From 8fb829ca6da5bf4601f8991fb9bb686e60f1a922 Mon Sep 17 00:00:00 2001 From: Tavi Date: Thu, 23 May 2024 09:14:33 -0400 Subject: [PATCH] LinkScanner: performance improvements Signed-off-by: Tavi --- .../malwarescanner/LinkScannerService.java | 44 ++++++++++++------- app/src/main/res/values/strings.xml | 2 +- .../res/xml/accessibility_service_config.xml | 2 +- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/us/spotco/malwarescanner/LinkScannerService.java b/app/src/main/java/us/spotco/malwarescanner/LinkScannerService.java index a101797..e24c053 100644 --- a/app/src/main/java/us/spotco/malwarescanner/LinkScannerService.java +++ b/app/src/main/java/us/spotco/malwarescanner/LinkScannerService.java @@ -18,7 +18,7 @@ public class LinkScannerService extends AccessibilityService { private static final String hostnameRegex = "^((?!-)[A-Za-z0-9-]{1,63}(? scannedObjects = new ConcurrentSkipListSet<>(); + private static final ConcurrentSkipListSet scannedText = new ConcurrentSkipListSet<>(); private static final ConcurrentSkipListSet scannedDomains = new ConcurrentSkipListSet<>(); private NotificationManager notificationManager = null; @@ -50,18 +50,20 @@ public class LinkScannerService extends AccessibilityService { return; } - //Don't scan if we already did - int hash = mNodeInfo.toString().hashCode(); - if (scannedObjects.contains(hash)) { - return; - } else { - scannedObjects.add(hash); - } - //Get and check the text String text = (String) mNodeInfo.getText(); - if (text != null && text.contains(".")) { - scanText(text.toLowerCase()); + if (text != null && text.contains(".") && text.length() < 10000) { + //Don't scan text if we already did + int hashDomain = mNodeInfo.getText().hashCode(); + if (scannedText.contains(hashDomain)) { + return; + } else { + if (scannedText.size() > 10000) { + scannedText.clear(); + } + scannedText.add(hashDomain); + scanText(text.toLowerCase()); + } } //Finish if no more children @@ -80,12 +82,7 @@ public class LinkScannerService extends AccessibilityService { private void scanText(String haystack) { Matcher matcher = hostnamePattern.matcher(haystack); while (matcher.find()) { - if (!scannedDomains.contains(matcher.group())) { - scannedDomains.add(matcher.group()); - if (Database.domains.mightContain(matcher.group())) { - sendNotification(matcher.group()); - } - } + scanDomain(matcher.group()); } if (haystack.contains("/")) { for (String split : haystack.split("/")) { @@ -94,6 +91,19 @@ public class LinkScannerService extends AccessibilityService { } } + private void scanDomain(String domain) { + //Don't scan domain if we already did + if (!scannedDomains.contains(domain)) { + if (scannedDomains.size() > 1000) { + scannedDomains.clear(); + } + scannedDomains.add(domain); + if (Database.domains.mightContain(domain)) { + sendNotification(domain); + } + } + } + private void sendNotification(String link) { link = link.replaceAll("\\.", "[.]"); Notification.Builder mBuilder = diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8aa1137..0a1ddcc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -83,5 +83,5 @@ Malicious Link Detected: Link Scanner Enable link scanner? - [EXPERIMENTAL]\nThis will download an additional database of domains.\nAny domains found in screen content will be checked against the database.\nThis requires granting accessibility service permission manually. + [EXPERIMENTAL]\nThis will download an additional database of domains.\nAny domains found in screen content will be checked against the database.\nThis requires granting accessibility service permission manually.\nThis can have a substantial performance impact on screen with large amounts of text. diff --git a/app/src/main/res/xml/accessibility_service_config.xml b/app/src/main/res/xml/accessibility_service_config.xml index 9b4d7a3..0e65fb3 100644 --- a/app/src/main/res/xml/accessibility_service_config.xml +++ b/app/src/main/res/xml/accessibility_service_config.xml @@ -1,7 +1,7 @@