Identity - Fix issue with Realm

This commit is contained in:
Benoit Marty 2020-05-06 14:49:47 +02:00
parent ab6e7a3b8a
commit 0199cf9a03
6 changed files with 22 additions and 12 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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
}

View File

@ -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,

View File

@ -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?)

View File

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