diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index b29011f..780a91a 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/README.md b/README.md index 035c470..883a937 100644 --- a/README.md +++ b/README.md @@ -50,9 +50,10 @@ Credits - ClamAV for the databases (GPLv2) - ESET for extra databases (BSD 2-Clause) - RecursiveFileObserver.java (GPLv3): Daniel Gultsch, ownCloud Inc., Bartek Przybylski +- Petra Mirelli for the German Translations - Icons (Apache-2.0): Google/Android/AOSP Notices ------- - Divested Computing Group is not affiliated with Cisco or ESET -- Hypatia is not sponsored or endorsed by Cisco or ESET \ No newline at end of file +- Hypatia is not sponsored or endorsed by Cisco or ESET diff --git a/app/build.gradle b/app/build.gradle index 3650494..9656229 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,9 +6,9 @@ android { applicationId "us.spotco.malwarescanner" minSdkVersion 16 targetSdkVersion 29 - versionCode 49 - versionName "2.11" - resConfigs "en" + versionCode 50 + versionName "2.12" + resConfigs "en", "de" } buildTypes { debug { diff --git a/app/src/main/java/us/spotco/malwarescanner/Database.java b/app/src/main/java/us/spotco/malwarescanner/Database.java index 97d3389..e5b6b0e 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Database.java +++ b/app/src/main/java/us/spotco/malwarescanner/Database.java @@ -77,7 +77,7 @@ class Database { public static void updateDatabase(Context context, HashSet signatureDatabases) { initDatabase(context); - log.append("Updating " + signatureDatabases.size() + " databases...\n"); + log.append(context.getString(R.string.main_database_updating, signatureDatabases.size() + "")+ "\n"); for (SignatureDatabase signatureDatabase : signatureDatabases) { boolean onionRouting = prefs.getBoolean("ONION_ROUTING", false); new Downloader().executeOnExecutor(threadPoolExecutor, onionRouting, signatureDatabase.getUrl(), databasePath + "/" + signatureDatabase.getName()); @@ -184,7 +184,7 @@ class Database { String lastModifiedLocal = ""; if (out.exists()) { connection.setIfModifiedSince(out.lastModified()); - lastModifiedLocal = " since " + dateFormat.format(new Date(out.lastModified())); + lastModifiedLocal = " since " + dateFormat.format(new Date(out.lastModified())); //TODO: Move to strings.xml } connection.connect(); String lastModifiedServer = dateFormat.format(new Date(connection.getLastModified())); @@ -204,22 +204,22 @@ class Database { fileOutputStream.close(); publishProgress(url.replaceAll(baseURL, "") - + "\n\tSuccessfully downloaded." - + "\n\tReleased on " + lastModifiedServer + "\n"); + + "\n\t" + Utils.getContext().getString(R.string.main_database_download_success) + + "\n\tReleased on " + lastModifiedServer + "\n"); //TODO: Move to strings.xml } else { publishProgress(url.replaceAll(baseURL, "") - + "\n\tFile not downloaded, response code " + res + "\n"); + + "\n\t" + Utils.getContext().getString(R.string.main_database_download_error, res + "") + "\n"); } } else { publishProgress(url.replaceAll(baseURL, "") - + "\n\tFile not changed" + lastModifiedLocal + "\n"); + + "\n\t" + Utils.getContext().getString(R.string.main_database_not_changed) + lastModifiedLocal + "\n"); } connection.disconnect(); } catch (Exception e) { e.printStackTrace(); out.delete(); publishProgress(url.replaceAll(baseURL, "") - + "\nFailed to download, check logcat\n"); + + "\n" + Utils.getContext().getString(R.string.main_database_download_error_logcat) + "\n"); } return null; } diff --git a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java index 610d03a..ea8db10 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java +++ b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java @@ -65,6 +65,7 @@ public class MainActivity extends AppCompatActivity { @Override protected final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Utils.setContext(getApplicationContext()); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); @@ -74,7 +75,7 @@ public class MainActivity extends AppCompatActivity { logView = findViewById(R.id.txtLogOutput); logView.setMovementMethod(new ScrollingMovementMethod()); - logView.append("Copyright 2017-2020 Divested Computing Group\n"); + logView.append("Copyright 2017-2021 Divested Computing Group\n"); //TODO: Move to strings.xml logView.append("License: GPLv3\n"); logView.append("Powered by ClamAV signatures\n\n"); @@ -168,7 +169,7 @@ public class MainActivity extends AppCompatActivity { case R.id.mnuUpdateDatabase: if (prefs.getBoolean("ONION_ROUTING", false)) { Utils.requestStartOrbot(this); - logView.append("Downloading over Tor, this may take a while...\n"); + logView.append("Downloading over Tor, this may take a while...\n"); //TODO: Move to strings.xml } updateDatabase(); break; diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java index e852f0c..55b244c 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java +++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java @@ -92,7 +92,7 @@ class MalwareScanner extends AsyncTask, Object, String> { @Override protected final void onPreExecute() { scanTime = SystemClock.elapsedRealtime(); - logResult("Starting scan...", true); + logResult(context.getString(R.string.main_starting_scan), true); } @Override @@ -102,18 +102,18 @@ class MalwareScanner extends AsyncTask, Object, String> { fileHashesSHA1.clear(); fileHashesSHA256.clear(); - publishProgress("\t" + filesToScan[0].size() + " files pending scan\n", true); + publishProgress("\t" + context.getString(R.string.main_files_pending_scan, filesToScan[0].size() + "") + "\n", true); Database.loadDatabase(context, true, Database.signatureDatabases); if (Database.getSignatureCount() >= 0) { - publishProgress("\tLoaded database with " + Database.getSignatureCount() + " signatures\n", true); + publishProgress("\t" + context.getString(R.string.main_database_loaded, Database.getSignatureCount() + "") + "\n", true); //Get file hashes - publishProgress("\tHashing files...", true); + publishProgress("\t" + context.getString(R.string.main_hashing_files), true); for (File file : filesToScan[0]) { getFileHashes(file); } - publishProgress("\tCalculated hashes for all files\n", true); + publishProgress("\t" + context.getString(R.string.main_hash_scan_done) + "\n", true); //Check the hashes checkSignature("MD5", fileHashesMD5, Database.signaturesMD5); @@ -126,10 +126,9 @@ class MalwareScanner extends AsyncTask, Object, String> { fileHashesSHA256.clear(); System.gc(); Utils.FILES_SCANNED += filesToScan[0].size(); - Log.d("Hypatia", "Scan completed in " + (SystemClock.elapsedRealtime() - scanTime) + " ms!"); - publishProgress("Scan completed in " + ((SystemClock.elapsedRealtime() - scanTime) / 1000) + " seconds!\n\n\n\n", true); + publishProgress(context.getString(R.string.main_scanning_done, ((SystemClock.elapsedRealtime() - scanTime) / 1000) + "") + "\n\n\n\n", true); } else { - publishProgress("\tNo database available, not scanning...", true); + publishProgress("\t" + context.getString(R.string.main_no_database_available), true); } return null; } @@ -147,9 +146,9 @@ class MalwareScanner extends AsyncTask, Object, String> { publishProgress(result + " in " + file.getValue().toString().replaceAll(Environment.getExternalStorageDirectory().toString(), "~"), false); } } - publishProgress("\tChecked all " + hashType + " hashes against signature databases\n", true); + publishProgress("\t" + context.getString(R.string.main_hash_scan_done, hashType) + "\n", true); } else { - publishProgress("\tNo " + hashType + " signatures available\n", true); + publishProgress("\t" + context.getString(R.string.main_no_database_available) + "\n", true); } } diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java index b81f912..5ad2348 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java +++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java @@ -48,6 +48,7 @@ public class MalwareScannerService extends Service { @Override public final int onStartCommand(Intent intent, int flags, int startId) { + Utils.setContext(getApplicationContext()); malwareMonitors.clear(); addMalwareMonitor(Environment.getExternalStorageDirectory().toString()); @@ -106,7 +107,7 @@ public class MalwareScannerService extends Service { } malwareMonitors.clear(); System.gc(); - //Toast.makeText(this, "Hypatia: Realtime Scanning Stopped", Toast.LENGTH_SHORT).show(); + //Toast.makeText(this, "Hypatia: Realtime Scanning Stopped", Toast.LENGTH_SHORT).show(); //TODO: Move to strings.xml } private void setForeground() { @@ -126,7 +127,7 @@ public class MalwareScannerService extends Service { } private void updateForegroundNotification() { - foregroundNotification.setSubText(Utils.FILES_SCANNED + " files scanned"); + foregroundNotification.setSubText(Utils.FILES_SCANNED + " files scanned"); //TODO: Move to strings.xml notificationManager.notify(-1, foregroundNotification.build()); } diff --git a/app/src/main/java/us/spotco/malwarescanner/Utils.java b/app/src/main/java/us/spotco/malwarescanner/Utils.java index 5a37ec8..88026e0 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Utils.java +++ b/app/src/main/java/us/spotco/malwarescanner/Utils.java @@ -32,6 +32,7 @@ import java.util.concurrent.ThreadPoolExecutor; 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 @@ -160,4 +161,11 @@ class Utils { return listening; } + public static Context getContext() { + return context; + } + + public static void setContext(Context context) { + Utils.context = context; + } } \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml new file mode 100644 index 0000000..2ba76b6 --- /dev/null +++ b/app/src/main/res/values-de/strings.xml @@ -0,0 +1,26 @@ + + + Hypatia + Malware-Erkennung + Dient zur Warnung in Echtzeit wenn Malware erkannt wird + Echtzeit-Scanner + Bekannte Malware wird in Echtzeit erkannt + Echtzeit-Scanner + + Update der %s Datenbank... + Download von %s + Erfolgreich heruntergeladen + Datei wurde nicht heruntergeladen. Fehlercode %s + Keine Datenbank verfügbar. Scan wird abgebrochen... + Datei wurd nicht geändert + Download ist fehlgeschlagen. Für weitere Details bitte in logcat nachsehen + + Scan startet... + %s Dateien, die zur Überprüfung vorgesehen sind + Datenbank mit %s Signaturen geladen + Generiere Hashes für Dateien... + Hashes für alle Dateien generiert + Alle %s Hashes wurden mit den Signatur-Datenbanken abgeglichen + Keine %s Hash-Signaturen verfügbar + Scan nach %s Sekunden abgeschlossen! + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9761ad..7f3bbad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,4 +17,21 @@ Known malware will be detected in realtime Malware Detected: Realtime Scanner + + Updating %s databases... + Downloading %s + Successfully downloaded + File not downloaded, response code %s + No database available, not scanning... + File not changed + Failed to download, check logcat + + Starting scan... + %s files pending scan + Loaded database with %s signatures + Hashing files... + Calculated hashes for all files + Checked all %s hashes against signature databases + No %s hashes signatures available + Scan completed in %s seconds! \ No newline at end of file