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.