diff --git a/app/src/main/java/me/impy/aegis/db/Database.java b/app/src/main/java/me/impy/aegis/db/Database.java index ef58dd5f..1580a47a 100644 --- a/app/src/main/java/me/impy/aegis/db/Database.java +++ b/app/src/main/java/me/impy/aegis/db/Database.java @@ -5,6 +5,7 @@ import org.json.JSONException; import org.json.JSONObject; import java.util.List; +import java.util.UUID; import me.impy.aegis.encoding.Base64Exception; import me.impy.aegis.otp.OtpInfoException; @@ -68,4 +69,8 @@ public class Database { public List getEntries() { return _entries.getList(); } + + public DatabaseEntry getEntryByUUID(UUID uuid) { + return _entries.getByUUID(uuid); + } } diff --git a/app/src/main/java/me/impy/aegis/db/DatabaseEntry.java b/app/src/main/java/me/impy/aegis/db/DatabaseEntry.java index 9a5fefe6..c83ecf01 100644 --- a/app/src/main/java/me/impy/aegis/db/DatabaseEntry.java +++ b/app/src/main/java/me/impy/aegis/db/DatabaseEntry.java @@ -64,6 +64,10 @@ public class DatabaseEntry implements Serializable { _info = OtpInfo.parseJson(obj.getString("type"), obj.getJSONObject("info")); } + public void resetUUID() { + _uuid = UUID.randomUUID(); + } + public UUID getUUID() { return _uuid; } diff --git a/app/src/main/java/me/impy/aegis/db/DatabaseEntryList.java b/app/src/main/java/me/impy/aegis/db/DatabaseEntryList.java index ec0ba801..14f2992e 100644 --- a/app/src/main/java/me/impy/aegis/db/DatabaseEntryList.java +++ b/app/src/main/java/me/impy/aegis/db/DatabaseEntryList.java @@ -19,19 +19,19 @@ public class DatabaseEntryList implements Iterable, Serializable } public void add(DatabaseEntry entry) { - if (tryGetByUUID(entry.getUUID()) != null) { + if (getByUUID(entry.getUUID()) != null) { throw new AssertionError("entry found with the same uuid"); } _entries.add(entry); } public void remove(DatabaseEntry entry) { - entry = getByUUID(entry.getUUID()); + entry = mustGetByUUID(entry.getUUID()); _entries.remove(entry); } public void replace(DatabaseEntry newEntry) { - DatabaseEntry oldEntry = getByUUID(newEntry.getUUID()); + DatabaseEntry oldEntry = mustGetByUUID(newEntry.getUUID()); _entries.set(_entries.indexOf(oldEntry), newEntry); } @@ -43,7 +43,7 @@ public class DatabaseEntryList implements Iterable, Serializable return Collections.unmodifiableList(_entries); } - private DatabaseEntry tryGetByUUID(UUID uuid) { + public DatabaseEntry getByUUID(UUID uuid) { for (DatabaseEntry entry : _entries) { if (entry.getUUID().equals(uuid)) { return entry; @@ -52,8 +52,8 @@ public class DatabaseEntryList implements Iterable, Serializable return null; } - private DatabaseEntry getByUUID(UUID uuid) { - DatabaseEntry entry = tryGetByUUID(uuid); + private DatabaseEntry mustGetByUUID(UUID uuid) { + DatabaseEntry entry = getByUUID(uuid); if (entry == null) { throw new AssertionError("no entry found with the same uuid"); } diff --git a/app/src/main/java/me/impy/aegis/db/DatabaseManager.java b/app/src/main/java/me/impy/aegis/db/DatabaseManager.java index 9f7939c1..e7c66a7c 100644 --- a/app/src/main/java/me/impy/aegis/db/DatabaseManager.java +++ b/app/src/main/java/me/impy/aegis/db/DatabaseManager.java @@ -11,6 +11,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; +import java.util.UUID; import me.impy.aegis.BuildConfig; import me.impy.aegis.crypto.MasterKey; @@ -187,6 +188,11 @@ public class DatabaseManager { return _db.getEntries(); } + public DatabaseEntry getEntryByUUID(UUID uuid) { + assertState(false, true); + return _db.getEntryByUUID(uuid); + } + public MasterKey getMasterKey() { assertState(false, true); return _key; diff --git a/app/src/main/java/me/impy/aegis/ui/PreferencesFragment.java b/app/src/main/java/me/impy/aegis/ui/PreferencesFragment.java index a5efb4ff..e2f82e40 100644 --- a/app/src/main/java/me/impy/aegis/ui/PreferencesFragment.java +++ b/app/src/main/java/me/impy/aegis/ui/PreferencesFragment.java @@ -7,9 +7,7 @@ import android.content.Intent; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Bundle; -import android.support.v7.preference.EditTextPreference; import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; import android.support.v7.preference.Preference; import com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat; import android.view.Window; @@ -315,6 +313,11 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Pas private void importDatabase(DatabaseImporter importer) throws DatabaseImporterException { List entries = importer.convert(); for (DatabaseEntry entry : entries) { + // temporary: randomize the UUID of duplicate entries and add them anyway + if (_db.getEntryByUUID(entry.getUUID()) != null) { + entry.resetUUID(); + } + _db.addEntry(entry); }