mirror of
https://github.com/MaintainTeam/Hypatia.git
synced 2025-03-01 05:48:23 +03:00
Add the German string translations, credit Petra Mirelli
https://gitlab.com/divested-mobile/hypatia/-/issues/1
This commit is contained in:
parent
6cc6c09403
commit
538aac8140
10 changed files with 78 additions and 25 deletions
BIN
.idea/caches/build_file_checksums.ser
generated
BIN
.idea/caches/build_file_checksums.ser
generated
Binary file not shown.
|
@ -50,9 +50,10 @@ Credits
|
||||||
- ClamAV for the databases (GPLv2)
|
- ClamAV for the databases (GPLv2)
|
||||||
- ESET for extra databases (BSD 2-Clause)
|
- ESET for extra databases (BSD 2-Clause)
|
||||||
- RecursiveFileObserver.java (GPLv3): Daniel Gultsch, ownCloud Inc., Bartek Przybylski
|
- RecursiveFileObserver.java (GPLv3): Daniel Gultsch, ownCloud Inc., Bartek Przybylski
|
||||||
|
- Petra Mirelli for the German Translations
|
||||||
- Icons (Apache-2.0): Google/Android/AOSP
|
- Icons (Apache-2.0): Google/Android/AOSP
|
||||||
|
|
||||||
Notices
|
Notices
|
||||||
-------
|
-------
|
||||||
- Divested Computing Group is not affiliated with Cisco or ESET
|
- Divested Computing Group is not affiliated with Cisco or ESET
|
||||||
- Hypatia is not sponsored or endorsed by Cisco or ESET
|
- Hypatia is not sponsored or endorsed by Cisco or ESET
|
||||||
|
|
|
@ -6,9 +6,9 @@ android {
|
||||||
applicationId "us.spotco.malwarescanner"
|
applicationId "us.spotco.malwarescanner"
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
versionCode 49
|
versionCode 50
|
||||||
versionName "2.11"
|
versionName "2.12"
|
||||||
resConfigs "en"
|
resConfigs "en", "de"
|
||||||
}
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
debug {
|
debug {
|
||||||
|
|
|
@ -77,7 +77,7 @@ class Database {
|
||||||
|
|
||||||
public static void updateDatabase(Context context, HashSet<SignatureDatabase> signatureDatabases) {
|
public static void updateDatabase(Context context, HashSet<SignatureDatabase> signatureDatabases) {
|
||||||
initDatabase(context);
|
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) {
|
for (SignatureDatabase signatureDatabase : signatureDatabases) {
|
||||||
boolean onionRouting = prefs.getBoolean("ONION_ROUTING", false);
|
boolean onionRouting = prefs.getBoolean("ONION_ROUTING", false);
|
||||||
new Downloader().executeOnExecutor(threadPoolExecutor, onionRouting, signatureDatabase.getUrl(), databasePath + "/" + signatureDatabase.getName());
|
new Downloader().executeOnExecutor(threadPoolExecutor, onionRouting, signatureDatabase.getUrl(), databasePath + "/" + signatureDatabase.getName());
|
||||||
|
@ -184,7 +184,7 @@ class Database {
|
||||||
String lastModifiedLocal = "";
|
String lastModifiedLocal = "";
|
||||||
if (out.exists()) {
|
if (out.exists()) {
|
||||||
connection.setIfModifiedSince(out.lastModified());
|
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();
|
connection.connect();
|
||||||
String lastModifiedServer = dateFormat.format(new Date(connection.getLastModified()));
|
String lastModifiedServer = dateFormat.format(new Date(connection.getLastModified()));
|
||||||
|
@ -204,22 +204,22 @@ class Database {
|
||||||
|
|
||||||
fileOutputStream.close();
|
fileOutputStream.close();
|
||||||
publishProgress(url.replaceAll(baseURL, "")
|
publishProgress(url.replaceAll(baseURL, "")
|
||||||
+ "\n\tSuccessfully downloaded."
|
+ "\n\t" + Utils.getContext().getString(R.string.main_database_download_success)
|
||||||
+ "\n\tReleased on " + lastModifiedServer + "\n");
|
+ "\n\tReleased on " + lastModifiedServer + "\n"); //TODO: Move to strings.xml
|
||||||
} else {
|
} else {
|
||||||
publishProgress(url.replaceAll(baseURL, "")
|
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 {
|
} else {
|
||||||
publishProgress(url.replaceAll(baseURL, "")
|
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();
|
connection.disconnect();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
out.delete();
|
out.delete();
|
||||||
publishProgress(url.replaceAll(baseURL, "")
|
publishProgress(url.replaceAll(baseURL, "")
|
||||||
+ "\nFailed to download, check logcat\n");
|
+ "\n" + Utils.getContext().getString(R.string.main_database_download_error_logcat) + "\n");
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,7 @@ public class MainActivity extends AppCompatActivity {
|
||||||
@Override
|
@Override
|
||||||
protected final void onCreate(Bundle savedInstanceState) {
|
protected final void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
Utils.setContext(getApplicationContext());
|
||||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||||
|
@ -74,7 +75,7 @@ public class MainActivity extends AppCompatActivity {
|
||||||
|
|
||||||
logView = findViewById(R.id.txtLogOutput);
|
logView = findViewById(R.id.txtLogOutput);
|
||||||
logView.setMovementMethod(new ScrollingMovementMethod());
|
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("License: GPLv3\n");
|
||||||
logView.append("Powered by ClamAV signatures\n\n");
|
logView.append("Powered by ClamAV signatures\n\n");
|
||||||
|
|
||||||
|
@ -168,7 +169,7 @@ public class MainActivity extends AppCompatActivity {
|
||||||
case R.id.mnuUpdateDatabase:
|
case R.id.mnuUpdateDatabase:
|
||||||
if (prefs.getBoolean("ONION_ROUTING", false)) {
|
if (prefs.getBoolean("ONION_ROUTING", false)) {
|
||||||
Utils.requestStartOrbot(this);
|
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();
|
updateDatabase();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -92,7 +92,7 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
|
||||||
@Override
|
@Override
|
||||||
protected final void onPreExecute() {
|
protected final void onPreExecute() {
|
||||||
scanTime = SystemClock.elapsedRealtime();
|
scanTime = SystemClock.elapsedRealtime();
|
||||||
logResult("Starting scan...", true);
|
logResult(context.getString(R.string.main_starting_scan), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -102,18 +102,18 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
|
||||||
fileHashesSHA1.clear();
|
fileHashesSHA1.clear();
|
||||||
fileHashesSHA256.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);
|
Database.loadDatabase(context, true, Database.signatureDatabases);
|
||||||
if (Database.getSignatureCount() >= 0) {
|
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
|
//Get file hashes
|
||||||
publishProgress("\tHashing files...", true);
|
publishProgress("\t" + context.getString(R.string.main_hashing_files), true);
|
||||||
for (File file : filesToScan[0]) {
|
for (File file : filesToScan[0]) {
|
||||||
getFileHashes(file);
|
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
|
//Check the hashes
|
||||||
checkSignature("MD5", fileHashesMD5, Database.signaturesMD5);
|
checkSignature("MD5", fileHashesMD5, Database.signaturesMD5);
|
||||||
|
@ -126,10 +126,9 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
|
||||||
fileHashesSHA256.clear();
|
fileHashesSHA256.clear();
|
||||||
System.gc();
|
System.gc();
|
||||||
Utils.FILES_SCANNED += filesToScan[0].size();
|
Utils.FILES_SCANNED += filesToScan[0].size();
|
||||||
Log.d("Hypatia", "Scan completed in " + (SystemClock.elapsedRealtime() - scanTime) + " ms!");
|
publishProgress(context.getString(R.string.main_scanning_done, ((SystemClock.elapsedRealtime() - scanTime) / 1000) + "") + "\n\n\n\n", true);
|
||||||
publishProgress("Scan completed in " + ((SystemClock.elapsedRealtime() - scanTime) / 1000) + " seconds!\n\n\n\n", true);
|
|
||||||
} else {
|
} else {
|
||||||
publishProgress("\tNo database available, not scanning...", true);
|
publishProgress("\t" + context.getString(R.string.main_no_database_available), true);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -147,9 +146,9 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
|
||||||
publishProgress(result + " in " + file.getValue().toString().replaceAll(Environment.getExternalStorageDirectory().toString(), "~"), false);
|
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 {
|
} else {
|
||||||
publishProgress("\tNo " + hashType + " signatures available\n", true);
|
publishProgress("\t" + context.getString(R.string.main_no_database_available) + "\n", true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ public class MalwareScannerService extends Service {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final int onStartCommand(Intent intent, int flags, int startId) {
|
public final int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
Utils.setContext(getApplicationContext());
|
||||||
malwareMonitors.clear();
|
malwareMonitors.clear();
|
||||||
addMalwareMonitor(Environment.getExternalStorageDirectory().toString());
|
addMalwareMonitor(Environment.getExternalStorageDirectory().toString());
|
||||||
|
|
||||||
|
@ -106,7 +107,7 @@ public class MalwareScannerService extends Service {
|
||||||
}
|
}
|
||||||
malwareMonitors.clear();
|
malwareMonitors.clear();
|
||||||
System.gc();
|
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() {
|
private void setForeground() {
|
||||||
|
@ -126,7 +127,7 @@ public class MalwareScannerService extends Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateForegroundNotification() {
|
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());
|
notificationManager.notify(-1, foregroundNotification.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
class Utils {
|
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 = (1000 * 1000) * 80; //80MB
|
||||||
public final static int MAX_SCAN_SIZE_REALTIME = MAX_SCAN_SIZE / 2; //40MB
|
public final static int MAX_SCAN_SIZE_REALTIME = MAX_SCAN_SIZE / 2; //40MB
|
||||||
|
|
||||||
|
@ -160,4 +161,11 @@ class Utils {
|
||||||
return listening;
|
return listening;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Context getContext() {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setContext(Context context) {
|
||||||
|
Utils.context = context;
|
||||||
|
}
|
||||||
}
|
}
|
26
app/src/main/res/values-de/strings.xml
Normal file
26
app/src/main/res/values-de/strings.xml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Hypatia</string>
|
||||||
|
<string name="lblNotificationMalwareDetectionTitle">Malware-Erkennung</string>
|
||||||
|
<string name="lblNotificationMalwareDetectionDescription">Dient zur Warnung in Echtzeit wenn Malware erkannt wird</string>
|
||||||
|
<string name="lblNotificationRealtimeTitle">Echtzeit-Scanner</string>
|
||||||
|
<string name="lblNotificationRealtimeText">Bekannte Malware wird in Echtzeit erkannt</string>
|
||||||
|
<string name="lblRealtimeScannerToggle">Echtzeit-Scanner</string>
|
||||||
|
|
||||||
|
<string name="main_database_updating">Update der %s Datenbank...</string>
|
||||||
|
<string name="main_database_downloading">Download von %s</string>
|
||||||
|
<string name="main_database_download_success">Erfolgreich heruntergeladen</string>
|
||||||
|
<string name="main_database_download_error">Datei wurde nicht heruntergeladen. Fehlercode %s</string>
|
||||||
|
<string name="main_no_database_available">Keine Datenbank verfügbar. Scan wird abgebrochen...</string>
|
||||||
|
<string name="main_database_not_changed">Datei wurd nicht geändert</string>
|
||||||
|
<string name="main_database_download_error_logcat">Download ist fehlgeschlagen. Für weitere Details bitte in logcat nachsehen</string>
|
||||||
|
|
||||||
|
<string name="main_starting_scan">Scan startet...</string>
|
||||||
|
<string name="main_files_pending_scan">%s Dateien, die zur Überprüfung vorgesehen sind</string>
|
||||||
|
<string name="main_database_loaded">Datenbank mit %s Signaturen geladen</string>
|
||||||
|
<string name="main_hashing_files">Generiere Hashes für Dateien...</string>
|
||||||
|
<string name="main_hashing_done">Hashes für alle Dateien generiert</string>
|
||||||
|
<string name="main_hash_scan_done">Alle %s Hashes wurden mit den Signatur-Datenbanken abgeglichen</string>
|
||||||
|
<string name="main_no_hashes_available">Keine %s Hash-Signaturen verfügbar</string>
|
||||||
|
<string name="main_scanning_done">Scan nach %s Sekunden abgeschlossen!</string>
|
||||||
|
</resources>
|
|
@ -17,4 +17,21 @@
|
||||||
<string name="lblNotificationRealtimeText">Known malware will be detected in realtime</string>
|
<string name="lblNotificationRealtimeText">Known malware will be detected in realtime</string>
|
||||||
<string name="lblNotificationRealtimeDetection">Malware Detected:</string>
|
<string name="lblNotificationRealtimeDetection">Malware Detected:</string>
|
||||||
<string name="lblRealtimeScannerToggle">Realtime Scanner</string>
|
<string name="lblRealtimeScannerToggle">Realtime Scanner</string>
|
||||||
|
|
||||||
|
<string name="main_database_updating">Updating %s databases...</string>
|
||||||
|
<string name="main_database_downloading">Downloading %s</string>
|
||||||
|
<string name="main_database_download_success">Successfully downloaded</string>
|
||||||
|
<string name="main_database_download_error">File not downloaded, response code %s</string>
|
||||||
|
<string name="main_no_database_available">No database available, not scanning...</string>
|
||||||
|
<string name="main_database_not_changed">File not changed</string>
|
||||||
|
<string name="main_database_download_error_logcat">Failed to download, check logcat</string>
|
||||||
|
|
||||||
|
<string name="main_starting_scan">Starting scan...</string>
|
||||||
|
<string name="main_files_pending_scan">%s files pending scan</string>
|
||||||
|
<string name="main_database_loaded">Loaded database with %s signatures</string>
|
||||||
|
<string name="main_hashing_files">Hashing files...</string>
|
||||||
|
<string name="main_hashing_done">Calculated hashes for all files</string>
|
||||||
|
<string name="main_hash_scan_done">Checked all %s hashes against signature databases</string>
|
||||||
|
<string name="main_no_hashes_available">No %s hashes signatures available</string>
|
||||||
|
<string name="main_scanning_done">Scan completed in %s seconds!</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Add table
Reference in a new issue