diff --git a/README.md b/README.md
index f88bcfd..954319f 100644
--- a/README.md
+++ b/README.md
@@ -46,6 +46,5 @@ Goals
Credits
-------
-- Trove (GPLv3): A memory efficient replacement for Java's Collections
- RecursiveFileObserver.java (GPLv3): Daniel Gultsch, ownCloud Inc., Bartek Przybylski
- Icons (Apache-2.0): Google/Android/AOSP
diff --git a/app/build.gradle b/app/build.gradle
index 6fe2593..e268542 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,8 +6,8 @@ android {
applicationId "us.spotco.malwarescanner"
minSdkVersion 16
targetSdkVersion 26
- versionCode 28
- versionName "2.3"
+ versionCode 29
+ versionName "2.4"
}
buildTypes {
debug {
@@ -31,5 +31,4 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
- implementation 'net.sf.trove4j:trove4j:3.0.3'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 23e47ec..9d5831d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -29,13 +29,13 @@
diff --git a/app/src/main/java/us/spotco/malwarescanner/Database.java b/app/src/main/java/us/spotco/malwarescanner/Database.java
index 138f2b3..d2daad7 100644
--- a/app/src/main/java/us/spotco/malwarescanner/Database.java
+++ b/app/src/main/java/us/spotco/malwarescanner/Database.java
@@ -11,20 +11,20 @@ import java.io.FileOutputStream;
import java.io.FileReader;
import java.net.HttpURLConnection;
import java.net.URL;
-
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
+import java.util.HashMap;
+import java.util.HashSet;
class Database {
private static TextView log = null;
private static File databasePath = null;
- public final static THashSet signatureDatabases = new THashSet<>();
+ public final static HashSet signatureDatabases = new HashSet<>();
+ public final static String baseURL = "https://spotco.us/MalwareScannerSignatures/";
- public final static THashMap signaturesMD5 = new THashMap<>();
- public final static THashMap signaturesSHA1 = new THashMap<>();
- public final static THashMap signaturesSHA256 = new THashMap<>();
+ public final static HashMap signaturesMD5 = new HashMap<>();
+ public final static HashMap signaturesSHA1 = new HashMap<>();
+ public final static HashMap signaturesSHA256 = new HashMap<>();
public Database(TextView log) {
Database.log = log;
@@ -42,7 +42,7 @@ class Database {
return signaturesMD5.size() + signaturesSHA1.size() + signaturesSHA256.size();
}
- public static void updateDatabase(Context context, THashSet signatureDatabases) {
+ public static void updateDatabase(Context context, HashSet signatureDatabases) {
initDatabase(context);
for (SignatureDatabase signatureDatabase : signatureDatabases) {
new Downloader().execute(signatureDatabase.getUrl(), databasePath + "/" + signatureDatabase.getName());
@@ -57,37 +57,37 @@ class Database {
SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
if (prefs.getBoolean("SIGNATURES_EXTENDED", false)) {
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/bofhland_malware_attach.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/crdfam.clamav.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/doppelstern.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/hackingteam.hsb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/malware.expert.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/malwarehash.hsb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/porcupine.hsb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/rfxn.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/rogue.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/spamattach.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/spamimg.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/winnow.attachments.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/winnow_bad_cw.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/winnow_extended_malware.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/winnow_malware.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "bofhland_malware_attach.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "crdfam.clamav.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "doppelstern.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "hackingteam.hsb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "malware.expert.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "malwarehash.hsb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "porcupine.hsb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "rfxn.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "rogue.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "spamattach.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "spamimg.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "winnow.attachments.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "winnow_bad_cw.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "winnow_extended_malware.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "winnow_malware.hdb"));
}
if (prefs.getBoolean("SIGNATURES_CLAMAV-MAIN", false)) {
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/main.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/main.hsb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "main.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "main.hsb"));
}
if (prefs.getBoolean("SIGNATURES_CLAMAV-DAILY", false)) {
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/daily.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/daily.hsb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "daily.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "daily.hsb"));
}
if (prefs.getBoolean("SIGNATURES_CLAMAV-ANDROID", true)) {
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/Android.hdb"));
- signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/Android.hsb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "Android.hdb"));
+ signatureDatabases.add(new SignatureDatabase(baseURL + "Android.hsb"));
}
}
- public static void loadDatabase(Context context, boolean ignoreifLoaded, THashSet signatureDatabases) {
+ public static void loadDatabase(Context context, boolean ignoreifLoaded, HashSet signatureDatabases) {
if (!isDatabaseLoaded() || !ignoreifLoaded && isDatabaseLoaded()) {
initDatabase(context);
signaturesMD5.clear();
@@ -139,7 +139,7 @@ class Database {
protected String doInBackground(String... strings) {
String url = strings[0];
File out = new File(strings[1]);
- publishProgress("Downloading " + url);
+ publishProgress("Downloading " + url.replaceAll(baseURL, ""));
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setConnectTimeout(45000);
diff --git a/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java b/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java
index 8bcf6ec..2ff7f85 100644
--- a/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java
+++ b/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java
@@ -6,8 +6,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import java.io.File;
-
-import gnu.trove.set.hash.THashSet;
+import java.util.HashSet;
public class EventReceiver extends BroadcastReceiver {
@@ -30,7 +29,7 @@ public class EventReceiver extends BroadcastReceiver {
private static void scanApp(Context context, String appID) {
if (Utils.isServiceRunning(MalwareScannerService.class, context)) {
- THashSet filesToScan = new THashSet<>();
+ HashSet filesToScan = new HashSet<>();
try {
filesToScan.add(new File(context.getPackageManager().getApplicationInfo(appID, PackageManager.GET_META_DATA).sourceDir));
} catch (Exception e) {
diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java
index ef333a2..d679750 100644
--- a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java
+++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java
@@ -17,12 +17,11 @@ import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
+import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
-import gnu.trove.map.hash.THashMap;
-
class MalwareScanner extends AsyncTask, Object, String> {
private Context context = null;
@@ -30,9 +29,9 @@ class MalwareScanner extends AsyncTask, Object, String> {
private boolean userFacing = false;
private NotificationManager notificationManager = null;
private long scanTime = 0;
- private final THashMap fileHashesMD5 = new THashMap<>();
- private final THashMap fileHashesSHA1 = new THashMap<>();
- private final THashMap fileHashesSHA256 = new THashMap<>();
+ private final HashMap fileHashesMD5 = new HashMap<>();
+ private final HashMap fileHashesSHA1 = new HashMap<>();
+ private final HashMap fileHashesSHA256 = new HashMap<>();
public MalwareScanner(Activity activity, Context context, boolean userFacing) {
this.context = context;
@@ -114,7 +113,7 @@ class MalwareScanner extends AsyncTask, Object, String> {
logResult((String) objects[0], (boolean) objects[1]);
}
- private void checkSignature(String hashType, THashMap signaturesToCheck, THashMap signatureDatabase) {
+ private void checkSignature(String hashType, HashMap signaturesToCheck, HashMap signatureDatabase) {
if (signatureDatabase.size() > 0) {
for (Map.Entry file : signaturesToCheck.entrySet()) {
if (signatureDatabase.containsKey(file.getKey())) {
diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java
index 488353d..c460ac6 100644
--- a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java
+++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java
@@ -11,14 +11,13 @@ import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import java.io.File;
+import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
-import gnu.trove.set.hash.THashSet;
-
public class MalwareScannerService extends Service {
- private THashSet malwareMonitors = new THashSet<>();
+ private final HashSet malwareMonitors = new HashSet<>();
private ThreadPoolExecutor threadPoolExecutor = null;
private NotificationCompat.Builder foregroundNotification = null;
private NotificationManager notificationManager = null;
@@ -55,7 +54,7 @@ public class MalwareScannerService extends Service {
return START_STICKY;
}
- private final void addMalwareMonitor(String monitorPath) {
+ private void addMalwareMonitor(String monitorPath) {
malwareMonitors.add(new RecursiveFileObserver(monitorPath) {
@Override
public void onEvent(int event, String path) {
@@ -64,7 +63,7 @@ public class MalwareScannerService extends Service {
case FileObserver.CLOSE_WRITE:
File file = new File(path);
if (file.exists() && /*file.length() > 0 &&*/ file.length() <= Utils.MAX_SCAN_SIZE_REALTIME) {
- THashSet filesToScan = new THashSet<>();
+ HashSet filesToScan = new HashSet<>();
filesToScan.add(file);
new MalwareScanner(null, getApplicationContext(), false).executeOnExecutor(threadPoolExecutor, filesToScan);
}
diff --git a/app/src/main/java/us/spotco/malwarescanner/RecursiveFileObserver.java b/app/src/main/java/us/spotco/malwarescanner/RecursiveFileObserver.java
index f26054f..851e992 100644
--- a/app/src/main/java/us/spotco/malwarescanner/RecursiveFileObserver.java
+++ b/app/src/main/java/us/spotco/malwarescanner/RecursiveFileObserver.java
@@ -3,20 +3,19 @@ package us.spotco.malwarescanner;
import android.os.FileObserver;
import java.io.File;
+import java.util.HashSet;
import java.util.Stack;
-import gnu.trove.set.hash.THashSet;
-
/**
* Copyright (C) 2012 Bartek Przybylski
* Copyright (C) 2015 ownCloud Inc.
* Copyright (C) 2016 Daniel Gultsch
* Taken from siacs/Conversations and tweaked a bit
*/
-public abstract class RecursiveFileObserver {
+abstract class RecursiveFileObserver {
private final String path;
- private final THashSet mObservers = new THashSet<>();
+ private final HashSet mObservers = new HashSet<>();
public RecursiveFileObserver(String path) {
this.path = path;
diff --git a/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java b/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java
index 40b41f4..2909bf6 100644
--- a/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java
+++ b/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java
@@ -7,7 +7,7 @@ class SignatureDatabase {
public SignatureDatabase(String url) {
this.url = url;
- this.name = url.replaceAll("https://spotco.us/Theia/", "");
+ this.name = url.replaceAll(Database.baseURL, "");
}
public final String getUrl() {
diff --git a/app/src/main/java/us/spotco/malwarescanner/Utils.java b/app/src/main/java/us/spotco/malwarescanner/Utils.java
index 1a5f64e..7bc42c6 100644
--- a/app/src/main/java/us/spotco/malwarescanner/Utils.java
+++ b/app/src/main/java/us/spotco/malwarescanner/Utils.java
@@ -6,11 +6,10 @@ import android.content.Intent;
import android.content.SharedPreferences;
import java.io.File;
+import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
-import gnu.trove.set.hash.THashSet;
-
class Utils {
public final static int MAX_SCAN_SIZE = (1000 * 1000) * 80; //80MB
@@ -35,14 +34,14 @@ class Utils {
return maxTheads;
}
- public static THashSet getFilesRecursive(File root) {
- THashSet filesAll = new THashSet<>();
+ public static HashSet getFilesRecursive(File root) {
+ HashSet filesAll = new HashSet<>();
File[] files = root.listFiles();
if (files != null && files.length > 0) {
for (File f : files) {
if (f.isDirectory()) {
- THashSet filesTmp = getFilesRecursive(f);
+ HashSet filesTmp = getFilesRecursive(f);
if (filesTmp != null) {
filesAll.addAll(filesTmp);
}