From 63eb119df6441a42a76999664f292cdf957b4504 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 12 Oct 2020 21:12:48 +0200 Subject: [PATCH] Inject userId and deviceId instead of sessionParam --- .../crypto/store/db/RealmCryptoStore.kt | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt index 9065da47b9..b25349cba9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt @@ -23,7 +23,6 @@ import io.realm.Realm import io.realm.RealmConfiguration import io.realm.Sort import io.realm.kotlin.where -import org.matrix.android.sdk.api.auth.data.Credentials import org.matrix.android.sdk.api.session.crypto.crosssigning.MXCrossSigningInfo import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.LocalEcho @@ -86,7 +85,9 @@ import org.matrix.android.sdk.internal.crypto.store.db.query.getById import org.matrix.android.sdk.internal.crypto.store.db.query.getOrCreate import org.matrix.android.sdk.internal.database.mapper.ContentMapper import org.matrix.android.sdk.internal.di.CryptoDatabase +import org.matrix.android.sdk.internal.di.DeviceId import org.matrix.android.sdk.internal.di.MoshiProvider +import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.session.SessionScope import org.matrix.olm.OlmAccount import org.matrix.olm.OlmException @@ -98,7 +99,9 @@ import kotlin.collections.set internal class RealmCryptoStore @Inject constructor( @CryptoDatabase private val realmConfiguration: RealmConfiguration, private val crossSigningKeysMapper: CrossSigningKeysMapper, - private val credentials: Credentials) : IMXCryptoStore { + @UserId private val userId: String, + @DeviceId private val deviceId: String? +) : IMXCryptoStore { /* ========================================================================================== * Memory cache, to correctly release JNI objects @@ -141,8 +144,8 @@ internal class RealmCryptoStore @Inject constructor( // Check credentials // The device id may not have been provided in credentials. // Check it only if provided, else trust the stored one. - if (currentMetadata.userId != credentials.userId - || (credentials.deviceId != null && credentials.deviceId != currentMetadata.deviceId)) { + if (currentMetadata.userId != userId + || (deviceId != null && deviceId != currentMetadata.deviceId)) { Timber.w("## open() : Credentials do not match, close this store and delete data") deleteAll = true currentMetadata = null @@ -155,8 +158,8 @@ internal class RealmCryptoStore @Inject constructor( } // Metadata not found, or database cleaned, create it - realm.createObject(CryptoMetadataEntity::class.java, credentials.userId).apply { - deviceId = credentials.deviceId + realm.createObject(CryptoMetadataEntity::class.java, userId).apply { + deviceId = this@RealmCryptoStore.deviceId } } } @@ -312,7 +315,7 @@ internal class RealmCryptoStore @Inject constructor( Timber.d("## CrossSigning MSK change for $userId") val keyEntity = crossSigningKeysMapper.map(masterKey) signingInfo.setMasterKey(keyEntity) - if (userId == credentials.userId) { + if (userId == this.userId) { shouldResetMyDevicesLocalTrust = true // my msk has changed! clear my private key // Could we have some race here? e.g I am the one that did change the keys @@ -331,7 +334,7 @@ internal class RealmCryptoStore @Inject constructor( Timber.d("## CrossSigning SSK change for $userId") val keyEntity = crossSigningKeysMapper.map(selfSigningKey) signingInfo.setSelfSignedKey(keyEntity) - if (userId == credentials.userId) { + if (userId == this.userId) { shouldResetMyDevicesLocalTrust = true // my ssk has changed! clear my private key realm.where().findFirst()?.apply { @@ -349,7 +352,7 @@ internal class RealmCryptoStore @Inject constructor( Timber.d("## CrossSigning USK change for $userId") val keyEntity = crossSigningKeysMapper.map(userSigningKey) signingInfo.setUserSignedKey(keyEntity) - if (userId == credentials.userId) { + if (userId == this.userId) { shouldResetMyDevicesLocalTrust = true // my usk has changed! clear my private key realm.where().findFirst()?.apply { @@ -362,11 +365,11 @@ internal class RealmCryptoStore @Inject constructor( // When my cross signing keys are reset, we consider clearing all existing device trust if (shouldResetMyDevicesLocalTrust) { realm.where() - .equalTo(UserEntityFields.USER_ID, credentials.userId) + .equalTo(UserEntityFields.USER_ID, this.userId) .findFirst() ?.devices?.forEach { it?.trustLevelEntity?.crossSignedVerified = false - it?.trustLevelEntity?.locallyVerified = it.deviceId == credentials.deviceId + it?.trustLevelEntity?.locallyVerified = it.deviceId == deviceId } } userEntity.crossSigningInfoEntity = signingInfo @@ -1355,7 +1358,7 @@ internal class RealmCryptoStore @Inject constructor( .findAll() xInfoEntities?.forEach { info -> // Need to ignore mine - if (info.userId != credentials.userId) { + if (info.userId != userId) { info.crossSigningKeys.forEach { it.trustLevelEntity = null } @@ -1370,7 +1373,7 @@ internal class RealmCryptoStore @Inject constructor( .findAll() xInfoEntities?.forEach { xInfoEntity -> // Need to ignore mine - if (xInfoEntity.userId == credentials.userId) return@forEach + if (xInfoEntity.userId == userId) return@forEach val mapped = mapCrossSigningInfoEntity(xInfoEntity) val currentTrust = mapped.isTrusted() val newTrust = check(mapped.userId)