diff --git a/app/src/main/java/com/beemdevelopment/aegis/importers/DatabaseImporter.java b/app/src/main/java/com/beemdevelopment/aegis/importers/DatabaseImporter.java
index 62d846fe..e29fd7ee 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/importers/DatabaseImporter.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/importers/DatabaseImporter.java
@@ -39,6 +39,7 @@ public abstract class DatabaseImporter {
_importers.add(new Definition("Battle.net Authenticator", BattleNetImporter.class, R.string.importer_help_battle_net_authenticator, true));
_importers.add(new Definition("Bitwarden", BitwardenImporter.class, R.string.importer_help_bitwarden, false));
_importers.add(new Definition("Duo", DuoImporter.class, R.string.importer_help_duo, true));
+ _importers.add(new Definition("Ente Auth", EnteAuthImporter.class, R.string.importer_help_ente_auth, false));
_importers.add(new Definition("FreeOTP (1.x)", FreeOtpImporter.class, R.string.importer_help_freeotp, true));
_importers.add(new Definition("FreeOTP+ (JSON)", FreeOtpPlusImporter.class, R.string.importer_help_freeotp_plus, true));
_importers.add(new Definition("Google Authenticator", GoogleAuthImporter.class, R.string.importer_help_google_authenticator, true));
diff --git a/app/src/main/java/com/beemdevelopment/aegis/importers/EnteAuthImporter.java b/app/src/main/java/com/beemdevelopment/aegis/importers/EnteAuthImporter.java
new file mode 100644
index 00000000..e9196b51
--- /dev/null
+++ b/app/src/main/java/com/beemdevelopment/aegis/importers/EnteAuthImporter.java
@@ -0,0 +1,32 @@
+package com.beemdevelopment.aegis.importers;
+
+import android.content.Context;
+
+import com.beemdevelopment.aegis.util.IOUtils;
+import com.topjohnwu.superuser.io.SuFile;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class EnteAuthImporter extends DatabaseImporter {
+ public EnteAuthImporter(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected SuFile getAppPath() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ protected State read(InputStream stream, boolean isInternal) throws DatabaseImporterException {
+ try {
+ byte[] bytes = IOUtils.readAll(stream);
+ GoogleAuthUriImporter importer = new GoogleAuthUriImporter(requireContext());
+ return importer.read(new ByteArrayInputStream(bytes), isInternal);
+ } catch (IOException e) {
+ throw new DatabaseImporterException(e);
+ }
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index da3ebea7..d0c13fe2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -519,6 +519,7 @@
Supply a Bitwarden export/backup file. Encrypted files are not supported.
Supply a copy of /data/data/com.blizzard.messenger/shared_prefs/com.blizzard.messenger.authenticator_preferences.xml, located in the internal storage directory of Battle.net Authenticator.
Supply a copy of /data/data/com.duosecurity.duomobile/files/duokit/accounts.json, located in the internal storage directory of DUO.
+ Supply an Ente Auth export file. Currently only unencrypted files are supported.
Supply a copy of /data/data/org.fedorahosted.freeotp/shared_prefs/tokens.xml, located in the internal storage directory of FreeOTP (1.x).
Supply a FreeOTP+ export file.
Only database files from Google Authenticator v5.10 and prior are supported.\n\nSupply a copy of /data/data/com.google.android.apps.authenticator2/databases/databases, located in the internal storage directory of Google Authenticator.
diff --git a/app/src/test/java/com/beemdevelopment/aegis/importers/DatabaseImporterTest.java b/app/src/test/java/com/beemdevelopment/aegis/importers/DatabaseImporterTest.java
index d376dfe3..146381a5 100644
--- a/app/src/test/java/com/beemdevelopment/aegis/importers/DatabaseImporterTest.java
+++ b/app/src/test/java/com/beemdevelopment/aegis/importers/DatabaseImporterTest.java
@@ -84,6 +84,12 @@ public class DatabaseImporterTest {
}
}
+ @Test
+ public void testImportEnteAuth() throws IOException, DatabaseImporterException, OtpInfoException {
+ List entries = importPlain(EnteAuthImporter.class, "ente_auth.txt");
+ checkImportedEntries(entries);
+ }
+
@Test
public void testImportWinAuth() throws IOException, DatabaseImporterException, OtpInfoException {
List entries = importPlain(WinAuthImporter.class, "plain.txt");
diff --git a/app/src/test/resources/com/beemdevelopment/aegis/importers/ente_auth.txt b/app/src/test/resources/com/beemdevelopment/aegis/importers/ente_auth.txt
new file mode 100644
index 00000000..8c52e62c
--- /dev/null
+++ b/app/src/test/resources/com/beemdevelopment/aegis/importers/ente_auth.txt
@@ -0,0 +1,7 @@
+otpauth://hotp/Air%20Canada:Benjamin?secret=KUVJJOM753IHTNDSZVCNKL7GII&issuer=Air+Canada&algorithm=SHA256&digits=7&counter=50&codeDisplay=%7B%22pinned%22%3Afalse%2C%22trashed%22%3Afalse%2C%22lastUsedAt%22%3A0%2C%22tapCount%22%3A0%2C%22tags%22%3A%5B%5D%7D
+otpauth://totp/Airbnb:Elijah?secret=7ELGJSGXNCCTV3O6LKJWYFV2RA&issuer=Airbnb&algorithm=SHA512&digits=8&period=50&codeDisplay=%7B%22pinned%22%3Afalse%2C%22trashed%22%3Afalse%2C%22lastUsedAt%22%3A0%2C%22tapCount%22%3A0%2C%22tags%22%3A%5B%5D%7D
+otpauth://steam/Boeing:Sophia?secret=JRZCL47CMXVOQMNPZR2F7J4RGI&issuer=Boeing&algorithm=SHA1&digits=5&period=30&codeDisplay=%7B%22pinned%22%3Afalse%2C%22trashed%22%3Afalse%2C%22lastUsedAt%22%3A0%2C%22tapCount%22%3A0%2C%22tags%22%3A%5B%5D%7D
+otpauth://totp/Deno:Mason?secret=4SJHB4GSD43FZBAI7C2HLRJGPQ&issuer=Deno&algorithm=SHA1&digits=6&period=30&codeDisplay=%7B%22pinned%22%3Afalse%2C%22trashed%22%3Afalse%2C%22lastUsedAt%22%3A0%2C%22tapCount%22%3A0%2C%22tags%22%3A%5B%5D%7D
+otpauth://hotp/Issuu:James?secret=YOOMIXWS5GN6RTBPUFFWKTW5M4&issuer=Issuu&algorithm=SHA1&digits=6&counter=1&codeDisplay=%7B%22pinned%22%3Afalse%2C%22trashed%22%3Afalse%2C%22lastUsedAt%22%3A0%2C%22tapCount%22%3A0%2C%22tags%22%3A%5B%5D%7D
+otpauth://totp/SPDX:James?secret=5OM4WOOGPLQEF6UGN3CPEOOLWU&issuer=SPDX&algorithm=SHA256&digits=7&period=20&codeDisplay=%7B%22pinned%22%3Afalse%2C%22trashed%22%3Afalse%2C%22lastUsedAt%22%3A0%2C%22tapCount%22%3A0%2C%22tags%22%3A%5B%5D%7D
+otpauth://hotp/WWE:Mason?algorithm=sha512&digits=8&issuer=WWE&period=30&secret=5VAML3X35THCEBVRLV24CGBKOY&counter=10300&codeDisplay=%7B%22pinned%22%3Afalse%2C%22trashed%22%3Afalse%2C%22lastUsedAt%22%3A0%2C%22tapCount%22%3A0%2C%22tags%22%3A%5B%5D%7D