From 214e994e90f960f1d3742ae4e2333f080f45dda6 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 18 Aug 2021 10:16:54 -0400 Subject: [PATCH] Update to SQLCipher with true WAL support. --- app/build.gradle | 8 +- app/proguard/proguard-sqlite.pro | 5 +- .../database/FlipperSqlCipherAdapter.java | 6 +- .../securesms/backup/FullBackupExporter.java | 2 +- .../securesms/backup/FullBackupImporter.java | 2 +- .../database/AttachmentDatabase.java | 90 ++++++------ .../securesms/database/ChatColorsDatabase.kt | 10 +- .../securesms/database/DatabaseFactory.java | 30 ++-- .../securesms/database/DraftDatabase.java | 12 +- .../database/EmojiSearchDatabase.java | 7 +- .../securesms/database/GroupDatabase.java | 78 +++++----- .../database/GroupReceiptDatabase.java | 17 ++- .../securesms/database/IdentityDatabase.java | 16 +-- .../securesms/database/JobDatabase.java | 27 ++-- .../securesms/database/KeyValueDatabase.java | 27 ++-- .../database/LocalMetricsDatabase.kt | 23 +-- .../securesms/database/LogDatabase.kt | 21 +-- .../securesms/database/MediaDatabase.java | 10 +- .../securesms/database/MegaphoneDatabase.java | 21 ++- .../securesms/database/MentionDatabase.java | 14 +- .../securesms/database/MessageDatabase.java | 28 ++-- .../database/MessageSendLogDatabase.kt | 14 +- .../securesms/database/MmsDatabase.java | 82 +++++------ .../securesms/database/MmsSmsDatabase.java | 14 +- .../database/OneTimePreKeyDatabase.java | 6 +- .../securesms/database/PaymentDatabase.java | 22 +-- .../database/PendingRetryReceiptDatabase.java | 8 +- .../securesms/database/PushDatabase.java | 14 +- .../securesms/database/RecipientDatabase.java | 133 +++++++++--------- .../database/RemappedRecordsDatabase.java | 11 +- .../securesms/database/SQLiteDatabase.java | 49 ++----- .../securesms/database/SearchDatabase.java | 7 +- .../securesms/database/SenderKeyDatabase.java | 10 +- .../database/SenderKeySharedDatabase.java | 14 +- .../securesms/database/SessionDatabase.java | 18 +-- .../securesms/database/SignalDatabase.java | 4 +- .../database/SignedPreKeyDatabase.java | 8 +- .../securesms/database/SmsDatabase.java | 88 ++++++------ .../securesms/database/SmsMigrator.java | 2 +- .../database/SqlCipherDatabaseHook.java | 22 ++- .../database/SqlCipherErrorHandler.java | 4 +- .../database/SqlCipherLibraryLoader.kt | 3 +- .../securesms/database/StickerDatabase.java | 32 ++--- .../securesms/database/ThreadDatabase.java | 98 ++++++------- .../database/UnknownStorageIdDatabase.java | 17 +-- .../helpers/PreKeyMigrationHelper.java | 2 +- .../helpers/RecipientIdCleanupHelper.java | 2 +- .../helpers/RecipientIdMigrationHelper.java | 2 +- .../helpers/SQLCipherMigrationHelper.java | 10 +- .../database/helpers/SQLCipherOpenHelper.java | 56 +++++--- .../helpers/SessionStoreMigrationHelper.java | 2 +- .../database/model/AvatarPickerDatabase.kt | 12 +- .../newdevice/NewDeviceServerTask.java | 2 +- .../securesms/jobs/StorageSyncJob.java | 2 +- .../recipients/LiveRecipientCache.java | 2 +- .../fragments/RestoreBackupFragment.java | 2 +- .../thoughtcrime/securesms/util/SqlUtil.java | 2 +- .../securesms/MockAppDataInitializer.java | 2 +- app/witness-verifications.gradle | 6 +- 59 files changed, 610 insertions(+), 628 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c411aaf02a..e372a683ad 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,6 +23,12 @@ repositories { includeGroupByRegex "com\\.github\\.dmytrodanylyk\\.circular-progress-button\\.*" } } + maven { + url "https://raw.github.com/signalapp/maven/master/sqlcipher/release/" + content { + includeGroupByRegex "org\\.signal.*" + } + } maven { // textdrawable url 'https://dl.bintray.com/amulyakhare/maven' content { @@ -485,7 +491,7 @@ dependencies { implementation 'com.codewaves.stickyheadergrid:stickyheadergrid:0.9.4' implementation 'com.github.dmytrodanylyk.circular-progress-button:library:1.1.3-S2' - implementation "net.zetetic:android-database-sqlcipher:4.4.3" + implementation 'org.signal:android-database-sqlcipher:4.4.3-S1' implementation "androidx.sqlite:sqlite:2.1.0" implementation ('com.googlecode.ez-vcard:ez-vcard:0.9.11') { diff --git a/app/proguard/proguard-sqlite.pro b/app/proguard/proguard-sqlite.pro index b7837ef87b..3626fa180e 100644 --- a/app/proguard/proguard-sqlite.pro +++ b/app/proguard/proguard-sqlite.pro @@ -2,4 +2,7 @@ -keep class org.sqlite.database.** { *; } -keep class net.sqlcipher.** { *; } --dontwarn net.sqlcipher.** \ No newline at end of file +-dontwarn net.sqlcipher.** + +-keep class net.zetetic.** { *; } +-dontwarn net.zetetic.** 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 43a6bc8e4b..df7819053a 100644 --- a/app/src/flipper/java/org/thoughtcrime/securesms/database/FlipperSqlCipherAdapter.java +++ b/app/src/flipper/java/org/thoughtcrime/securesms/database/FlipperSqlCipherAdapter.java @@ -11,9 +11,9 @@ import androidx.annotation.Nullable; import com.facebook.flipper.plugins.databases.DatabaseDescriptor; import com.facebook.flipper.plugins.databases.DatabaseDriver; -import net.sqlcipher.DatabaseUtils; -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteStatement; +import net.zetetic.database.DatabaseUtils; +import net.zetetic.database.sqlcipher.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteStatement; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java index 81ad11f5ce..a7fec0f3e4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java @@ -13,7 +13,7 @@ import androidx.documentfile.provider.DocumentFile; import com.annimon.stream.function.Predicate; import com.google.protobuf.ByteString; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.greenrobot.eventbus.EventBus; import org.signal.core.util.Conversions; diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupImporter.java b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupImporter.java index 9fb8b43ef7..6c219e5371 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupImporter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupImporter.java @@ -11,7 +11,7 @@ import android.util.Pair; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.greenrobot.eventbus.EventBus; import org.signal.core.util.Conversions; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java index dd985fff39..706854f74a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java @@ -212,7 +212,7 @@ public class AttachmentDatabase extends Database { String selection = STICKER_PACK_ID + " = ?"; String[] args = new String[] { stickerPackId }; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, null, "1")) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, null, "1")) { return cursor != null && cursor.moveToFirst(); } } @@ -220,7 +220,7 @@ public class AttachmentDatabase extends Database { public void setTransferProgressFailed(AttachmentId attachmentId, long mmsId) throws MmsException { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(); values.put(TRANSFER_STATE, TRANSFER_PROGRESS_FAILED); @@ -230,8 +230,8 @@ public class AttachmentDatabase extends Database { public @Nullable DatabaseAttachment getAttachment(@NonNull AttachmentId attachmentId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); - Cursor cursor = null; + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); + Cursor cursor = null; try { cursor = database.query(TABLE_NAME, PROJECTION, PART_ID_WHERE, attachmentId.toStrings(), null, null, null); @@ -252,7 +252,7 @@ public class AttachmentDatabase extends Database { } public @NonNull List getAttachmentsForMessage(long mmsId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); Cursor cursor = null; @@ -276,7 +276,7 @@ public class AttachmentDatabase extends Database { return Collections.emptyMap(); } - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); SqlUtil.Query query = SqlUtil.buildCollectionQuery(MMS_ID, mmsIds); Map> output = new HashMap<>(); @@ -299,7 +299,7 @@ public class AttachmentDatabase extends Database { } public boolean hasAttachment(@NonNull AttachmentId id) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, new String[]{ROW_ID, UNIQUE_ID}, @@ -319,13 +319,13 @@ public class AttachmentDatabase extends Database { String selection = MMS_ID + " = ? AND (" + DATA + " NOT NULL OR " + TRANSFER_STATE + " != ?)"; String[] args = new String[] { String.valueOf(mmsId), String.valueOf(TRANSFER_PROGRESS_DONE) }; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, "1")) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, "1")) { return cursor != null && cursor.moveToFirst(); } } public @NonNull List getPendingAttachments() { - final SQLiteDatabase database = databaseHelper.getReadableDatabase(); + final SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); final List attachments = new LinkedList<>(); Cursor cursor = null; @@ -345,8 +345,8 @@ public class AttachmentDatabase extends Database { public void deleteAttachmentsForMessage(long mmsId) { Log.d(TAG, "[deleteAttachmentsForMessage] mmsId: " + mmsId); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); - Cursor cursor = null; + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); + Cursor cursor = null; try { cursor = database.query(TABLE_NAME, new String[] {DATA, CONTENT_TYPE, ROW_ID, UNIQUE_ID}, MMS_ID + " = ?", @@ -375,10 +375,10 @@ public class AttachmentDatabase extends Database { * pre-uploaded. */ public int deleteAbandonedPreuploadedAttachments() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); - String query = MMS_ID + " = ?"; - String[] args = new String[] { String.valueOf(PREUPLOAD_MESSAGE_ID) }; - int count = 0; + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); + String query = MMS_ID + " = ?"; + String[] args = new String[] { String.valueOf(PREUPLOAD_MESSAGE_ID) }; + int count = 0; try (Cursor cursor = db.query(TABLE_NAME, null, query, args, null, null, null)) { while (cursor != null && cursor.moveToNext()) { @@ -397,8 +397,8 @@ public class AttachmentDatabase extends Database { public void deleteAttachmentFilesForViewOnceMessage(long mmsId) { Log.d(TAG, "[deleteAttachmentFilesForViewOnceMessage] mmsId: " + mmsId); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); - Cursor cursor = null; + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); + Cursor cursor = null; try { cursor = database.query(TABLE_NAME, new String[] {DATA, CONTENT_TYPE, ROW_ID, UNIQUE_ID}, MMS_ID + " = ?", @@ -440,7 +440,7 @@ public class AttachmentDatabase extends Database { public void deleteAttachment(@NonNull AttachmentId id) { Log.d(TAG, "[deleteAttachment] attachmentId: " + id); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, new String[]{DATA, CONTENT_TYPE}, @@ -464,7 +464,7 @@ public class AttachmentDatabase extends Database { } public void trimAllAbandonedAttachments() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String selectAllMmsIds = "SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME; String where = MMS_ID + " != " + PREUPLOAD_MESSAGE_ID + " AND " + MMS_ID + " NOT IN (" + selectAllMmsIds + ")"; @@ -483,7 +483,7 @@ public class AttachmentDatabase extends Database { filesOnDisk.add(file.getAbsolutePath()); } - try (Cursor cursor = databaseHelper.getReadableDatabase().query(true, TABLE_NAME, new String[] { DATA }, null, null, null, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(true, TABLE_NAME, new String[] { DATA }, null, null, null, null, null, null)) { while (cursor != null && cursor.moveToNext()) { filesInDb.add(CursorUtil.requireString(cursor, DATA)); } @@ -503,7 +503,7 @@ public class AttachmentDatabase extends Database { @SuppressWarnings("ResultOfMethodCallIgnored") void deleteAllAttachments() { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.delete(TABLE_NAME, null, null); FileUtils.deleteDirectoryContents(context.getDir(DIRECTORY, Context.MODE_PRIVATE)); @@ -532,7 +532,7 @@ public class AttachmentDatabase extends Database { if (removableWeakReferences.size() > 0) { Log.i(TAG, String.format(Locale.US, "[deleteAttachmentOnDisk] Deleting %d weak references for %s", removableWeakReferences.size(), data)); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); int deletedCount = 0; database.beginTransaction(); try { @@ -568,7 +568,7 @@ public class AttachmentDatabase extends Database { private @NonNull DataUsageResult getAttachmentFileUsages(@Nullable String data, @NonNull AttachmentId attachmentId) { if (data == null) return DataUsageResult.NOT_IN_USE; - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String selection = DATA + " = ? AND " + UNIQUE_ID + " != ? AND " + ROW_ID + " != ?"; String[] args = {data, Long.toString(attachmentId.getUniqueId()), Long.toString(attachmentId.getRowId())}; List quoteRows = new LinkedList<>(); @@ -591,11 +591,11 @@ public class AttachmentDatabase extends Database { throws MmsException { DatabaseAttachment placeholder = getAttachment(attachmentId); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(); DataInfo oldInfo = getAttachmentDataFileInfo(attachmentId, DATA); DataInfo dataInfo = setAttachmentData(inputStream, attachmentId); - File transferFile = getTransferFile(databaseHelper.getReadableDatabase(), attachmentId); + File transferFile = getTransferFile(databaseHelper.getSignalReadableDatabase(), attachmentId); if (oldInfo != null) { updateAttachmentDataHash(database, oldInfo.hash, dataInfo); @@ -646,7 +646,7 @@ public class AttachmentDatabase extends Database { throw new MmsException("Cannot find attachment for source!"); } - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); DataInfo sourceDataInfo = getAttachmentDataFileInfo(sourceId, DATA); if (sourceDataInfo == null) { @@ -680,11 +680,11 @@ public class AttachmentDatabase extends Database { ContentValues values = new ContentValues(1); values.put(CAPTION, caption); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, PART_ID_WHERE, id.toStrings()); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, PART_ID_WHERE, id.toStrings()); } public void updateDisplayOrder(@NonNull Map orderMap) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -692,7 +692,7 @@ public class AttachmentDatabase extends Database { ContentValues values = new ContentValues(1); values.put(DISPLAY_ORDER, entry.getValue()); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, PART_ID_WHERE, entry.getKey().toStrings()); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, PART_ID_WHERE, entry.getKey().toStrings()); } db.setTransactionSuccessful(); @@ -703,7 +703,7 @@ public class AttachmentDatabase extends Database { } public void updateAttachmentAfterUpload(@NonNull AttachmentId id, @NonNull Attachment attachment, long uploadTimestamp) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); DataInfo dataInfo = getAttachmentDataFileInfo(id, DATA); ContentValues values = new ContentValues(); @@ -744,7 +744,7 @@ public class AttachmentDatabase extends Database { } public void updateMessageId(@NonNull Collection attachmentIds, long mmsId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -792,7 +792,7 @@ public class AttachmentDatabase extends Database { boolean onlyModifyThisAttachment) throws MmsException, IOException { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); DataInfo oldDataInfo = getAttachmentDataFileInfo(databaseAttachment.getAttachmentId(), DATA); if (oldDataInfo == null) { @@ -830,7 +830,7 @@ public class AttachmentDatabase extends Database { * Returns false if the file is referenced by zero or one attachments. */ private boolean fileReferencedByMoreThanOneAttachment(@NonNull File file) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String selection = DATA + " = ?"; String[] args = new String[]{file.getAbsolutePath()}; @@ -854,12 +854,12 @@ public class AttachmentDatabase extends Database { ContentValues contentValues = new ContentValues(); contentValues.put(TRANSFORM_PROPERTIES, transformProperties.serialize()); - int updateCount = updateAttachmentAndMatchingHashes(databaseHelper.getWritableDatabase(), attachmentId, dataInfo.hash, contentValues); + int updateCount = updateAttachmentAndMatchingHashes(databaseHelper.getSignalWritableDatabase(), attachmentId, dataInfo.hash, contentValues); Log.i(TAG, "[updateAttachmentTransformProperties] Updated " + updateCount + " rows."); } public @NonNull File getOrCreateTransferFile(@NonNull AttachmentId attachmentId) throws IOException { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); File existing = getTransferFile(db, attachmentId); if (existing != null) { @@ -923,7 +923,7 @@ public class AttachmentDatabase extends Database { public void updateAttachmentFileName(@NonNull AttachmentId attachmentId, @Nullable String fileName) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(1); contentValues.put(FILE_NAME, StorageUtil.getCleanFileName(fileName)); @@ -933,7 +933,7 @@ public class AttachmentDatabase extends Database { public void markAttachmentUploaded(long messageId, Attachment attachment) { ContentValues values = new ContentValues(1); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); values.put(TRANSFER_STATE, TRANSFER_PROGRESS_DONE); database.update(TABLE_NAME, values, PART_ID_WHERE, ((DatabaseAttachment)attachment).getAttachmentId().toStrings()); @@ -951,7 +951,7 @@ public class AttachmentDatabase extends Database { public void setTransferState(long messageId, @NonNull AttachmentId attachmentId, int transferState) { final ContentValues values = new ContentValues(1); - final SQLiteDatabase database = databaseHelper.getWritableDatabase(); + final SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); values.put(TRANSFER_STATE, transferState); database.update(TABLE_NAME, values, PART_ID_WHERE, attachmentId.toStrings()); @@ -972,13 +972,13 @@ public class AttachmentDatabase extends Database { "SELECT DISTINCT " + StickerDatabase.PACK_ID + " FROM " + StickerDatabase.TABLE_NAME + ")"; - return databaseHelper.getReadableDatabase().rawQuery(query, null); + return databaseHelper.getSignalReadableDatabase().rawQuery(query, null); } public boolean hasStickerAttachments() { String selection = STICKER_PACK_ID + " NOT NULL"; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, selection, null, null, null, null, "1")) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, selection, null, null, null, null, "1")) { return cursor != null && cursor.moveToFirst(); } } @@ -1015,7 +1015,7 @@ public class AttachmentDatabase extends Database { private @Nullable DataInfo getAttachmentDataFileInfo(@NonNull AttachmentId attachmentId, @NonNull String dataType) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); Cursor cursor = null; try { @@ -1082,7 +1082,7 @@ public class AttachmentDatabase extends Database { long length = StreamUtil.copy(digestInputStream, out.second); String hash = Base64.encodeBytes(digestInputStream.getMessageDigest().digest()); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); Optional sharedDataInfo = findDuplicateDataFileInfo(database, hash, attachmentId); if (sharedDataInfo.isPresent()) { Log.i(TAG, "[setAttachmentData] Duplicate data file found! " + sharedDataInfo.get().file.getAbsolutePath()); @@ -1248,7 +1248,7 @@ public class AttachmentDatabase extends Database { throws MmsException { Log.d(TAG, "Inserting attachment for mms id: " + mmsId); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.beginTransaction(); try { @@ -1343,7 +1343,7 @@ public class AttachmentDatabase extends Database { String selection = DATA_HASH + " = ?"; String[] args = new String[] { dataHash }; - try (Cursor cursor = databaseHelper.getWritableDatabase().query(TABLE_NAME, null, selection, args, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalWritableDatabase().query(TABLE_NAME, null, selection, args, null, null, null)) { if (cursor != null && cursor.moveToFirst()) { return getAttachments(cursor).get(0); } @@ -1356,7 +1356,7 @@ public class AttachmentDatabase extends Database { public void writeAudioHash(@NonNull AttachmentId attachmentId, @Nullable AudioWaveFormData audioWaveForm) { Log.i(TAG, "updating part audio wave form for #" + attachmentId); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(1); if (audioWaveForm != null) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ChatColorsDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ChatColorsDatabase.kt index df46841b41..7047743847 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ChatColorsDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ChatColorsDatabase.kt @@ -28,7 +28,7 @@ class ChatColorsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) } fun getById(chatColorsId: ChatColors.Id): ChatColors { - val db = databaseHelper.readableDatabase + val db = databaseHelper.signalReadableDatabase val projection = arrayOf(ID, CHAT_COLORS) val args = SqlUtil.buildArgs(chatColorsId.longValue) @@ -51,7 +51,7 @@ class ChatColorsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) } fun getSavedChatColors(): List { - val db = databaseHelper.readableDatabase + val db = databaseHelper.signalReadableDatabase val projection = arrayOf(ID, CHAT_COLORS) val result = mutableListOf() @@ -69,7 +69,7 @@ class ChatColorsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) throw IllegalArgumentException("Bad chat colors to insert.") } - val db: SQLiteDatabase = databaseHelper.writableDatabase + val db: SQLiteDatabase = databaseHelper.signalWritableDatabase val values = ContentValues(1).apply { put(CHAT_COLORS, chatColors.serialize().toByteArray()) } @@ -89,7 +89,7 @@ class ChatColorsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) throw IllegalArgumentException("Bad chat colors to update.") } - val db: SQLiteDatabase = databaseHelper.writableDatabase + val db: SQLiteDatabase = databaseHelper.signalWritableDatabase val values = ContentValues(1).apply { put(CHAT_COLORS, chatColors.serialize().toByteArray()) } @@ -115,7 +115,7 @@ class ChatColorsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) throw IllegalArgumentException("Cannot delete this chat color") } - val db: SQLiteDatabase = databaseHelper.writableDatabase + val db: SQLiteDatabase = databaseHelper.signalWritableDatabase db.delete(TABLE_NAME, ID_WHERE, SqlUtil.buildArgs(chatColors.id.longValue)) if (SignalStore.chatColorsValues().chatColors?.id == chatColors.id) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java index 54ab1ac8b3..19f3a40b59 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java @@ -20,7 +20,7 @@ import android.content.Context; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.thoughtcrime.securesms.contacts.ContactsDatabase; import org.thoughtcrime.securesms.crypto.AttachmentSecret; @@ -206,8 +206,8 @@ public class DatabaseFactory { return getInstance(context).avatarPickerDatabase; } - public static SQLiteDatabase getBackupDatabase(Context context) { - return getInstance(context).databaseHelper.getReadableDatabase().getSqlCipherDatabase(); + public static net.zetetic.database.sqlcipher.SQLiteDatabase getBackupDatabase(Context context) { + return getInstance(context).databaseHelper.getRawReadableDatabase(); } public static void upgradeRestored(Context context, SQLiteDatabase database){ @@ -217,11 +217,11 @@ public class DatabaseFactory { getInstance(context).sms.deleteAbandonedMessages(); getInstance(context).mms.deleteAbandonedMessages(); getInstance(context).mms.trimEntriesForExpiredMessages(); - getInstance(context).getRawDatabase().rawExecSQL("DROP TABLE IF EXISTS key_value"); - getInstance(context).getRawDatabase().rawExecSQL("DROP TABLE IF EXISTS megaphone"); - getInstance(context).getRawDatabase().rawExecSQL("DROP TABLE IF EXISTS job_spec"); - getInstance(context).getRawDatabase().rawExecSQL("DROP TABLE IF EXISTS constraint_spec"); - getInstance(context).getRawDatabase().rawExecSQL("DROP TABLE IF EXISTS dependency_spec"); + getInstance(context).getRawDatabase().execSQL("DROP TABLE IF EXISTS key_value"); + getInstance(context).getRawDatabase().execSQL("DROP TABLE IF EXISTS megaphone"); + getInstance(context).getRawDatabase().execSQL("DROP TABLE IF EXISTS job_spec"); + getInstance(context).getRawDatabase().execSQL("DROP TABLE IF EXISTS constraint_spec"); + getInstance(context).getRawDatabase().execSQL("DROP TABLE IF EXISTS dependency_spec"); instance.databaseHelper.close(); instance = null; @@ -229,7 +229,7 @@ public class DatabaseFactory { } public static boolean inTransaction(Context context) { - return getInstance(context).databaseHelper.getWritableDatabase().inTransaction(); + return getInstance(context).databaseHelper.getSignalWritableDatabase().inTransaction(); } private DatabaseFactory(@NonNull Context context) { @@ -273,7 +273,7 @@ public class DatabaseFactory { public void onApplicationLevelUpgrade(@NonNull Context context, @NonNull MasterSecret masterSecret, int fromVersion, LegacyMigrationJob.DatabaseUpgradeListener listener) { - databaseHelper.getWritableDatabase(); + databaseHelper.getSignalWritableDatabase(); ClassicOpenHelper legacyOpenHelper = null; @@ -289,20 +289,20 @@ public class DatabaseFactory { SQLCipherMigrationHelper.migrateCiphertext(context, masterSecret, legacyOpenHelper.getWritableDatabase(), - databaseHelper.getWritableDatabase().getSqlCipherDatabase(), + databaseHelper.getRawWritableDatabase(), listener); } } public void triggerDatabaseAccess() { - databaseHelper.getWritableDatabase(); + databaseHelper.getSignalWritableDatabase(); } - public SQLiteDatabase getRawDatabase() { - return databaseHelper.getWritableDatabase().getSqlCipherDatabase(); + public net.zetetic.database.sqlcipher.SQLiteDatabase getRawDatabase() { + return databaseHelper.getRawWritableDatabase(); } public boolean hasTable(String table) { - return SqlUtil.tableExists(databaseHelper.getReadableDatabase().getSqlCipherDatabase(), table); + return SqlUtil.tableExists(databaseHelper.getRawReadableDatabase(), table); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DraftDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/DraftDatabase.java index 1aacdfcd42..c378bb0171 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DraftDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DraftDatabase.java @@ -40,7 +40,7 @@ public class DraftDatabase extends Database { } public void replaceDrafts(long threadId, List drafts) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); try { db.beginTransaction(); @@ -64,13 +64,13 @@ public class DraftDatabase extends Database { } public void clearDrafts(long threadId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); int deletedRowCount = db.delete(TABLE_NAME, THREAD_ID + " = ?", SqlUtil.buildArgs(threadId)); Log.d(TAG, "[clearDrafts] Deleted " + deletedRowCount + " rows for thread " + threadId); } void clearDrafts(Set threadIds) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); StringBuilder where = new StringBuilder(); List arguments = new LinkedList<>(); @@ -86,12 +86,12 @@ public class DraftDatabase extends Database { } void clearAllDrafts() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, null, null); } public Drafts getDrafts(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Drafts results = new Drafts(); try (Cursor cursor = db.query(TABLE_NAME, null, THREAD_ID + " = ?", new String[] {threadId+""}, null, null, null)) { @@ -107,7 +107,7 @@ public class DraftDatabase extends Database { } public @NonNull Drafts getAllVoiceNoteDrafts() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Drafts results = new Drafts(); String where = DRAFT_TYPE + " = ?"; String[] args = SqlUtil.buildArgs(Draft.VOICE_NOTE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/EmojiSearchDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/EmojiSearchDatabase.java index 5afbaf463b..554f0d3de5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/EmojiSearchDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/EmojiSearchDatabase.java @@ -7,8 +7,6 @@ import android.text.TextUtils; import androidx.annotation.NonNull; -import com.annimon.stream.Stream; - import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.EmojiSearchData; import org.thoughtcrime.securesms.util.CursorUtil; @@ -17,7 +15,6 @@ import org.thoughtcrime.securesms.util.SqlUtil; import java.util.LinkedList; import java.util.List; -import java.util.Map; /** * Contains all info necessary for full-text search of emoji tags. @@ -40,7 +37,7 @@ public class EmojiSearchDatabase extends Database { * @return A list of emoji that are related to the search term, ordered by relevance. */ public @NonNull List query(@NonNull String query, int limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String matchString = FtsUtil.createPrefixMatchString(query); List results = new LinkedList<>(); @@ -65,7 +62,7 @@ public class EmojiSearchDatabase extends Database { * Deletes the content of the current search index and replaces it with the new one. */ public void setSearchIndex(@NonNull List searchIndex) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); db.beginTransaction(); try { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index 310df6b377..78525ff697 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -33,7 +33,6 @@ import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.CursorUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.SetUtil; import org.thoughtcrime.securesms.util.SqlUtil; import org.thoughtcrime.securesms.util.Util; @@ -57,7 +56,6 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.UUID; -import java.util.stream.Collector; import java.util.stream.Collectors; public final class GroupDatabase extends Database { @@ -130,7 +128,7 @@ private static final String[] GROUP_PROJECTION = { } public Optional getGroup(RecipientId recipientId) { - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, RECIPIENT_ID + " = ?", new String[] {recipientId.serialize()}, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, RECIPIENT_ID + " = ?", new String[] { recipientId.serialize()}, null, null, null)) { if (cursor != null && cursor.moveToNext()) { return getGroup(cursor); } @@ -140,9 +138,9 @@ private static final String[] GROUP_PROJECTION = { } public Optional getGroup(@NonNull GroupId groupId) { - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, GROUP_ID + " = ?", - new String[] {groupId.toString()}, - null, null, null)) + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, GROUP_ID + " = ?", + new String[] {groupId.toString()}, + null, null, null)) { if (cursor != null && cursor.moveToNext()) { return getGroup(cursor); @@ -153,9 +151,9 @@ private static final String[] GROUP_PROJECTION = { } public boolean groupExists(@NonNull GroupId groupId) { - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, GROUP_ID + " = ?", - new String[] {groupId.toString()}, - null, null, null)) + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, GROUP_ID + " = ?", + new String[] {groupId.toString()}, + null, null, null)) { return cursor.moveToNext(); } @@ -165,7 +163,7 @@ private static final String[] GROUP_PROJECTION = { * @return A gv1 group whose expected v2 ID matches the one provided. */ public Optional getGroupV1ByExpectedV2(@NonNull GroupId.V2 gv2Id) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, GROUP_PROJECTION, EXPECTED_V2_ID + " = ?", SqlUtil.buildArgs(gv2Id), null, null, null)) { if (cursor.moveToFirst()) { return getGroup(cursor); @@ -176,7 +174,7 @@ private static final String[] GROUP_PROJECTION = { } public Optional getGroupByDistributionId(@NonNull DistributionId distributionId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = DISTRIBUTION_ID + " = ?"; String[] args = SqlUtil.buildArgs(distributionId); @@ -207,7 +205,7 @@ private static final String[] GROUP_PROJECTION = { ContentValues values = new ContentValues(); values.put(UNMIGRATED_V1_MEMBERS, newUnmigrated.isEmpty() ? null : RecipientId.toSerializedList(newUnmigrated)); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, GROUP_ID + " = ?", SqlUtil.buildArgs(id)); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, GROUP_ID + " = ?", SqlUtil.buildArgs(id)); Recipient.live(Recipient.externalGroupExact(context, id).getId()).refresh(); } @@ -221,9 +219,9 @@ private static final String[] GROUP_PROJECTION = { * @return local db group revision or -1 if not present. */ public int getGroupV2Revision(@NonNull GroupId.V2 groupId) { - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, GROUP_ID + " = ?", - new String[] {groupId.toString()}, - null, null, null)) + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, GROUP_ID + " = ?", + new String[] {groupId.toString()}, + null, null, null)) { if (cursor != null && cursor.moveToNext()) { return cursor.getInt(cursor.getColumnIndexOrThrow(V2_REVISION)); @@ -281,17 +279,17 @@ private static final String[] GROUP_PROJECTION = { query += " AND " + MMS + " = 0"; } - Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, query, queryArgs, null, null, TITLE + " COLLATE NOCASE ASC"); + Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, query, queryArgs, null, null, TITLE + " COLLATE NOCASE ASC"); return new Reader(cursor); } public @NonNull DistributionId getOrCreateDistributionId(@NonNull GroupId.V2 groupId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = GROUP_ID + " = ?"; String[] args = SqlUtil.buildArgs(groupId); - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, new String[] { DISTRIBUTION_ID }, query, args, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, new String[] { DISTRIBUTION_ID }, query, args, null, null, null)) { if (cursor.moveToFirst()) { Optional serialized = CursorUtil.getString(cursor, DISTRIBUTION_ID); @@ -321,10 +319,10 @@ private static final String[] GROUP_PROJECTION = { public GroupId.Mms getOrCreateMmsGroupForMembers(List members) { Collections.sort(members); - Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, new String[] {GROUP_ID}, + Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, new String[] { GROUP_ID}, MEMBERS + " = ? AND " + MMS + " = ?", - new String[] {RecipientId.toSerializedList(members), "1"}, - null, null, null); + new String[] {RecipientId.toSerializedList(members), "1"}, + null, null, null); try { if (cursor != null && cursor.moveToNext()) { return GroupId.parseOrThrow(cursor.getString(cursor.getColumnIndexOrThrow(GROUP_ID))) @@ -357,7 +355,7 @@ private static final String[] GROUP_PROJECTION = { @WorkerThread public @NonNull List getGroupsContainingMember(@NonNull RecipientId recipientId, boolean pushOnly, boolean includeInactive) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String table = TABLE_NAME + " INNER JOIN " + ThreadDatabase.TABLE_NAME + " ON " + TABLE_NAME + "." + RECIPIENT_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID; String query = MEMBERS + " LIKE ?"; String[] args = SqlUtil.buildArgs("%" + recipientId.serialize() + "%"); @@ -390,12 +388,12 @@ private static final String[] GROUP_PROJECTION = { public Reader getGroups() { @SuppressLint("Recycle") - Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null); + Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null); return new Reader(cursor); } public int getActiveGroupCount() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] cols = { "COUNT(*)" }; String query = ACTIVE + " = 1"; @@ -472,7 +470,7 @@ private static final String[] GROUP_PROJECTION = { Log.w(TAG, "There already exists a V1 group that should be migrated into this group. But if the recipient already exists, there's not much we can do here."); } - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -566,7 +564,7 @@ private static final String[] GROUP_PROJECTION = { } } - databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, contentValues); + databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, contentValues); if (groupState != null && groupState.hasDisappearingMessagesTimer()) { recipientDatabase.setExpireMessages(groupRecipientId, groupState.getDisappearingMessagesTimer().getDuration()); @@ -597,7 +595,7 @@ private static final String[] GROUP_PROJECTION = { contentValues.put(AVATAR_ID, 0); } - databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, GROUP_ID + " = ?", new String[] {groupId.toString()}); @@ -617,7 +615,7 @@ private static final String[] GROUP_PROJECTION = { @NonNull GroupId.V1 groupIdV1, @NonNull DecryptedGroup decryptedGroup) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); GroupId.V2 groupIdV2 = groupIdV1.deriveV2MigrationGroupId(); GroupMasterKey groupMasterKey = groupIdV1.deriveV2MigrationMasterKey(); @@ -713,7 +711,7 @@ private static final String[] GROUP_PROJECTION = { } } - databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, GROUP_ID + " = ?", new String[]{ groupId.toString() }); @@ -745,7 +743,7 @@ private static final String[] GROUP_PROJECTION = { ContentValues contentValues = new ContentValues(); contentValues.put(TITLE, title); - databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, GROUP_ID + " = ?", + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, GROUP_ID + " = ?", new String[] {groupId.toString()}); RecipientId groupRecipient = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(groupId); @@ -759,7 +757,7 @@ private static final String[] GROUP_PROJECTION = { ContentValues contentValues = new ContentValues(1); contentValues.put(AVATAR_ID, hasAvatar ? Math.abs(new SecureRandom().nextLong()) : 0); - databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, GROUP_ID + " = ?", + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, GROUP_ID + " = ?", new String[] {groupId.toString()}); RecipientId groupRecipient = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(groupId); @@ -773,7 +771,7 @@ private static final String[] GROUP_PROJECTION = { contents.put(MEMBERS, RecipientId.toSerializedList(members)); contents.put(ACTIVE, 1); - databaseHelper.getWritableDatabase().update(TABLE_NAME, contents, GROUP_ID + " = ?", + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contents, GROUP_ID + " = ?", new String[] {groupId.toString()}); RecipientId groupRecipient = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(groupId); @@ -787,7 +785,7 @@ private static final String[] GROUP_PROJECTION = { ContentValues contents = new ContentValues(); contents.put(MEMBERS, RecipientId.toSerializedList(currentMembers)); - databaseHelper.getWritableDatabase().update(TABLE_NAME, contents, GROUP_ID + " = ?", + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contents, GROUP_ID + " = ?", new String[] {groupId.toString()}); RecipientId groupRecipient = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(groupId); @@ -805,10 +803,10 @@ private static final String[] GROUP_PROJECTION = { Cursor cursor = null; try { - cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, new String[] {MEMBERS}, + cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, new String[] { MEMBERS}, GROUP_ID + " = ?", - new String[] {groupId.toString()}, - null, null, null); + new String[] {groupId.toString()}, + null, null, null); if (cursor != null && cursor.moveToFirst()) { String serializedMembers = cursor.getString(cursor.getColumnIndexOrThrow(MEMBERS)); @@ -828,7 +826,7 @@ private static final String[] GROUP_PROJECTION = { } public void setActive(@NonNull GroupId groupId, boolean active) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(); values.put(ACTIVE, active ? 1 : 0); database.update(TABLE_NAME, values, GROUP_ID + " = ?", new String[] {groupId.toString()}); @@ -836,7 +834,7 @@ private static final String[] GROUP_PROJECTION = { @WorkerThread public boolean isCurrentMember(@NonNull GroupId.Push groupId, @NonNull RecipientId recipientId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, new String[] {MEMBERS}, GROUP_ID + " = ?", new String[] {groupId.toString()}, @@ -876,7 +874,7 @@ private static final String[] GROUP_PROJECTION = { public @NonNull List getAllGroupV2Ids() { List result = new LinkedList<>(); - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, new String[]{ GROUP_ID }, null, null, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, new String[]{ GROUP_ID }, null, null, null, null, null)) { while (cursor.moveToNext()) { GroupId groupId = GroupId.parseOrThrow(cursor.getString(cursor.getColumnIndexOrThrow(GROUP_ID))); if (groupId.isV2()) { @@ -898,7 +896,7 @@ private static final String[] GROUP_PROJECTION = { String[] projection = new String[]{ GROUP_ID, EXPECTED_V2_ID }; String query = EXPECTED_V2_ID + " NOT NULL"; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, projection, query, null, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, projection, query, null, null, null, null)) { while (cursor.moveToNext()) { GroupId.V1 groupId = GroupId.parseOrThrow(cursor.getString(cursor.getColumnIndexOrThrow(GROUP_ID))).requireV1(); GroupId.V2 expectedId = GroupId.parseOrThrow(cursor.getString(cursor.getColumnIndexOrThrow(EXPECTED_V2_ID))).requireV2(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java index 0d184c8b0f..dee701df19 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java @@ -11,7 +11,6 @@ import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.SqlUtil; import org.whispersystems.libsignal.util.Pair; -import org.whispersystems.libsignal.util.guava.Optional; import java.util.Collection; import java.util.LinkedList; @@ -48,7 +47,7 @@ public class GroupReceiptDatabase extends Database { } public void insert(Collection recipientIds, long mmsId, int status, long timestamp) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -68,7 +67,7 @@ public class GroupReceiptDatabase extends Database { } public void update(@NonNull RecipientId recipientId, long mmsId, int status, long timestamp) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(2); values.put(STATUS, status); values.put(TIMESTAMP, timestamp); @@ -78,7 +77,7 @@ public class GroupReceiptDatabase extends Database { } public void setUnidentified(Collection> results, long mmsId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -98,7 +97,7 @@ public class GroupReceiptDatabase extends Database { } public @NonNull List getGroupReceiptInfo(long mmsId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); try (Cursor cursor = db.query(TABLE_NAME, null, MMS_ID + " = ?", new String[] {String.valueOf(mmsId)}, null, null, null)) { @@ -114,7 +113,7 @@ public class GroupReceiptDatabase extends Database { } public @Nullable GroupReceiptInfo getGroupReceiptInfo(long mmsId, @NonNull RecipientId recipientId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = MMS_ID + " = ? AND " + RECIPIENT_ID + " = ?"; String[] args = SqlUtil.buildArgs(mmsId, recipientId); @@ -131,17 +130,17 @@ public class GroupReceiptDatabase extends Database { } void deleteRowsForMessage(long mmsId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, MMS_ID + " = ?", new String[] {String.valueOf(mmsId)}); } void deleteAbandonedRows() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, MMS_ID + " NOT IN (SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME + ")", null); } void deleteAllRows() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, null, null); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java index 728ad33341..f2b1f250d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java @@ -85,7 +85,7 @@ public class IdentityDatabase extends Database { } public Cursor getIdentities() { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); return database.query(TABLE_NAME, null, null, null, null, null, null); } @@ -95,7 +95,7 @@ public class IdentityDatabase extends Database { } public Optional getIdentity(@NonNull RecipientId recipientId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); Cursor cursor = null; try { @@ -116,7 +116,7 @@ public class IdentityDatabase extends Database { public @NonNull IdentityRecordList getIdentities(@NonNull List recipients) { List records = new LinkedList<>(); - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String[] selectionArgs = new String[1]; database.beginTransaction(); @@ -147,7 +147,7 @@ public class IdentityDatabase extends Database { } public void setApproval(@NonNull RecipientId recipientId, boolean nonBlockingApproval) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(2); contentValues.put(NONBLOCKING_APPROVAL, nonBlockingApproval); @@ -158,7 +158,7 @@ public class IdentityDatabase extends Database { } public void setVerified(@NonNull RecipientId recipientId, IdentityKey identityKey, VerifiedStatus verifiedStatus) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(1); contentValues.put(VERIFIED, verifiedStatus.toInt()); @@ -190,7 +190,7 @@ public class IdentityDatabase extends Database { } private boolean hasMatchingKey(@NonNull RecipientId id, IdentityKey identityKey) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = RECIPIENT_ID + " = ? AND " + IDENTITY_KEY + " = ?"; String[] args = new String[]{id.serialize(), Base64.encodeBytes(identityKey.serialize())}; @@ -200,7 +200,7 @@ public class IdentityDatabase extends Database { } private boolean hasMatchingStatus(@NonNull RecipientId id, IdentityKey identityKey, VerifiedStatus verifiedStatus) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = RECIPIENT_ID + " = ? AND " + IDENTITY_KEY + " = ? AND " + VERIFIED + " = ?"; String[] args = new String[]{id.serialize(), Base64.encodeBytes(identityKey.serialize()), String.valueOf(verifiedStatus.toInt())}; @@ -224,7 +224,7 @@ public class IdentityDatabase extends Database { private void saveIdentityInternal(@NonNull RecipientId recipientId, IdentityKey identityKey, VerifiedStatus verifiedStatus, boolean firstUse, long timestamp, boolean nonBlockingApproval) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String identityKeyString = Base64.encodeBytes(identityKey.serialize()); ContentValues contentValues = new ContentValues(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java index ffe13349c4..cfd1924bfb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java @@ -2,14 +2,16 @@ package org.thoughtcrime.securesms.database; import android.app.Application; import android.content.ContentValues; +import android.content.Context; import android.database.Cursor; import androidx.annotation.NonNull; import com.annimon.stream.Stream; -import net.sqlcipher.database.SQLiteOpenHelper; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabaseHook; +import net.zetetic.database.sqlcipher.SQLiteOpenHelper; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; @@ -87,8 +89,7 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabase { private static volatile JobDatabase instance; - private final Application application; - private final DatabaseSecret databaseSecret; + private final Application application; public static @NonNull JobDatabase getInstance(@NonNull Application context) { if (instance == null) { @@ -103,10 +104,9 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabase { } public JobDatabase(@NonNull Application application, @NonNull DatabaseSecret databaseSecret) { - super(application, DATABASE_NAME, null, DATABASE_VERSION, new SqlCipherDatabaseHook(), new SqlCipherErrorHandler(DATABASE_NAME)); + super(application, DATABASE_NAME, databaseSecret.asString(), null, DATABASE_VERSION, 0, new SqlCipherErrorHandler(DATABASE_NAME), new SqlCipherDatabaseHook()); - this.application = application; - this.databaseSecret = databaseSecret; + this.application = application; } @Override @@ -142,6 +142,9 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabase { public void onOpen(SQLiteDatabase db) { Log.i(TAG, "onOpen()"); + db.enableWriteAheadLogging(); + db.setForeignKeyConstraintsEnabled(true); + SignalExecutors.BOUNDED.execute(() -> { dropTableIfPresent("job_spec"); dropTableIfPresent("constraint_spec"); @@ -366,14 +369,6 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabase { false); } - private @NonNull SQLiteDatabase getReadableDatabase() { - return getWritableDatabase(databaseSecret.asString()); - } - - private @NonNull SQLiteDatabase getWritableDatabase() { - return getWritableDatabase(databaseSecret.asString()); - } - @Override public @NonNull SQLiteDatabase getSqlCipherDatabase() { return getWritableDatabase(); @@ -382,7 +377,7 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabase { private void dropTableIfPresent(@NonNull String table) { if (DatabaseFactory.getInstance(application).hasTable(table)) { Log.i(TAG, "Dropping original " + table + " table from the main database."); - DatabaseFactory.getInstance(application).getRawDatabase().rawExecSQL("DROP TABLE " + table); + DatabaseFactory.getInstance(application).getRawDatabase().execSQL("DROP TABLE " + table); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/KeyValueDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/KeyValueDatabase.java index e714f258b2..c5dfa5e6d7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/KeyValueDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/KeyValueDatabase.java @@ -6,9 +6,9 @@ import android.database.Cursor; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteDatabaseHook; -import net.sqlcipher.database.SQLiteOpenHelper; +import net.zetetic.database.sqlcipher.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabaseHook; +import net.zetetic.database.sqlcipher.SQLiteOpenHelper; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; @@ -47,8 +47,7 @@ public class KeyValueDatabase extends SQLiteOpenHelper implements SignalDatabase private static volatile KeyValueDatabase instance; - private final Application application; - private final DatabaseSecret databaseSecret; + private final Application application; public static @NonNull KeyValueDatabase getInstance(@NonNull Application context) { if (instance == null) { @@ -63,10 +62,9 @@ public class KeyValueDatabase extends SQLiteOpenHelper implements SignalDatabase } private KeyValueDatabase(@NonNull Application application, @NonNull DatabaseSecret databaseSecret) { - super(application, DATABASE_NAME, null, DATABASE_VERSION, new SqlCipherDatabaseHook(), new SqlCipherErrorHandler(DATABASE_NAME)); + super(application, DATABASE_NAME, databaseSecret.asString(), null, DATABASE_VERSION, 0,new SqlCipherErrorHandler(DATABASE_NAME), new SqlCipherDatabaseHook()); - this.application = application; - this.databaseSecret = databaseSecret; + this.application = application; } @Override @@ -90,10 +88,13 @@ public class KeyValueDatabase extends SQLiteOpenHelper implements SignalDatabase public void onOpen(SQLiteDatabase db) { Log.i(TAG, "onOpen()"); + db.enableWriteAheadLogging(); + db.setForeignKeyConstraintsEnabled(true); + SignalExecutors.BOUNDED.execute(() -> { if (DatabaseFactory.getInstance(application).hasTable("key_value")) { Log.i(TAG, "Dropping original key_value table from the main database."); - DatabaseFactory.getInstance(application).getRawDatabase().rawExecSQL("DROP TABLE key_value"); + DatabaseFactory.getInstance(application).getRawDatabase().execSQL("DROP TABLE key_value"); } }); } @@ -181,14 +182,6 @@ public class KeyValueDatabase extends SQLiteOpenHelper implements SignalDatabase } } - private @NonNull SQLiteDatabase getReadableDatabase() { - return getReadableDatabase(databaseSecret.asString()); - } - - private @NonNull SQLiteDatabase getWritableDatabase() { - return getWritableDatabase(databaseSecret.asString()); - } - @Override public @NonNull SQLiteDatabase getSqlCipherDatabase() { return getWritableDatabase(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/LocalMetricsDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/LocalMetricsDatabase.kt index c9a596f82b..46f69efd08 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/LocalMetricsDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/LocalMetricsDatabase.kt @@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.database import android.annotation.SuppressLint import android.app.Application import android.content.ContentValues -import net.sqlcipher.database.SQLiteDatabase -import net.sqlcipher.database.SQLiteOpenHelper +import net.zetetic.database.sqlcipher.SQLiteDatabase +import net.zetetic.database.sqlcipher.SQLiteOpenHelper import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.crypto.DatabaseSecret import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider @@ -29,10 +29,12 @@ class LocalMetricsDatabase private constructor( ) : SQLiteOpenHelper( application, DATABASE_NAME, + databaseSecret.asString(), null, DATABASE_VERSION, - SqlCipherDatabaseHook(), - SqlCipherErrorHandler(DATABASE_NAME) + 0, + SqlCipherErrorHandler(DATABASE_NAME), + SqlCipherDatabaseHook() ), SignalDatabase { @@ -107,7 +109,12 @@ class LocalMetricsDatabase private constructor( db.execSQL(EventTotals.CREATE_VIEW) } - override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { + override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + } + + override fun onOpen(db: SQLiteDatabase) { + db.enableWriteAheadLogging() + db.setForeignKeyConstraintsEnabled(true) } override fun getSqlCipherDatabase(): SQLiteDatabase { @@ -233,12 +240,6 @@ class LocalMetricsDatabase private constructor( } } - private val readableDatabase: SQLiteDatabase - get() = getReadableDatabase(databaseSecret.asString()) - - private val writableDatabase: SQLiteDatabase - get() = getWritableDatabase(databaseSecret.asString()) - data class EventMetrics( val name: String, val count: Long, diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt index c1357d5365..8e1c9595c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt @@ -4,8 +4,8 @@ import android.annotation.SuppressLint import android.app.Application import android.content.ContentValues import android.database.Cursor -import net.sqlcipher.database.SQLiteDatabase -import net.sqlcipher.database.SQLiteOpenHelper +import net.zetetic.database.sqlcipher.SQLiteDatabase +import net.zetetic.database.sqlcipher.SQLiteOpenHelper import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.crypto.DatabaseSecret import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider @@ -32,10 +32,12 @@ class LogDatabase private constructor( ) : SQLiteOpenHelper( application, DATABASE_NAME, + databaseSecret.asString(), null, DATABASE_VERSION, - SqlCipherDatabaseHook(), - SqlCipherErrorHandler(DATABASE_NAME) + 0, + SqlCipherErrorHandler(DATABASE_NAME), + SqlCipherDatabaseHook() ), SignalDatabase { @@ -106,6 +108,11 @@ class LogDatabase private constructor( } } + override fun onOpen(db: SQLiteDatabase) { + db.enableWriteAheadLogging() + db.setForeignKeyConstraintsEnabled(true) + } + override fun getSqlCipherDatabase(): SQLiteDatabase { return writableDatabase } @@ -222,12 +229,6 @@ class LogDatabase private constructor( } } - private val readableDatabase: SQLiteDatabase - get() = getReadableDatabase(databaseSecret.asString()) - - private val writableDatabase: SQLiteDatabase - get() = getWritableDatabase(databaseSecret.asString()) - interface Reader : Iterator, Closeable class CursorReader(private val cursor: Cursor) : Reader { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java index 9c23797326..fd2bd6b8aa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java @@ -91,7 +91,7 @@ public class MediaDatabase extends Database { } public @NonNull Cursor getGalleryMediaForThread(long threadId, @NonNull Sorting sorting, boolean listenToAllThreads) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String query = sorting.applyToQuery(applyEqualityOperator(threadId, GALLERY_MEDIA_QUERY)); String[] args = {threadId + ""}; Cursor cursor = database.rawQuery(query, args); @@ -104,7 +104,7 @@ public class MediaDatabase extends Database { } public @NonNull Cursor getDocumentMediaForThread(long threadId, @NonNull Sorting sorting) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String query = sorting.applyToQuery(applyEqualityOperator(threadId, DOCUMENT_MEDIA_QUERY)); String[] args = {threadId + ""}; Cursor cursor = database.rawQuery(query, args); @@ -113,7 +113,7 @@ public class MediaDatabase extends Database { } public @NonNull Cursor getAudioMediaForThread(long threadId, @NonNull Sorting sorting) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String query = sorting.applyToQuery(applyEqualityOperator(threadId, AUDIO_MEDIA_QUERY)); String[] args = {threadId + ""}; Cursor cursor = database.rawQuery(query, args); @@ -122,7 +122,7 @@ public class MediaDatabase extends Database { } public @NonNull Cursor getAllMediaForThread(long threadId, @NonNull Sorting sorting) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String query = sorting.applyToQuery(applyEqualityOperator(threadId, ALL_MEDIA_QUERY)); String[] args = {threadId + ""}; Cursor cursor = database.rawQuery(query, args); @@ -144,7 +144,7 @@ public class MediaDatabase extends Database { public StorageBreakdown getStorageBreakdown() { StorageBreakdown storageBreakdown = new StorageBreakdown(); - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = database.rawQuery(UNIQUE_MEDIA_QUERY, new String[0])) { int sizeColumn = cursor.getColumnIndexOrThrow(AttachmentDatabase.SIZE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java index 5e4c30e4a8..02e0eb1ac1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java @@ -6,8 +6,8 @@ import android.database.Cursor; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteOpenHelper; +import net.zetetic.database.sqlcipher.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteOpenHelper; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; @@ -50,8 +50,7 @@ public class MegaphoneDatabase extends SQLiteOpenHelper implements SignalDatabas private static volatile MegaphoneDatabase instance; - private final Application application; - private final DatabaseSecret databaseSecret; + private final Application application; public static @NonNull MegaphoneDatabase getInstance(@NonNull Application context) { if (instance == null) { @@ -66,10 +65,9 @@ public class MegaphoneDatabase extends SQLiteOpenHelper implements SignalDatabas } public MegaphoneDatabase(@NonNull Application application, @NonNull DatabaseSecret databaseSecret) { - super(application, DATABASE_NAME, null, DATABASE_VERSION, new SqlCipherDatabaseHook(), new SqlCipherErrorHandler(DATABASE_NAME)); + super(application, DATABASE_NAME, databaseSecret.asString(), null, DATABASE_VERSION, 0, new SqlCipherErrorHandler(DATABASE_NAME), new SqlCipherDatabaseHook()); - this.application = application; - this.databaseSecret = databaseSecret; + this.application = application; } @Override @@ -93,10 +91,13 @@ public class MegaphoneDatabase extends SQLiteOpenHelper implements SignalDatabas public void onOpen(SQLiteDatabase db) { Log.i(TAG, "onOpen()"); + db.enableWriteAheadLogging(); + db.setForeignKeyConstraintsEnabled(true); + SignalExecutors.BOUNDED.execute(() -> { if (DatabaseFactory.getInstance(application).hasTable("megaphone")) { Log.i(TAG, "Dropping original megaphone table from the main database."); - DatabaseFactory.getInstance(application).getRawDatabase().rawExecSQL("DROP TABLE megaphone"); + DatabaseFactory.getInstance(application).getRawDatabase().execSQL("DROP TABLE megaphone"); } }); } @@ -197,10 +198,6 @@ public class MegaphoneDatabase extends SQLiteOpenHelper implements SignalDatabas getWritableDatabase().delete(TABLE_NAME, query, args); } - private @NonNull SQLiteDatabase getWritableDatabase() { - return getWritableDatabase(databaseSecret.asString()); - } - @Override public @NonNull SQLiteDatabase getSqlCipherDatabase() { return getWritableDatabase(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MentionDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MentionDatabase.java index ca3d4e675f..8b0f9fbf32 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MentionDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MentionDatabase.java @@ -50,7 +50,7 @@ public class MentionDatabase extends Database { } public void insert(long threadId, long messageId, @NonNull Collection mentions) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -71,7 +71,7 @@ public class MentionDatabase extends Database { } public @NonNull List getMentionsForMessage(long messageId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); List mentions = new LinkedList<>(); try (Cursor cursor = db.query(TABLE_NAME, null, MESSAGE_ID + " = ?", SqlUtil.buildArgs(messageId), null, null, null)) { @@ -86,7 +86,7 @@ public class MentionDatabase extends Database { } public @NonNull Map> getMentionsForMessages(@NonNull Collection messageIds) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String ids = TextUtils.join(",", messageIds); try (Cursor cursor = db.query(TABLE_NAME, null, MESSAGE_ID + " IN (" + ids + ")", null, null, null, null)) { @@ -99,7 +99,7 @@ public class MentionDatabase extends Database { } public @NonNull Map> getMentionsContainingRecipients(@NonNull Collection recipientIds, long threadId, long limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String ids = TextUtils.join(",", Stream.of(recipientIds).map(RecipientId::serialize).toList()); String where = " WHERE " + RECIPIENT_ID + " IN (" + ids + ")"; @@ -124,21 +124,21 @@ public class MentionDatabase extends Database { } void deleteMentionsForMessage(long messageId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = MESSAGE_ID + " = ?"; db.delete(TABLE_NAME, where, SqlUtil.buildArgs(messageId)); } void deleteAbandonedMentions() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = MESSAGE_ID + " NOT IN (SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME + ") OR " + THREAD_ID + " NOT IN (SELECT " + ThreadDatabase.ID + " FROM " + ThreadDatabase.TABLE_NAME + ")"; db.delete(TABLE_NAME, where, null); } void deleteAllMentions() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, null, null); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java index e1b032905a..b747fdbb28 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java @@ -12,7 +12,7 @@ import com.annimon.stream.Stream; import com.google.android.mms.pdu_alt.NotificationInd; import com.google.protobuf.InvalidProtocolBufferException; -import net.sqlcipher.database.SQLiteStatement; +import net.zetetic.database.sqlcipher.SQLiteStatement; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.documents.Document; @@ -197,7 +197,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } final int getInsecureMessagesSentForThread(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = new String[]{"COUNT(*)"}; String query = THREAD_ID + " = ? AND " + getOutgoingInsecureMessageClause() + " AND " + getDateSentColumnName() + " > ?"; String[] args = new String[]{String.valueOf(threadId), String.valueOf(System.currentTimeMillis() - InsightsConstants.PERIOD_IN_MILLIS)}; @@ -220,7 +220,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } final int getSecureMessageCount(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = new String[] {"COUNT(*)"}; String query = getSecureMessageClause() + "AND " + MmsSmsColumns.THREAD_ID + " = ?"; String[] args = new String[]{String.valueOf(threadId)}; @@ -235,7 +235,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } final int getOutgoingSecureMessageCount(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = new String[] {"COUNT(*)"}; String query = getOutgoingSecureMessageClause() + "AND " + MmsSmsColumns.THREAD_ID + " = ? AND" + "(" + getTypeField() + " & " + Types.GROUP_QUIT_BIT + " = 0)"; String[] args = new String[]{String.valueOf(threadId)}; @@ -251,7 +251,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns private int getMessageCountForRecipientsAndType(String typeClause) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = new String[] {"COUNT(*)"}; String query = typeClause + " AND " + getDateSentColumnName() + " > ?"; String[] args = new String[]{String.valueOf(System.currentTimeMillis() - InsightsConstants.PERIOD_IN_MILLIS)}; @@ -282,7 +282,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } public void setReactionsSeen(long threadId, long sinceTimestamp) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(); String whereClause = THREAD_ID + " = ? AND " + REACTIONS_UNREAD + " = ?"; String[] whereArgs = new String[]{String.valueOf(threadId), "1"}; @@ -298,7 +298,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } public void setAllReactionsSeen() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(); String query = REACTIONS_UNREAD + " != ?"; String[] args = new String[] { "0" }; @@ -310,7 +310,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } public void addReaction(long messageId, @NonNull ReactionRecord reaction) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); @@ -340,7 +340,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } public void deleteReaction(long messageId, @NonNull RecipientId author) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); @@ -361,7 +361,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } public boolean hasReaction(long messageId, @NonNull ReactionRecord reactionRecord) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); ReactionList reactions = getReactions(db, messageId).or(ReactionList.getDefaultInstance()); @@ -381,7 +381,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns return; } - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); SqlUtil.Query where = SqlUtil.buildCollectionQuery(ID, ids); ContentValues values = new ContentValues(); @@ -411,7 +411,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } public @NonNull List getReportSpamMessageServerGuids(long threadId, long timestamp) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = THREAD_ID + " = ? AND " + getDateReceivedColumnName() + " <= ?"; String[] args = SqlUtil.buildArgs(threadId, timestamp); @@ -452,7 +452,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } protected , I> void removeFromDocument(long messageId, String column, I object, Class clazz) throws IOException { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.beginTransaction(); try { @@ -484,7 +484,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } protected , I> void addToDocument(long messageId, String column, List objects, Class clazz) throws IOException { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.beginTransaction(); try { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogDatabase.kt index 023da84a26..6a26b7f10f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogDatabase.kt @@ -198,7 +198,7 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: SQLC if (!FeatureFlags.retryReceipts()) return if (sendMessageResult.isSuccess && sendMessageResult.success.content.isPresent) { - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase db.beginTransaction() try { @@ -219,7 +219,7 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: SQLC } private fun insert(recipients: List, dateSent: Long, content: SignalServiceProtos.Content, contentHint: ContentHint, messageIds: List): Long { - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase db.beginTransaction() try { @@ -266,7 +266,7 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: SQLC trimOldMessages(System.currentTimeMillis(), FeatureFlags.retryRespondMaxAge()) - val db = databaseHelper.readableDatabase + val db = databaseHelper.signalReadableDatabase val table = "${PayloadTable.TABLE_NAME} LEFT JOIN ${RecipientTable.TABLE_NAME} ON ${PayloadTable.TABLE_NAME}.${PayloadTable.ID} = ${RecipientTable.TABLE_NAME}.${RecipientTable.PAYLOAD_ID}" val query = "${PayloadTable.DATE_SENT} = ? AND ${RecipientTable.RECIPIENT_ID} = ? AND ${RecipientTable.DEVICE} = ?" val args = SqlUtil.buildArgs(dateSent, recipientId, device) @@ -304,7 +304,7 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: SQLC fun deleteAllRelatedToMessage(messageId: Long, mms: Boolean) { if (!FeatureFlags.retryReceipts()) return - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase val query = "${PayloadTable.ID} IN (SELECT ${MessageTable.PAYLOAD_ID} FROM ${MessageTable.TABLE_NAME} WHERE ${MessageTable.MESSAGE_ID} = ? AND ${MessageTable.IS_MMS} = ?)" val args = SqlUtil.buildArgs(messageId, if (mms) 1 else 0) @@ -320,7 +320,7 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: SQLC fun deleteEntriesForRecipient(dateSent: List, recipientId: RecipientId, device: Int) { if (!FeatureFlags.retryReceipts()) return - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase db.beginTransaction() try { @@ -348,13 +348,13 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: SQLC fun deleteAll() { if (!FeatureFlags.retryReceipts()) return - databaseHelper.writableDatabase.delete(PayloadTable.TABLE_NAME, null, null) + databaseHelper.signalWritableDatabase.delete(PayloadTable.TABLE_NAME, null, null) } fun trimOldMessages(currentTime: Long, maxAge: Long) { if (!FeatureFlags.retryReceipts()) return - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase val query = "${PayloadTable.DATE_SENT} < ?" val args = SqlUtil.buildArgs(currentTime - maxAge) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index 0e8ac32ae8..0a47cf94fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -29,7 +29,7 @@ import com.annimon.stream.Stream; import com.google.android.mms.pdu_alt.NotificationInd; import com.google.android.mms.pdu_alt.PduHeaders; -import net.sqlcipher.database.SQLiteStatement; +import net.zetetic.database.sqlcipher.SQLiteStatement; import org.json.JSONArray; import org.json.JSONException; @@ -363,7 +363,7 @@ public class MmsDatabase extends MessageDatabase { @Override public @NonNull List getViewedIncomingMessages(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[]{ID, RECIPIENT_ID, DATE_SENT, MESSAGE_BOX, THREAD_ID}; String where = THREAD_ID + " = ? AND " + VIEWED_RECEIPT_COUNT + " > 0 AND " + MESSAGE_BOX + " & " + Types.BASE_INBOX_TYPE + " = " + Types.BASE_INBOX_TYPE; String[] args = SqlUtil.buildArgs(threadId); @@ -405,7 +405,7 @@ public class MmsDatabase extends MessageDatabase { return Collections.emptyList(); } - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String[] columns = new String[]{ID, RECIPIENT_ID, DATE_SENT, MESSAGE_BOX, THREAD_ID}; String where = ID + " IN (" + Util.join(messageIds, ",") + ") AND " + VIEWED_RECEIPT_COUNT + " = 0"; List results = new LinkedList<>(); @@ -523,12 +523,12 @@ public class MmsDatabase extends MessageDatabase { @Override public void ensureMigration() { - databaseHelper.getWritableDatabase(); + databaseHelper.getSignalWritableDatabase(); } @Override public boolean isGroupQuitMessage(long messageId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[]{ID}; String query = ID + " = ? AND " + MESSAGE_BOX + " & ?"; @@ -546,7 +546,7 @@ public class MmsDatabase extends MessageDatabase { @Override public long getLatestGroupQuitTimestamp(long threadId, long quitTimeBarrier) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[]{DATE_SENT}; String query = THREAD_ID + " = ? AND " + MESSAGE_BOX + " & ? AND " + DATE_SENT + " < ?"; @@ -566,7 +566,7 @@ public class MmsDatabase extends MessageDatabase { @Override public int getMessageCountForThread(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, COUNT, THREAD_ID_WHERE, SqlUtil.buildArgs(threadId), null, null, null)) { if (cursor != null && cursor.moveToFirst()) { @@ -579,7 +579,7 @@ public class MmsDatabase extends MessageDatabase { @Override public int getMessageCountForThread(long threadId, long beforeTime) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] cols = new String[] {"COUNT(*)"}; String query = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < ?"; @@ -596,7 +596,7 @@ public class MmsDatabase extends MessageDatabase { @Override public boolean hasMeaningfulMessage(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, new String[] { "1" }, THREAD_ID_WHERE, SqlUtil.buildArgs(threadId), null, null, null, "1")) { return cursor != null && cursor.moveToFirst(); @@ -623,7 +623,7 @@ public class MmsDatabase extends MessageDatabase { @Override public Set incrementReceiptCount(SyncMessageId messageId, long timestamp, @NonNull ReceiptType receiptType) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); Set threadUpdates = new HashSet<>(); try (Cursor cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, MESSAGE_BOX, RECIPIENT_ID, receiptType.getColumnName()}, @@ -665,7 +665,7 @@ public class MmsDatabase extends MessageDatabase { public long getThreadIdForMessage(long id) { String sql = "SELECT " + THREAD_ID + " FROM " + TABLE_NAME + " WHERE " + ID + " = ?"; String[] sqlArgs = new String[] {id+""}; - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Cursor cursor = null; @@ -705,7 +705,7 @@ public class MmsDatabase extends MessageDatabase { } private Cursor rawQuery(@NonNull String where, @Nullable String[] arguments, boolean reverse, long limit) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String rawQueryString = "SELECT " + Util.join(MMS_PROJECTION, ",") + " FROM " + MmsDatabase.TABLE_NAME + " LEFT OUTER JOIN " + AttachmentDatabase.TABLE_NAME + " ON (" + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " = " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + ")" + @@ -753,7 +753,7 @@ public class MmsDatabase extends MessageDatabase { } private void updateMailboxBitmask(long id, long maskOff, long maskOn, Optional threadId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + " SET " + MESSAGE_BOX + " = (" + MESSAGE_BOX + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" + " WHERE " + ID + " = ?", new String[] {id + ""}); @@ -785,7 +785,7 @@ public class MmsDatabase extends MessageDatabase { @Override public void clearRateLimitStatus(@NonNull Collection ids) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -830,7 +830,7 @@ public class MmsDatabase extends MessageDatabase { @Override public void markAsRemoteDelete(long messageId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId; @@ -863,7 +863,7 @@ public class MmsDatabase extends MessageDatabase { @Override public void markDownloadState(long messageId, long state) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(STATUS, state); @@ -881,7 +881,7 @@ public class MmsDatabase extends MessageDatabase { ContentValues contentValues = new ContentValues(); contentValues.put(UNIDENTIFIED, unidentified ? 1 : 0); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(messageId)}); } @@ -897,7 +897,7 @@ public class MmsDatabase extends MessageDatabase { @Override public void markExpireStarted(Collection ids, long startedAtTimestamp) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId = -1; db.beginTransaction(); @@ -926,7 +926,7 @@ public class MmsDatabase extends MessageDatabase { @Override public void markAsNotified(long id) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(NOTIFIED, 1); @@ -955,7 +955,7 @@ public class MmsDatabase extends MessageDatabase { } private List setMessagesRead(String where, String[] arguments) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); List result = new LinkedList<>(); Cursor cursor = null; @@ -996,7 +996,7 @@ public class MmsDatabase extends MessageDatabase { @Override public List> setTimestampRead(SyncMessageId messageId, long proposedExpireStarted, @NonNull Map threadToLatestRead) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); List> expiring = new LinkedList<>(); Cursor cursor = null; @@ -1045,7 +1045,7 @@ public class MmsDatabase extends MessageDatabase { @Override public @Nullable Pair getOldestUnreadMentionDetails(long threadId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String[] projection = new String[]{RECIPIENT_ID,DATE_RECEIVED}; String selection = THREAD_ID + " = ? AND " + READ + " = 0 AND " + MENTIONS_SELF + " = 1"; String[] args = SqlUtil.buildArgs(threadId); @@ -1061,7 +1061,7 @@ public class MmsDatabase extends MessageDatabase { @Override public int getUnreadMentionCount(long threadId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String[] projection = new String[]{"COUNT(*)"}; String selection = THREAD_ID + " = ? AND " + READ + " = 0 AND " + MENTIONS_SELF + " = 1"; String[] args = SqlUtil.buildArgs(threadId); @@ -1079,7 +1079,7 @@ public class MmsDatabase extends MessageDatabase { * Trims data related to expired messages. Only intended to be run after a backup restore. */ void trimEntriesForExpiredMessages() { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String trimmedCondition = " NOT IN (SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME + ")"; database.delete(GroupReceiptDatabase.TABLE_NAME, GroupReceiptDatabase.MMS_ID + trimmedCondition, null); @@ -1396,7 +1396,7 @@ public class MmsDatabase extends MessageDatabase { } public Pair insertMessageInbox(@NonNull NotificationInd notification, int subscriptionId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId = getThreadIdFor(notification); ContentValues contentValues = new ContentValues(); ContentValuesBuilder contentBuilder = new ContentValuesBuilder(contentValues); @@ -1585,7 +1585,7 @@ public class MmsDatabase extends MessageDatabase { @Nullable SmsDatabase.InsertListener insertListener) throws MmsException { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); AttachmentDatabase partsDatabase = DatabaseFactory.getAttachmentDatabase(context); MentionDatabase mentionDatabase = DatabaseFactory.getMentionDatabase(context); @@ -1617,7 +1617,7 @@ public class MmsDatabase extends MessageDatabase { ContentValues contactValues = new ContentValues(); contactValues.put(SHARED_CONTACTS, serializedContacts); - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); int rows = database.update(TABLE_NAME, contactValues, ID + " = ?", new String[]{ String.valueOf(messageId) }); if (rows <= 0) { @@ -1629,7 +1629,7 @@ public class MmsDatabase extends MessageDatabase { ContentValues contactValues = new ContentValues(); contactValues.put(LINK_PREVIEWS, serializedPreviews); - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); int rows = database.update(TABLE_NAME, contactValues, ID + " = ?", new String[]{ String.valueOf(messageId) }); if (rows <= 0) { @@ -1666,7 +1666,7 @@ public class MmsDatabase extends MessageDatabase { MentionDatabase mentionDatabase = DatabaseFactory.getMentionDatabase(context); mentionDatabase.deleteMentionsForMessage(messageId); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.delete(TABLE_NAME, ID_WHERE, new String[] {messageId+""}); DatabaseFactory.getThreadDatabase(context).setLastScrolled(threadId, 0); @@ -1734,7 +1734,7 @@ public class MmsDatabase extends MessageDatabase { } private boolean isDuplicate(IncomingMediaMessage message, long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = DATE_SENT + " = ? AND " + RECIPIENT_ID + " = ? AND " + THREAD_ID + " = ?"; String[] args = SqlUtil.buildArgs(message.getSentTimeMillis(), message.getFrom().serialize(), threadId); @@ -1745,7 +1745,7 @@ public class MmsDatabase extends MessageDatabase { @Override public boolean isSent(long messageId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, new String[] { MESSAGE_BOX }, ID + " = ?", new String[] { String.valueOf(messageId)}, null, null, null)) { if (cursor != null && cursor.moveToNext()) { long type = cursor.getLong(cursor.getColumnIndexOrThrow(MESSAGE_BOX)); @@ -1762,7 +1762,7 @@ public class MmsDatabase extends MessageDatabase { @Override public Set getAllRateLimitedMessageIds() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String where = "(" + MESSAGE_BOX + " & " + Types.TOTAL_MASK + " & " + Types.MESSAGE_RATE_LIMITED_BIT + ") > 0"; Set ids = new HashSet<>(); @@ -1780,7 +1780,7 @@ public class MmsDatabase extends MessageDatabase { void deleteThreads(@NonNull Set threadIds) { Log.d(TAG, "deleteThreads(count: " + threadIds.size() + ")"); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = ""; for (long threadId : threadIds) { @@ -1798,7 +1798,7 @@ public class MmsDatabase extends MessageDatabase { @Override int deleteMessagesInThreadBeforeDate(long threadId, long date) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < " + date; return db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId)); @@ -1806,7 +1806,7 @@ public class MmsDatabase extends MessageDatabase { @Override void deleteAbandonedMessages() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = THREAD_ID + " NOT IN (SELECT _id FROM " + ThreadDatabase.TABLE_NAME + ")"; int deletes = db.delete(TABLE_NAME, where, null); @@ -1839,13 +1839,13 @@ public class MmsDatabase extends MessageDatabase { DatabaseFactory.getGroupReceiptDatabase(context).deleteAllRows(); DatabaseFactory.getMentionDatabase(context).deleteAllMentions(); - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.delete(TABLE_NAME, null, null); } @Override public @Nullable ViewOnceExpirationInfo getNearestExpiringViewOnceMessage() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); ViewOnceExpirationInfo info = null; long nearestExpiration = Long.MAX_VALUE; @@ -1884,18 +1884,18 @@ public class MmsDatabase extends MessageDatabase { @Override public SQLiteDatabase beginTransaction() { - databaseHelper.getWritableDatabase().beginTransaction(); - return databaseHelper.getWritableDatabase(); + databaseHelper.getSignalWritableDatabase().beginTransaction(); + return databaseHelper.getSignalWritableDatabase(); } @Override public void setTransactionSuccessful() { - databaseHelper.getWritableDatabase().setTransactionSuccessful(); + databaseHelper.getSignalWritableDatabase().setTransactionSuccessful(); } @Override public void endTransaction() { - databaseHelper.getWritableDatabase().endTransaction(); + databaseHelper.getSignalWritableDatabase().endTransaction(); } public static Reader readerFor(Cursor cursor) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index 9d9ab9b492..7990e0cf9c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -24,7 +24,7 @@ import androidx.annotation.Nullable; import com.annimon.stream.Stream; -import net.sqlcipher.database.SQLiteQueryBuilder; +import net.zetetic.database.sqlcipher.SQLiteQueryBuilder; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; @@ -192,7 +192,7 @@ public class MmsSmsDatabase extends Database { public Cursor getConversation(long threadId, long offset, long limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC"; String selection = MmsSmsColumns.THREAD_ID + " = " + threadId; String limitStr = limit > 0 || offset > 0 ? offset + ", " + limit : null; @@ -219,7 +219,7 @@ public class MmsSmsDatabase extends Database { } public @NonNull MessageRecord getConversationSnippet(long threadId) throws NoSuchMessageException { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.rawQuery(SNIPPET_QUERY, SqlUtil.buildArgs(threadId, threadId))) { if (cursor.moveToFirst()) { boolean isMms = CursorUtil.requireBoolean(cursor, TRANSPORT); @@ -237,7 +237,7 @@ public class MmsSmsDatabase extends Database { } public long getConversationSnippetType(long threadId) throws NoSuchMessageException { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.rawQuery(SNIPPET_QUERY, SqlUtil.buildArgs(threadId, threadId))) { if (cursor.moveToFirst()) { return CursorUtil.requireLong(cursor, MmsSmsColumns.NORMALIZED_TYPE); @@ -415,7 +415,7 @@ public class MmsSmsDatabase extends Database { * @return Whether or not some thread was updated. */ private boolean incrementReceiptCount(SyncMessageId syncMessageId, long timestamp, @NonNull MessageDatabase.ReceiptType receiptType) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); Set threadUpdates = new HashSet<>(); @@ -449,7 +449,7 @@ public class MmsSmsDatabase extends Database { * @return All of the messages that didn't result in updates. */ private @NonNull Collection incrementReceiptCounts(@NonNull List syncMessageIds, long timestamp, @NonNull MessageDatabase.ReceiptType receiptType) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); Set threadUpdates = new HashSet<>(); Collection unhandled = new HashSet<>(); @@ -819,7 +819,7 @@ public class MmsSmsDatabase extends Database { private Cursor queryTables(String[] projection, String selection, String order, String limit) { String query = buildQuery(projection, selection, order, limit, true); - return databaseHelper.getReadableDatabase().rawQuery(query, null); + return databaseHelper.getSignalReadableDatabase().rawQuery(query, null); } public static Reader readerFor(@NonNull Cursor cursor) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyDatabase.java index e2f9920f9e..dc1ff884d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyDatabase.java @@ -40,7 +40,7 @@ public class OneTimePreKeyDatabase extends Database { } public @Nullable PreKeyRecord getPreKey(int keyId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, null, KEY_ID + " = ?", new String[] {String.valueOf(keyId)}, @@ -62,7 +62,7 @@ public class OneTimePreKeyDatabase extends Database { } public void insertPreKey(int keyId, PreKeyRecord record) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(KEY_ID, keyId); @@ -73,7 +73,7 @@ public class OneTimePreKeyDatabase extends Database { } public void removePreKey(int keyId) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.delete(TABLE_NAME, KEY_ID + " = ?", new String[] {String.valueOf(keyId)}); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/PaymentDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/PaymentDatabase.java index 9de077c43b..9f295d40bb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/PaymentDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/PaymentDatabase.java @@ -197,7 +197,7 @@ public final class PaymentDatabase extends Database { throw new AssertionError(); } - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(15); values.put(PAYMENT_UUID, uuid.toString()); @@ -247,14 +247,14 @@ public final class PaymentDatabase extends Database { } public void deleteAll() { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.delete(TABLE_NAME, null, null); Log.i(TAG, "Deleted all records"); } @WorkerThread public boolean delete(@NonNull UUID uuid) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String where = PAYMENT_UUID + " = ?"; String[] args = {uuid.toString()}; int deleted; @@ -281,7 +281,7 @@ public final class PaymentDatabase extends Database { @WorkerThread public @NonNull List getAll() { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); List result = new LinkedList<>(); try (Cursor cursor = database.query(TABLE_NAME, null, null, null, null, null, TIMESTAMP + " DESC")) { @@ -295,7 +295,7 @@ public final class PaymentDatabase extends Database { @WorkerThread public void markAllSeen() { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(1); List unseenIds = new LinkedList<>(); String[] unseenProjection = SqlUtil.buildArgs(PAYMENT_UUID); @@ -334,7 +334,7 @@ public final class PaymentDatabase extends Database { @WorkerThread public void markPaymentSeen(@NonNull UUID uuid) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(1); String where = PAYMENT_UUID + " = ?"; String[] args = {uuid.toString()}; @@ -349,7 +349,7 @@ public final class PaymentDatabase extends Database { @WorkerThread public @NonNull List getUnseenPayments() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = SEEN + " = 0 AND " + STATE + " = " + State.SUCCESSFUL.serialize(); List results = new LinkedList<>(); @@ -364,7 +364,7 @@ public final class PaymentDatabase extends Database { @WorkerThread public @Nullable PaymentTransaction getPayment(@NonNull UUID uuid) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String select = PAYMENT_UUID + " = ?"; String[] args = {uuid.toString()}; @@ -394,7 +394,7 @@ public final class PaymentDatabase extends Database { @NonNull Money fee) throws PublicKeyConflictException { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String where = PAYMENT_UUID + " = ?"; String[] whereArgs = {uuid.toString()}; int updated; @@ -449,7 +449,7 @@ public final class PaymentDatabase extends Database { @Nullable FailureReason failureReason, @Nullable Long blockIndex) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String where = PAYMENT_UUID + " = ?"; String[] whereArgs = {uuid.toString()}; int updated; @@ -499,7 +499,7 @@ public final class PaymentDatabase extends Database { long blockIndex, long blockTimestamp) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String where = PAYMENT_UUID + " = ?"; String[] whereArgs = {uuid.toString()}; int updated; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/PendingRetryReceiptDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/PendingRetryReceiptDatabase.java index f5e0de0e73..7ecbf14142 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/PendingRetryReceiptDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/PendingRetryReceiptDatabase.java @@ -6,6 +6,8 @@ import android.database.Cursor; import androidx.annotation.NonNull; +import net.zetetic.database.sqlcipher.SQLiteDatabase; + import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.PendingRetryReceiptModel; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -51,7 +53,7 @@ public final class PendingRetryReceiptDatabase extends Database { values.put(RECEIVED_TIMESTAMP, receivedTimestamp); values.put(THREAD_ID, threadId); - long id = databaseHelper.getWritableDatabase().insertWithOnConflict(TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE); + long id = databaseHelper.getSignalWritableDatabase().insertWithOnConflict(TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE); return new PendingRetryReceiptModel(id, author, authorDevice, sentTimestamp, receivedTimestamp, threadId); } @@ -59,7 +61,7 @@ public final class PendingRetryReceiptDatabase extends Database { @NonNull List getAll() { List models = new LinkedList<>(); - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null)) { while (cursor.moveToNext()) { models.add(fromCursor(cursor)); } @@ -69,7 +71,7 @@ public final class PendingRetryReceiptDatabase extends Database { } void delete(@NonNull PendingRetryReceiptModel model) { - databaseHelper.getWritableDatabase().delete(TABLE_NAME, ID_WHERE, SqlUtil.buildArgs(model.getId())); + databaseHelper.getSignalWritableDatabase().delete(TABLE_NAME, ID_WHERE, SqlUtil.buildArgs(model.getId())); } private static @NonNull PendingRetryReceiptModel fromCursor(@NonNull Cursor cursor) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/PushDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/PushDatabase.java index 27d663e090..a3d7bc07ab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/PushDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/PushDatabase.java @@ -69,7 +69,7 @@ public class PushDatabase extends Database { values.put(SERVER_DELIVERED_TIMESTAMP, envelope.getServerDeliveredTimestamp()); values.put(SERVER_GUID, envelope.getServerGuid()); - return databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, values); + return databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values); } } @@ -77,9 +77,9 @@ public class PushDatabase extends Database { Cursor cursor = null; try { - cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, ID_WHERE, - new String[] {String.valueOf(id)}, - null, null, null); + cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, ID_WHERE, + new String[] {String.valueOf(id)}, + null, null, null); if (cursor != null && cursor.moveToNext()) { String legacyMessage = cursor.getString(cursor.getColumnIndexOrThrow(LEGACY_MSG)); @@ -109,11 +109,11 @@ public class PushDatabase extends Database { } public Cursor getPending() { - return databaseHelper.getReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null); + return databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null); } public void delete(long id) { - databaseHelper.getWritableDatabase().delete(TABLE_NAME, ID_WHERE, new String[] {id+""}); + databaseHelper.getSignalWritableDatabase().delete(TABLE_NAME, ID_WHERE, new String[] {id+""}); } public Reader readerFor(Cursor cursor) { @@ -121,7 +121,7 @@ public class PushDatabase extends Database { } private Optional find(SignalServiceEnvelope envelope) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String query = TYPE + " = ? AND " + DEVICE_ID + " = ? AND " + LEGACY_MSG + " = ? AND " + diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java index 38c450056a..a9344a1e2b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -14,8 +14,7 @@ import com.annimon.stream.Stream; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; -import net.sqlcipher.SQLException; -import net.sqlcipher.database.SQLiteConstraintException; +import net.zetetic.database.sqlcipher.SQLiteConstraintException; import org.jetbrains.annotations.NotNull; import org.signal.core.util.logging.Log; @@ -387,7 +386,7 @@ public class RecipientDatabase extends Database { } public @NonNull boolean containsPhoneOrUuid(@NonNull String id) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = UUID + " = ? OR " + PHONE + " = ?"; String[] args = new String[]{id, id}; @@ -429,7 +428,7 @@ public class RecipientDatabase extends Database { Pair remapped = null; boolean transactionSuccessful = false; - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -598,7 +597,7 @@ public class RecipientDatabase extends Database { values.put(GROUP_ID, groupId.toString()); values.put(AVATAR_COLOR, AvatarColor.random().serialize()); - long id = databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, values); + long id = databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values); if (id < 0) { existing = getByColumn(GROUP_ID, groupId.toString()); @@ -639,7 +638,7 @@ public class RecipientDatabase extends Database { * See {@link Recipient#externalPossiblyMigratedGroup(Context, GroupId)}. */ public @NonNull RecipientId getOrInsertFromPossiblyMigratedGroupId(@NonNull GroupId groupId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -676,7 +675,7 @@ public class RecipientDatabase extends Database { } public Cursor getBlocked() { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); return database.query(TABLE_NAME, ID_PROJECTION, BLOCKED + " = 1", null, null, null, null, null); @@ -687,7 +686,7 @@ public class RecipientDatabase extends Database { } public RecipientReader getRecipientsWithNotificationChannels() { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); Cursor cursor = database.query(TABLE_NAME, ID_PROJECTION, NOTIFICATION_CHANNEL + " NOT NULL", null, null, null, null, null); @@ -695,7 +694,7 @@ public class RecipientDatabase extends Database { } public @NonNull RecipientSettings getRecipientSettings(@NonNull RecipientId id) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String query = ID + " = ?"; String[] args = new String[] { id.serialize() }; @@ -742,7 +741,7 @@ public class RecipientDatabase extends Database { } public void markNeedsSyncWithoutRefresh(@NonNull Collection recipientIds) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -761,7 +760,7 @@ public class RecipientDatabase extends Database { } public void applyStorageIdUpdates(@NonNull Map storageIds) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -784,7 +783,7 @@ public class RecipientDatabase extends Database { } public void applyStorageSyncContactInsert(@NonNull SignalContactRecord insert) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); ContentValues values = getValuesForStorageContact(insert, true); @@ -813,7 +812,7 @@ public class RecipientDatabase extends Database { } public void applyStorageSyncContactUpdate(@NonNull StorageRecordUpdate update) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); IdentityDatabase identityDatabase = DatabaseFactory.getIdentityDatabase(context); ContentValues values = getValuesForStorageContact(update.getNew(), false); @@ -871,7 +870,7 @@ public class RecipientDatabase extends Database { } public void applyStorageSyncGroupV1Insert(@NonNull SignalGroupV1Record insert) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long id = db.insertOrThrow(TABLE_NAME, null, getValuesForStorageGroupV1(insert, true)); RecipientId recipientId = RecipientId.from(id); @@ -882,7 +881,7 @@ public class RecipientDatabase extends Database { } public void applyStorageSyncGroupV1Update(@NonNull StorageRecordUpdate update) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues values = getValuesForStorageGroupV1(update.getNew(), false); int updateCount = db.update(TABLE_NAME, values, STORAGE_SERVICE_ID + " = ?", new String[]{Base64.encodeBytes(update.getOld().getId().getRaw())}); @@ -899,7 +898,7 @@ public class RecipientDatabase extends Database { } public void applyStorageSyncGroupV2Insert(@NonNull SignalGroupV2Record insert) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); GroupMasterKey masterKey = insert.getMasterKeyOrThrow(); GroupId.V2 groupId = GroupId.v2(masterKey); @@ -924,7 +923,7 @@ public class RecipientDatabase extends Database { } public void applyStorageSyncGroupV2Update(@NonNull StorageRecordUpdate update) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues values = getValuesForStorageGroupV2(update.getNew(), false); int updateCount = db.update(TABLE_NAME, values, STORAGE_SERVICE_ID + " = ?", new String[]{Base64.encodeBytes(update.getOld().getId().getRaw())}); @@ -942,7 +941,7 @@ public class RecipientDatabase extends Database { } public void applyStorageSyncAccountUpdate(@NonNull StorageRecordUpdate update) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(); ProfileName profileName = ProfileName.fromParts(update.getNew().getGivenName().orNull(), update.getNew().getFamilyName().orNull()); @@ -983,7 +982,7 @@ public class RecipientDatabase extends Database { public void updatePhoneNumbers(@NonNull Map mapping) { if (mapping.isEmpty()) return; - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -1003,7 +1002,7 @@ public class RecipientDatabase extends Database { } private @NonNull RecipientId getByStorageKeyOrThrow(byte[] storageKey) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = STORAGE_SERVICE_ID + " = ?"; String[] args = new String[]{Base64.encodeBytes(storageKey)}; @@ -1096,7 +1095,7 @@ public class RecipientDatabase extends Database { } private List getRecipientSettingsForSync(@Nullable String query, @Nullable String[] args) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String table = TABLE_NAME + " LEFT OUTER JOIN " + IdentityDatabase.TABLE_NAME + " ON " + TABLE_NAME + "." + ID + " = " + IdentityDatabase.TABLE_NAME + "." + IdentityDatabase.RECIPIENT_ID + " LEFT OUTER JOIN " + GroupDatabase.TABLE_NAME + " ON " + TABLE_NAME + "." + GROUP_ID + " = " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.GROUP_ID + " LEFT OUTER JOIN " + ThreadDatabase.TABLE_NAME + " ON " + TABLE_NAME + "." + ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID; @@ -1132,7 +1131,7 @@ public class RecipientDatabase extends Database { * @return All storage IDs for ContactRecords, excluding the ones that need to be deleted. */ public @NonNull Map getContactStorageSyncIdsMap() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = STORAGE_SERVICE_ID + " NOT NULL AND " + ID + " != ? AND " + GROUP_TYPE + " != ?"; String[] args = SqlUtil.buildArgs(Recipient.self().getId(), String.valueOf(GroupType.SIGNAL_V2.getId())); Map out = new HashMap<>(); @@ -1347,7 +1346,7 @@ public class RecipientDatabase extends Database { } public BulkOperationsHandle beginBulkSystemContactUpdate() { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.beginTransaction(); ContentValues contentValues = new ContentValues(1); @@ -1359,7 +1358,7 @@ public class RecipientDatabase extends Database { } void onUpdatedChatColors(@NonNull ChatColors chatColors) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String where = CUSTOM_CHAT_COLORS_ID + " = ?"; String[] args = SqlUtil.buildArgs(chatColors.getId().getLongValue()); List updated = new LinkedList<>(); @@ -1387,7 +1386,7 @@ public class RecipientDatabase extends Database { } void onDeletedChatColors(@NonNull ChatColors chatColors) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String where = CUSTOM_CHAT_COLORS_ID + " = ?"; String[] args = SqlUtil.buildArgs(chatColors.getId().getLongValue()); List updated = new LinkedList<>(); @@ -1415,7 +1414,7 @@ public class RecipientDatabase extends Database { } public int getColorUsageCount(@NotNull ChatColors.Id chatColorsId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = SqlUtil.buildArgs("COUNT(*)"); String where = CUSTOM_CHAT_COLORS_ID + " = ?"; String[] args = SqlUtil.buildArgs(chatColorsId.getLongValue()); @@ -1431,7 +1430,7 @@ public class RecipientDatabase extends Database { } public void clearAllColors() { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String where = CUSTOM_CHAT_COLORS_ID + " != ?"; String[] args = SqlUtil.buildArgs(ChatColors.Id.NotSet.INSTANCE.getLongValue()); List toUpdate = new LinkedList<>(); @@ -1555,7 +1554,7 @@ public class RecipientDatabase extends Database { } private void setInsightsBannerTier(@NonNull RecipientId id, @NonNull InsightsBannerTier insightsBannerTier) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(1); String query = ID + " = ? AND " + SEEN_INVITE_REMINDER + " < ?"; String[] args = new String[]{ id.serialize(), String.valueOf(insightsBannerTier) }; @@ -1588,7 +1587,7 @@ public class RecipientDatabase extends Database { } public @NonNull DeviceLastResetTime getLastSessionResetTimes(@NonNull RecipientId id) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, new String[] {LAST_SESSION_RESET}, ID_WHERE, SqlUtil.buildArgs(id), null, null, null)) { if (cursor.moveToFirst()) { @@ -1599,7 +1598,7 @@ public class RecipientDatabase extends Database { } else { return DeviceLastResetTime.newBuilder().build(); } - } catch (InvalidProtocolBufferException | SQLException e) { + } catch (InvalidProtocolBufferException e) { Log.w(TAG, e); return DeviceLastResetTime.newBuilder().build(); } @@ -1670,7 +1669,7 @@ public class RecipientDatabase extends Database { * @return true iff changed. */ public boolean setProfileKeyIfAbsent(@NonNull RecipientId id, @NonNull ProfileKey profileKey) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String selection = ID + " = ? AND " + PROFILE_KEY + " is NULL"; String[] args = new String[]{id.serialize()}; ContentValues valuesToSet = new ContentValues(3); @@ -1777,7 +1776,7 @@ public class RecipientDatabase extends Database { } public @NonNull List getSimilarRecipientIds(@NonNull Recipient recipient) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = SqlUtil.buildArgs(ID, "COALESCE(" + nullIfEmpty(SYSTEM_JOINED_NAME) + ", " + nullIfEmpty(PROFILE_JOINED_NAME) + ") AS checked_name"); String where = "checked_name = ?"; @@ -1862,7 +1861,7 @@ public class RecipientDatabase extends Database { } public void resetAllWallpaper() { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); String[] selection = SqlUtil.buildArgs(ID, WALLPAPER_URI); String where = WALLPAPER + " IS NOT NULL"; List> idWithWallpaper = new LinkedList<>(); @@ -1944,7 +1943,7 @@ public class RecipientDatabase extends Database { } private @Nullable Wallpaper getWallpaper(@NonNull RecipientId id) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, new String[] {WALLPAPER}, ID_WHERE, SqlUtil.buildArgs(id), null, null, null)) { if (cursor.moveToFirst()) { @@ -1976,7 +1975,7 @@ public class RecipientDatabase extends Database { } public int getWallpaperUriUsageCount(@NonNull Uri uri) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = WALLPAPER_URI + " = ?"; String[] args = SqlUtil.buildArgs(uri); @@ -1993,7 +1992,7 @@ public class RecipientDatabase extends Database { * @return True if setting the phone number resulted in changed recipientId, otherwise false. */ public boolean setPhoneNumber(@NonNull RecipientId id, @NonNull String e164) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -2061,7 +2060,7 @@ public class RecipientDatabase extends Database { } public Set getAllPhoneNumbers() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Set results = new HashSet<>(); try (Cursor cursor = db.query(TABLE_NAME, new String[] { PHONE }, null, null, null, null, null)) { @@ -2081,7 +2080,7 @@ public class RecipientDatabase extends Database { * @return True if setting the UUID resulted in changed recipientId, otherwise false. */ public boolean markRegistered(@NonNull RecipientId id, @NonNull UUID uuid) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -2142,7 +2141,7 @@ public class RecipientDatabase extends Database { } public void bulkUpdatedRegisteredStatus(@NonNull Map registered, Collection unregistered) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -2188,7 +2187,7 @@ public class RecipientDatabase extends Database { * @return A mapping of (RecipientId, UUID) */ public @NonNull Map bulkProcessCdsResult(@NonNull Map mapping) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); HashMap uuidMap = new HashMap<>(); db.beginTransaction(); @@ -2219,7 +2218,7 @@ public class RecipientDatabase extends Database { } public @NonNull List getUninvitedRecipientsForInsights() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); final String[] args = new String[]{String.valueOf(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(31))}; @@ -2233,7 +2232,7 @@ public class RecipientDatabase extends Database { } public @NonNull List getRegistered() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); try (Cursor cursor = db.query(TABLE_NAME, ID_PROJECTION, REGISTERED + " = ?", new String[] {"1"}, null, null, null)) { @@ -2246,7 +2245,7 @@ public class RecipientDatabase extends Database { } public List getSystemContacts() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); try (Cursor cursor = db.query(TABLE_NAME, ID_PROJECTION, SYSTEM_JOINED_NAME + " IS NOT NULL AND " + SYSTEM_JOINED_NAME + " != \"\"", null, null, null, null)) { @@ -2264,7 +2263,7 @@ public class RecipientDatabase extends Database { */ @Deprecated public void updateSystemContactColors() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Map updates = new HashMap<>(); db.beginTransaction(); @@ -2326,7 +2325,7 @@ public class RecipientDatabase extends Database { String[] args = searchSelection.getArgs(); String orderBy = SORT_NAME + ", " + SYSTEM_JOINED_NAME + ", " + SEARCH_PROFILE_NAME + ", " + USERNAME + ", " + PHONE; - return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); + return databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); } public @Nullable Cursor querySignalContacts(@NonNull String query, boolean includeSelf) { @@ -2343,7 +2342,7 @@ public class RecipientDatabase extends Database { String orderBy = SORT_NAME + ", " + SYSTEM_JOINED_NAME + ", " + SEARCH_PROFILE_NAME + ", " + PHONE; - return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); + return databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); } public @Nullable Cursor getNonSignalContacts() { @@ -2355,7 +2354,7 @@ public class RecipientDatabase extends Database { String[] args = searchSelection.getArgs(); String orderBy = SYSTEM_JOINED_NAME + ", " + PHONE; - return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); + return databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); } public @Nullable Cursor queryNonSignalContacts(@NonNull String query) { @@ -2370,7 +2369,7 @@ public class RecipientDatabase extends Database { String[] args = searchSelection.getArgs(); String orderBy = SYSTEM_JOINED_NAME + ", " + PHONE; - return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); + return databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); } public @Nullable Cursor getNonGroupContacts(boolean includeSelf) { @@ -2382,7 +2381,7 @@ public class RecipientDatabase extends Database { String orderBy = orderByPreferringAlphaOverNumeric(SORT_NAME) + ", " + PHONE; - return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, searchSelection.where, searchSelection.args, null, null, orderBy); + return databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, searchSelection.where, searchSelection.args, null, null, orderBy); } public @Nullable Cursor queryNonGroupContacts(@NonNull String query, boolean includeSelf) { @@ -2399,7 +2398,7 @@ public class RecipientDatabase extends Database { String[] args = searchSelection.getArgs(); String orderBy = orderByPreferringAlphaOverNumeric(SORT_NAME) + ", " + PHONE; - return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); + return databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, orderBy); } public @Nullable Cursor queryAllContacts(@NonNull String query) { @@ -2414,7 +2413,7 @@ public class RecipientDatabase extends Database { ")"; String[] args = SqlUtil.buildArgs("0", query, query, query, query); - return databaseHelper.getReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, null); + return databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, SEARCH_PROJECTION, selection, args, null, null, null); } public @NonNull List queryRecipientsForMentions(@NonNull String query) { @@ -2434,7 +2433,7 @@ public class RecipientDatabase extends Database { SORT_NAME + " GLOB ?"; List recipients = new ArrayList<>(); - try (RecipientDatabase.RecipientReader reader = new RecipientReader(databaseHelper.getReadableDatabase().query(TABLE_NAME, MENTION_SEARCH_PROJECTION, selection, SqlUtil.buildArgs(query), null, null, SORT_NAME))) { + try (RecipientDatabase.RecipientReader reader = new RecipientReader(databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, MENTION_SEARCH_PROJECTION, selection, SqlUtil.buildArgs(query), null, null, SORT_NAME))) { Recipient recipient; while ((recipient = reader.getNext()) != null) { recipients.add(recipient); @@ -2539,7 +2538,7 @@ public class RecipientDatabase extends Database { List recipients = new ArrayList<>(); - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, ID_PROJECTION, selection, args, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, ID_PROJECTION, selection, args, null, null, null)) { while (cursor != null && cursor.moveToNext()) { recipients.add(Recipient.resolved(RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(ID))))); } @@ -2580,7 +2579,7 @@ public class RecipientDatabase extends Database { } public void markProfilesFetched(@NonNull Collection ids, long time) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(1); @@ -2605,7 +2604,7 @@ public class RecipientDatabase extends Database { .map(b -> b.getUuid().get().toString().toLowerCase()) .toList(); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -2644,7 +2643,7 @@ public class RecipientDatabase extends Database { } public void updateStorageIds(@NonNull Map ids) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -2677,7 +2676,7 @@ public class RecipientDatabase extends Database { + ")"; List idsToUpdate = new ArrayList<>(); - try (Cursor cursor = databaseHelper.getReadableDatabase().rawQuery(select, whereArgs)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().rawQuery(select, whereArgs)) { while (cursor.moveToNext()) { idsToUpdate.add(CursorUtil.requireLong(cursor, ID)); } @@ -2687,7 +2686,7 @@ public class RecipientDatabase extends Database { SqlUtil.Query query = SqlUtil.buildCollectionQuery(ID, idsToUpdate); ContentValues values = new ContentValues(1); values.put(PROFILE_SHARING, 1); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, query.getWhere(), query.getWhereArgs()); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, query.getWhere(), query.getWhereArgs()); for (long id : idsToUpdate) { Recipient.live(RecipientId.from(id)).refresh(); @@ -2701,7 +2700,7 @@ public class RecipientDatabase extends Database { } SqlUtil.Query query = SqlUtil.buildCollectionQuery(ID, recipientIds); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, new String[]{ID}, query.getWhere() + " AND " + GROUPS_IN_COMMON + " = 0", @@ -2734,7 +2733,7 @@ public class RecipientDatabase extends Database { } private void updateExtras(@NonNull RecipientId recipientId, @NonNull Function updater) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { try (Cursor cursor = db.query(TABLE_NAME, new String[]{ID, EXTRAS}, ID_WHERE, SqlUtil.buildArgs(recipientId), null, null, null)) { @@ -2767,7 +2766,7 @@ public class RecipientDatabase extends Database { String query = ID + " = ? AND (" + GROUP_TYPE + " IN (?, ?) OR " + REGISTERED + " = ?)"; String[] args = SqlUtil.buildArgs(recipientId, GroupType.SIGNAL_V1.getId(), GroupType.SIGNAL_V2.getId(), RegisteredState.REGISTERED.getId()); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, query, args); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, query, args); } /** @@ -2780,7 +2779,7 @@ public class RecipientDatabase extends Database { String query = ID + " = ? AND " + STORAGE_SERVICE_ID + " IS NULL"; String[] args = SqlUtil.buildArgs(recipientId); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, query, args); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, query, args); } /** @@ -2817,14 +2816,14 @@ public class RecipientDatabase extends Database { * This will only return true if a row was *actually* updated with respect to the where clause of the {@param updateQuery}. */ private boolean update(@NonNull SqlUtil.Query updateQuery, @NonNull ContentValues contentValues) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); return database.update(TABLE_NAME, contentValues, updateQuery.getWhere(), updateQuery.getWhereArgs()) > 0; } private @NonNull Optional getByColumn(@NonNull String column, String value) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String query = column + " = ?"; String[] args = new String[] { value }; @@ -2851,7 +2850,7 @@ public class RecipientDatabase extends Database { values.put(column, value); values.put(AVATAR_COLOR, AvatarColor.random().serialize()); - long id = databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, values); + long id = databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values); if (id < 0) { existing = getByColumn(column, value); @@ -2875,7 +2874,7 @@ public class RecipientDatabase extends Database { private @NonNull RecipientId merge(@NonNull RecipientId byUuid, @NonNull RecipientId byE164) { ensureInTransaction(); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); RecipientSettings uuidSettings = getRecipientSettings(byUuid); RecipientSettings e164Settings = getRecipientSettings(byE164); @@ -3005,7 +3004,7 @@ public class RecipientDatabase extends Database { } private void ensureInTransaction() { - if (!databaseHelper.getWritableDatabase().inTransaction()) { + if (!databaseHelper.getSignalWritableDatabase().inTransaction()) { throw new IllegalStateException("Must be in a transaction!"); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordsDatabase.java index 4fa7bab5f4..4dcdb85999 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordsDatabase.java @@ -2,11 +2,10 @@ package org.thoughtcrime.securesms.database; import android.content.ContentValues; import android.content.Context; +import android.database.Cursor; import androidx.annotation.NonNull; -import net.sqlcipher.Cursor; - import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.CursorUtil; @@ -49,7 +48,7 @@ public class RemappedRecordsDatabase extends Database { } @NonNull Map getAllRecipientMappings() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Map recipientMap = new HashMap<>(); db.beginTransaction(); @@ -71,7 +70,7 @@ public class RemappedRecordsDatabase extends Database { } @NonNull Map getAllThreadMappings() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Map threadMap = new HashMap<>(); db.beginTransaction(); @@ -101,7 +100,7 @@ public class RemappedRecordsDatabase extends Database { private @NonNull List getAllMappings(@NonNull String table) { List mappings = new LinkedList<>(); - try (Cursor cursor = databaseHelper.getReadableDatabase().query(table, null, null, null, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(table, null, null, null, null, null, null)) { while (cursor != null && cursor.moveToNext()) { long oldId = CursorUtil.requireLong(cursor, SharedColumns.OLD_ID); long newId = CursorUtil.requireLong(cursor, SharedColumns.NEW_ID); @@ -117,7 +116,7 @@ public class RemappedRecordsDatabase extends Database { values.put(SharedColumns.OLD_ID, mapping.getOldId()); values.put(SharedColumns.NEW_ID, mapping.getNewId()); - databaseHelper.getWritableDatabase().insert(table, null, values); + databaseHelper.getSignalWritableDatabase().insert(table, null, values); } static final class Mapping { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java index fcafb3dab8..943e1f5105 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java @@ -2,22 +2,20 @@ package org.thoughtcrime.securesms.database; import android.content.ContentValues; +import android.database.Cursor; -import net.sqlcipher.Cursor; -import net.sqlcipher.SQLException; -import net.sqlcipher.database.SQLiteQueryStats; -import net.sqlcipher.database.SQLiteStatement; -import net.sqlcipher.database.SQLiteTransactionListener; +import net.zetetic.database.SQLException; +import net.zetetic.database.sqlcipher.SQLiteStatement; +import net.zetetic.database.sqlcipher.SQLiteTransactionListener; import org.signal.core.util.tracing.Tracer; -import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** - * This is a wrapper around {@link net.sqlcipher.database.SQLiteDatabase}. There's difficulties + * This is a wrapper around {@link net.zetetic.database.sqlcipher.SQLiteDatabase}. There's difficulties * making a subclass, so instead we just match the interface. Callers should just need to change * their import statements. */ @@ -35,10 +33,11 @@ public class SQLiteDatabase { private static final String KEY_THREAD = "thread"; private static final String NAME_LOCK = "LOCK"; - private final net.sqlcipher.database.SQLiteDatabase wrapped; - private final Tracer tracer; - public SQLiteDatabase(net.sqlcipher.database.SQLiteDatabase wrapped) { + private final net.zetetic.database.sqlcipher.SQLiteDatabase wrapped; + private final Tracer tracer; + + public SQLiteDatabase(net.zetetic.database.sqlcipher.SQLiteDatabase wrapped) { this.wrapped = wrapped; this.tracer = Tracer.getInstance(); } @@ -99,7 +98,7 @@ public class SQLiteDatabase { return result; } - public net.sqlcipher.database.SQLiteDatabase getSqlCipherDatabase() { + public net.zetetic.database.sqlcipher.SQLiteDatabase getSqlCipherDatabase() { return wrapped; } @@ -130,7 +129,7 @@ public class SQLiteDatabase { return traceSql("query(9)", table, selection, false, () -> wrapped.query(distinct, table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)); } - public Cursor queryWithFactory(net.sqlcipher.database.SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) { + public Cursor queryWithFactory(net.zetetic.database.sqlcipher.SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) { return traceSql("queryWithFactory()", table, selection, false, () -> wrapped.queryWithFactory(cursorFactory, distinct, table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)); } @@ -150,7 +149,7 @@ public class SQLiteDatabase { return traceSql("rawQuery(2b)", sql, false,() -> wrapped.rawQuery(sql, args)); } - public Cursor rawQueryWithFactory(net.sqlcipher.database.SQLiteDatabase.CursorFactory cursorFactory, String sql, String[] selectionArgs, String editTable) { + public Cursor rawQueryWithFactory(net.zetetic.database.sqlcipher.SQLiteDatabase.CursorFactory cursorFactory, String sql, String[] selectionArgs, String editTable) { return traceSql("rawQueryWithFactory()", sql, false, () -> wrapped.rawQueryWithFactory(cursorFactory, sql, selectionArgs, editTable)); } @@ -283,10 +282,6 @@ public class SQLiteDatabase { return wrapped.compileStatement(sql); } - public SQLiteQueryStats getQueryStats(String sql, Object[] args) { - return wrapped.getQueryStats(sql, args); - } - public boolean isReadOnly() { return wrapped.isReadOnly(); } @@ -306,24 +301,4 @@ public class SQLiteDatabase { public void setLocale(Locale locale) { wrapped.setLocale(locale); } - - public boolean isInCompiledSqlCache(String sql) { - return wrapped.isInCompiledSqlCache(sql); - } - - public void purgeFromCompiledSqlCache(String sql) { - wrapped.purgeFromCompiledSqlCache(sql); - } - - public void resetCompiledSqlCache() { - wrapped.resetCompiledSqlCache(); - } - - public int getMaxSqlCacheSize() { - return wrapped.getMaxSqlCacheSize(); - } - - public void setMaxSqlCacheSize(int cacheSize) { - wrapped.setMaxSqlCacheSize(cacheSize); - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java index e2ec1b91a7..4401f407d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java @@ -1,14 +1,13 @@ package org.thoughtcrime.securesms.database; import android.content.Context; +import android.database.Cursor; import android.text.TextUtils; import androidx.annotation.NonNull; import com.annimon.stream.Stream; -import net.sqlcipher.Cursor; - import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; /** @@ -126,7 +125,7 @@ public class SearchDatabase extends Database { } public Cursor queryMessages(@NonNull String query) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String fullTextSearchQuery = createFullTextSearchQuery(query); if (TextUtils.isEmpty(fullTextSearchQuery)) { @@ -137,7 +136,7 @@ public class SearchDatabase extends Database { } public Cursor queryMessages(@NonNull String query, long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String fullTextSearchQuery = createFullTextSearchQuery(query); if (TextUtils.isEmpty(fullTextSearchQuery)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeyDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeyDatabase.java index 839f76481d..7d9bdfecc2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeyDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeyDatabase.java @@ -50,7 +50,7 @@ public class SenderKeyDatabase extends Database { } public void store(@NonNull RecipientId recipientId, int deviceId, @NonNull DistributionId distributionId, @NonNull SenderKeyRecord record) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(); values.put(RECIPIENT_ID, recipientId.serialize()); @@ -63,7 +63,7 @@ public class SenderKeyDatabase extends Database { } public @Nullable SenderKeyRecord load(@NonNull RecipientId recipientId, int deviceId, @NonNull DistributionId distributionId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = RECIPIENT_ID + " = ? AND " + DEVICE + " = ? AND " + DISTRIBUTION_ID + " = ?"; String[] args = SqlUtil.buildArgs(recipientId, deviceId, distributionId); @@ -85,7 +85,7 @@ public class SenderKeyDatabase extends Database { * Gets when the sender key session was created, or -1 if it doesn't exist. */ public long getCreatedTime(@NonNull RecipientId recipientId, int deviceId, @NonNull DistributionId distributionId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = RECIPIENT_ID + " = ? AND " + DEVICE + " = ? AND " + DISTRIBUTION_ID + " = ?"; String[] args = SqlUtil.buildArgs(recipientId, deviceId, distributionId); @@ -103,7 +103,7 @@ public class SenderKeyDatabase extends Database { * Removes all sender key session state for all devices for the provided recipient-distributionId pair. */ public void deleteAllFor(@NonNull RecipientId recipientId, @NonNull DistributionId distributionId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String query = RECIPIENT_ID + " = ? AND " + DISTRIBUTION_ID + " = ?"; String[] args = SqlUtil.buildArgs(recipientId, distributionId); @@ -114,7 +114,7 @@ public class SenderKeyDatabase extends Database { * Deletes all database state. */ public void deleteAll() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, null, null); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeySharedDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeySharedDatabase.java index c732229d29..a2f41031b1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeySharedDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeySharedDatabase.java @@ -49,7 +49,7 @@ public class SenderKeySharedDatabase extends Database { * Mark that a distributionId has been shared with the provided recipients */ public void markAsShared(@NonNull DistributionId distributionId, @NonNull Collection addresses) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -72,7 +72,7 @@ public class SenderKeySharedDatabase extends Database { * Get the set of recipientIds that know about the distributionId in question. */ public @NonNull Set getSharedWith(@NonNull DistributionId distributionId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = DISTRIBUTION_ID + " = ?"; String[] args = SqlUtil.buildArgs(distributionId); @@ -94,7 +94,7 @@ public class SenderKeySharedDatabase extends Database { * Clear the shared statuses for all provided addresses. */ public void delete(@NonNull DistributionId distributionId, @NonNull Collection addresses) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String query = DISTRIBUTION_ID + " = ? AND " + ADDRESS + " = ? AND " + DEVICE + " = ?"; db.beginTransaction(); @@ -113,7 +113,7 @@ public class SenderKeySharedDatabase extends Database { * Clear all shared statuses for a given distributionId. */ public void deleteAllFor(@NonNull DistributionId distributionId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, DISTRIBUTION_ID + " = ?", SqlUtil.buildArgs(distributionId)); } @@ -121,7 +121,7 @@ public class SenderKeySharedDatabase extends Database { * Clear the shared status for all distributionIds for a set of addresses. */ public void deleteAllFor(@NonNull Collection addresses) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String query = ADDRESS + " = ? AND " + DEVICE + " = ?"; db.beginTransaction(); @@ -140,7 +140,7 @@ public class SenderKeySharedDatabase extends Database { * Clear the shared status for all distributionIds for a given recipientId. */ public void deleteAllFor(@NonNull RecipientId recipientId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); Recipient recipient = Recipient.resolved(recipientId); if (recipient.hasUuid()) { @@ -154,7 +154,7 @@ public class SenderKeySharedDatabase extends Database { * Clears all database content. */ public void deleteAll() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, null, null); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java index 81106cee72..d3e1d7e568 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java @@ -42,7 +42,7 @@ public class SessionDatabase extends Database { } public void store(@NonNull RecipientId recipientId, int deviceId, @NonNull SessionRecord record) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues values = new ContentValues(); values.put(RECIPIENT_ID, recipientId.serialize()); @@ -53,7 +53,7 @@ public class SessionDatabase extends Database { } public @Nullable SessionRecord load(@NonNull RecipientId recipientId, int deviceId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, new String[]{RECORD}, RECIPIENT_ID + " = ? AND " + DEVICE + " = ?", @@ -73,7 +73,7 @@ public class SessionDatabase extends Database { } public @NonNull List load(@NonNull List ids) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); List sessions = new ArrayList<>(ids.size()); database.beginTransaction(); @@ -103,7 +103,7 @@ public class SessionDatabase extends Database { } public @NonNull List getAllFor(@NonNull RecipientId recipientId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); try (Cursor cursor = database.query(TABLE_NAME, null, @@ -126,7 +126,7 @@ public class SessionDatabase extends Database { } public @NonNull List getAll() { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); try (Cursor cursor = database.query(TABLE_NAME, null, null, null, null, null, null)) { @@ -145,7 +145,7 @@ public class SessionDatabase extends Database { } public @NonNull List getSubDevices(@NonNull RecipientId recipientId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); try (Cursor cursor = database.query(TABLE_NAME, new String[] {DEVICE}, @@ -166,19 +166,19 @@ public class SessionDatabase extends Database { } public void delete(@NonNull RecipientId recipientId, int deviceId) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.delete(TABLE_NAME, RECIPIENT_ID + " = ? AND " + DEVICE + " = ?", new String[] {recipientId.serialize(), String.valueOf(deviceId)}); } public void deleteAllFor(@NonNull RecipientId recipientId) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.delete(TABLE_NAME, RECIPIENT_ID + " = ?", new String[] {recipientId.serialize()}); } public boolean hasSessionFor(@NonNull RecipientId recipientId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); String query = RECIPIENT_ID + " = ?"; String[] args = SqlUtil.buildArgs(recipientId); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.java index 46130e8b91..a7104cb109 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.java @@ -2,11 +2,11 @@ package org.thoughtcrime.securesms.database; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; /** * Simple interface for common methods across our various - * {@link net.sqlcipher.database.SQLiteOpenHelper}s. + * {@link net.zetetic.database.sqlcipher.SQLiteOpenHelper}s. */ public interface SignalDatabase { SQLiteDatabase getSqlCipherDatabase(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyDatabase.java index 5f432203c4..251242c4a5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyDatabase.java @@ -48,7 +48,7 @@ public class SignedPreKeyDatabase extends Database { } public @Nullable SignedPreKeyRecord getSignedPreKey(int keyId) { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, null, KEY_ID + " = ?", new String[] {String.valueOf(keyId)}, @@ -72,7 +72,7 @@ public class SignedPreKeyDatabase extends Database { } public @NonNull List getAllSignedPreKeys() { - SQLiteDatabase database = databaseHelper.getReadableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalReadableDatabase(); List results = new LinkedList<>(); try (Cursor cursor = database.query(TABLE_NAME, null, null, null, null, null, null)) { @@ -95,7 +95,7 @@ public class SignedPreKeyDatabase extends Database { } public void insertSignedPreKey(int keyId, SignedPreKeyRecord record) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(KEY_ID, keyId); @@ -109,7 +109,7 @@ public class SignedPreKeyDatabase extends Database { public void removeSignedPreKey(int keyId) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.delete(TABLE_NAME, KEY_ID + " = ? AND " + SIGNATURE + " IS NOT NULL", new String[] {String.valueOf(keyId)}); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index 9fc728bd7f..d5b694fd81 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -28,7 +28,7 @@ import androidx.annotation.Nullable; import com.annimon.stream.Stream; import com.google.android.mms.pdu_alt.NotificationInd; -import net.sqlcipher.database.SQLiteStatement; +import net.zetetic.database.sqlcipher.SQLiteStatement; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; @@ -176,7 +176,7 @@ public class SmsDatabase extends MessageDatabase { } private void updateTypeBitmask(long id, long maskOff, long maskOn) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + " SET " + TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" + " WHERE " + ID + " = ?", SqlUtil.buildArgs(id)); @@ -190,7 +190,7 @@ public class SmsDatabase extends MessageDatabase { @Override public @Nullable RecipientId getOldestGroupUpdateSender(long threadId, long minimumDateReceived) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[]{RECIPIENT_ID}; String query = THREAD_ID + " = ? AND " + TYPE + " & ? AND " + DATE_RECEIVED + " >= ?"; @@ -209,7 +209,7 @@ public class SmsDatabase extends MessageDatabase { @Override public long getThreadIdForMessage(long id) { - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, THREAD_ID_PROJECTION, ID_WHERE, SqlUtil.buildArgs(id), null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, THREAD_ID_PROJECTION, ID_WHERE, SqlUtil.buildArgs(id), null, null, null)) { if (cursor.moveToFirst()) { return CursorUtil.requireLong(cursor, THREAD_ID); } @@ -219,7 +219,7 @@ public class SmsDatabase extends MessageDatabase { @Override public int getMessageCountForThread(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, COUNT, THREAD_ID_WHERE, SqlUtil.buildArgs(threadId), null, null, null)) { if (cursor != null && cursor.moveToFirst()) { @@ -232,7 +232,7 @@ public class SmsDatabase extends MessageDatabase { @Override public int getMessageCountForThread(long threadId, long beforeTime) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] cols = new String[] {"COUNT(*)"}; String query = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < ?"; @@ -249,7 +249,7 @@ public class SmsDatabase extends MessageDatabase { @Override public boolean hasMeaningfulMessage(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); SqlUtil.Query query = buildMeaningfulMessagesQuery(threadId); try (Cursor cursor = db.query(TABLE_NAME, new String[] { "1" }, query.getWhere(), query.getWhereArgs(), null, null, null, "1")) { @@ -304,7 +304,7 @@ public class SmsDatabase extends MessageDatabase { @Override public void clearRateLimitStatus(@NonNull Collection ids) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -375,7 +375,7 @@ public class SmsDatabase extends MessageDatabase { @Override public void markAsRemoteDelete(long id) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId; @@ -404,7 +404,7 @@ public class SmsDatabase extends MessageDatabase { ContentValues contentValues = new ContentValues(1); contentValues.put(UNIDENTIFIED, unidentified ? 1 : 0); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(id)}); } @@ -420,7 +420,7 @@ public class SmsDatabase extends MessageDatabase { @Override public void markExpireStarted(Collection ids, long startedAtTimestamp) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId = -1; db.beginTransaction(); @@ -453,7 +453,7 @@ public class SmsDatabase extends MessageDatabase { ContentValues contentValues = new ContentValues(); contentValues.put(STATUS, status); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {id+""}); long threadId = getThreadIdForMessage(id); @@ -468,7 +468,7 @@ public class SmsDatabase extends MessageDatabase { @Override public void markAsNotified(long id) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(NOTIFIED, 1); @@ -483,7 +483,7 @@ public class SmsDatabase extends MessageDatabase { return Collections.emptySet(); } - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); Set threadUpdates = new HashSet<>(); try (Cursor cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, RECIPIENT_ID, TYPE, DELIVERY_RECEIPT_COUNT, READ_RECEIPT_COUNT}, @@ -520,7 +520,7 @@ public class SmsDatabase extends MessageDatabase { @Override public List> setTimestampRead(SyncMessageId messageId, long proposedExpireStarted, @NonNull Map threadToLatestRead) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); List> expiring = new LinkedList<>(); Cursor cursor = null; @@ -588,7 +588,7 @@ public class SmsDatabase extends MessageDatabase { } private List setMessagesRead(String where, String[] arguments) { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); List results = new LinkedList<>(); Cursor cursor = null; @@ -648,7 +648,7 @@ public class SmsDatabase extends MessageDatabase { } private InsertResult updateMessageBodyAndType(long messageId, String body, long maskOff, long maskOn) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + " SET " + BODY + " = ?, " + TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + ") " + "WHERE " + ID + " = ?", @@ -665,7 +665,7 @@ public class SmsDatabase extends MessageDatabase { @Override public boolean hasReceivedAnyCallsSince(long threadId, long timestamp) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = SqlUtil.buildArgs(SmsDatabase.TYPE); String selection = THREAD_ID + " = ? AND " + DATE_RECEIVED + " > ? AND (" + TYPE + " = ? OR " + TYPE + " = ? OR " + TYPE + " = ? OR " + TYPE + " =?)"; String[] selectionArgs = SqlUtil.buildArgs(threadId, @@ -703,7 +703,7 @@ public class SmsDatabase extends MessageDatabase { @NonNull Collection peekJoinedUuids, boolean isCallFull) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); Recipient recipient = Recipient.resolved(groupRecipientId); long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipient); boolean peerEraIdSameAsPrevious = updatePreviousGroupCall(threadId, peekGroupCallEraId, peekJoinedUuids, isCallFull); @@ -758,7 +758,7 @@ public class SmsDatabase extends MessageDatabase { long timestamp, @Nullable String messageGroupCallEraId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId; @@ -831,7 +831,7 @@ public class SmsDatabase extends MessageDatabase { @Override public boolean updatePreviousGroupCall(long threadId, @Nullable String peekGroupCallEraId, @NonNull Collection peekJoinedUuids, boolean isCallFull) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = TYPE + " = ? AND " + THREAD_ID + " = ?"; String[] args = SqlUtil.buildArgs(Types.GROUP_CALL_TYPE, threadId); boolean sameEraId = false; @@ -883,7 +883,7 @@ public class SmsDatabase extends MessageDatabase { values.put(TYPE, type); values.put(THREAD_ID, threadId); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long messageId = db.insert(TABLE_NAME, null, values); DatabaseFactory.getThreadDatabase(context).update(threadId, true); @@ -899,7 +899,7 @@ public class SmsDatabase extends MessageDatabase { @Override public Set getAllRateLimitedMessageIds() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String where = "(" + TYPE + " & " + Types.TOTAL_MASK + " & " + Types.MESSAGE_RATE_LIMITED_BIT + ") > 0"; Set ids = new HashSet<>(); @@ -943,7 +943,7 @@ public class SmsDatabase extends MessageDatabase { String body = Base64.encodeBytes(profileChangeDetails); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -1018,7 +1018,7 @@ public class SmsDatabase extends MessageDatabase { values.put(BODY, membershipChange.serialize()); } - databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, values); + databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values); } @Override @@ -1101,7 +1101,7 @@ public class SmsDatabase extends MessageDatabase { Log.w(TAG, "Duplicate message (" + message.getSentTimestampMillis() + "), ignoring..."); return Optional.absent(); } else { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long messageId = db.insert(TABLE_NAME, null, values); if (unread) { @@ -1133,7 +1133,7 @@ public class SmsDatabase extends MessageDatabase { @Override public @NonNull InsertResult insertChatSessionRefreshedMessage(@NonNull RecipientId recipientId, long senderDeviceId, long sentTimestamp) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(Recipient.resolved(recipientId)); long type = Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT; @@ -1173,7 +1173,7 @@ public class SmsDatabase extends MessageDatabase { values.put(TYPE, Types.BAD_DECRYPT_TYPE); values.put(THREAD_ID, threadId); - databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, values); + databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values); DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1); DatabaseFactory.getThreadDatabase(context).update(threadId, true); @@ -1212,7 +1212,7 @@ public class SmsDatabase extends MessageDatabase { contentValues.put(EXPIRES_IN, message.getExpiresIn()); contentValues.put(DELIVERY_RECEIPT_COUNT, Stream.of(earlyDeliveryReceipts.values()).mapToLong(Long::longValue).sum()); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long messageId = db.insert(TABLE_NAME, null, contentValues); if (insertListener != null) { @@ -1240,13 +1240,13 @@ public class SmsDatabase extends MessageDatabase { @Override public Cursor getExpirationStartedMessages() { String where = EXPIRE_STARTED + " > 0"; - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); return db.query(TABLE_NAME, MESSAGE_PROJECTION, where, null, null, null, null); } @Override public SmsMessageRecord getSmsMessage(long messageId) throws NoSuchMessageException { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[]{messageId + ""}, null, null, null); Reader reader = new Reader(cursor); SmsMessageRecord record = reader.getNext(); @@ -1266,7 +1266,7 @@ public class SmsDatabase extends MessageDatabase { @Override public Cursor getMessageCursor(long messageId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); return db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[] {messageId + ""}, null, null, null); } @@ -1274,7 +1274,7 @@ public class SmsDatabase extends MessageDatabase { public boolean deleteMessage(long messageId) { Log.d(TAG, "deleteMessage(" + messageId + ")"); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId; boolean threadDeleted; @@ -1299,7 +1299,7 @@ public class SmsDatabase extends MessageDatabase { @Override public void ensureMigration() { - databaseHelper.getWritableDatabase(); + databaseHelper.getSignalWritableDatabase(); } @Override @@ -1317,7 +1317,7 @@ public class SmsDatabase extends MessageDatabase { } private boolean isDuplicate(IncomingTextMessage message, long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = DATE_SENT + " = ? AND " + RECIPIENT_ID + " = ? AND " + THREAD_ID + " = ?"; String[] args = SqlUtil.buildArgs(message.getSentTimestampMillis(), message.getSender().serialize(), threadId); @@ -1329,14 +1329,14 @@ public class SmsDatabase extends MessageDatabase { @Override void deleteThread(long threadId) { Log.d(TAG, "deleteThread(" + threadId + ")"); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, THREAD_ID + " = ?", new String[] {threadId+""}); } @Override int deleteMessagesInThreadBeforeDate(long threadId, long date) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < " + date; return db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId)); @@ -1344,7 +1344,7 @@ public class SmsDatabase extends MessageDatabase { @Override void deleteAbandonedMessages() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = THREAD_ID + " NOT IN (SELECT _id FROM " + ThreadDatabase.TABLE_NAME + ")"; int deletes = db.delete(TABLE_NAME, where, null); @@ -1371,7 +1371,7 @@ public class SmsDatabase extends MessageDatabase { } private Cursor queryMessages(@NonNull String where, @NonNull String[] args, boolean reverse, long limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); return db.query(TABLE_NAME, MESSAGE_PROJECTION, @@ -1387,7 +1387,7 @@ public class SmsDatabase extends MessageDatabase { void deleteThreads(@NonNull Set threadIds) { Log.d(TAG, "deleteThreads(count: " + threadIds.size() + ")"); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = ""; for (long threadId : threadIds) { @@ -1402,20 +1402,20 @@ public class SmsDatabase extends MessageDatabase { @Override void deleteAllThreads() { Log.d(TAG, "deleteAllThreads()"); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, null, null); } @Override public SQLiteDatabase beginTransaction() { - SQLiteDatabase database = databaseHelper.getWritableDatabase(); + SQLiteDatabase database = databaseHelper.getSignalWritableDatabase(); database.beginTransaction(); return database; } @Override public void setTransactionSuccessful() { - databaseHelper.getWritableDatabase().setTransactionSuccessful(); + databaseHelper.getSignalWritableDatabase().setTransactionSuccessful(); } @Override @@ -1426,7 +1426,7 @@ public class SmsDatabase extends MessageDatabase { @Override public void endTransaction() { - databaseHelper.getWritableDatabase().endTransaction(); + databaseHelper.getSignalWritableDatabase().endTransaction(); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java index 0c2665601f..49f48f8186 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java @@ -25,7 +25,7 @@ import androidx.annotation.Nullable; import com.annimon.stream.Stream; -import net.sqlcipher.database.SQLiteStatement; +import net.zetetic.database.sqlcipher.SQLiteStatement; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.groups.GroupId; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherDatabaseHook.java b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherDatabaseHook.java index a60319e845..26b395cc18 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherDatabaseHook.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherDatabaseHook.java @@ -1,7 +1,7 @@ package org.thoughtcrime.securesms.database; -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteDatabaseHook; +import net.zetetic.database.sqlcipher.SQLiteConnection; +import net.zetetic.database.sqlcipher.SQLiteDatabaseHook; /** * Standard hook for setting common SQLCipher PRAGMAs. @@ -9,18 +9,16 @@ import net.sqlcipher.database.SQLiteDatabaseHook; public 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;"); + public void preKey(SQLiteConnection connection) { + connection.execute("PRAGMA cipher_default_kdf_iter = 1;", null, null); + connection.execute("PRAGMA cipher_default_page_size = 4096;", null, null); } @Override - public void postKey(SQLiteDatabase db) { - db.rawExecSQL("PRAGMA cipher_compatibility = 3;"); - db.rawExecSQL("PRAGMA cipher_memory_security = OFF;"); - db.rawExecSQL("PRAGMA kdf_iter = '1';"); - db.rawExecSQL("PRAGMA cipher_page_size = 4096;"); - db.enableWriteAheadLogging(); - db.setForeignKeyConstraintsEnabled(true); + public void postKey(SQLiteConnection connection) { + connection.execute("PRAGMA cipher_compatibility = 3;", null, null); + connection.execute("PRAGMA cipher_memory_security = OFF;", null, null); + connection.execute("PRAGMA kdf_iter = '1';", null, null); + connection.execute("PRAGMA cipher_page_size = 4096;", null, null); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.java b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.java index 0555f3e5cd..cca6351c95 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.java @@ -4,8 +4,8 @@ import android.database.Cursor; import androidx.annotation.NonNull; -import net.sqlcipher.DatabaseErrorHandler; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.DatabaseErrorHandler; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.util.CursorUtil; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherLibraryLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherLibraryLoader.kt index 599d9731e2..f7d58f5ccf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherLibraryLoader.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherLibraryLoader.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.database import android.content.Context -import net.sqlcipher.database.SQLiteDatabase /** * A simple wrapper to load SQLCipher libs exactly once. The exact entry point of database access is non-deterministic because content providers run before @@ -19,7 +18,7 @@ class SqlCipherLibraryLoader { if (!loaded) { synchronized(LOCK) { if (!loaded) { - SQLiteDatabase.loadLibs(context) + System.loadLibrary("sqlcipher") loaded = true } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java index 0f96dc618f..cedb115140 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java @@ -103,12 +103,12 @@ public class StickerDatabase extends Database { contentValues.put(FILE_LENGTH, fileInfo.getLength()); contentValues.put(FILE_RANDOM, fileInfo.getRandom()); - long id = databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, contentValues); + long id = databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, contentValues); if (id == -1) { String selection = PACK_ID + " = ? AND " + STICKER_ID + " = ? AND " + COVER + " = ?"; String[] args = SqlUtil.buildArgs(sticker.getPackId(), sticker.getStickerId(), (sticker.isCover() ? 1 : 0)); - id = databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, selection, args); + id = databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, selection, args); } if (id > 0) { @@ -128,7 +128,7 @@ public class StickerDatabase extends Database { String selection = PACK_ID + " = ? AND " + STICKER_ID + " = ? AND " + COVER + " = ?"; String[] args = new String[] { packId, String.valueOf(stickerId), String.valueOf(isCover ? 1 : 0) }; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, "1")) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, "1")) { return new StickerRecordReader(cursor).getNext(); } } @@ -137,7 +137,7 @@ public class StickerDatabase extends Database { String query = PACK_ID + " = ? AND " + COVER + " = ?"; String[] args = new String[] { packId, "1" }; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, query, args, null, null, null, "1")) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, query, args, null, null, null, "1")) { return new StickerPackRecordReader(cursor).getNext(); } } @@ -145,7 +145,7 @@ public class StickerDatabase extends Database { public @Nullable Cursor getInstalledStickerPacks() { String selection = COVER + " = ? AND " + INSTALLED + " = ?"; String[] args = new String[] { "1", "1" }; - Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, PACK_ORDER + " ASC"); + Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, PACK_ORDER + " ASC"); setNotifyStickerPackListeners(cursor); return cursor; @@ -155,7 +155,7 @@ public class StickerDatabase extends Database { String selection = EMOJI + " LIKE ? AND " + COVER + " = ?"; String[] args = new String[] { "%"+emoji+"%", "0" }; - Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, null); + Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, null); setNotifyStickerListeners(cursor); return cursor; @@ -168,14 +168,14 @@ public class StickerDatabase extends Database { public @Nullable Cursor getAllStickerPacks(@Nullable String limit) { String query = COVER + " = ?"; String[] args = new String[] { "1" }; - Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, query, args, null, null, PACK_ORDER + " ASC", limit); + Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, query, args, null, null, PACK_ORDER + " ASC", limit); setNotifyStickerPackListeners(cursor); return cursor; } public @Nullable Cursor getStickersForPack(@NonNull String packId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String selection = PACK_ID + " = ? AND " + COVER + " = ?"; String[] args = new String[] { packId, "0" }; @@ -186,7 +186,7 @@ public class StickerDatabase extends Database { } public @Nullable Cursor getRecentlyUsedStickers(int limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String selection = LAST_USED + " > ? AND " + COVER + " = ?"; String[] args = new String[] { "0", "0" }; @@ -197,7 +197,7 @@ public class StickerDatabase extends Database { } public @NonNull Set getAllStickerFiles() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Set files = new HashSet<>(); try (Cursor cursor = db.query(TABLE_NAME, new String[] { FILE_PATH }, null, null, null, null, null)) { @@ -213,7 +213,7 @@ public class StickerDatabase extends Database { String selection = _ID + " = ?"; String[] args = new String[] { String.valueOf(rowId) }; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, selection, args, null, null, null)) { if (cursor != null && cursor.moveToNext()) { String path = cursor.getString(cursor.getColumnIndexOrThrow(FILE_PATH)); byte[] random = cursor.getBlob(cursor.getColumnIndexOrThrow(FILE_RANDOM)); @@ -248,19 +248,19 @@ public class StickerDatabase extends Database { values.put(LAST_USED, lastUsed); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, selection, args); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, selection, args); notifyStickerListeners(); notifyStickerPackListeners(); } public void markPackAsInstalled(@NonNull String packKey, boolean notify) { - updatePackInstalled(databaseHelper.getWritableDatabase(), packKey, true, notify); + updatePackInstalled(databaseHelper.getSignalWritableDatabase(), packKey, true, notify); notifyStickerPackListeners(); } public void deleteOrphanedPacks() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String query = "SELECT " + PACK_ID + " FROM " + TABLE_NAME + " WHERE " + INSTALLED + " = ? AND " + PACK_ID + " NOT IN (" + "SELECT DISTINCT " + AttachmentDatabase.STICKER_PACK_ID + " FROM " + AttachmentDatabase.TABLE_NAME + " " + @@ -296,7 +296,7 @@ public class StickerDatabase extends Database { } public void uninstallPack(@NonNull String packId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -312,7 +312,7 @@ public class StickerDatabase extends Database { } public void updatePackOrder(@NonNull List packsInOrder) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index b491f526dc..d52ef97240 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -176,7 +176,7 @@ public class ThreadDatabase extends Database { contentValues.put(MEANINGFUL_MESSAGES, 0); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long result = db.insert(TABLE_NAME, null, contentValues); Recipient.live(recipientId).refresh(); @@ -212,7 +212,7 @@ public class ThreadDatabase extends Database { contentValues.put(READ_RECEIPT_COUNT, readReceiptCount); contentValues.put(EXPIRES_IN, expiresIn); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId)); if (unarchive) { @@ -243,7 +243,7 @@ public class ThreadDatabase extends Database { contentValues.put(ARCHIVED, 0); } - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.update(TABLE_NAME, contentValues, ID + " = ?", new String[] {threadId + ""}); notifyConversationListListeners(); } @@ -253,14 +253,14 @@ public class ThreadDatabase extends Database { return; } - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); GroupReceiptDatabase groupReceiptDatabase = DatabaseFactory.getGroupReceiptDatabase(context); MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context); MentionDatabase mentionDatabase = DatabaseFactory.getMentionDatabase(context); int deletes = 0; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, new String[] { ID }, null, null, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, new String[] { ID }, null, null, null, null, null)) { while (cursor != null && cursor.moveToNext()) { trimThreadInternal(CursorUtil.requireLong(cursor, ID), length, trimBeforeDate); } @@ -293,7 +293,7 @@ public class ThreadDatabase extends Database { return; } - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); GroupReceiptDatabase groupReceiptDatabase = DatabaseFactory.getGroupReceiptDatabase(context); MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context); @@ -354,7 +354,7 @@ public class ThreadDatabase extends Database { } public List setAllThreadsRead() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(1); contentValues.put(READ, ReadStatus.READ.serialize()); contentValues.put(UNREAD_COUNT, 0); @@ -402,7 +402,7 @@ public class ThreadDatabase extends Database { } public List setReadSince(Map threadIdToSinceTimestamp, boolean lastSeen) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); List smsRecords = new LinkedList<>(); List mmsRecords = new LinkedList<>(); @@ -458,7 +458,7 @@ public class ThreadDatabase extends Database { } public void setForcedUnread(@NonNull Collection threadIds) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); List recipientIds = Collections.emptyList(); db.beginTransaction(); @@ -488,7 +488,7 @@ public class ThreadDatabase extends Database { public void incrementUnread(long threadId, int amount) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + " SET " + READ + " = " + ReadStatus.UNREAD.serialize() + ", " + UNREAD_COUNT + " = " + UNREAD_COUNT + " + ?, " + @@ -501,13 +501,13 @@ public class ThreadDatabase extends Database { ContentValues contentValues = new ContentValues(1); contentValues.put(TYPE, distributionType); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {threadId + ""}); notifyConversationListListeners(); } public int getDistributionType(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, new String[]{TYPE}, ID_WHERE, new String[]{String.valueOf(threadId)}, null, null, null); try { @@ -526,7 +526,7 @@ public class ThreadDatabase extends Database { if (filter == null || filter.size() == 0) return null; - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); List> splitRecipientIds = Util.partition(filter, 900); List cursors = new LinkedList<>(); @@ -555,7 +555,7 @@ public class ThreadDatabase extends Database { } public Cursor getRecentConversationList(int limit, boolean includeInactiveGroups, boolean groupsOnly, boolean hideV1Groups, boolean hideSms) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = !includeInactiveGroups ? MEANINGFUL_MESSAGES + " != 0 AND (" + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " IS NULL OR " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1)" : MEANINGFUL_MESSAGES + " != 0"; @@ -579,7 +579,7 @@ public class ThreadDatabase extends Database { } public Cursor getRecentPushConversationList(int limit, boolean includeInactiveGroups) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String activeGroupQuery = !includeInactiveGroups ? " AND " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1" : ""; String where = MEANINGFUL_MESSAGES + " != 0 AND " + "(" + @@ -596,7 +596,7 @@ public class ThreadDatabase extends Database { } public @NonNull List getRecentV1Groups(int limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String where = MEANINGFUL_MESSAGES + " != 0 AND " + "(" + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1 AND " + @@ -622,7 +622,7 @@ public class ThreadDatabase extends Database { } public boolean isArchived(@NonNull RecipientId recipientId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = RECIPIENT_ID + " = ?"; String[] args = new String[]{ recipientId.serialize() }; @@ -636,7 +636,7 @@ public class ThreadDatabase extends Database { } public void setArchived(Set threadIds, boolean archive) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); List recipientIds = Collections.emptyList(); db.beginTransaction(); @@ -681,7 +681,7 @@ public class ThreadDatabase extends Database { } public @NonNull Map getInboxPositions() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = createQuery(MEANINGFUL_MESSAGES + " != ?", 0); Map positions = new HashMap<>(); @@ -707,7 +707,7 @@ public class ThreadDatabase extends Database { } public Cursor getUnarchivedConversationList(boolean pinned, long offset, long limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String pinnedWhere = PINNED + (pinned ? " != 0" : " = 0"); String where = ARCHIVED + " = 0 AND " + MEANINGFUL_MESSAGES + " != 0 AND " + pinnedWhere; @@ -725,7 +725,7 @@ public class ThreadDatabase extends Database { } private Cursor getConversationList(@NonNull String archived, long offset, long limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = createQuery(ARCHIVED + " = ? AND " + MEANINGFUL_MESSAGES + " != 0", offset, limit, false); Cursor cursor = db.rawQuery(query, new String[]{archived}); @@ -733,7 +733,7 @@ public class ThreadDatabase extends Database { } public int getArchivedConversationListCount() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[] { "COUNT(*)" }; String query = ARCHIVED + " = ? AND " + MEANINGFUL_MESSAGES + " != 0"; String[] args = new String[] {"1"}; @@ -748,7 +748,7 @@ public class ThreadDatabase extends Database { } public int getPinnedConversationListCount() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[] { "COUNT(*)" }; String query = ARCHIVED + " = 0 AND " + PINNED + " != 0 AND " + MEANINGFUL_MESSAGES + " != 0"; @@ -762,7 +762,7 @@ public class ThreadDatabase extends Database { } public int getUnarchivedConversationListCount() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[] { "COUNT(*)" }; String query = ARCHIVED + " = 0 AND " + MEANINGFUL_MESSAGES + " != 0"; @@ -811,7 +811,7 @@ public class ThreadDatabase extends Database { * @return Pinned recipients, in order from top to bottom. */ private @NonNull Cursor getPinned(String[] projection) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String query = PINNED + " > ?"; String[] args = SqlUtil.buildArgs(0); @@ -829,7 +829,7 @@ public class ThreadDatabase extends Database { } private void pinConversations(@NonNull Collection threadIds, boolean clearFirst) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); threadIds = new LinkedHashSet<>(threadIds); try { @@ -870,7 +870,7 @@ public class ThreadDatabase extends Database { } public void unpinConversations(@NonNull Set threadIds) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(1); String placeholders = StringUtil.join(Stream.of(threadIds).map(unused -> "?").toList(), ","); String selection = ID + " IN (" + placeholders + ")"; @@ -898,7 +898,7 @@ public class ThreadDatabase extends Database { } void setLastSeenSilently(long threadId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(1); contentValues.put(LAST_SEEN, System.currentTimeMillis()); @@ -906,7 +906,7 @@ public class ThreadDatabase extends Database { } public void setLastScrolled(long threadId, long lastScrolledTimestamp) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ContentValues contentValues = new ContentValues(1); contentValues.put(LAST_SCROLLED, lastScrolledTimestamp); @@ -915,7 +915,7 @@ public class ThreadDatabase extends Database { } public ConversationMetadata getConversationMetadata(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, new String[]{LAST_SEEN, HAS_SENT, LAST_SCROLLED}, ID_WHERE, new String[]{String.valueOf(threadId)}, null, null, null)) { if (cursor != null && cursor.moveToFirst()) { @@ -929,7 +929,7 @@ public class ThreadDatabase extends Database { } public void deleteConversation(long threadId) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); RecipientId recipientIdForThreadId = getRecipientIdForThreadId(threadId); db.beginTransaction(); @@ -951,7 +951,7 @@ public class ThreadDatabase extends Database { } public void deleteConversations(Set selectedConversations) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); List recipientIdsForThreadIds = getRecipientIdsForThreadIds(selectedConversations); db.beginTransaction(); @@ -982,7 +982,7 @@ public class ThreadDatabase extends Database { } public void deleteAllConversations() { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -1003,7 +1003,7 @@ public class ThreadDatabase extends Database { } public long getThreadIdIfExistsFor(@NonNull RecipientId recipientId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String where = RECIPIENT_ID + " = ?"; String[] recipientsArg = new String[] {recipientId.serialize()}; @@ -1017,8 +1017,8 @@ public class ThreadDatabase extends Database { } public Map getThreadIdsIfExistsFor(@NonNull RecipientId ... recipientIds) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); - SqlUtil.Query query = SqlUtil.buildCollectionQuery(RECIPIENT_ID, Arrays.asList(recipientIds)); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); + SqlUtil.Query query = SqlUtil.buildCollectionQuery(RECIPIENT_ID, Arrays.asList(recipientIds)); Map results = new HashMap<>(); try (Cursor cursor = db.query(TABLE_NAME, new String[]{ ID, RECIPIENT_ID }, query.getWhere(), query.getWhereArgs(), null, null, null, "1")) { @@ -1062,7 +1062,7 @@ public class ThreadDatabase extends Database { } public @Nullable Long getThreadIdFor(@NonNull RecipientId recipientId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String where = RECIPIENT_ID + " = ?"; String[] recipientsArg = new String[]{recipientId.serialize()}; @@ -1076,7 +1076,7 @@ public class ThreadDatabase extends Database { } public @Nullable RecipientId getRecipientIdForThreadId(long threadId) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, RECIPIENT_ID_PROJECTION, ID_WHERE, SqlUtil.buildArgs(threadId), null, null, null)) { @@ -1095,7 +1095,7 @@ public class ThreadDatabase extends Database { } public @NonNull List getRecipientIdsForThreadIds(Collection threadIds) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); SqlUtil.Query query = SqlUtil.buildCollectionQuery(ID, threadIds); List ids = new ArrayList<>(threadIds.size()); @@ -1116,7 +1116,7 @@ public class ThreadDatabase extends Database { ContentValues contentValues = new ContentValues(1); contentValues.put(HAS_SENT, hasSent ? 1 : 0); - databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, ID_WHERE, + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(threadId)}); } @@ -1128,7 +1128,7 @@ public class ThreadDatabase extends Database { contentValues.put(READ, unreadCount == 0 ? ReadStatus.READ.serialize() : ReadStatus.UNREAD.serialize()); contentValues.put(UNREAD_COUNT, unreadCount); - databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId)); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId)); notifyConversationListListeners(); @@ -1151,7 +1151,7 @@ public class ThreadDatabase extends Database { } public void applyStorageSyncUpdate(@NonNull RecipientId recipientId, @NonNull SignalAccountRecord record) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -1221,7 +1221,7 @@ public class ThreadDatabase extends Database { } } - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, RECIPIENT_ID + " = ?", SqlUtil.buildArgs(recipientId)); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, RECIPIENT_ID + " = ?", SqlUtil.buildArgs(recipientId)); if (threadId != null) { notifyConversationListeners(threadId); @@ -1298,7 +1298,7 @@ public class ThreadDatabase extends Database { ContentValues contentValues = new ContentValues(1); contentValues.put(SNIPPET_TYPE, type); - databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId)); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId)); } public @NonNull ThreadRecord getThreadRecordFor(@NonNull Recipient recipient) { @@ -1306,7 +1306,7 @@ public class ThreadDatabase extends Database { } public @NonNull Set getAllThreadRecipients() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); Set ids = new HashSet<>(); @@ -1321,7 +1321,7 @@ public class ThreadDatabase extends Database { @NonNull MergeResult merge(@NonNull RecipientId primaryRecipientId, @NonNull RecipientId secondaryRecipientId) { - if (!databaseHelper.getWritableDatabase().inTransaction()) { + if (!databaseHelper.getSignalWritableDatabase().inTransaction()) { throw new IllegalStateException("Must be in a transaction!"); } @@ -1339,7 +1339,7 @@ public class ThreadDatabase extends Database { ContentValues values = new ContentValues(); values.put(RECIPIENT_ID, primaryRecipientId.serialize()); - databaseHelper.getWritableDatabase().update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(secondary.getThreadId())); + databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(secondary.getThreadId())); return new MergeResult(secondary.getThreadId(), -1, false); } else if (primary == null && secondary == null) { Log.w(TAG, "[merge] No thread for either."); @@ -1347,7 +1347,7 @@ public class ThreadDatabase extends Database { } else { Log.w(TAG, "[merge] Had a thread for both. Deleting the secondary and merging the attributes together.", true); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.delete(TABLE_NAME, ID_WHERE, SqlUtil.buildArgs(secondary.getThreadId())); @@ -1386,7 +1386,7 @@ public class ThreadDatabase extends Database { String query = createQuery(TABLE_NAME + "." + ID + " = ?", 1); - try (Cursor cursor = databaseHelper.getReadableDatabase().rawQuery(query, SqlUtil.buildArgs(threadId))) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().rawQuery(query, SqlUtil.buildArgs(threadId))) { if (cursor != null && cursor.moveToFirst()) { return readerFor(cursor).getCurrent(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/UnknownStorageIdDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/UnknownStorageIdDatabase.java index 4e1a29ab19..4067d9aba2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/UnknownStorageIdDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/UnknownStorageIdDatabase.java @@ -15,13 +15,10 @@ import org.thoughtcrime.securesms.util.SqlUtil; import org.whispersystems.libsignal.util.guava.Preconditions; import org.whispersystems.signalservice.api.storage.SignalStorageRecord; import org.whispersystems.signalservice.api.storage.StorageId; -import org.whispersystems.signalservice.internal.storage.protos.ManifestRecord; -import org.whispersystems.signalservice.internal.storage.protos.SignalStorage; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; /** @@ -53,7 +50,7 @@ public class UnknownStorageIdDatabase extends Database { String query = TYPE + " > ?"; String[] args = SqlUtil.buildArgs(StorageId.largestKnownType()); - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, query, args, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, query, args, null, null, null)) { while (cursor != null && cursor.moveToNext()) { String keyEncoded = cursor.getString(cursor.getColumnIndexOrThrow(STORAGE_ID)); int type = cursor.getInt(cursor.getColumnIndexOrThrow(TYPE)); @@ -72,7 +69,7 @@ public class UnknownStorageIdDatabase extends Database { String query = STORAGE_ID + " = ?"; String[] args = new String[] { Base64.encodeBytes(rawId) }; - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, query, args, null, null, null)) { + try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, query, args, null, null, null)) { if (cursor != null && cursor.moveToFirst()) { int type = cursor.getInt(cursor.getColumnIndexOrThrow(TYPE)); return SignalStorageRecord.forUnknown(StorageId.forType(rawId, type)); @@ -85,7 +82,7 @@ public class UnknownStorageIdDatabase extends Database { public void applyStorageSyncUpdates(@NonNull Collection inserts, @NonNull Collection deletes) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.beginTransaction(); try { @@ -99,7 +96,7 @@ public class UnknownStorageIdDatabase extends Database { } public void insert(@NonNull Collection inserts) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); Preconditions.checkArgument(db.inTransaction(), "Must be in a transaction!"); @@ -113,7 +110,7 @@ public class UnknownStorageIdDatabase extends Database { } public void delete(@NonNull Collection deletes) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String deleteQuery = STORAGE_ID + " = ?"; Preconditions.checkArgument(db.inTransaction(), "Must be in a transaction!"); @@ -128,10 +125,10 @@ public class UnknownStorageIdDatabase extends Database { String query = TYPE + " = ?"; String[] args = new String[]{String.valueOf(type)}; - databaseHelper.getWritableDatabase().delete(TABLE_NAME, query, args); + databaseHelper.getSignalWritableDatabase().delete(TABLE_NAME, query, args); } public void deleteAll() { - databaseHelper.getWritableDatabase().delete(TABLE_NAME, null, null); + databaseHelper.getSignalWritableDatabase().delete(TABLE_NAME, null, null); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java index 9e01aa77a0..cbe125e5be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java @@ -8,7 +8,7 @@ import androidx.annotation.NonNull; import com.fasterxml.jackson.annotation.JsonProperty; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.Conversions; import org.signal.core.util.logging.Log; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/RecipientIdCleanupHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/RecipientIdCleanupHelper.java index a3efc678dd..f70c41879e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/RecipientIdCleanupHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/RecipientIdCleanupHelper.java @@ -5,7 +5,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.util.DelimiterUtil; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/RecipientIdMigrationHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/RecipientIdMigrationHelper.java index f1bf305e56..339ac045d6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/RecipientIdMigrationHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/RecipientIdMigrationHelper.java @@ -7,7 +7,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.groups.GroupId; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherMigrationHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherMigrationHelper.java index d73f2510ec..b74d0505ab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherMigrationHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherMigrationHelper.java @@ -12,6 +12,8 @@ import androidx.annotation.Nullable; import com.annimon.stream.function.BiFunction; +import net.zetetic.database.sqlcipher.SQLiteDatabase; + import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.crypto.AsymmetricMasterCipher; @@ -38,7 +40,7 @@ public class SQLCipherMigrationHelper { static void migratePlaintext(@NonNull Context context, @NonNull android.database.sqlite.SQLiteDatabase legacyDb, - @NonNull net.sqlcipher.database.SQLiteDatabase modernDb) + @NonNull SQLiteDatabase modernDb) { modernDb.beginTransaction(); int foregroundId = GenericForegroundService.startForegroundTask(context, context.getString(R.string.SQLCipherMigrationHelper_migrating_signal_database)).getId(); @@ -58,7 +60,7 @@ public class SQLCipherMigrationHelper { public static void migrateCiphertext(@NonNull Context context, @NonNull MasterSecret masterSecret, @NonNull android.database.sqlite.SQLiteDatabase legacyDb, - @NonNull net.sqlcipher.database.SQLiteDatabase modernDb, + @NonNull SQLiteDatabase modernDb, @Nullable LegacyMigrationJob.DatabaseUpgradeListener listener) { MasterCipher legacyCipher = new MasterCipher(masterSecret); @@ -182,7 +184,7 @@ public class SQLCipherMigrationHelper { private static void copyTable(@NonNull String tableName, @NonNull android.database.sqlite.SQLiteDatabase legacyDb, - @NonNull net.sqlcipher.database.SQLiteDatabase modernDb, + @NonNull SQLiteDatabase modernDb, @Nullable BiFunction, ContentValues> transformer) { Set destinationColumns = getTableColumns(tableName, modernDb); @@ -236,7 +238,7 @@ public class SQLCipherMigrationHelper { return new Pair<>(type, body); } - private static Set getTableColumns(String tableName, net.sqlcipher.database.SQLiteDatabase database) { + private static Set getTableColumns(String tableName, SQLiteDatabase database) { Set results = new HashSet<>(); try (Cursor cursor = database.rawQuery("PRAGMA table_info(" + tableName + ")", null)) { 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 c25b6afdd1..3bd5878e0c 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 @@ -18,8 +18,8 @@ import com.annimon.stream.Stream; import com.bumptech.glide.Glide; import com.google.protobuf.InvalidProtocolBufferException; -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteOpenHelper; +import net.zetetic.database.sqlcipher.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteOpenHelper; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.color.MaterialColor; @@ -214,14 +214,18 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab private static final int DATABASE_VERSION = 112; private static final String DATABASE_NAME = "signal.db"; - private final Context context; - private final DatabaseSecret databaseSecret; + private final Context context; public SQLCipherOpenHelper(@NonNull Context context, @NonNull DatabaseSecret databaseSecret) { - super(context, DATABASE_NAME, null, DATABASE_VERSION, new SqlCipherDatabaseHook(), new SqlCipherErrorHandler(DATABASE_NAME)); + super(context, DATABASE_NAME, databaseSecret.asString(), null, DATABASE_VERSION, 0, new SqlCipherErrorHandler(DATABASE_NAME), new SqlCipherDatabaseHook()); - this.context = context.getApplicationContext(); - this.databaseSecret = databaseSecret; + this.context = context.getApplicationContext(); + } + + @Override + public void onOpen(SQLiteDatabase db) { + db.enableWriteAheadLogging(); + db.setForeignKeyConstraintsEnabled(true); } @Override @@ -1361,12 +1365,12 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab String selectIdsToUpdateProfileSharing = "SELECT r._id FROM recipient AS r INNER JOIN thread AS t ON r._id = t.recipient_ids WHERE profile_sharing = 0 AND (" + secureOutgoingSms + " OR " + secureOutgoingMms + ")"; - db.rawExecSQL("UPDATE recipient SET profile_sharing = 1 WHERE _id IN (" + selectIdsToUpdateProfileSharing + ")"); + db.execSQL("UPDATE recipient SET profile_sharing = 1 WHERE _id IN (" + selectIdsToUpdateProfileSharing + ")"); String selectIdsWithGroupsInCommon = "SELECT r._id FROM recipient AS r WHERE EXISTS(" + "SELECT 1 FROM groups AS g INNER JOIN recipient AS gr ON (g.recipient_id = gr._id AND gr.profile_sharing = 1) WHERE g.active = 1 AND (g.members LIKE r._id || ',%' OR g.members LIKE '%,' || r._id || ',%' OR g.members LIKE '%,' || r._id)" + ")"; - db.rawExecSQL("UPDATE recipient SET groups_in_common = 1 WHERE _id IN (" + selectIdsWithGroupsInCommon + ")"); + db.execSQL("UPDATE recipient SET groups_in_common = 1 WHERE _id IN (" + selectIdsWithGroupsInCommon + ")"); } if (oldVersion < CLEAN_STORAGE_IDS_WITHOUT_INFO) { @@ -1973,17 +1977,35 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab Log.i(TAG, "Upgrade complete. Took " + (System.currentTimeMillis() - startTime) + " ms."); } - public org.thoughtcrime.securesms.database.SQLiteDatabase getReadableDatabase() { - return new org.thoughtcrime.securesms.database.SQLiteDatabase(getReadableDatabase(databaseSecret.asString())); - } - - public org.thoughtcrime.securesms.database.SQLiteDatabase getWritableDatabase() { - return new org.thoughtcrime.securesms.database.SQLiteDatabase(getWritableDatabase(databaseSecret.asString())); + @Override + public net.zetetic.database.sqlcipher.SQLiteDatabase getReadableDatabase() { + throw new UnsupportedOperationException("Call getSignalReadableDatabase() instead!"); } @Override - public @NonNull SQLiteDatabase getSqlCipherDatabase() { - return getWritableDatabase().getSqlCipherDatabase(); + public net.zetetic.database.sqlcipher.SQLiteDatabase getWritableDatabase() { + throw new UnsupportedOperationException("Call getSignalReadableDatabase() instead!"); + } + + public net.zetetic.database.sqlcipher.SQLiteDatabase getRawReadableDatabase() { + return super.getReadableDatabase(); + } + + public net.zetetic.database.sqlcipher.SQLiteDatabase getRawWritableDatabase() { + return super.getWritableDatabase(); + } + + public org.thoughtcrime.securesms.database.SQLiteDatabase getSignalReadableDatabase() { + return new org.thoughtcrime.securesms.database.SQLiteDatabase(super.getReadableDatabase()); + } + + public org.thoughtcrime.securesms.database.SQLiteDatabase getSignalWritableDatabase() { + return new org.thoughtcrime.securesms.database.SQLiteDatabase(super.getWritableDatabase()); + } + + @Override + public @NonNull net.zetetic.database.sqlcipher.SQLiteDatabase getSqlCipherDatabase() { + return super.getWritableDatabase(); } public void markCurrent(SQLiteDatabase db) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SessionStoreMigrationHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SessionStoreMigrationHelper.java index 1ab296e613..e67c81099b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SessionStoreMigrationHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SessionStoreMigrationHelper.java @@ -4,7 +4,7 @@ package org.thoughtcrime.securesms.database.helpers; import android.content.ContentValues; import android.content.Context; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.Conversions; import org.signal.core.util.logging.Log; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/AvatarPickerDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/AvatarPickerDatabase.kt index 0fae6b4c43..5c56ce6b87 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/AvatarPickerDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/AvatarPickerDatabase.kt @@ -50,7 +50,7 @@ class AvatarPickerDatabase(context: Context, databaseHelper: SQLCipherOpenHelper throw IllegalArgumentException("Must save this avatar before trying to mark usage.") } - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase val where = ID_WHERE val args = SqlUtil.buildArgs(databaseId.id) val values = ContentValues(1) @@ -65,7 +65,7 @@ class AvatarPickerDatabase(context: Context, databaseHelper: SQLCipherOpenHelper throw IllegalArgumentException("Cannot update an unsaved avatar") } - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase val where = ID_WHERE val values = ContentValues(1) @@ -79,7 +79,7 @@ class AvatarPickerDatabase(context: Context, databaseHelper: SQLCipherOpenHelper throw IllegalArgumentException("Cannot delete an unsaved avatar.") } - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase val where = ID_WHERE val args = SqlUtil.buildArgs(databaseId.id) @@ -87,7 +87,7 @@ class AvatarPickerDatabase(context: Context, databaseHelper: SQLCipherOpenHelper } private fun saveAvatar(avatar: Avatar, groupId: GroupId?): Avatar { - val db = databaseHelper.writableDatabase + val db = databaseHelper.signalWritableDatabase val databaseId = avatar.databaseId if (databaseId is Avatar.DatabaseId.DoNotPersist) { @@ -119,7 +119,7 @@ class AvatarPickerDatabase(context: Context, databaseHelper: SQLCipherOpenHelper } fun getAllAvatars(): List { - val db = databaseHelper.readableDatabase + val db = databaseHelper.signalReadableDatabase val results = mutableListOf() db.query(TABLE_NAME, SqlUtil.buildArgs(ID, AVATAR), null, null, null, null, null)?.use { @@ -143,7 +143,7 @@ class AvatarPickerDatabase(context: Context, databaseHelper: SQLCipherOpenHelper } private fun getAvatars(groupId: GroupId?): List { - val db = databaseHelper.readableDatabase + val db = databaseHelper.signalReadableDatabase val orderBy = "$LAST_USED DESC" val results = mutableListOf() diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceServerTask.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceServerTask.java index bfb882954d..4220cc87da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceServerTask.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceServerTask.java @@ -4,7 +4,7 @@ import android.content.Context; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java index a85ee9e3b8..ee22ef846a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java @@ -6,7 +6,7 @@ import androidx.annotation.NonNull; import com.annimon.stream.Stream; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.DatabaseFactory; diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java index 3476e72d1b..1ef9267094 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java @@ -7,7 +7,7 @@ import android.database.Cursor; import androidx.annotation.AnyThread; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RestoreBackupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RestoreBackupFragment.java index ef2dc17bc1..b701b3002d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RestoreBackupFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RestoreBackupFragment.java @@ -31,7 +31,7 @@ import androidx.navigation.Navigation; import com.dd.CircularProgressButton; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.java index 6d01caaaa9..1525ca84ac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.java @@ -7,7 +7,7 @@ import androidx.annotation.NonNull; import com.annimon.stream.Stream; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.thoughtcrime.securesms.recipients.RecipientId; import org.whispersystems.libsignal.util.guava.Preconditions; diff --git a/app/src/mock/java/org/thoughtcrime/securesms/MockAppDataInitializer.java b/app/src/mock/java/org/thoughtcrime/securesms/MockAppDataInitializer.java index 7efe7fc9c3..e253cbbce1 100644 --- a/app/src/mock/java/org/thoughtcrime/securesms/MockAppDataInitializer.java +++ b/app/src/mock/java/org/thoughtcrime/securesms/MockAppDataInitializer.java @@ -5,7 +5,7 @@ import android.content.Context; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.StreamUtil; import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; diff --git a/app/witness-verifications.gradle b/app/witness-verifications.gradle index e1e37bd31d..c6b27b5f38 100644 --- a/app/witness-verifications.gradle +++ b/app/witness-verifications.gradle @@ -495,9 +495,6 @@ dependencyVerification { ['mobi.upod:time-duration-picker:1.1.3', 'db469ce0f48dd96b892eac424ed76870e54bf00fe0a28cdcddfbe5f2a226a0e1'], - ['net.zetetic:android-database-sqlcipher:4.4.3', - '64cf472e3f6c3300fd7307aebb74dfff4eeb3805f138045c83362c7687e4af61'], - ['org.apache.httpcomponents:httpclient-android:4.3.5', '6f56466a9bd0d42934b90bfbfe9977a8b654c058bf44a12bdc2877c4e1f033f1'], @@ -555,6 +552,9 @@ dependencyVerification { ['org.signal:aesgcmprovider:0.0.3', '6eb4422e8a618b3b76cb2096a3619d251f9e27989dc68307a1e5414c3710f2d1'], + ['org.signal:android-database-sqlcipher:4.4.3-S1', + '71080a72aa671856b769375f7be625625dc7f46605263113a5817de9dbc8b610'], + ['org.signal:argon2:13.1', '0f686ccff0d4842bfcc74d92e8dc780a5f159b9376e37a1189fabbcdac458bef'],