diff --git a/app/build.gradle b/app/build.gradle index 790178e59..2a97f0e30 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -252,7 +252,7 @@ dependencies { compileOnly 'javax.annotation:javax.annotation-api:1.3.2' implementation 'org.greenrobot:eventbus:3.3.1' - implementation 'net.zetetic:android-database-sqlcipher:4.5.4' + implementation 'net.zetetic:sqlcipher-android:4.9.0' implementation "androidx.room:room-runtime:${roomVersion}" implementation "androidx.room:room-rxjava2:${roomVersion}" diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index 2759d0bdb..fbe5c328c 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -253,10 +253,6 @@ class MainActivity : startActivity(chatIntent) } } else { - if (!appPreferences.isDbRoomMigrated) { - appPreferences.isDbRoomMigrated = true - } - userManager.users.subscribe(object : SingleObserver> { override fun onSubscribe(d: Disposable) { // unused atm diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index 0fb7a9f19..6ab3c7039 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -58,8 +58,6 @@ import com.vanniktech.emoji.EmojiManager import com.vanniktech.emoji.google.GoogleEmojiProvider import de.cotech.hw.SecurityKeyManager import de.cotech.hw.SecurityKeyManagerConfig -import net.sqlcipher.database.SQLiteDatabase -import net.sqlcipher.database.SQLiteDatabaseHook import okhttp3.OkHttpClient import org.conscrypt.Conscrypt import org.webrtc.PeerConnectionFactory @@ -103,18 +101,6 @@ class NextcloudTalkApplication : lateinit var okHttpClient: OkHttpClient //endregion - val hook: SQLiteDatabaseHook = object : SQLiteDatabaseHook { - override fun preKey(database: SQLiteDatabase) { - // unused atm - } - - override fun postKey(database: SQLiteDatabase) { - Log.i("TalkApplication", "DB cipher_migrate START") - database.rawExecSQL("PRAGMA cipher_migrate;") - Log.i("TalkApplication", "DB cipher_migrate END") - } - } - //region private methods private fun initializeWebRtc() { try { diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/DatabaseModule.java b/app/src/main/java/com/nextcloud/talk/dagger/modules/DatabaseModule.java index 253e0c3ce..c7b08a69d 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/DatabaseModule.java +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/DatabaseModule.java @@ -42,9 +42,8 @@ public class DatabaseModule { @Provides @Singleton - public TalkDatabase provideTalkDatabase(@NonNull final Context context, - @NonNull final AppPreferences appPreferences) { - return TalkDatabase.getInstance(context, appPreferences); + public TalkDatabase provideTalkDatabase(@NonNull final Context context) { + return TalkDatabase.getInstance(context); } @Provides diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt index 6ba99dbea..994e9dfa7 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt @@ -9,7 +9,6 @@ package com.nextcloud.talk.data.source.local import android.content.Context -import android.util.Log import androidx.room.AutoMigration import androidx.room.Database import androidx.room.Room @@ -37,10 +36,7 @@ import com.nextcloud.talk.data.storage.ArbitraryStoragesDao import com.nextcloud.talk.data.storage.model.ArbitraryStorageEntity import com.nextcloud.talk.data.user.UsersDao import com.nextcloud.talk.data.user.model.UserEntity -import com.nextcloud.talk.utils.preferences.AppPreferences -import net.sqlcipher.database.SQLiteDatabase -import net.sqlcipher.database.SQLiteDatabaseHook -import net.sqlcipher.database.SupportFactory +import net.zetetic.database.sqlcipher.SupportOpenHelperFactory import java.util.Locale @Database( @@ -70,7 +66,6 @@ import java.util.Locale SendStatusConverter::class ) abstract class TalkDatabase : RoomDatabase() { - abstract fun usersDao(): UsersDao abstract fun conversationsDao(): ConversationsDao abstract fun chatMessagesDao(): ChatMessagesDao @@ -79,27 +74,21 @@ abstract class TalkDatabase : RoomDatabase() { companion object { const val TAG = "TalkDatabase" + const val SQL_CIPHER_LIBRARY = "sqlcipher" @Volatile private var instance: TalkDatabase? = null @JvmStatic - fun getInstance(context: Context, appPreferences: AppPreferences): TalkDatabase = + fun getInstance(context: Context): TalkDatabase = instance ?: synchronized(this) { - instance ?: build(context, appPreferences).also { instance = it } + instance ?: build(context).also { instance = it } } - private fun build(context: Context, appPreferences: AppPreferences): TalkDatabase { + private fun build(context: Context): TalkDatabase { val passCharArray = context.getString(R.string.nc_talk_database_encryption_key).toCharArray() - val passphrase: ByteArray = SQLiteDatabase.getBytes(passCharArray) - - val factory = if (appPreferences.isDbRoomMigrated) { - Log.i(TAG, "No cipher migration needed") - SupportFactory(passphrase) - } else { - Log.i(TAG, "Add cipher migration hook") - SupportFactory(passphrase, getCipherMigrationHook()) - } + val passphrase: ByteArray = getBytesFromChars(passCharArray) + val factory = SupportOpenHelperFactory(passphrase) val dbName = context .resources @@ -109,6 +98,8 @@ abstract class TalkDatabase : RoomDatabase() { .trim() + ".sqlite" + System.loadLibrary(SQL_CIPHER_LIBRARY) + return Room .databaseBuilder(context.applicationContext, TalkDatabase::class.java, dbName) // comment out openHelperFactory to view the database entries in Android Studio for debugging @@ -126,7 +117,7 @@ abstract class TalkDatabase : RoomDatabase() { ) .allowMainThreadQueries() .addCallback( - object : RoomDatabase.Callback() { + object : Callback() { override fun onOpen(db: SupportSQLiteDatabase) { super.onOpen(db) db.execSQL("PRAGMA defer_foreign_keys = 1") @@ -136,17 +127,6 @@ abstract class TalkDatabase : RoomDatabase() { .build() } - private fun getCipherMigrationHook(): SQLiteDatabaseHook = - object : SQLiteDatabaseHook { - override fun preKey(database: SQLiteDatabase) { - // unused atm - } - - override fun postKey(database: SQLiteDatabase) { - Log.i(TAG, "DB cipher_migrate START") - database.rawExecSQL("PRAGMA cipher_migrate;") - Log.i(TAG, "DB cipher_migrate END") - } - } + private fun getBytesFromChars(chars: CharArray): ByteArray = String(chars).toByteArray(Charsets.UTF_8) } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java index 60699b78c..7b44022a5 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java @@ -143,10 +143,6 @@ public interface AppPreferences { void setDbCypherToUpgrade(boolean value); - boolean getIsDbRoomMigrated(); - - void setIsDbRoomMigrated(boolean value); - void setPhoneBookIntegrationLastRun(long currentTimeMillis); long getPhoneBookIntegrationLastRun(Long defaultValue); diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt index ec92560cf..d11461821 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt @@ -388,18 +388,6 @@ class AppPreferencesImpl(val context: Context) : AppPreferences { } } - override fun getIsDbRoomMigrated(): Boolean = - runBlocking { - async { readBoolean(DB_ROOM_MIGRATED).first() } - }.getCompleted() - - override fun setIsDbRoomMigrated(value: Boolean) = - runBlocking { - async { - writeBoolean(DB_ROOM_MIGRATED, value) - } - } - override fun getShowRegularNotificationWarning(): Boolean = runBlocking { async { readBoolean(SHOW_REGULAR_NOTIFICATION_WARNING, true).first() } diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys index 4012f4478..88ef056d1 100644 --- a/gradle/verification-keyring.keys +++ b/gradle/verification-keyring.keys @@ -1036,24 +1036,6 @@ EEIhZlI/ojefaZkRseFrtl3X =pJaU -----END PGP PUBLIC KEY BLOCK----- -pub A6EA2E2BF22E0543 -uid Tobias Warneke (for development purposes) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBFJQhigBDADpuhND/VUQwJT0nnJxfjAIur59hyaZZ3Ph/KIgmCneyq7lzYO6 -xa1ucH8mqNBVNLLBhs4CjihBddU/ZKTX3WnZyhQKQMZr3Tg+TCNFmAR4/hnZ3NjZ -N5N5gUj/dqVI2rIvypIuxUApl88BYMsxYpn2+8FKeMd8oBJLqFRJ3WNjB4Op2tRO -XRWoxs1ypubS/IV1zkphHHpi6VSABlTyTWu4kXEj/1/GpsdtHRa9kvdWw7yKQbnM -XuwOxtzZFJcyu0P2jYVfHHvxcjxuklc9edmCGdNxgKIoo0LXZOeFIi6OWtwzD0pn -O6ovJ+PL9QscMdnQlPwsiCwjNUNue20GBv3aUIYc+Z8Gq0SqSan5V0IiKRHMJkzd -FAhnpkSFBvHhPJn07BCcb1kctqL+xnLxIdi7arq3WNA/6bJjsojc/x3FdIvORIeP -sqejhtL8mCBvbMAMHSBrFxclMp+HSz2ouHEEPIQam0KeN8t1yEqIy3/aYKMzHj9c -C3s8XOaBCbJbKpMAEQEAAbQ9VG9iaWFzIFdhcm5la2UgKGZvciBkZXZlbG9wbWVu -dCBwdXJwb3NlcykgPHQud2FybmVrZUBnbXgubmV0Pg== -=q1C6 ------END PGP PUBLIC KEY BLOCK----- - pub A730529CA355A63E uid Jukka Zitting @@ -3802,50 +3784,6 @@ pIXjPlQ0i6kV0h8KapE1Uo005JYgeg== =ASmD -----END PGP PUBLIC KEY BLOCK----- -pub 1DE461528F1F1B2A -uid Julian Reschke (CODE SIGNING KEY) - -sub D4569BDF799A59AB ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -ZAstgdvEqFLHh1yX4I+if5VODD2nEzXFDzE= -=d5S6 ------END PGP PUBLIC KEY BLOCK----- - pub 1F7A8F87B9D8F501 uid Download diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 7589cd678..5e685b21d 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -164,7 +164,10 @@ - + + + +