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 2cafa50754..ba7b6c2c1d 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 @@ -38,7 +38,7 @@ import im.vector.matrix.android.internal.di.AuthenticatedIdentity import im.vector.matrix.android.internal.di.Unauthenticated import im.vector.matrix.android.internal.network.RetrofitFactory import im.vector.matrix.android.internal.session.SessionScope -import im.vector.matrix.android.internal.session.identity.db.IdentityServiceStore +import im.vector.matrix.android.internal.session.identity.data.IdentityStore import im.vector.matrix.android.internal.session.identity.todelete.AccountDataDataSource import im.vector.matrix.android.internal.session.identity.todelete.observeNotNull import im.vector.matrix.android.internal.session.openid.GetOpenIdTokenTask @@ -58,9 +58,9 @@ import javax.net.ssl.HttpsURLConnection @SessionScope internal class DefaultIdentityService @Inject constructor( - private val identityServiceStore: IdentityServiceStore, + private val identityStore: IdentityStore, private val getOpenIdTokenTask: GetOpenIdTokenTask, - private val bulkLookupTask: BulkLookupTask, + private val identityBulkLookupTask: IdentityBulkLookupTask, private val identityRegisterTask: IdentityRegisterTask, private val identityPingTask: IdentityPingTask, private val identityDisconnectTask: IdentityDisconnectTask, @@ -95,16 +95,16 @@ internal class DefaultIdentityService @Inject constructor( } // Init identityApi - updateIdentityAPI(identityServiceStore.getIdentityServerDetails()?.identityServerUrl) + updateIdentityAPI(identityStore.getIdentityData()?.identityServerUrl) } private fun notifyIdentityServerUrlChange(baseUrl: String?) { // This is maybe not a real change (echo of account data we are just setting) - if (identityServiceStore.getIdentityServerDetails()?.identityServerUrl == baseUrl) { + if (identityStore.getIdentityData()?.identityServerUrl == baseUrl) { Timber.d("Echo of local identity server url change, or no change") } else { // Url has changed, we have to reset our store, update internal configuration and notify listeners - identityServiceStore.setUrl(baseUrl) + identityStore.setUrl(baseUrl) updateIdentityAPI(baseUrl) listeners.toList().forEach { tryThis { it.onIdentityServerChange() } } } @@ -121,7 +121,7 @@ internal class DefaultIdentityService @Inject constructor( } override fun getCurrentIdentityServerUrl(): String? { - return identityServiceStore.getIdentityServerDetails()?.identityServerUrl + return identityStore.getIdentityData()?.identityServerUrl } override fun startBindThreePid(threePid: ThreePid, callback: MatrixCallback): Cancelable { @@ -137,7 +137,7 @@ internal class DefaultIdentityService @Inject constructor( override fun cancelBindThreePid(threePid: ThreePid, callback: MatrixCallback): Cancelable { return GlobalScope.launchToCallback(coroutineDispatchers.main, callback) { - identityServiceStore.deletePendingBinding(threePid) + identityStore.deletePendingBinding(threePid) } } @@ -187,7 +187,7 @@ internal class DefaultIdentityService @Inject constructor( return GlobalScope.launchToCallback(coroutineDispatchers.main, callback) { identityDisconnectTask.execute(Unit) - identityServiceStore.setUrl(null) + identityStore.setUrl(null) updateIdentityAPI(null) updateAccountData(null) } @@ -217,8 +217,8 @@ internal class DefaultIdentityService @Inject constructor( // Try to get a token val token = getNewIdentityServerToken(urlCandidate) - identityServiceStore.setUrl(urlCandidate) - identityServiceStore.setToken(token) + identityStore.setUrl(urlCandidate) + identityStore.setToken(token) updateIdentityAPI(urlCandidate) updateAccountData(urlCandidate) @@ -261,7 +261,7 @@ internal class DefaultIdentityService @Inject constructor( threePids.associateWith { threePid -> // If not in lookup result, check if there is a pending binding if (lookupResult.firstOrNull { it.threePid == threePid } == null) { - if (identityServiceStore.getPendingBinding(threePid) == null) { + if (identityStore.getPendingBinding(threePid) == null) { SharedState.NOT_SHARED } else { SharedState.BINDING_IN_PROGRESS @@ -277,12 +277,12 @@ internal class DefaultIdentityService @Inject constructor( ensureToken() return try { - bulkLookupTask.execute(BulkLookupTask.Params(threePids)) + identityBulkLookupTask.execute(IdentityBulkLookupTask.Params(threePids)) } catch (throwable: Throwable) { // Refresh token? when { throwable.isInvalidToken() && canRetry -> { - identityServiceStore.setToken(null) + identityStore.setToken(null) lookUpInternal(false, threePids) } throwable.isTermsNotSigned() -> throw IdentityServiceError.TermsNotSignedException @@ -292,13 +292,13 @@ internal class DefaultIdentityService @Inject constructor( } private suspend fun ensureToken() { - val entity = identityServiceStore.getIdentityServerDetails() ?: throw IdentityServiceError.NoIdentityServerConfigured - val url = entity.identityServerUrl ?: throw IdentityServiceError.NoIdentityServerConfigured + val identityData = identityStore.getIdentityData() ?: throw IdentityServiceError.NoIdentityServerConfigured + val url = identityData.identityServerUrl ?: throw IdentityServiceError.NoIdentityServerConfigured - if (entity.token == null) { + if (identityData.token == null) { // Try to get a token val token = getNewIdentityServerToken(url) - identityServiceStore.setToken(token) + identityStore.setToken(token) } } 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 d2dd987645..ee2f18c767 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 @@ -17,11 +17,11 @@ package im.vector.matrix.android.internal.session.identity import im.vector.matrix.android.internal.network.token.AccessTokenProvider -import im.vector.matrix.android.internal.session.identity.db.IdentityServiceStore +import im.vector.matrix.android.internal.session.identity.data.IdentityStore import javax.inject.Inject internal class IdentityAccessTokenProvider @Inject constructor( - private val identityServiceStore: IdentityServiceStore + private val identityStore: IdentityStore ) : AccessTokenProvider { - override fun getToken() = identityServiceStore.getIdentityServerDetails()?.token + override fun getToken() = identityStore.getIdentityData()?.token } 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/IdentityBulkLookupTask.kt similarity index 88% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/BulkLookupTask.kt rename to matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityBulkLookupTask.kt index 61792fdc43..9f1579af60 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/IdentityBulkLookupTask.kt @@ -26,7 +26,7 @@ import im.vector.matrix.android.internal.crypto.attachments.MXEncryptedAttachmen import im.vector.matrix.android.internal.crypto.tools.withOlmUtility import im.vector.matrix.android.internal.di.UserId import im.vector.matrix.android.internal.network.executeRequest -import im.vector.matrix.android.internal.session.identity.db.IdentityServiceStore +import im.vector.matrix.android.internal.session.identity.data.IdentityStore import im.vector.matrix.android.internal.session.identity.model.IdentityHashDetailResponse import im.vector.matrix.android.internal.session.identity.model.IdentityLookUpParams import im.vector.matrix.android.internal.session.identity.model.IdentityLookUpResponse @@ -34,27 +34,27 @@ import im.vector.matrix.android.internal.task.Task import java.util.Locale import javax.inject.Inject -internal interface BulkLookupTask : Task> { +internal interface IdentityBulkLookupTask : Task> { data class Params( val threePids: List ) } -internal class DefaultBulkLookupTask @Inject constructor( +internal class DefaultIdentityBulkLookupTask @Inject constructor( private val identityApiProvider: IdentityApiProvider, - private val identityServiceStore: IdentityServiceStore, + private val identityStore: IdentityStore, @UserId private val userId: String -) : BulkLookupTask { +) : IdentityBulkLookupTask { - override suspend fun execute(params: BulkLookupTask.Params): List { + override suspend fun execute(params: IdentityBulkLookupTask.Params): List { val identityAPI = getIdentityApiAndEnsureTerms(identityApiProvider, userId) - val entity = identityServiceStore.getIdentityServerDetails() ?: throw IdentityServiceError.NoIdentityServerConfigured - val pepper = entity.hashLookupPepper + val identityData = identityStore.getIdentityData() ?: throw IdentityServiceError.NoIdentityServerConfigured + val pepper = identityData.hashLookupPepper val hashDetailResponse = if (pepper == null) { // We need to fetch the hash details first fetchAndStoreHashDetails(identityAPI) } else { - IdentityHashDetailResponse(pepper, entity.hashLookupAlgorithm.toList()) + IdentityHashDetailResponse(pepper, identityData.hashLookupAlgorithm) } if (hashDetailResponse.algorithms.contains("sha256").not()) { @@ -97,7 +97,7 @@ internal class DefaultBulkLookupTask @Inject constructor( if (!failure.error.newLookupPepper.isNullOrEmpty()) { // Store it and use it right now hashDetailResponse.copy(pepper = failure.error.newLookupPepper) - .also { identityServiceStore.setHashDetails(it) } + .also { identityStore.setHashDetails(it) } .let { lookUpInternal(identityAPI, hashedAddresses, it, false /* Avoid infinite loop */) } } else { // Retrieve the new hash details @@ -122,7 +122,7 @@ internal class DefaultBulkLookupTask @Inject constructor( return executeRequest(null) { apiCall = identityAPI.hashDetails() } - .also { identityServiceStore.setHashDetails(it) } + .also { identityStore.setHashDetails(it) } } private fun handleSuccess(threePids: List, hashedAddresses: List, identityLookUpResponse: IdentityLookUpResponse): List { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityModule.kt index e077e385e5..0cfad72ede 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityModule.kt @@ -30,8 +30,8 @@ import im.vector.matrix.android.internal.network.token.AccessTokenProvider import im.vector.matrix.android.internal.session.SessionModule import im.vector.matrix.android.internal.session.SessionScope import im.vector.matrix.android.internal.session.identity.db.IdentityRealmModule -import im.vector.matrix.android.internal.session.identity.db.IdentityServiceStore -import im.vector.matrix.android.internal.session.identity.db.RealmIdentityServiceStore +import im.vector.matrix.android.internal.session.identity.data.IdentityStore +import im.vector.matrix.android.internal.session.identity.db.RealmIdentityStore import io.realm.RealmConfiguration import okhttp3.OkHttpClient import java.io.File @@ -75,7 +75,7 @@ internal abstract class IdentityModule { abstract fun bindAccessTokenProvider(provider: IdentityAccessTokenProvider): AccessTokenProvider @Binds - abstract fun bindIdentityServiceStore(store: RealmIdentityServiceStore): IdentityServiceStore + abstract fun bindIdentityStore(store: RealmIdentityStore): IdentityStore @Binds abstract fun bindIdentityPingTask(task: DefaultIdentityPingTask): IdentityPingTask @@ -90,7 +90,7 @@ internal abstract class IdentityModule { abstract fun bindIdentitySubmitTokenForBindingTask(task: DefaultIdentitySubmitTokenForBindingTask): IdentitySubmitTokenForBindingTask @Binds - abstract fun bindBulkLookupTask(task: DefaultBulkLookupTask): BulkLookupTask + abstract fun bindIdentityBulkLookupTask(task: DefaultIdentityBulkLookupTask): IdentityBulkLookupTask @Binds abstract fun bindIdentityDisconnectTask(task: DefaultIdentityDisconnectTask): IdentityDisconnectTask diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityRequestTokenForBindingTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityRequestTokenForBindingTask.kt index e06a0e3b9a..313f5f6662 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityRequestTokenForBindingTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentityRequestTokenForBindingTask.kt @@ -21,7 +21,8 @@ import im.vector.matrix.android.api.session.identity.ThreePid import im.vector.matrix.android.api.session.identity.getCountryCode import im.vector.matrix.android.internal.di.UserId import im.vector.matrix.android.internal.network.executeRequest -import im.vector.matrix.android.internal.session.identity.db.IdentityServiceStore +import im.vector.matrix.android.internal.session.identity.data.IdentityPendingBinding +import im.vector.matrix.android.internal.session.identity.data.IdentityStore import im.vector.matrix.android.internal.session.identity.model.IdentityRequestTokenForEmailBody import im.vector.matrix.android.internal.session.identity.model.IdentityRequestTokenForMsisdnBody import im.vector.matrix.android.internal.session.identity.model.IdentityRequestTokenResponse @@ -39,21 +40,21 @@ internal interface IdentityRequestTokenForBindingTask : Task(null) { apiCall = when (params.threePid) { @@ -73,11 +74,14 @@ internal class DefaultIdentityRequestTokenForBindingTask @Inject constructor( } } - // Store client secret and sid - identityServiceStore.storePendingBinding( + // Store client secret, send attempt and sid + identityStore.storePendingBinding( params.threePid, - clientSecret, - sendAttempt, - tokenResponse.sid) + IdentityPendingBinding( + clientSecret = clientSecret, + sendAttempt = sendAttempt, + sid = tokenResponse.sid + ) + ) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentitySubmitTokenForBindingTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentitySubmitTokenForBindingTask.kt index 78f4305edf..fae1dd1eba 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentitySubmitTokenForBindingTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/IdentitySubmitTokenForBindingTask.kt @@ -22,7 +22,7 @@ import im.vector.matrix.android.api.session.identity.toMedium import im.vector.matrix.android.internal.auth.registration.SuccessResult import im.vector.matrix.android.internal.di.UserId import im.vector.matrix.android.internal.network.executeRequest -import im.vector.matrix.android.internal.session.identity.db.IdentityServiceStore +import im.vector.matrix.android.internal.session.identity.data.IdentityStore import im.vector.matrix.android.internal.session.identity.model.IdentityRequestOwnershipParams import im.vector.matrix.android.internal.task.Task import javax.inject.Inject @@ -36,20 +36,20 @@ internal interface IdentitySubmitTokenForBindingTask : Task(null) { apiCall = identityAPI.submitToken( params.threePid.toMedium(), IdentityRequestOwnershipParams( - clientSecret = pendingThreePid.clientSecret, - sid = pendingThreePid.sid, + clientSecret = identityPendingBinding.clientSecret, + sid = identityPendingBinding.sid, token = params.token )) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/data/IdentityData.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/data/IdentityData.kt new file mode 100644 index 0000000000..f1e57e1ed5 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/data/IdentityData.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.matrix.android.internal.session.identity.data + +internal data class IdentityData( + val identityServerUrl: String?, + val token: String?, + val hashLookupPepper: String?, + val hashLookupAlgorithm: List +) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/data/IdentityPendingBinding.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/data/IdentityPendingBinding.kt new file mode 100644 index 0000000000..b7f405cb0a --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/data/IdentityPendingBinding.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.matrix.android.internal.session.identity.data + +internal data class IdentityPendingBinding( + /* Managed by Riot */ + val clientSecret: String, + /* Managed by Riot */ + val sendAttempt: Int, + /* Provided by the identity server */ + val sid: String +) 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/data/IdentityStore.kt similarity index 67% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServiceStore.kt rename to matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/data/IdentityStore.kt index 477f1478fd..d5cd3277ec 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/data/IdentityStore.kt @@ -14,14 +14,14 @@ * limitations under the License. */ -package im.vector.matrix.android.internal.session.identity.db +package im.vector.matrix.android.internal.session.identity.data import im.vector.matrix.android.api.session.identity.ThreePid import im.vector.matrix.android.internal.session.identity.model.IdentityHashDetailResponse -internal interface IdentityServiceStore { +internal interface IdentityStore { - fun getIdentityServerDetails(): IdentityServerEntity? + fun getIdentityData(): IdentityData? fun setUrl(url: String?) @@ -32,16 +32,13 @@ internal interface IdentityServiceStore { /** * Store details about a current binding */ - fun storePendingBinding(threePid: ThreePid, - clientSecret: String, - sendAttempt: Int, - sid: String) + fun storePendingBinding(threePid: ThreePid, data: IdentityPendingBinding) - fun getPendingBinding(threePid: ThreePid): IdentityPendingBindingEntity? + fun getPendingBinding(threePid: ThreePid): IdentityPendingBinding? fun deletePendingBinding(threePid: ThreePid) } -internal fun IdentityServiceStore.getIdentityServerUrlWithoutProtocol(): String? { - return getIdentityServerDetails()?.identityServerUrl?.substringAfter("://") +internal fun IdentityStore.getIdentityServerUrlWithoutProtocol(): String? { + return getIdentityData()?.identityServerUrl?.substringAfter("://") } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServerEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityDataEntity.kt similarity index 95% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServerEntity.kt rename to matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityDataEntity.kt index 5545f5bccf..76e480bdc9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServerEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityDataEntity.kt @@ -19,7 +19,7 @@ package im.vector.matrix.android.internal.session.identity.db import io.realm.RealmList import io.realm.RealmObject -internal open class IdentityServerEntity( +internal open class IdentityDataEntity( var identityServerUrl: String? = null, var token: String? = null, var hashLookupPepper: String? = null, 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/IdentityDataEntityQuery.kt similarity index 61% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityServerQuery.kt rename to matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityDataEntityQuery.kt index 906b4d8d7c..0a07359642 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/IdentityDataEntityQuery.kt @@ -24,17 +24,17 @@ 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().findFirst() +internal fun IdentityDataEntity.Companion.get(realm: Realm): IdentityDataEntity? { + return realm.where().findFirst() } -private fun IdentityServerEntity.Companion.getOrCreate(realm: Realm): IdentityServerEntity { +private fun IdentityDataEntity.Companion.getOrCreate(realm: Realm): IdentityDataEntity { return get(realm) ?: realm.createObject() } -internal fun IdentityServerEntity.Companion.setUrl(realm: Realm, - url: String?) { - realm.where().findAll().deleteAllFromRealm() +internal fun IdentityDataEntity.Companion.setUrl(realm: Realm, + url: String?) { + realm.where().findAll().deleteAllFromRealm() // Delete all pending binding if any IdentityPendingBindingEntity.deleteAll(realm) @@ -45,16 +45,16 @@ internal fun IdentityServerEntity.Companion.setUrl(realm: Realm, } } -internal fun IdentityServerEntity.Companion.setToken(realm: Realm, - newToken: String?) { +internal fun IdentityDataEntity.Companion.setToken(realm: Realm, + newToken: String?) { get(realm)?.apply { token = newToken } } -internal fun IdentityServerEntity.Companion.setHashDetails(realm: Realm, - pepper: String, - algorithms: List) { +internal fun IdentityDataEntity.Companion.setHashDetails(realm: Realm, + pepper: String, + algorithms: List) { get(realm)?.apply { hashLookupPepper = pepper hashLookupAlgorithm = RealmList().apply { addAll(algorithms) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityMapper.kt new file mode 100644 index 0000000000..1335e38565 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityMapper.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.matrix.android.internal.session.identity.db + +import im.vector.matrix.android.internal.session.identity.data.IdentityData +import im.vector.matrix.android.internal.session.identity.data.IdentityPendingBinding + +internal object IdentityMapper { + + fun map(entity: IdentityDataEntity): IdentityData { + return IdentityData( + identityServerUrl = entity.identityServerUrl, + token = entity.token, + hashLookupPepper = entity.hashLookupPepper, + hashLookupAlgorithm = entity.hashLookupAlgorithm.toList() + ) + } + + fun map(entity: IdentityPendingBindingEntity): IdentityPendingBinding { + return IdentityPendingBinding( + clientSecret = entity.clientSecret, + sendAttempt = entity.sendAttempt, + sid = entity.sid + ) + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityPendingBindingQuery.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityPendingBindingEntityQuery.kt similarity index 100% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityPendingBindingQuery.kt rename to matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityPendingBindingEntityQuery.kt diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityRealmModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityRealmModule.kt index eb5844244b..19bd90ee1f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityRealmModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/IdentityRealmModule.kt @@ -23,7 +23,7 @@ import io.realm.annotations.RealmModule */ @RealmModule(library = true, classes = [ - IdentityServerEntity::class, + IdentityDataEntity::class, IdentityPendingBindingEntity::class ]) internal class IdentityRealmModule diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityServiceStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityStore.kt similarity index 71% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityServiceStore.kt rename to matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityStore.kt index d04c7da91e..c294fbbf4b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityServiceStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/identity/db/RealmIdentityStore.kt @@ -19,27 +19,30 @@ package im.vector.matrix.android.internal.session.identity.db import im.vector.matrix.android.api.session.identity.ThreePid import im.vector.matrix.android.internal.di.IdentityDatabase import im.vector.matrix.android.internal.session.SessionScope +import im.vector.matrix.android.internal.session.identity.data.IdentityPendingBinding +import im.vector.matrix.android.internal.session.identity.data.IdentityData +import im.vector.matrix.android.internal.session.identity.data.IdentityStore import im.vector.matrix.android.internal.session.identity.model.IdentityHashDetailResponse import io.realm.Realm import io.realm.RealmConfiguration import javax.inject.Inject @SessionScope -internal class RealmIdentityServiceStore @Inject constructor( +internal class RealmIdentityStore @Inject constructor( @IdentityDatabase private val realmConfiguration: RealmConfiguration -) : IdentityServiceStore { +) : IdentityStore { - override fun getIdentityServerDetails(): IdentityServerEntity? { + override fun getIdentityData(): IdentityData? { return Realm.getInstance(realmConfiguration).use { realm -> - IdentityServerEntity.get(realm)?.let { realm.copyFromRealm(it) } + IdentityDataEntity.get(realm)?.let { IdentityMapper.map(it) } } } override fun setUrl(url: String?) { Realm.getInstance(realmConfiguration).use { it.executeTransaction { realm -> - IdentityServerEntity.setUrl(realm, url) + IdentityDataEntity.setUrl(realm, url) } } } @@ -47,7 +50,7 @@ internal class RealmIdentityServiceStore @Inject constructor( override fun setToken(token: String?) { Realm.getInstance(realmConfiguration).use { it.executeTransaction { realm -> - IdentityServerEntity.setToken(realm, token) + IdentityDataEntity.setToken(realm, token) } } } @@ -55,26 +58,26 @@ internal class RealmIdentityServiceStore @Inject constructor( override fun setHashDetails(hashDetailResponse: IdentityHashDetailResponse) { Realm.getInstance(realmConfiguration).use { it.executeTransaction { realm -> - IdentityServerEntity.setHashDetails(realm, hashDetailResponse.pepper, hashDetailResponse.algorithms) + IdentityDataEntity.setHashDetails(realm, hashDetailResponse.pepper, hashDetailResponse.algorithms) } } } - override fun storePendingBinding(threePid: ThreePid, clientSecret: String, sendAttempt: Int, sid: String) { + override fun storePendingBinding(threePid: ThreePid, data: IdentityPendingBinding) { Realm.getInstance(realmConfiguration).use { it.executeTransaction { realm -> IdentityPendingBindingEntity.getOrCreate(realm, threePid).let { entity -> - entity.clientSecret = clientSecret - entity.sendAttempt = sendAttempt - entity.sid = sid + entity.clientSecret = data.clientSecret + entity.sendAttempt = data.sendAttempt + entity.sid = data.sid } } } } - override fun getPendingBinding(threePid: ThreePid): IdentityPendingBindingEntity? { + override fun getPendingBinding(threePid: ThreePid): IdentityPendingBinding? { return Realm.getInstance(realmConfiguration).use { realm -> - IdentityPendingBindingEntity.get(realm, threePid)?.let { realm.copyFromRealm(it) } + IdentityPendingBindingEntity.get(realm, threePid)?.let { IdentityMapper.map(it) } } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/profile/BindThreePidsTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/profile/BindThreePidsTask.kt index 93daf8f8ed..0e1987dd5f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/profile/BindThreePidsTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/profile/BindThreePidsTask.kt @@ -21,8 +21,8 @@ import im.vector.matrix.android.api.session.identity.ThreePid import im.vector.matrix.android.internal.di.AuthenticatedIdentity import im.vector.matrix.android.internal.network.executeRequest import im.vector.matrix.android.internal.network.token.AccessTokenProvider -import im.vector.matrix.android.internal.session.identity.db.IdentityServiceStore -import im.vector.matrix.android.internal.session.identity.db.getIdentityServerUrlWithoutProtocol +import im.vector.matrix.android.internal.session.identity.data.IdentityStore +import im.vector.matrix.android.internal.session.identity.data.getIdentityServerUrlWithoutProtocol import im.vector.matrix.android.internal.task.Task import org.greenrobot.eventbus.EventBus import javax.inject.Inject @@ -34,27 +34,26 @@ internal abstract class BindThreePidsTask : Task } internal class DefaultBindThreePidsTask @Inject constructor(private val profileAPI: ProfileAPI, - private val identityServiceStore: IdentityServiceStore, + private val identityStore: IdentityStore, @AuthenticatedIdentity private val accessTokenProvider: AccessTokenProvider, private val eventBus: EventBus) : BindThreePidsTask() { override suspend fun execute(params: Params) { - val identityServerUrlWithoutProtocol = identityServiceStore.getIdentityServerUrlWithoutProtocol() - ?: throw IdentityServiceError.NoIdentityServerConfigured + val identityServerUrlWithoutProtocol = identityStore.getIdentityServerUrlWithoutProtocol() ?: throw IdentityServiceError.NoIdentityServerConfigured val identityServerAccessToken = accessTokenProvider.getToken() ?: throw IdentityServiceError.NoIdentityServerConfigured - val pendingThreePid = identityServiceStore.getPendingBinding(params.threePid) ?: throw IdentityServiceError.NoCurrentBindingError + val identityPendingBinding = identityStore.getPendingBinding(params.threePid) ?: throw IdentityServiceError.NoCurrentBindingError executeRequest(eventBus) { apiCall = profileAPI.bindThreePid( BindThreePidBody( - clientSecret = pendingThreePid.clientSecret, + clientSecret = identityPendingBinding.clientSecret, identityServerUrlWithoutProtocol = identityServerUrlWithoutProtocol, identityServerAccessToken = identityServerAccessToken, - sid = pendingThreePid.sid + sid = identityPendingBinding.sid )) } // Binding is over, cleanup the store - identityServiceStore.deletePendingBinding(params.threePid) + identityStore.deletePendingBinding(params.threePid) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/profile/UnbindThreePidsTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/profile/UnbindThreePidsTask.kt index 4a11950ab5..5206ea9bda 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/profile/UnbindThreePidsTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/profile/UnbindThreePidsTask.kt @@ -20,8 +20,8 @@ import im.vector.matrix.android.api.session.identity.IdentityServiceError import im.vector.matrix.android.api.session.identity.ThreePid import im.vector.matrix.android.api.session.identity.toMedium import im.vector.matrix.android.internal.network.executeRequest -import im.vector.matrix.android.internal.session.identity.db.IdentityServiceStore -import im.vector.matrix.android.internal.session.identity.db.getIdentityServerUrlWithoutProtocol +import im.vector.matrix.android.internal.session.identity.data.IdentityStore +import im.vector.matrix.android.internal.session.identity.data.getIdentityServerUrlWithoutProtocol import im.vector.matrix.android.internal.task.Task import org.greenrobot.eventbus.EventBus import javax.inject.Inject @@ -33,10 +33,10 @@ internal abstract class UnbindThreePidsTask : Task(eventBus) {