Fix new logins with Simplified SS using the proxy (#3417)

* Fix new logins with Simplified SS using the proxy

* Make sure `ClientBuilderSlidingSync.Restored` is always used for restored sessions
This commit is contained in:
Jorge Martin Espinosa 2024-09-06 17:09:36 +02:00 committed by GitHub
parent 87a485baf6
commit 1b79887c9d
2 changed files with 22 additions and 15 deletions

View file

@ -56,16 +56,11 @@ class RustMatrixClientFactory @Inject constructor(
private val appPreferencesStore: AppPreferencesStore, private val appPreferencesStore: AppPreferencesStore,
) { ) {
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) { suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
val sessionDelegate = RustClientSessionDelegate(sessionStore, appCoroutineScope, coroutineDispatchers) val sessionDelegate = RustClientSessionDelegate(sessionStore, appCoroutineScope, coroutineDispatchers)
val client = getBaseClientBuilder( val client = getBaseClientBuilder(
sessionPaths = sessionData.getSessionPaths(), sessionPaths = sessionData.getSessionPaths(),
passphrase = sessionData.passphrase, passphrase = sessionData.passphrase,
slidingSync = when { restore = true,
AuthenticationConfig.SLIDING_SYNC_PROXY_URL != null -> ClientBuilderSlidingSync.CustomProxy(AuthenticationConfig.SLIDING_SYNC_PROXY_URL!!)
appPreferencesStore.isSimplifiedSlidingSyncEnabledFlow().first() -> ClientBuilderSlidingSync.Simplified
else -> ClientBuilderSlidingSync.Restored
}
) )
.homeserverUrl(sessionData.homeserverUrl) .homeserverUrl(sessionData.homeserverUrl)
.username(sessionData.userId) .username(sessionData.userId)
@ -95,11 +90,19 @@ class RustMatrixClientFactory @Inject constructor(
} }
} }
internal fun getBaseClientBuilder( internal suspend fun getBaseClientBuilder(
sessionPaths: SessionPaths, sessionPaths: SessionPaths,
passphrase: String?, passphrase: String?,
slidingSync: ClientBuilderSlidingSync, restore: Boolean,
): ClientBuilder { ): ClientBuilder {
val slidingSync = when {
// Always check restore first, since otherwise other values could accidentally override the already persisted config
restore -> ClientBuilderSlidingSync.Restored
AuthenticationConfig.SLIDING_SYNC_PROXY_URL != null -> ClientBuilderSlidingSync.CustomProxy(AuthenticationConfig.SLIDING_SYNC_PROXY_URL!!)
appPreferencesStore.isSimplifiedSlidingSyncEnabledFlow().first() -> ClientBuilderSlidingSync.Simplified
else -> ClientBuilderSlidingSync.Discovered
}
return ClientBuilder() return ClientBuilder()
.sessionPaths( .sessionPaths(
dataPath = sessionPaths.fileDirectory.absolutePath, dataPath = sessionPaths.fileDirectory.absolutePath,
@ -116,7 +119,8 @@ class RustMatrixClientFactory @Inject constructor(
ClientBuilderSlidingSync.Restored -> this ClientBuilderSlidingSync.Restored -> this
is ClientBuilderSlidingSync.CustomProxy -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.Proxy(slidingSync.url)) is ClientBuilderSlidingSync.CustomProxy -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.Proxy(slidingSync.url))
ClientBuilderSlidingSync.Discovered -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.DiscoverProxy) ClientBuilderSlidingSync.Discovered -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.DiscoverProxy)
ClientBuilderSlidingSync.Simplified -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.Native) ClientBuilderSlidingSync.Simplified -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.DiscoverNative)
ClientBuilderSlidingSync.ForcedSimplified -> slidingSyncVersionBuilder(SlidingSyncVersionBuilder.Native)
} }
} }
.run { .run {
@ -136,8 +140,12 @@ sealed interface ClientBuilderSlidingSync {
// A proxy must be discovered whilst building the session. // A proxy must be discovered whilst building the session.
data object Discovered : ClientBuilderSlidingSync data object Discovered : ClientBuilderSlidingSync
// Use Simplified Sliding Sync (discovery isn't a thing yet). // Use Simplified Sliding Sync.
data object Simplified : ClientBuilderSlidingSync data object Simplified : ClientBuilderSlidingSync
// Force using Simplified Sliding Sync.
// TODO allow the user to select between proxy, simplified or force simplified in developer options.
data object ForcedSimplified : ClientBuilderSlidingSync
} }
private fun SessionData.toSession() = Session( private fun SessionData.toSession() = Session(

View file

@ -28,7 +28,6 @@ import io.element.android.libraries.matrix.api.auth.OidcDetails
import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData
import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.impl.ClientBuilderSlidingSync
import io.element.android.libraries.matrix.impl.RustMatrixClientFactory import io.element.android.libraries.matrix.impl.RustMatrixClientFactory
import io.element.android.libraries.matrix.impl.auth.qrlogin.QrErrorMapper import io.element.android.libraries.matrix.impl.auth.qrlogin.QrErrorMapper
import io.element.android.libraries.matrix.impl.auth.qrlogin.SdkQrCodeLoginData import io.element.android.libraries.matrix.impl.auth.qrlogin.SdkQrCodeLoginData
@ -222,7 +221,7 @@ class RustMatrixAuthenticationService @Inject constructor(
val client = rustMatrixClientFactory.getBaseClientBuilder( val client = rustMatrixClientFactory.getBaseClientBuilder(
sessionPaths = emptySessionPaths, sessionPaths = emptySessionPaths,
passphrase = pendingPassphrase, passphrase = pendingPassphrase,
slidingSync = ClientBuilderSlidingSync.Discovered, restore = false,
) )
.buildWithQrCode( .buildWithQrCode(
qrCodeData = (qrCodeData as SdkQrCodeLoginData).rustQrCodeData, qrCodeData = (qrCodeData as SdkQrCodeLoginData).rustQrCodeData,
@ -259,13 +258,13 @@ class RustMatrixAuthenticationService @Inject constructor(
} }
} }
private fun getBaseClientBuilder( private suspend fun getBaseClientBuilder(
sessionPaths: SessionPaths, sessionPaths: SessionPaths,
) = rustMatrixClientFactory ) = rustMatrixClientFactory
.getBaseClientBuilder( .getBaseClientBuilder(
sessionPaths = sessionPaths, sessionPaths = sessionPaths,
passphrase = pendingPassphrase, passphrase = pendingPassphrase,
slidingSync = ClientBuilderSlidingSync.Discovered, restore = false,
) )
private fun clear() { private fun clear() {