Browse Source

Avoid restoring several MatrixClient

pull/3050/head
Benoit Marty 3 months ago
parent
commit
a8cd659b1f
  1. 1
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/MatrixAuthenticationService.kt
  2. 8
      libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseNewTokenHandler.kt
  3. 40
      libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/DefaultFirebaseNewTokenHandlerTest.kt
  4. 8
      libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushNewGatewayHandler.kt
  5. 12
      libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushNewGatewayHandlerTest.kt

1
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/MatrixAuthenticationService.kt

@ -31,6 +31,7 @@ interface MatrixAuthenticationService {
/** /**
* Restore a session from a [sessionId]. * Restore a session from a [sessionId].
* Do not restore anything it the access token is not valid anymore. * Do not restore anything it the access token is not valid anymore.
* Generally this method should not be used directly, prefer using [MatrixClientProvider.getOrRestore] instead.
*/ */
suspend fun restoreSession(sessionId: SessionId): Result<MatrixClient> suspend fun restoreSession(sessionId: SessionId): Result<MatrixClient>
fun getHomeserverDetails(): StateFlow<MatrixHomeServerDetails?> fun getHomeserverDetails(): StateFlow<MatrixHomeServerDetails?>

8
libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseNewTokenHandler.kt

@ -20,7 +20,7 @@ import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.core.extensions.flatMap import io.element.android.libraries.core.extensions.flatMap
import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.AppScope
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.api.MatrixClientProvider
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.pushproviders.api.PusherSubscriber import io.element.android.libraries.pushproviders.api.PusherSubscriber
import io.element.android.libraries.pushstore.api.UserPushStoreFactory import io.element.android.libraries.pushstore.api.UserPushStoreFactory
@ -43,7 +43,7 @@ class DefaultFirebaseNewTokenHandler @Inject constructor(
private val pusherSubscriber: PusherSubscriber, private val pusherSubscriber: PusherSubscriber,
private val sessionStore: SessionStore, private val sessionStore: SessionStore,
private val userPushStoreFactory: UserPushStoreFactory, private val userPushStoreFactory: UserPushStoreFactory,
private val matrixAuthenticationService: MatrixAuthenticationService, private val matrixClientProvider: MatrixClientProvider,
private val firebaseStore: FirebaseStore, private val firebaseStore: FirebaseStore,
) : FirebaseNewTokenHandler { ) : FirebaseNewTokenHandler {
override suspend fun handle(firebaseToken: String) { override suspend fun handle(firebaseToken: String) {
@ -54,8 +54,8 @@ class DefaultFirebaseNewTokenHandler @Inject constructor(
.forEach { sessionId -> .forEach { sessionId ->
val userDataStore = userPushStoreFactory.getOrCreate(sessionId) val userDataStore = userPushStoreFactory.getOrCreate(sessionId)
if (userDataStore.getPushProviderName() == FirebaseConfig.NAME) { if (userDataStore.getPushProviderName() == FirebaseConfig.NAME) {
matrixAuthenticationService matrixClientProvider
.restoreSession(sessionId) .getOrRestore(sessionId)
.onFailure { .onFailure {
Timber.tag(loggerTag.value).e(it, "Failed to restore session $sessionId") Timber.tag(loggerTag.value).e(it, "Failed to restore session $sessionId")
} }

40
libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/DefaultFirebaseNewTokenHandlerTest.kt

@ -18,13 +18,13 @@ package io.element.android.libraries.pushproviders.firebase
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.api.MatrixClientProvider
import io.element.android.libraries.matrix.test.AN_EXCEPTION import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.libraries.matrix.test.A_USER_ID_2
import io.element.android.libraries.matrix.test.A_USER_ID_3 import io.element.android.libraries.matrix.test.A_USER_ID_3
import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
import io.element.android.libraries.push.test.FakePusherSubscriber import io.element.android.libraries.push.test.FakePusherSubscriber
import io.element.android.libraries.pushproviders.api.PusherSubscriber import io.element.android.libraries.pushproviders.api.PusherSubscriber
import io.element.android.libraries.pushstore.api.UserPushStoreFactory import io.element.android.libraries.pushstore.api.UserPushStoreFactory
@ -64,16 +64,14 @@ class DefaultFirebaseNewTokenHandlerTest {
storeData(aSessionData(A_USER_ID_2)) storeData(aSessionData(A_USER_ID_2))
storeData(aSessionData(A_USER_ID_3)) storeData(aSessionData(A_USER_ID_3))
}, },
matrixAuthenticationService = FakeMatrixAuthenticationService( matrixClientProvider = FakeMatrixClientProvider { sessionId ->
matrixClientResult = { sessionId -> when (sessionId) {
when (sessionId) { A_USER_ID -> Result.success(aMatrixClient1)
A_USER_ID -> Result.success(aMatrixClient1) A_USER_ID_2 -> Result.success(aMatrixClient2)
A_USER_ID_2 -> Result.success(aMatrixClient2) A_USER_ID_3 -> Result.success(aMatrixClient3)
A_USER_ID_3 -> Result.success(aMatrixClient3) else -> Result.failure(IllegalStateException())
else -> Result.failure(IllegalStateException())
}
} }
), },
userPushStoreFactory = FakeUserPushStoreFactory( userPushStoreFactory = FakeUserPushStoreFactory(
userPushStore = { sessionId -> userPushStore = { sessionId ->
when (sessionId) { when (sessionId) {
@ -103,11 +101,9 @@ class DefaultFirebaseNewTokenHandlerTest {
sessionStore = InMemoryMultiSessionsStore().apply { sessionStore = InMemoryMultiSessionsStore().apply {
storeData(aSessionData(A_USER_ID)) storeData(aSessionData(A_USER_ID))
}, },
matrixAuthenticationService = FakeMatrixAuthenticationService( matrixClientProvider = FakeMatrixClientProvider {
matrixClientResult = { _ -> Result.failure(IllegalStateException())
Result.failure(IllegalStateException()) },
}
),
userPushStoreFactory = FakeUserPushStoreFactory( userPushStoreFactory = FakeUserPushStoreFactory(
userPushStore = { _ -> userPushStore = { _ ->
FakeUserPushStore(pushProviderName = FirebaseConfig.NAME) FakeUserPushStore(pushProviderName = FirebaseConfig.NAME)
@ -129,11 +125,9 @@ class DefaultFirebaseNewTokenHandlerTest {
sessionStore = InMemoryMultiSessionsStore().apply { sessionStore = InMemoryMultiSessionsStore().apply {
storeData(aSessionData(A_USER_ID)) storeData(aSessionData(A_USER_ID))
}, },
matrixAuthenticationService = FakeMatrixAuthenticationService( matrixClientProvider = FakeMatrixClientProvider {
matrixClientResult = { _ -> Result.success(aMatrixClient1)
Result.success(aMatrixClient1) },
}
),
userPushStoreFactory = FakeUserPushStoreFactory( userPushStoreFactory = FakeUserPushStoreFactory(
userPushStore = { _ -> userPushStore = { _ ->
FakeUserPushStore(pushProviderName = FirebaseConfig.NAME) FakeUserPushStore(pushProviderName = FirebaseConfig.NAME)
@ -152,14 +146,14 @@ class DefaultFirebaseNewTokenHandlerTest {
pusherSubscriber: PusherSubscriber = FakePusherSubscriber(), pusherSubscriber: PusherSubscriber = FakePusherSubscriber(),
sessionStore: SessionStore = InMemorySessionStore(), sessionStore: SessionStore = InMemorySessionStore(),
userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(), userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(),
matrixAuthenticationService: MatrixAuthenticationService = FakeMatrixAuthenticationService(), matrixClientProvider: MatrixClientProvider = FakeMatrixClientProvider(),
firebaseStore: FirebaseStore = InMemoryFirebaseStore(), firebaseStore: FirebaseStore = InMemoryFirebaseStore(),
): FirebaseNewTokenHandler { ): FirebaseNewTokenHandler {
return DefaultFirebaseNewTokenHandler( return DefaultFirebaseNewTokenHandler(
pusherSubscriber = pusherSubscriber, pusherSubscriber = pusherSubscriber,
sessionStore = sessionStore, sessionStore = sessionStore,
userPushStoreFactory = userPushStoreFactory, userPushStoreFactory = userPushStoreFactory,
matrixAuthenticationService = matrixAuthenticationService, matrixClientProvider = matrixClientProvider,
firebaseStore = firebaseStore firebaseStore = firebaseStore
) )
} }

8
libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushNewGatewayHandler.kt

@ -20,7 +20,7 @@ import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.core.extensions.flatMap import io.element.android.libraries.core.extensions.flatMap
import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.AppScope
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.api.MatrixClientProvider
import io.element.android.libraries.pushproviders.api.PusherSubscriber import io.element.android.libraries.pushproviders.api.PusherSubscriber
import io.element.android.libraries.pushstore.api.UserPushStoreFactory import io.element.android.libraries.pushstore.api.UserPushStoreFactory
import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret
@ -41,7 +41,7 @@ class DefaultUnifiedPushNewGatewayHandler @Inject constructor(
private val pusherSubscriber: PusherSubscriber, private val pusherSubscriber: PusherSubscriber,
private val userPushStoreFactory: UserPushStoreFactory, private val userPushStoreFactory: UserPushStoreFactory,
private val pushClientSecret: PushClientSecret, private val pushClientSecret: PushClientSecret,
private val matrixAuthenticationService: MatrixAuthenticationService, private val matrixClientProvider: MatrixClientProvider,
) : UnifiedPushNewGatewayHandler { ) : UnifiedPushNewGatewayHandler {
override suspend fun handle(endpoint: String, pushGateway: String, clientSecret: String): Result<Unit> { override suspend fun handle(endpoint: String, pushGateway: String, clientSecret: String): Result<Unit> {
// Register the pusher for the session with this client secret, if is it using UnifiedPush. // Register the pusher for the session with this client secret, if is it using UnifiedPush.
@ -52,8 +52,8 @@ class DefaultUnifiedPushNewGatewayHandler @Inject constructor(
} }
val userDataStore = userPushStoreFactory.getOrCreate(userId) val userDataStore = userPushStoreFactory.getOrCreate(userId)
return if (userDataStore.getPushProviderName() == UnifiedPushConfig.NAME) { return if (userDataStore.getPushProviderName() == UnifiedPushConfig.NAME) {
matrixAuthenticationService matrixClientProvider
.restoreSession(userId) .getOrRestore(userId)
.flatMap { client -> .flatMap { client ->
pusherSubscriber.registerPusher(client, endpoint, pushGateway) pusherSubscriber.registerPusher(client, endpoint, pushGateway)
} }

12
libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushNewGatewayHandlerTest.kt

@ -18,11 +18,11 @@ package io.element.android.libraries.pushproviders.unifiedpush
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.api.MatrixClientProvider
import io.element.android.libraries.matrix.test.A_SECRET import io.element.android.libraries.matrix.test.A_SECRET
import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
import io.element.android.libraries.push.test.FakePusherSubscriber import io.element.android.libraries.push.test.FakePusherSubscriber
import io.element.android.libraries.pushproviders.api.PusherSubscriber import io.element.android.libraries.pushproviders.api.PusherSubscriber
import io.element.android.libraries.pushstore.api.UserPushStoreFactory import io.element.android.libraries.pushstore.api.UserPushStoreFactory
@ -86,7 +86,7 @@ class DefaultUnifiedPushNewGatewayHandlerTest {
pusherSubscriber = FakePusherSubscriber( pusherSubscriber = FakePusherSubscriber(
registerPusherResult = { _, _, _ -> Result.failure(IllegalStateException("an error")) } registerPusherResult = { _, _, _ -> Result.failure(IllegalStateException("an error")) }
), ),
matrixAuthenticationService = FakeMatrixAuthenticationService(matrixClientResult = { Result.success(aMatrixClient) }), matrixClientProvider = FakeMatrixClientProvider { Result.success(aMatrixClient) },
) )
val result = defaultUnifiedPushNewGatewayHandler.handle( val result = defaultUnifiedPushNewGatewayHandler.handle(
endpoint = "aEndpoint", endpoint = "aEndpoint",
@ -114,7 +114,7 @@ class DefaultUnifiedPushNewGatewayHandlerTest {
pusherSubscriber = FakePusherSubscriber( pusherSubscriber = FakePusherSubscriber(
registerPusherResult = lambda registerPusherResult = lambda
), ),
matrixAuthenticationService = FakeMatrixAuthenticationService(matrixClientResult = { Result.success(aMatrixClient) }), matrixClientProvider = FakeMatrixClientProvider { Result.success(aMatrixClient) },
) )
val result = defaultUnifiedPushNewGatewayHandler.handle( val result = defaultUnifiedPushNewGatewayHandler.handle(
endpoint = "aEndpoint", endpoint = "aEndpoint",
@ -131,13 +131,13 @@ class DefaultUnifiedPushNewGatewayHandlerTest {
pusherSubscriber: PusherSubscriber = FakePusherSubscriber(), pusherSubscriber: PusherSubscriber = FakePusherSubscriber(),
userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(), userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(),
pushClientSecret: PushClientSecret = FakePushClientSecret(), pushClientSecret: PushClientSecret = FakePushClientSecret(),
matrixAuthenticationService: MatrixAuthenticationService = FakeMatrixAuthenticationService() matrixClientProvider: MatrixClientProvider = FakeMatrixClientProvider()
): DefaultUnifiedPushNewGatewayHandler { ): DefaultUnifiedPushNewGatewayHandler {
return DefaultUnifiedPushNewGatewayHandler( return DefaultUnifiedPushNewGatewayHandler(
pusherSubscriber = pusherSubscriber, pusherSubscriber = pusherSubscriber,
userPushStoreFactory = userPushStoreFactory, userPushStoreFactory = userPushStoreFactory,
pushClientSecret = pushClientSecret, pushClientSecret = pushClientSecret,
matrixAuthenticationService = matrixAuthenticationService matrixClientProvider = matrixClientProvider,
) )
} }
} }

Loading…
Cancel
Save