diff --git a/.idea/misc.xml b/.idea/misc.xml index bf02b78..0688e19 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,6 +4,7 @@ diff --git a/app/build.gradle b/app/build.gradle index 8a6d51c..991d7a5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "us.spotco.malwarescanner" minSdkVersion 16 targetSdkVersion 29 - versionCode 79 - versionName "2.23" + versionCode 80 + versionName "2.24" resConfigs "en", "af", "de", "es", "fr", "it", "pt", "ru" } buildTypes { diff --git a/app/src/main/java/us/spotco/malwarescanner/Database.java b/app/src/main/java/us/spotco/malwarescanner/Database.java index 7ba31d9..be88214 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Database.java +++ b/app/src/main/java/us/spotco/malwarescanner/Database.java @@ -36,8 +36,6 @@ import java.text.DateFormat; import java.util.Date; import java.util.HashMap; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadPoolExecutor; import java.util.zip.GZIPInputStream; class Database { @@ -49,9 +47,6 @@ class Database { private static boolean databaseCurrentlyLoading = false; public final static ConcurrentLinkedQueue signatureDatabases = new ConcurrentLinkedQueue<>(); - public final static String baseURL = "https://divested.dev/MalwareScannerSignatures/"; - public final static String baseURLOnion = "https://hypatiagbf5vp3ba.onion/MalwareScannerSignatures/"; //TODO: Setup the .onion - public final static HashMap signaturesMD5 = new HashMap<>(); public final static HashMap signaturesSHA1 = new HashMap<>(); public final static HashMap signaturesSHA256 = new HashMap<>(); @@ -77,9 +72,12 @@ class Database { public static void updateDatabase(Context context, ConcurrentLinkedQueue signatureDatabases) { initDatabase(context); log.append(context.getString(R.string.main_database_updating, signatureDatabases.size() + "") + "\n"); + if(!Utils.getDatabaseURL(context).equals(Utils.DATABASE_URL_DEFAULT)) { + log.append(context.getString(R.string.main_database_override, Utils.getDatabaseURL(context)) + "\n"); + } for (SignatureDatabase signatureDatabase : signatureDatabases) { boolean onionRouting = prefs.getBoolean("ONION_ROUTING", false); - new Downloader().executeOnExecutor(Utils.getThreadPoolExecutor(), onionRouting, signatureDatabase.getUrl(), databasePath + "/" + signatureDatabase.getName()); + new Downloader().executeOnExecutor(Utils.getThreadPoolExecutor(), onionRouting, signatureDatabase.getUrl(), databasePath + "/" + signatureDatabase.getName(), signatureDatabase.getBaseUrl()); } } @@ -90,25 +88,26 @@ class Database { signatureDatabases.clear(); prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE); + String baseURL = Utils.getDatabaseURL(context); if (prefs.getBoolean("SIGNATURES_TARGETEDTHREATS", true)) { - signatureDatabases.add(new SignatureDatabase(baseURL + "targetedthreats.hdb.gz")); - signatureDatabases.add(new SignatureDatabase(baseURL + "targetedthreats.hsb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "targetedthreats.hdb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "targetedthreats.hsb.gz")); } if (prefs.getBoolean("SIGNATURES_ESET", true)) { - signatureDatabases.add(new SignatureDatabase(baseURL + "eset.hdb.gz")); - signatureDatabases.add(new SignatureDatabase(baseURL + "eset.hsb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "eset.hdb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "eset.hsb.gz")); } if (prefs.getBoolean("SIGNATURES_CLAMAV-MAIN", false)) { - signatureDatabases.add(new SignatureDatabase(baseURL + "main.hdb.gz")); - signatureDatabases.add(new SignatureDatabase(baseURL + "main.hsb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "main.hdb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "main.hsb.gz")); } if (prefs.getBoolean("SIGNATURES_CLAMAV-DAILY", false)) { - signatureDatabases.add(new SignatureDatabase(baseURL + "daily.hdb.gz")); - signatureDatabases.add(new SignatureDatabase(baseURL + "daily.hsb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "daily.hdb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "daily.hsb.gz")); } if (prefs.getBoolean("SIGNATURES_CLAMAV-ANDROID", true)) { - signatureDatabases.add(new SignatureDatabase(baseURL + "Android.hdb.gz")); - signatureDatabases.add(new SignatureDatabase(baseURL + "Android.hsb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "Android.hdb.gz")); + signatureDatabases.add(new SignatureDatabase(baseURL, "Android.hsb.gz")); } } @@ -173,11 +172,11 @@ class Database { boolean onionRouting = (boolean) objects[0]; String url = (String) objects[1]; File out = new File((String) objects[2]); + String baseURL = (String) objects[3]; try { HttpURLConnection connection; if (onionRouting) { Utils.waitUntilOrbotIsAvailable(); - //url = url.replaceAll(baseURL, baseURLOnion); //TODO: Setup the .onion Proxy orbot = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 9050)); connection = (HttpURLConnection) new URL(url).openConnection(orbot); } else { diff --git a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java index a4a4275..2286022 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java +++ b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java @@ -21,6 +21,7 @@ import android.Manifest; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; @@ -29,10 +30,12 @@ import android.content.res.ColorStateList; import android.os.Build; import android.os.Bundle; import android.os.Environment; +import android.text.InputType; import android.text.method.ScrollingMovementMethod; import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; +import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; @@ -215,6 +218,32 @@ public class MainActivity extends AppCompatActivity { case R.id.mnuSelectDatabases: selectDatabases(); break; + case R.id.mnuDatabaseServer: + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.lblDatabaseServer)); + final EditText input = new EditText(this); + input.setInputType(InputType.TYPE_CLASS_TEXT); + input.setText(Utils.getDatabaseURL(this)); + builder.setView(input); + builder.setPositiveButton(getString(R.string.lblOverride), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String newServer = input.getText().toString(); + if(!newServer.endsWith("/")) { + newServer += "/"; + } + prefs.edit().putString("DATABASE_SERVER", newServer).apply(); + } + }); + builder.setNegativeButton(getString(R.string.lblReset), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + prefs.edit().putString("DATABASE_SERVER", Utils.DATABASE_URL_DEFAULT).apply(); + dialog.cancel(); + } + }); + builder.show(); + break; case R.id.toggleRealtime: Intent realtimeScanner = new Intent(getApplicationContext(), MalwareScannerService.class); if (!item.isChecked()) { diff --git a/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java b/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java index d647817..1090058 100644 --- a/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java +++ b/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java @@ -19,20 +19,22 @@ package us.spotco.malwarescanner; class SignatureDatabase { - private final String url; + private final String baseURL; private final String name; - public SignatureDatabase(String url) { - this.url = url; - this.name = url.replaceAll(Database.baseURL, ""); + public SignatureDatabase(String baseURL, String name) { + this.baseURL = baseURL; + this.name = name; } - public final String getUrl() { - return url; + public final String getBaseUrl() { + return baseURL; } public final String getName() { return name; } + public final String getUrl() { return baseURL + name; } + } \ No newline at end of file diff --git a/app/src/main/java/us/spotco/malwarescanner/Utils.java b/app/src/main/java/us/spotco/malwarescanner/Utils.java index 7bb4639..9c46891 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Utils.java +++ b/app/src/main/java/us/spotco/malwarescanner/Utils.java @@ -37,6 +37,7 @@ class Utils { private static Context context = null; public final static int MAX_SCAN_SIZE = (1000 * 1000) * 80; //80MB public final static int MAX_SCAN_SIZE_REALTIME = MAX_SCAN_SIZE / 2; //40MB + public final static String DATABASE_URL_DEFAULT = "https://divested.dev/MalwareScannerSignatures/"; public final static int MAX_HASH_LENGTH = 12; @@ -98,6 +99,11 @@ class Utils { return false; } + public static String getDatabaseURL(Context context) { + SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE); + return prefs.getString("DATABASE_SERVER", DATABASE_URL_DEFAULT); + } + public static void considerStartService(Context context) { if (!Utils.isServiceRunning(MalwareScannerService.class, context)) { SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE); diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 01f7bac..446c0f6 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -12,6 +12,9 @@ + Update databases Select databases Select databases to enable + Database server override Credits Scan /system Scan App APKs @@ -26,8 +27,11 @@ Hypatia: Realtime Scanning Stopped Malware Detected: Realtime Scanner + Reset + Override Updating %s databases... + Using server %s Downloading %s Successfully downloaded File not downloaded, response code %s diff --git a/fastlane/metadata/android/en-US/changelogs/80.txt b/fastlane/metadata/android/en-US/changelogs/80.txt new file mode 100644 index 0000000..030cd3a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/80.txt @@ -0,0 +1 @@ +* Add the option to change server URL. Such replacement must have the same file names. Database generation scripts in source code repository.