From fa26eb2017095332a074f986d4d3840f39da18d9 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 1 Sep 2021 12:21:59 -0400 Subject: [PATCH] Switch back to mainline SQLCipher with true WAL mode. --- app/build.gradle | 2 +- .../database/FlipperSqlCipherAdapter.java | 6 +- .../securesms/backup/FullBackupExporter.java | 2 +- .../securesms/backup/FullBackupImporter.java | 2 +- .../securesms/database/DatabaseFactory.java | 6 +- .../securesms/database/JobDatabase.java | 22 ++----- .../securesms/database/KeyValueDatabase.java | 22 ++----- .../database/LocalMetricsDatabase.kt | 16 ++--- .../securesms/database/LogDatabase.kt | 16 ++--- .../securesms/database/MegaphoneDatabase.java | 20 ++---- .../securesms/database/MessageDatabase.java | 2 +- .../securesms/database/MmsDatabase.java | 2 +- .../securesms/database/MmsSmsDatabase.java | 2 +- .../database/PendingRetryReceiptDatabase.java | 2 +- .../securesms/database/RecipientDatabase.java | 2 +- .../securesms/database/SQLiteDatabase.java | 18 +++--- .../securesms/database/SessionDatabase.java | 2 +- .../securesms/database/SignalDatabase.java | 4 +- .../securesms/database/SmsDatabase.java | 2 +- .../securesms/database/SmsMigrator.java | 2 +- .../database/SqlCipherDatabaseHook.java | 22 +++---- .../database/SqlCipherErrorHandler.java | 4 +- .../helpers/PreKeyMigrationHelper.java | 2 +- .../helpers/RecipientIdCleanupHelper.java | 2 +- .../helpers/RecipientIdMigrationHelper.java | 2 +- .../helpers/SQLCipherMigrationHelper.java | 2 +- .../database/helpers/SQLCipherOpenHelper.java | 61 +++++++++---------- .../helpers/SessionStoreMigrationHelper.java | 2 +- .../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 +- 35 files changed, 113 insertions(+), 154 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7c4d203b1b..289060fb22 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -509,7 +509,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-S2' implementation "androidx.sqlite:sqlite:2.1.0" implementation ('com.googlecode.ez-vcard:ez-vcard:0.9.11') { 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/DatabaseFactory.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java index e5fb75a637..c171f9abb8 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; @@ -214,7 +214,7 @@ public class DatabaseFactory { return getInstance(context).groupCallRingDatabase; } - public static net.sqlcipher.database.SQLiteDatabase getBackupDatabase(Context context) { + public static net.zetetic.database.sqlcipher.SQLiteDatabase getBackupDatabase(Context context) { return getInstance(context).databaseHelper.getRawReadableDatabase(); } @@ -304,7 +304,7 @@ public class DatabaseFactory { databaseHelper.getSignalWritableDatabase(); } - public net.sqlcipher.database.SQLiteDatabase getRawDatabase() { + public net.zetetic.database.sqlcipher.SQLiteDatabase getRawDatabase() { return databaseHelper.getRawWritableDatabase(); } 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 42783dc32a..cfd1924bfb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java @@ -9,9 +9,9 @@ import androidx.annotation.NonNull; import com.annimon.stream.Stream; -import net.sqlcipher.database.SQLiteDatabaseHook; -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; @@ -89,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) { @@ -105,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 @@ -430,12 +428,4 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabase { } } } - - private SQLiteDatabase getReadableDatabase() { - return super.getReadableDatabase(databaseSecret.asString()); - } - - private SQLiteDatabase getWritableDatabase() { - return super.getWritableDatabase(databaseSecret.asString()); - } } 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 c347501d91..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 @@ -223,14 +221,6 @@ public class KeyValueDatabase extends SQLiteOpenHelper implements SignalDatabase } } - private SQLiteDatabase getReadableDatabase() { - return super.getReadableDatabase(databaseSecret.asString()); - } - - private SQLiteDatabase getWritableDatabase() { - return super.getWritableDatabase(databaseSecret.asString()); - } - private enum Type { BLOB(0), BOOLEAN(1), FLOAT(2), INTEGER(3), LONG(4), STRING(5); 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 c3a13aac8e..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 { @@ -238,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 5ec85b0e07..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 { @@ -227,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/MegaphoneDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java index a7b4f2ba8a..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 @@ -220,12 +218,4 @@ public class MegaphoneDatabase extends SQLiteOpenHelper implements SignalDatabas } } } - - private SQLiteDatabase getReadableDatabase() { - return super.getReadableDatabase(databaseSecret.asString()); - } - - private SQLiteDatabase getWritableDatabase() { - return super.getWritableDatabase(databaseSecret.asString()); - } } 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 7b1a4dcd03..05a5518180 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; 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 f085d2d708..f5f700c738 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; 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 65337763c4..d8982c649c 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; 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 4a04d6abcb..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,7 +6,7 @@ import android.database.Cursor; import androidx.annotation.NonNull; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.PendingRetryReceiptModel; 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 fd380e3756..31427d7d3a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -14,7 +14,7 @@ import com.annimon.stream.Stream; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; -import net.sqlcipher.database.SQLiteConstraintException; +import net.zetetic.database.sqlcipher.SQLiteConstraintException; import org.jetbrains.annotations.NotNull; import org.signal.core.util.logging.Log; 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 5a6719b1ac..943e1f5105 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java @@ -4,9 +4,9 @@ package org.thoughtcrime.securesms.database; import android.content.ContentValues; import android.database.Cursor; -import net.sqlcipher.SQLException; -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; @@ -15,7 +15,7 @@ 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. */ @@ -34,10 +34,10 @@ public class SQLiteDatabase { private static final String NAME_LOCK = "LOCK"; - private final net.sqlcipher.database.SQLiteDatabase wrapped; + private final net.zetetic.database.sqlcipher.SQLiteDatabase wrapped; private final Tracer tracer; - public SQLiteDatabase(net.sqlcipher.database.SQLiteDatabase wrapped) { + public SQLiteDatabase(net.zetetic.database.sqlcipher.SQLiteDatabase wrapped) { this.wrapped = wrapped; this.tracer = Tracer.getInstance(); } @@ -98,7 +98,7 @@ public class SQLiteDatabase { return result; } - public net.sqlcipher.database.SQLiteDatabase getSqlCipherDatabase() { + public net.zetetic.database.sqlcipher.SQLiteDatabase getSqlCipherDatabase() { return wrapped; } @@ -129,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)); } @@ -149,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)); } 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 6d9f530d71..9395e2052c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java @@ -7,7 +7,7 @@ import android.database.Cursor; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import net.sqlcipher.database.SQLiteStatement; +import net.zetetic.database.sqlcipher.SQLiteStatement; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; 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 cdddadc1cd..ed278cbba4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.java @@ -1,10 +1,10 @@ package org.thoughtcrime.securesms.database; -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/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index 863c5b8e60..c16dfd73e3 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; 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/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 7ee5dee176..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,7 +12,7 @@ import androidx.annotation.Nullable; import com.annimon.stream.function.BiFunction; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; 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 7025bb9ccb..51fae6ee77 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; @@ -31,7 +31,6 @@ import org.thoughtcrime.securesms.crypto.DatabaseSecret; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.database.ChatColorsDatabase; -import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.DraftDatabase; import org.thoughtcrime.securesms.database.EmojiSearchDatabase; import org.thoughtcrime.securesms.database.GroupCallRingDatabase; @@ -221,14 +220,12 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab private static final int DATABASE_VERSION = 117; 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 @@ -2058,33 +2055,35 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab Log.i(TAG, "Upgrade complete. Took " + (System.currentTimeMillis() - startTime) + " ms."); } - public net.sqlcipher.database.SQLiteDatabase getReadableDatabase() { + @Override + public net.zetetic.database.sqlcipher.SQLiteDatabase getReadableDatabase() { throw new UnsupportedOperationException("Call getSignalReadableDatabase() instead!"); } - public net.sqlcipher.database.SQLiteDatabase getWritableDatabase() { - throw new UnsupportedOperationException("Call getSignalReadableDatabase() instead!"); - } - - public net.sqlcipher.database.SQLiteDatabase getRawReadableDatabase() { - return super.getReadableDatabase(databaseSecret.asString()); - } - - public net.sqlcipher.database.SQLiteDatabase getRawWritableDatabase() { - return super.getWritableDatabase(databaseSecret.asString()); - } - - public org.thoughtcrime.securesms.database.SQLiteDatabase getSignalReadableDatabase() { - return new org.thoughtcrime.securesms.database.SQLiteDatabase(super.getReadableDatabase(databaseSecret.asString())); - } - - public org.thoughtcrime.securesms.database.SQLiteDatabase getSignalWritableDatabase() { - return new org.thoughtcrime.securesms.database.SQLiteDatabase(super.getWritableDatabase(databaseSecret.asString())); - } - @Override - public @NonNull net.sqlcipher.database.SQLiteDatabase getSqlCipherDatabase() { - return super.getWritableDatabase(databaseSecret.asString()); + 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 09b4db3890..ca91f9b599 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/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 50618ff77b..a934a48abd 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 20f4fec171..894b052a47 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 @@ -36,7 +36,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 f08d0f0ae3..3c9ec9b93e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.java @@ -8,7 +8,7 @@ import androidx.annotation.VisibleForTesting; 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 51371fad0c..84eb6b674e 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-S2', + 'f76f42927c967dc7549cb857e953e97993957129e71caf367cb462c59f3b29fd'], + ['org.signal:argon2:13.1', '0f686ccff0d4842bfcc74d92e8dc780a5f159b9376e37a1189fabbcdac458bef'],