diff --git a/app/src/flipper/java/org/thoughtcrime/securesms/database/FlipperSqlCipherAdapter.java b/app/src/flipper/java/org/thoughtcrime/securesms/database/FlipperSqlCipherAdapter.java index a15dfb1294..6e68db8a25 100644 --- a/app/src/flipper/java/org/thoughtcrime/securesms/database/FlipperSqlCipherAdapter.java +++ b/app/src/flipper/java/org/thoughtcrime/securesms/database/FlipperSqlCipherAdapter.java @@ -45,11 +45,13 @@ public class FlipperSqlCipherAdapter extends DatabaseDriver events) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = getWritableDatabase(); db.beginTransaction(); try { @@ -63,14 +116,14 @@ public class MegaphoneDatabase extends Database { } public @NonNull List getAllAndDeleteMissing() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = getWritableDatabase(); List records = new ArrayList<>(); db.beginTransaction(); try { Set missingKeys = new HashSet<>(); - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null)) { + try (Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null)) { while (cursor != null && cursor.moveToNext()) { String event = cursor.getString(cursor.getColumnIndexOrThrow(EVENT)); int seenCount = cursor.getInt(cursor.getColumnIndexOrThrow(SEEN_COUNT)); @@ -91,7 +144,7 @@ public class MegaphoneDatabase extends Database { String query = EVENT + " = ?"; String[] args = new String[]{missing}; - databaseHelper.getWritableDatabase().delete(TABLE_NAME, query, args); + db.delete(TABLE_NAME, query, args); } db.setTransactionSuccessful(); @@ -109,7 +162,7 @@ public class MegaphoneDatabase extends Database { ContentValues values = new ContentValues(); values.put(FIRST_VISIBLE, time); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, query, args); + getWritableDatabase().update(TABLE_NAME, values, query, args); } public void markSeen(@NonNull Event event, int seenCount, long lastSeen) { @@ -120,7 +173,7 @@ public class MegaphoneDatabase extends Database { values.put(SEEN_COUNT, seenCount); values.put(LAST_SEEN, lastSeen); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, query, args); + getWritableDatabase().update(TABLE_NAME, values, query, args); } public void markFinished(@NonNull Event event) { @@ -130,13 +183,38 @@ public class MegaphoneDatabase extends Database { ContentValues values = new ContentValues(); values.put(FINISHED, 1); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, query, args); + getWritableDatabase().update(TABLE_NAME, values, query, args); } public void delete(@NonNull Event event) { String query = EVENT + " = ?"; String[] args = new String[]{event.getKey()}; - databaseHelper.getWritableDatabase().delete(TABLE_NAME, query, args); + getWritableDatabase().delete(TABLE_NAME, query, args); + } + + private @NonNull SQLiteDatabase getWritableDatabase() { + return getWritableDatabase(databaseSecret.asString()); + } + + @Override + public @NonNull SQLiteDatabase getSqlCipherDatabase() { + return getWritableDatabase(); + } + + private static void migrateDataFromPreviousDatabase(@NonNull SQLiteDatabase oldDb, @NonNull SQLiteDatabase newDb) { + try (Cursor cursor = oldDb.rawQuery("SELECT * FROM megaphone", null)) { + while (cursor.moveToNext()) { + ContentValues values = new ContentValues(); + + values.put(EVENT, CursorUtil.requireString(cursor, "event")); + values.put(SEEN_COUNT, CursorUtil.requireInt(cursor, "seen_count")); + values.put(LAST_SEEN, CursorUtil.requireLong(cursor, "last_seen")); + values.put(FIRST_VISIBLE, CursorUtil.requireLong(cursor, "first_visible")); + values.put(FINISHED, CursorUtil.requireInt(cursor, "finished")); + + newDb.insert(TABLE_NAME, null, values); + } + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherDatabaseHook.java b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherDatabaseHook.java new file mode 100644 index 0000000000..88e5c7351f --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherDatabaseHook.java @@ -0,0 +1,22 @@ +package org.thoughtcrime.securesms.database; + +import net.sqlcipher.database.SQLiteDatabase; +import net.sqlcipher.database.SQLiteDatabaseHook; + +/** + * Standard hook for setting common SQLCipher PRAGMAs. + */ +public final class SqlCipherDatabaseHook implements SQLiteDatabaseHook { + + @Override + public void preKey(SQLiteDatabase db) { + db.rawExecSQL("PRAGMA cipher_default_kdf_iter = 1;"); + db.rawExecSQL("PRAGMA cipher_default_page_size = 4096;"); + } + + @Override + public void postKey(SQLiteDatabase db) { + db.rawExecSQL("PRAGMA kdf_iter = '1';"); + db.rawExecSQL("PRAGMA cipher_page_size = 4096;"); + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java index 1348aaa622..b231b2a44a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java @@ -44,6 +44,7 @@ import org.thoughtcrime.securesms.database.SessionDatabase; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.SignedPreKeyDatabase; import org.thoughtcrime.securesms.database.SmsDatabase; +import org.thoughtcrime.securesms.database.SqlCipherDatabaseHook; import org.thoughtcrime.securesms.database.StickerDatabase; import org.thoughtcrime.securesms.database.StorageKeyDatabase; import org.thoughtcrime.securesms.database.ThreadDatabase; @@ -174,19 +175,7 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab private final DatabaseSecret databaseSecret; public SQLCipherOpenHelper(@NonNull Context context, @NonNull DatabaseSecret databaseSecret) { - super(context, DATABASE_NAME, null, DATABASE_VERSION, new SQLiteDatabaseHook() { - @Override - public void preKey(SQLiteDatabase db) { - db.rawExecSQL("PRAGMA cipher_default_kdf_iter = 1;"); - db.rawExecSQL("PRAGMA cipher_default_page_size = 4096;"); - } - - @Override - public void postKey(SQLiteDatabase db) { - db.rawExecSQL("PRAGMA kdf_iter = '1';"); - db.rawExecSQL("PRAGMA cipher_page_size = 4096;"); - } - }); + super(context, DATABASE_NAME, null, DATABASE_VERSION, new SqlCipherDatabaseHook()); this.context = context.getApplicationContext(); this.databaseSecret = databaseSecret; @@ -209,7 +198,6 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab db.execSQL(SessionDatabase.CREATE_TABLE); db.execSQL(StickerDatabase.CREATE_TABLE); db.execSQL(StorageKeyDatabase.CREATE_TABLE); - db.execSQL(MegaphoneDatabase.CREATE_TABLE); db.execSQL(MentionDatabase.CREATE_TABLE); executeStatements(db, SearchDatabase.CREATE_TABLE); executeStatements(db, JobDatabase.CREATE_TABLE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java index 89398d5381..81dd63d7b1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java @@ -39,7 +39,7 @@ public class MegaphoneRepository { public MegaphoneRepository(@NonNull Application context) { this.context = context; this.executor = SignalExecutors.SERIAL; - this.database = DatabaseFactory.getMegaphoneDatabase(context); + this.database = MegaphoneDatabase.getInstance(context); this.databaseCache = new HashMap<>(); executor.execute(this::init);