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)
+            }
         }
     }
 }