From 0199cf9a037e224924c1cba5a3083f8523c8d37a Mon Sep 17 00:00:00 2001 From: Benoit Marty <benoitm@matrix.org> Date: Wed, 6 May 2020 14:49:47 +0200 Subject: [PATCH] Identity - Fix issue with Realm --- .../internal/session/identity/BulkLookupTask.kt | 2 +- .../session/identity/DefaultIdentityService.kt | 6 +++--- .../identity/IdentityAccessTokenProvider.kt | 2 +- .../session/identity/db/IdentityServerQuery.kt | 6 +++++- .../session/identity/db/IdentityServiceStore.kt | 2 +- .../identity/db/RealmIdentityServerStore.kt | 16 +++++++++++----- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/BulkLookupTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/BulkLookupTask.kt index 9d701ad7c5..0524e704f3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/BulkLookupTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/BulkLookupTask.kt @@ -43,7 +43,7 @@ internal class DefaultBulkLookupTask @Inject constructor( override suspend fun execute(params: BulkLookupTask.Params): List<FoundThreePid> { val identityAPI = identityApiProvider.identityApi ?: throw IdentityServiceError.NoIdentityServerConfigured - val entity = identityServiceStore.get() + val entity = identityServiceStore.get() ?: throw IdentityServiceError.NoIdentityServerConfigured val pepper = entity.hashLookupPepper val hashDetailResponse = if (pepper == null) { // We need to fetch the hash details first diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/DefaultIdentityService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/DefaultIdentityService.kt index f02e5446d8..01f2c466ac 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/DefaultIdentityService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/DefaultIdentityService.kt @@ -90,7 +90,7 @@ internal class DefaultIdentityService @Inject constructor( private fun notifyIdentityServerUrlChange(baseUrl: String?) { // This is maybe not a real change (local echo of account data we are just setting - if (identityServiceStore.get().identityServerUrl == baseUrl) { + if (identityServiceStore.get()?.identityServerUrl == baseUrl) { Timber.d("Local echo of identity server url change") } else { // Url has changed, we have to reset our store, update internal configuration and notify listeners @@ -109,7 +109,7 @@ internal class DefaultIdentityService @Inject constructor( } override fun getCurrentIdentityServer(): String? { - return identityServiceStore.get().identityServerUrl + return identityServiceStore.get()?.identityServerUrl } override fun disconnect() { @@ -176,7 +176,7 @@ internal class DefaultIdentityService @Inject constructor( } private suspend fun ensureToken() { - val entity = identityServiceStore.get() + val entity = identityServiceStore.get() ?: throw IdentityServiceError.NoIdentityServerConfigured val url = entity.identityServerUrl ?: throw IdentityServiceError.NoIdentityServerConfigured if (entity.token == null) { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityAccessTokenProvider.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityAccessTokenProvider.kt index 2fe2ca033b..1a7c724892 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityAccessTokenProvider.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityAccessTokenProvider.kt @@ -23,5 +23,5 @@ import javax.inject.Inject internal class IdentityAccessTokenProvider @Inject constructor( private val identityServiceStore: IdentityServiceStore ) : AccessTokenProvider { - override fun getToken() = identityServiceStore.get().token + override fun getToken() = identityServiceStore.get()?.token } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServerQuery.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServerQuery.kt index 6bef6109c3..7b7bec13c0 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServerQuery.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServerQuery.kt @@ -24,8 +24,12 @@ import io.realm.kotlin.where /** * Only one object can be stored at a time */ +internal fun IdentityServerEntity.Companion.get(realm: Realm): IdentityServerEntity? { + return realm.where<IdentityServerEntity>().findFirst() +} + internal fun IdentityServerEntity.Companion.getOrCreate(realm: Realm): IdentityServerEntity { - return realm.where<IdentityServerEntity>().findFirst() ?: realm.createObject() + return get(realm) ?: realm.createObject() } internal fun IdentityServerEntity.Companion.setUrl(realm: Realm, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServiceStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServiceStore.kt index 6933f0284f..af44766631 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServiceStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServiceStore.kt @@ -20,7 +20,7 @@ import im.vector.matrix.android.internal.session.identity.model.IdentityHashDeta internal interface IdentityServiceStore { - fun get(): IdentityServerEntity + fun get(): IdentityServerEntity? fun setUrl(url: String?) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityServerStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityServerStore.kt index 96194b3dcd..2c7ffbd75f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityServerStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityServerStore.kt @@ -27,27 +27,33 @@ internal class RealmIdentityServerStore @Inject constructor( private val realmConfiguration: RealmConfiguration ) : IdentityServiceStore { - override fun get(): IdentityServerEntity { + override fun get(): IdentityServerEntity? { return Realm.getInstance(realmConfiguration).use { - IdentityServerEntity.getOrCreate(it) + IdentityServerEntity.get(it) } } override fun setUrl(url: String?) { Realm.getInstance(realmConfiguration).use { - IdentityServerEntity.setUrl(it, url) + it.executeTransaction { realm -> + IdentityServerEntity.setUrl(realm, url) + } } } override fun setToken(token: String?) { Realm.getInstance(realmConfiguration).use { - IdentityServerEntity.setToken(it, token) + it.executeTransaction { realm -> + IdentityServerEntity.setToken(realm, token) + } } } override fun setHashDetails(hashDetailResponse: IdentityHashDetailResponse) { Realm.getInstance(realmConfiguration).use { - IdentityServerEntity.setHashDetails(it, hashDetailResponse.pepper, hashDetailResponse.algorithms) + it.executeTransaction { realm -> + IdentityServerEntity.setHashDetails(realm, hashDetailResponse.pepper, hashDetailResponse.algorithms) + } } } }