From d28d80bca33a544dc94e1edb27fd6f1f0bfabf85 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 22 Apr 2025 15:01:00 +0200 Subject: [PATCH 1/9] Login: more logs. --- .../matrix/impl/auth/RustMatrixAuthenticationService.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index 33af371569e..b03e0c9af43 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -137,6 +137,7 @@ class RustMatrixAuthenticationService @Inject constructor( }.onFailure { clear() }.mapFailure { failure -> + Timber.e(failure, "Failed to set homeserver to $homeserver") failure.mapAuthenticationException() } } @@ -162,6 +163,7 @@ class RustMatrixAuthenticationService @Inject constructor( SessionId(sessionData.userId) }.mapFailure { failure -> + Timber.e(failure, "Failed to login") failure.mapAuthenticationException() } } @@ -197,6 +199,7 @@ class RustMatrixAuthenticationService @Inject constructor( pendingOAuthAuthorizationData = oAuthAuthorizationData OidcDetails(url) }.mapFailure { failure -> + Timber.e(failure, "Failed to get OIDC URL") failure.mapAuthenticationException() } } @@ -210,6 +213,7 @@ class RustMatrixAuthenticationService @Inject constructor( } pendingOAuthAuthorizationData = null }.mapFailure { failure -> + Timber.e(failure, "Failed to cancel OIDC login") failure.mapAuthenticationException() } } @@ -243,6 +247,7 @@ class RustMatrixAuthenticationService @Inject constructor( SessionId(sessionData.userId) }.mapFailure { failure -> + Timber.e(failure, "Failed to login with OIDC") failure.mapAuthenticationException() } } From 912d6f2ffd13aeca4edc857672139403c0d9f0a1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 22 Apr 2025 15:17:34 +0200 Subject: [PATCH 2/9] Login: map Oidc error to provide more information in the error dialog. --- .../features/login/impl/error/ChangeServerError.kt | 12 +++++++++--- .../matrix/api/auth/AuthenticationException.kt | 1 + .../matrix/impl/auth/AuthenticationException.kt | 8 ++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt index b450aaea531..618f4f81f69 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt @@ -12,18 +12,24 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import io.element.android.features.login.impl.R import io.element.android.libraries.matrix.api.auth.AuthenticationException +import io.element.android.libraries.ui.strings.CommonStrings sealed class ChangeServerError : Throwable() { - data class Error(@StringRes val messageId: Int) : ChangeServerError() { + data class Error( + @StringRes val messageId: Int? = null, + val messageStr: String? = null, + ) : ChangeServerError() { @Composable - fun message(): String = stringResource(messageId) + fun message(): String = messageStr ?: stringResource(messageId ?: CommonStrings.error_unknown) } + data object SlidingSyncAlert : ChangeServerError() companion object { fun from(error: Throwable): ChangeServerError = when (error) { is AuthenticationException.SlidingSyncVersion -> SlidingSyncAlert - else -> Error(R.string.screen_change_server_error_invalid_homeserver) + is AuthenticationException.Oidc -> Error(messageStr = error.message) + else -> Error(messageId = R.string.screen_change_server_error_invalid_homeserver) } } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/AuthenticationException.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/AuthenticationException.kt index e3153cbbb84..ef73edfaf50 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/AuthenticationException.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/AuthenticationException.kt @@ -10,5 +10,6 @@ package io.element.android.libraries.matrix.api.auth sealed class AuthenticationException(message: String) : Exception(message) { class InvalidServerName(message: String) : AuthenticationException(message) class SlidingSyncVersion(message: String) : AuthenticationException(message) + class Oidc(message: String) : AuthenticationException(message) class Generic(message: String) : AuthenticationException(message) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/AuthenticationException.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/AuthenticationException.kt index c7fa9598ffe..7175913dad4 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/AuthenticationException.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/AuthenticationException.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.matrix.impl.auth import io.element.android.libraries.matrix.api.auth.AuthenticationException import org.matrix.rustcomponents.sdk.ClientBuildException +import org.matrix.rustcomponents.sdk.OidcException fun Throwable.mapAuthenticationException(): AuthenticationException { val message = this.message ?: "Unknown error" @@ -24,6 +25,13 @@ fun Throwable.mapAuthenticationException(): AuthenticationException { is ClientBuildException.WellKnownLookupFailed -> AuthenticationException.Generic(message) is ClientBuildException.EventCache -> AuthenticationException.Generic(message) } + is OidcException -> when (this) { + is OidcException.Generic -> AuthenticationException.Oidc(message) + is OidcException.CallbackUrlInvalid -> AuthenticationException.Oidc(message) + is OidcException.Cancelled -> AuthenticationException.Oidc(message) + is OidcException.MetadataInvalid -> AuthenticationException.Oidc(message) + is OidcException.NotSupported -> AuthenticationException.Oidc(message) + } else -> AuthenticationException.Generic(message) } } From 0bea29af01f12ec2058e4d0455885bde27686818 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 22 Apr 2025 15:23:20 +0200 Subject: [PATCH 3/9] Oidc: use the application name. --- .../matrix/impl/auth/OidcConfigurationProvider.kt | 7 +++++-- .../matrix/impl/auth/OidcConfigurationProviderTest.kt | 8 +++++++- .../impl/auth/RustMatrixAuthenticationServiceTest.kt | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt index ec220112ded..78490ea6461 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt @@ -7,13 +7,16 @@ package io.element.android.libraries.matrix.impl.auth +import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.matrix.api.auth.OidcConfig import org.matrix.rustcomponents.sdk.OidcConfiguration import javax.inject.Inject -class OidcConfigurationProvider @Inject constructor() { +class OidcConfigurationProvider @Inject constructor( + private val buildMeta: BuildMeta, +) { fun get(): OidcConfiguration = OidcConfiguration( - clientName = "Element", + clientName = buildMeta.applicationName, redirectUri = OidcConfig.REDIRECT_URI, clientUri = "https://element.io", logoUri = "https://element.io/mobile-icon.png", diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt index 01321fcdf69..907e2e59e4a 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt @@ -9,12 +9,18 @@ package io.element.android.libraries.matrix.impl.auth import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.api.auth.OidcConfig +import io.element.android.libraries.matrix.test.core.aBuildMeta import org.junit.Test class OidcConfigurationProviderTest { @Test fun get() { - val result = OidcConfigurationProvider().get() + val result = OidcConfigurationProvider( + aBuildMeta( + applicationName = "myName", + ) + ).get() + assertThat(result.clientName).isEqualTo("myName") assertThat(result.redirectUri).isEqualTo(OidcConfig.REDIRECT_URI) } } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt index e2a9d883eec..6a6ccf917c5 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt @@ -11,6 +11,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.impl.createRustMatrixClientFactory import io.element.android.libraries.matrix.impl.paths.SessionPathsFactory +import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.libraries.sessionstorage.api.SessionStore import io.element.android.libraries.sessionstorage.impl.memory.InMemorySessionStore import io.element.android.libraries.sessionstorage.test.aSessionData @@ -48,7 +49,7 @@ class RustMatrixAuthenticationServiceTest { sessionStore = sessionStore, rustMatrixClientFactory = rustMatrixClientFactory, passphraseGenerator = FakePassphraseGenerator(), - oidcConfigurationProvider = OidcConfigurationProvider(), + oidcConfigurationProvider = OidcConfigurationProvider(aBuildMeta()), ) } } From 8d7a57ba042b1ad006e2e83d42f42bcc107a1ac0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 22 Apr 2025 15:39:15 +0200 Subject: [PATCH 4/9] Oidc: move configuration from OidcConfigurationProvider to OidcConfig and add some comments. --- app/src/main/AndroidManifest.xml | 1 + .../libraries/matrix/api/auth/OidcConfig.kt | 23 +++++++++++++++++++ .../impl/auth/OidcConfigurationProvider.kt | 17 +++++--------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3450fcd55eb..c867a817f44 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -60,6 +60,7 @@ +