Rename OIDC components and variables to OAuth (#6686)

* Rename `OIDC` components and variables to `OAuth`. This matches the new behavior in the SDK.
This commit is contained in:
Jorge Martin Espinosa 2026-04-29 11:41:47 +02:00 committed by GitHub
parent 7dd81dc838
commit 367995303d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
96 changed files with 479 additions and 482 deletions

View file

@ -26,7 +26,7 @@ import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import io.element.android.libraries.matrix.api.media.MediaPreviewService
import io.element.android.libraries.matrix.api.notification.NotificationService
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
import io.element.android.libraries.matrix.api.oauth.AccountManagementAction
import io.element.android.libraries.matrix.api.pusher.PushersService
import io.element.android.libraries.matrix.api.room.BaseRoom
import io.element.android.libraries.matrix.api.room.JoinedRoom

View file

@ -16,6 +16,6 @@ sealed class AuthenticationException(message: String?) : Exception(message) {
class InvalidServerName(message: String?) : AuthenticationException(message)
class SlidingSyncVersion(message: String?) : AuthenticationException(message)
class ServerUnreachable(message: String?) : AuthenticationException(message)
class Oidc(message: String?) : AuthenticationException(message)
class OAuth(message: String?) : AuthenticationException(message)
class Generic(message: String?) : AuthenticationException(message)
}

View file

@ -37,21 +37,21 @@ interface MatrixAuthenticationService {
suspend fun importCreatedSession(externalSession: ExternalSession): Result<SessionId>
/*
* OIDC part.
* OAuth part.
*/
/**
* Get the Oidc url to display to the user.
* Get the OAuth url to display to the user.
*/
suspend fun getOidcUrl(
prompt: OidcPrompt,
suspend fun getOAuthUrl(
prompt: OAuthPrompt,
loginHint: String?,
): Result<OidcDetails>
): Result<OAuthDetails>
/**
* Cancel Oidc login sequence.
* Cancel OAuth login sequence.
*/
suspend fun cancelOidcLogin(): Result<Unit>
suspend fun cancelOAuthLogin(): Result<Unit>
/**
* Set the existing data about Element Classic session, if any.
@ -68,9 +68,9 @@ interface MatrixAuthenticationService {
): Boolean
/**
* Attempt to login using the [callbackUrl] provided by the Oidc page.
* Attempt to log in using the [callbackUrl] provided by the OAuth page.
*/
suspend fun loginWithOidc(callbackUrl: String): Result<SessionId>
suspend fun loginWithOAuth(callbackUrl: String): Result<SessionId>
suspend fun loginWithQrCode(qrCodeData: MatrixQrCodeLoginData, progress: (QrCodeLoginStep) -> Unit): Result<SessionId>

View file

@ -11,7 +11,7 @@ package io.element.android.libraries.matrix.api.auth
data class MatrixHomeServerDetails(
val url: String,
val supportsPasswordLogin: Boolean,
val supportsOidcLogin: Boolean,
val supportsOAuthLogin: Boolean,
) {
val isSupported = supportsPasswordLogin || supportsOidcLogin
val isSupported = supportsPasswordLogin || supportsOAuthLogin
}

View file

@ -10,7 +10,7 @@ package io.element.android.libraries.matrix.api.auth
import io.element.android.libraries.matrix.api.BuildConfig
object OidcConfig {
object OAuthConfig {
const val CLIENT_URI = BuildConfig.CLIENT_URI
// Note: host must match with the host of CLIENT_URI

View file

@ -12,6 +12,6 @@ import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class OidcDetails(
data class OAuthDetails(
val url: String,
) : Parcelable

View file

@ -8,12 +8,12 @@
package io.element.android.libraries.matrix.api.auth
sealed interface OidcPrompt {
sealed interface OAuthPrompt {
/**
* The Authorization Server should prompt the End-User for
* reauthentication.
*/
data object Login : OidcPrompt
data object Login : OAuthPrompt
/**
* The Authorization Server should prompt the End-User to create a user
@ -21,10 +21,10 @@ sealed interface OidcPrompt {
*
* Defined in [Initiating User Registration via OpenID Connect](https://openid.net/specs/openid-connect-prompt-create-1_0.html).
*/
data object Create : OidcPrompt
data object Create : OAuthPrompt
/**
* An unknown value.
*/
data class Unknown(val value: String) : OidcPrompt
data class Unknown(val value: String) : OAuthPrompt
}

View file

@ -8,6 +8,6 @@
package io.element.android.libraries.matrix.api.auth
interface OidcRedirectUrlProvider {
interface OAuthRedirectUrlProvider {
fun provide(): String
}

View file

@ -15,7 +15,7 @@ sealed class QrLoginException : Exception() {
data object Expired : QrLoginException()
data object NotFound : QrLoginException()
data object LinkingNotSupported : QrLoginException()
data object OidcMetadataInvalid : QrLoginException()
data object OAuthMetadataInvalid : QrLoginException()
data object SlidingSyncNotAvailable : QrLoginException()
data object OtherDeviceNotSignedIn : QrLoginException()
data object CheckCodeAlreadySent : QrLoginException()

View file

@ -112,19 +112,19 @@ interface IdentityPasswordResetHandle : IdentityResetHandle {
}
/**
* A handle to reset the user's identity with an OIDC login type.
* A handle to reset the user's identity with an OAuth login type.
*/
interface IdentityOidcResetHandle : IdentityResetHandle {
interface IdentityOAuthResetHandle : IdentityResetHandle {
/**
* The URL to open in a webview/custom tab to reset the identity.
*/
val url: String
/**
* Reset the identity using the OIDC flow.
* Reset the identity using the OAuth flow.
*
* This method will block the coroutine it's running on and keep polling indefinitely until either the coroutine is cancelled, the [cancel] method is
* called, or the identity is reset.
*/
suspend fun resetOidc(): Result<Unit>
suspend fun resetOAuth(): Result<Unit>
}

View file

@ -6,7 +6,7 @@
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.matrix.api.oidc
package io.element.android.libraries.matrix.api.oauth
import io.element.android.libraries.matrix.api.core.DeviceId

View file

@ -16,7 +16,7 @@ class MatrixHomeServerDetailsTest {
@Test
fun `if homeserver supports oidc, then it is supported`() {
val sut = aMatrixHomeServerDetails(
supportsOidcLogin = true,
supportsOAuthLogin = true,
supportsPasswordLogin = false,
)
assertThat(sut.isSupported).isTrue()
@ -25,7 +25,7 @@ class MatrixHomeServerDetailsTest {
@Test
fun `if homeserver supports password, then it is supported`() {
val sut = aMatrixHomeServerDetails(
supportsOidcLogin = false,
supportsOAuthLogin = false,
supportsPasswordLogin = true,
)
assertThat(sut.isSupported).isTrue()
@ -34,7 +34,7 @@ class MatrixHomeServerDetailsTest {
@Test
fun `if homeserver supports both, then it is supported`() {
val sut = aMatrixHomeServerDetails(
supportsOidcLogin = true,
supportsOAuthLogin = true,
supportsPasswordLogin = true,
)
assertThat(sut.isSupported).isTrue()
@ -43,7 +43,7 @@ class MatrixHomeServerDetailsTest {
@Test
fun `if homeserver supports none, then it is not supported`() {
val sut = aMatrixHomeServerDetails(
supportsOidcLogin = false,
supportsOAuthLogin = false,
supportsPasswordLogin = false,
)
assertThat(sut.isSupported).isFalse()

View file

@ -31,7 +31,7 @@ import io.element.android.libraries.matrix.api.createroom.RoomPreset
import io.element.android.libraries.matrix.api.linknewdevice.LinkDesktopHandler
import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileHandler
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
import io.element.android.libraries.matrix.api.oauth.AccountManagementAction
import io.element.android.libraries.matrix.api.room.BaseRoom
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.JoinedRoom
@ -59,7 +59,7 @@ import io.element.android.libraries.matrix.impl.media.RustMediaLoader
import io.element.android.libraries.matrix.impl.media.RustMediaPreviewService
import io.element.android.libraries.matrix.impl.notification.RustNotificationService
import io.element.android.libraries.matrix.impl.notificationsettings.RustNotificationSettingsService
import io.element.android.libraries.matrix.impl.oidc.toRustAction
import io.element.android.libraries.matrix.impl.oauth.toRustAction
import io.element.android.libraries.matrix.impl.pushers.RustPushersService
import io.element.android.libraries.matrix.impl.room.GetRoomResult
import io.element.android.libraries.matrix.impl.room.NotJoinedRustRoom

View file

@ -214,5 +214,5 @@ fun SessionData.toSession() = Session(
deviceId = deviceId,
homeserverUrl = homeserverUrl,
slidingSyncVersion = SlidingSyncVersion.NATIVE,
oauthData = oidcData,
oauthData = oAuthData,
)

View file

@ -30,11 +30,11 @@ fun Throwable.mapAuthenticationException(): AuthenticationException {
is ClientBuildException.EventCache -> AuthenticationException.Generic(message)
}
is OAuthException -> when (this) {
is OAuthException.Generic -> AuthenticationException.Oidc(message)
is OAuthException.CallbackUrlInvalid -> AuthenticationException.Oidc(message)
is OAuthException.Cancelled -> AuthenticationException.Oidc(message)
is OAuthException.MetadataInvalid -> AuthenticationException.Oidc(message)
is OAuthException.NotSupported -> AuthenticationException.Oidc(message)
is OAuthException.Generic -> AuthenticationException.OAuth(message)
is OAuthException.CallbackUrlInvalid -> AuthenticationException.OAuth(message)
is OAuthException.Cancelled -> AuthenticationException.OAuth(message)
is OAuthException.MetadataInvalid -> AuthenticationException.OAuth(message)
is OAuthException.NotSupported -> AuthenticationException.OAuth(message)
}
else -> AuthenticationException.Generic(message)
}

View file

@ -15,6 +15,6 @@ fun HomeserverLoginDetails.map(): MatrixHomeServerDetails = use {
MatrixHomeServerDetails(
url = url(),
supportsPasswordLogin = supportsPasswordLogin(),
supportsOidcLogin = supportsOauthLogin(),
supportsOAuthLogin = supportsOauthLogin(),
)
}

View file

@ -10,22 +10,22 @@ package io.element.android.libraries.matrix.impl.auth
import dev.zacsweers.metro.Inject
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.matrix.api.auth.OidcConfig
import io.element.android.libraries.matrix.api.auth.OidcRedirectUrlProvider
import io.element.android.libraries.matrix.api.auth.OAuthConfig
import io.element.android.libraries.matrix.api.auth.OAuthRedirectUrlProvider
import org.matrix.rustcomponents.sdk.OAuthConfiguration
@Inject
class OidcConfigurationProvider(
class OAuthConfigurationProvider(
private val buildMeta: BuildMeta,
private val oidcRedirectUrlProvider: OidcRedirectUrlProvider,
private val oAuthRedirectUrlProvider: OAuthRedirectUrlProvider,
) {
fun get(): OAuthConfiguration = OAuthConfiguration(
clientName = buildMeta.applicationName,
redirectUri = oidcRedirectUrlProvider.provide(),
clientUri = OidcConfig.CLIENT_URI,
logoUri = OidcConfig.LOGO_URI,
tosUri = OidcConfig.TOS_URI,
policyUri = OidcConfig.POLICY_URI,
staticRegistrations = OidcConfig.STATIC_REGISTRATIONS,
redirectUri = oAuthRedirectUrlProvider.provide(),
clientUri = OAuthConfig.CLIENT_URI,
logoUri = OAuthConfig.LOGO_URI,
tosUri = OAuthConfig.TOS_URI,
policyUri = OAuthConfig.POLICY_URI,
staticRegistrations = OAuthConfig.STATIC_REGISTRATIONS,
)
}

View file

@ -8,13 +8,13 @@
package io.element.android.libraries.matrix.impl.auth
import io.element.android.libraries.matrix.api.auth.OidcPrompt
import org.matrix.rustcomponents.sdk.OAuthPrompt as RustOidcPrompt
import io.element.android.libraries.matrix.api.auth.OAuthPrompt
import org.matrix.rustcomponents.sdk.OAuthPrompt as RustOAuthPrompt
internal fun OidcPrompt.toRustPrompt(): RustOidcPrompt {
internal fun OAuthPrompt.toRustPrompt(): RustOAuthPrompt {
return when (this) {
OidcPrompt.Login -> RustOidcPrompt.Unknown("consent")
OidcPrompt.Create -> RustOidcPrompt.Create
is OidcPrompt.Unknown -> RustOidcPrompt.Unknown(value)
OAuthPrompt.Login -> RustOAuthPrompt.Unknown("consent")
OAuthPrompt.Create -> RustOAuthPrompt.Create
is OAuthPrompt.Unknown -> RustOAuthPrompt.Unknown(value)
}
}

View file

@ -31,7 +31,7 @@ class RustHomeServerLoginCompatibilityChecker(
it.homeserverLoginDetails()
}
.use {
Timber.d("Homeserver $url | OIDC: ${it.supportsOauthLogin()} | Password: ${it.supportsPasswordLogin()} | SSO: ${it.supportsSsoLogin()}")
Timber.d("Homeserver $url | OAuth: ${it.supportsOauthLogin()} | Password: ${it.supportsPasswordLogin()} | SSO: ${it.supportsSsoLogin()}")
it.supportsOauthLogin() || it.supportsPasswordLogin()
}
}

View file

@ -19,8 +19,8 @@ import io.element.android.libraries.matrix.api.auth.AuthenticationException
import io.element.android.libraries.matrix.api.auth.ElementClassicSession
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
import io.element.android.libraries.matrix.api.auth.MatrixHomeServerDetails
import io.element.android.libraries.matrix.api.auth.OidcDetails
import io.element.android.libraries.matrix.api.auth.OidcPrompt
import io.element.android.libraries.matrix.api.auth.OAuthDetails
import io.element.android.libraries.matrix.api.auth.OAuthPrompt
import io.element.android.libraries.matrix.api.auth.SessionRestorationException
import io.element.android.libraries.matrix.api.auth.external.ExternalSession
import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData
@ -65,7 +65,7 @@ class RustMatrixAuthenticationService(
private val sessionStore: SessionStore,
private val rustMatrixClientFactory: RustMatrixClientFactory,
private val passphraseGenerator: PassphraseGenerator,
private val oidcConfigurationProvider: OidcConfigurationProvider,
private val oAuthConfigurationProvider: OAuthConfigurationProvider,
) : MatrixAuthenticationService {
// Any existing Element Classic session that we want to try to import secrets from during login.
private var elementClassicSession: ElementClassicSession? = null
@ -253,15 +253,15 @@ class RustMatrixAuthenticationService(
private var pendingOAuthAuthorizationData: OAuthAuthorizationData? = null
override suspend fun getOidcUrl(
prompt: OidcPrompt,
override suspend fun getOAuthUrl(
prompt: OAuthPrompt,
loginHint: String?,
): Result<OidcDetails> {
): Result<OAuthDetails> {
return withContext(coroutineDispatchers.io) {
runCatchingExceptions {
val client = currentClient ?: error("You need to call `setHomeserver()` first")
val oAuthAuthorizationData = client.urlForOauth(
oauthConfiguration = oidcConfigurationProvider.get(),
oauthConfiguration = oAuthConfigurationProvider.get(),
prompt = prompt.toRustPrompt(),
loginHint = loginHint,
// If we want to restore a previous session for which we have encryption keys, we can pass the deviceId here. At the moment, we don't
@ -270,15 +270,15 @@ class RustMatrixAuthenticationService(
)
val url = oAuthAuthorizationData.loginUrl()
pendingOAuthAuthorizationData = oAuthAuthorizationData
OidcDetails(url)
OAuthDetails(url)
}.mapFailure { failure ->
Timber.e(failure, "Failed to get OIDC URL")
Timber.e(failure, "Failed to get OAuth URL")
failure.mapAuthenticationException()
}
}
}
override suspend fun cancelOidcLogin(): Result<Unit> {
override suspend fun cancelOAuthLogin(): Result<Unit> {
return withContext(coroutineDispatchers.io) {
runCatchingExceptions {
pendingOAuthAuthorizationData?.use {
@ -286,7 +286,7 @@ class RustMatrixAuthenticationService(
}
pendingOAuthAuthorizationData = null
}.mapFailure { failure ->
Timber.e(failure, "Failed to cancel OIDC login")
Timber.e(failure, "Failed to cancel OAuth login")
failure.mapAuthenticationException()
}
}
@ -297,9 +297,9 @@ class RustMatrixAuthenticationService(
}
/**
* callbackUrl should be the uriRedirect from OidcClientMetadata (with all the parameters).
* callbackUrl should be the `url` from `OAuthAction` (with all the parameters).
*/
override suspend fun loginWithOidc(callbackUrl: String): Result<SessionId> {
override suspend fun loginWithOAuth(callbackUrl: String): Result<SessionId> {
return withContext(coroutineDispatchers.io) {
runCatchingExceptions {
val client = currentClient ?: error("You need to call `setHomeserver()` first")
@ -330,7 +330,7 @@ class RustMatrixAuthenticationService(
SessionId(sessionData.userId)
}.mapFailure { failure ->
Timber.e(failure, "Failed to login with OIDC")
Timber.e(failure, "Failed to login with OAuth")
failure.mapAuthenticationException()
}
}
@ -355,7 +355,7 @@ class RustMatrixAuthenticationService(
withContext(coroutineDispatchers.io) {
val sdkQrCodeLoginData = (qrCodeData as SdkQrCodeLoginData).rustQrCodeData
val emptySessionPaths = rotateSessionPath()
val oidcConfiguration = oidcConfigurationProvider.get()
val oAuthConfiguration = oAuthConfigurationProvider.get()
val progressListener = object : QrLoginProgressListener {
override fun onUpdate(state: QrLoginProgress) {
Timber.d("QR Code login progress: $state")
@ -368,7 +368,7 @@ class RustMatrixAuthenticationService(
qrCodeData = sdkQrCodeLoginData,
)
client.newLoginWithQrCodeHandler(
oauthConfiguration = oidcConfiguration,
oauthConfiguration = oAuthConfiguration,
).use {
it.scan(
qrCodeData = qrCodeData.rustQrCodeData,

View file

@ -42,7 +42,7 @@ object QrErrorMapper {
is RustHumanQrLoginException.OtherDeviceNotSignedIn -> QrLoginException.OtherDeviceNotSignedIn
is RustHumanQrLoginException.LinkingNotSupported -> QrLoginException.LinkingNotSupported
is RustHumanQrLoginException.Unknown -> QrLoginException.Unknown
is RustHumanQrLoginException.OAuthMetadataInvalid -> QrLoginException.OidcMetadataInvalid
is RustHumanQrLoginException.OAuthMetadataInvalid -> QrLoginException.OAuthMetadataInvalid
is RustHumanQrLoginException.SlidingSyncNotAvailable -> QrLoginException.SlidingSyncNotAvailable
is RustHumanQrLoginException.CheckCodeAlreadySent -> QrLoginException.CheckCodeAlreadySent
is RustHumanQrLoginException.CheckCodeCannotBeSent -> QrLoginException.CheckCodeCannotBeSent

View file

@ -10,7 +10,7 @@ package io.element.android.libraries.matrix.impl.encryption
import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.encryption.IdentityOidcResetHandle
import io.element.android.libraries.matrix.api.encryption.IdentityOAuthResetHandle
import io.element.android.libraries.matrix.api.encryption.IdentityPasswordResetHandle
import io.element.android.libraries.matrix.api.encryption.IdentityResetHandle
import org.matrix.rustcomponents.sdk.AuthData
@ -25,7 +25,7 @@ object RustIdentityResetHandleFactory {
return runCatchingExceptions {
identityResetHandle?.let {
when (val authType = identityResetHandle.authType()) {
is CrossSigningResetAuthType.OAuth -> RustOidcIdentityResetHandle(identityResetHandle, authType.info.approvalUrl)
is CrossSigningResetAuthType.OAuth -> RustIdentityOAuthResetHandle(identityResetHandle, authType.info.approvalUrl)
// User interactive authentication (user + password)
CrossSigningResetAuthType.Uiaa -> RustPasswordIdentityResetHandle(userId, identityResetHandle)
}
@ -47,11 +47,11 @@ class RustPasswordIdentityResetHandle(
}
}
class RustOidcIdentityResetHandle(
class RustIdentityOAuthResetHandle(
private val identityResetHandle: org.matrix.rustcomponents.sdk.IdentityResetHandle,
override val url: String,
) : IdentityOidcResetHandle {
override suspend fun resetOidc(): Result<Unit> {
) : IdentityOAuthResetHandle {
override suspend fun resetOAuth(): Result<Unit> {
return runCatchingExceptions { identityResetHandle.reset(null) }
}

View file

@ -27,7 +27,7 @@ internal fun Session.toSessionData(
accessToken = accessToken,
refreshToken = refreshToken,
homeserverUrl = homeserverUrl ?: this.homeserverUrl,
oidcData = oauthData,
oAuthData = oauthData,
loginTimestamp = Date(),
isTokenValid = isTokenValid,
loginType = loginType,
@ -52,7 +52,7 @@ internal fun ExternalSession.toSessionData(
accessToken = accessToken,
refreshToken = refreshToken,
homeserverUrl = homeserverUrl,
oidcData = null,
oAuthData = null,
loginTimestamp = Date(),
isTokenValid = isTokenValid,
loginType = loginType,

View file

@ -6,9 +6,9 @@
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.matrix.impl.oidc
package io.element.android.libraries.matrix.impl.oauth
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
import io.element.android.libraries.matrix.api.oauth.AccountManagementAction
import org.matrix.rustcomponents.sdk.AccountManagementAction as RustAccountManagementAction
fun AccountManagementAction.toRustAction(): RustAccountManagementAction {

View file

@ -64,17 +64,17 @@ class AuthenticationExceptionMappingTest {
}
@Test
fun `mapping Oidc exceptions map to the Oidc Kotlin`() {
fun `mapping Oidc exceptions map to the OAuth Kotlin`() {
assertThat(OAuthException.Generic("Generic").mapAuthenticationException())
.isException<AuthenticationException.Oidc>("Generic")
.isException<AuthenticationException.OAuth>("Generic")
assertThat(OAuthException.CallbackUrlInvalid("CallbackUrlInvalid").mapAuthenticationException())
.isException<AuthenticationException.Oidc>("CallbackUrlInvalid")
.isException<AuthenticationException.OAuth>("CallbackUrlInvalid")
assertThat(OAuthException.Cancelled("Cancelled").mapAuthenticationException())
.isException<AuthenticationException.Oidc>("Cancelled")
.isException<AuthenticationException.OAuth>("Cancelled")
assertThat(OAuthException.MetadataInvalid("MetadataInvalid").mapAuthenticationException())
.isException<AuthenticationException.Oidc>("MetadataInvalid")
.isException<AuthenticationException.OAuth>("MetadataInvalid")
assertThat(OAuthException.NotSupported("NotSupported").mapAuthenticationException())
.isException<AuthenticationException.Oidc>("NotSupported")
.isException<AuthenticationException.OAuth>("NotSupported")
}
private inline fun <reified T> ThrowableSubject.isException(message: String) {

View file

@ -20,7 +20,7 @@ class HomeserverDetailsKtTest {
val homeserverLoginDetails = FakeFfiHomeserverLoginDetails(
url = "https://example.org",
supportsPasswordLogin = true,
supportsOidcLogin = false
supportsOAuthLogin = false
)
// When
@ -31,7 +31,7 @@ class HomeserverDetailsKtTest {
MatrixHomeServerDetails(
url = "https://example.org",
supportsPasswordLogin = true,
supportsOidcLogin = false
supportsOAuthLogin = false
)
)
}

View file

@ -10,18 +10,18 @@ package io.element.android.libraries.matrix.impl.auth
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.matrix.test.auth.FAKE_REDIRECT_URL
import io.element.android.libraries.matrix.test.auth.FakeOidcRedirectUrlProvider
import io.element.android.libraries.matrix.test.auth.FakeOAuthRedirectUrlProvider
import io.element.android.libraries.matrix.test.core.aBuildMeta
import org.junit.Test
class OidcConfigurationProviderTest {
class OAuthConfigurationProviderTest {
@Test
fun get() {
val result = OidcConfigurationProvider(
val result = OAuthConfigurationProvider(
buildMeta = aBuildMeta(
applicationName = "myName",
),
oidcRedirectUrlProvider = FakeOidcRedirectUrlProvider(),
oAuthRedirectUrlProvider = FakeOAuthRedirectUrlProvider(),
).get()
assertThat(result.clientName).isEqualTo("myName")
assertThat(result.redirectUri).isEqualTo(FAKE_REDIRECT_URL)

View file

@ -18,8 +18,8 @@ import org.junit.Test
class RustHomeserverLoginCompatibilityCheckerTest {
@Test
fun `check - is valid if it supports OIDC login`() = runTest {
val sut = createChecker { FakeFfiHomeserverLoginDetails(supportsOidcLogin = true) }
fun `check - is valid if it supports OAuth login`() = runTest {
val sut = createChecker { FakeFfiHomeserverLoginDetails(supportsOAuthLogin = true) }
assertThat(sut.check("https://matrix.host.org").getOrNull()).isTrue()
}

View file

@ -16,7 +16,7 @@ import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiClient
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiClientBuilder
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiHomeserverLoginDetails
import io.element.android.libraries.matrix.impl.paths.SessionPathsFactory
import io.element.android.libraries.matrix.test.auth.FakeOidcRedirectUrlProvider
import io.element.android.libraries.matrix.test.auth.FakeOAuthRedirectUrlProvider
import io.element.android.libraries.matrix.test.core.aBuildMeta
import io.element.android.libraries.sessionstorage.api.SessionStore
import io.element.android.libraries.sessionstorage.test.InMemorySessionStore
@ -64,9 +64,9 @@ class RustMatrixAuthenticationServiceTest {
sessionStore = sessionStore,
rustMatrixClientFactory = rustMatrixClientFactory,
passphraseGenerator = FakePassphraseGenerator(),
oidcConfigurationProvider = OidcConfigurationProvider(
oAuthConfigurationProvider = OAuthConfigurationProvider(
buildMeta = aBuildMeta(),
oidcRedirectUrlProvider = FakeOidcRedirectUrlProvider(),
oAuthRedirectUrlProvider = FakeOAuthRedirectUrlProvider(),
),
)
}

View file

@ -32,7 +32,7 @@ class QrErrorMapperTest {
assertThat(QrErrorMapper.map(RustHumanQrLoginException.OtherDeviceNotSignedIn())).isEqualTo(QrLoginException.OtherDeviceNotSignedIn)
assertThat(QrErrorMapper.map(RustHumanQrLoginException.LinkingNotSupported())).isEqualTo(QrLoginException.LinkingNotSupported)
assertThat(QrErrorMapper.map(RustHumanQrLoginException.Unknown())).isEqualTo(QrLoginException.Unknown)
assertThat(QrErrorMapper.map(RustHumanQrLoginException.OAuthMetadataInvalid())).isEqualTo(QrLoginException.OidcMetadataInvalid)
assertThat(QrErrorMapper.map(RustHumanQrLoginException.OAuthMetadataInvalid())).isEqualTo(QrLoginException.OAuthMetadataInvalid)
assertThat(QrErrorMapper.map(RustHumanQrLoginException.SlidingSyncNotAvailable())).isEqualTo(QrLoginException.SlidingSyncNotAvailable)
}
}

View file

@ -14,11 +14,11 @@ import org.matrix.rustcomponents.sdk.NoHandle
class FakeFfiHomeserverLoginDetails(
private val url: String = "https://example.org",
private val supportsPasswordLogin: Boolean = false,
private val supportsOidcLogin: Boolean = false,
private val supportsOAuthLogin: Boolean = false,
private val supportsSsoLogin: Boolean = false,
) : HomeserverLoginDetails(NoHandle) {
override fun url(): String = url
override fun supportsOauthLogin(): Boolean = supportsOidcLogin
override fun supportsOauthLogin(): Boolean = supportsOAuthLogin
override fun supportsPasswordLogin(): Boolean = supportsPasswordLogin
override fun supportsSsoLogin(): Boolean = supportsSsoLogin
}

View file

@ -36,7 +36,7 @@ class SessionKtTest {
assertThat(result.refreshToken).isEqualTo("refreshToken")
assertThat(result.homeserverUrl).isEqualTo(A_HOMESERVER_URL)
assertThat(result.isTokenValid).isTrue()
assertThat(result.oidcData).isNull()
assertThat(result.oAuthData).isNull()
assertThat(result.loginType).isEqualTo(LoginType.PASSWORD)
assertThat(result.loginTimestamp).isNotNull()
assertThat(result.passphrase).isEqualTo(A_SECRET)
@ -82,7 +82,7 @@ class SessionKtTest {
assertThat(result.refreshToken).isNull()
assertThat(result.homeserverUrl).isEqualTo(A_HOMESERVER_URL)
assertThat(result.isTokenValid).isTrue()
assertThat(result.oidcData).isNull()
assertThat(result.oAuthData).isNull()
assertThat(result.loginType).isEqualTo(LoginType.PASSWORD)
assertThat(result.loginTimestamp).isNotNull()
assertThat(result.passphrase).isEqualTo(A_SECRET)

View file

@ -6,10 +6,10 @@
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.matrix.impl.oidc
package io.element.android.libraries.matrix.impl.oauth
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
import io.element.android.libraries.matrix.api.oauth.AccountManagementAction
import io.element.android.libraries.matrix.test.A_DEVICE_ID
import org.junit.Test
import org.matrix.rustcomponents.sdk.AccountManagementAction as RustAccountManagementAction

View file

@ -26,7 +26,7 @@ import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import io.element.android.libraries.matrix.api.media.MediaPreviewService
import io.element.android.libraries.matrix.api.notification.NotificationService
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
import io.element.android.libraries.matrix.api.oauth.AccountManagementAction
import io.element.android.libraries.matrix.api.pusher.PushersService
import io.element.android.libraries.matrix.api.room.BaseRoom
import io.element.android.libraries.matrix.api.room.JoinedRoom

View file

@ -12,8 +12,8 @@ import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.auth.ElementClassicSession
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
import io.element.android.libraries.matrix.api.auth.MatrixHomeServerDetails
import io.element.android.libraries.matrix.api.auth.OidcDetails
import io.element.android.libraries.matrix.api.auth.OidcPrompt
import io.element.android.libraries.matrix.api.auth.OAuthDetails
import io.element.android.libraries.matrix.api.auth.OAuthPrompt
import io.element.android.libraries.matrix.api.auth.external.ExternalSession
import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData
import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep
@ -26,7 +26,7 @@ import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.lambda.lambdaRecorder
import io.element.android.tests.testutils.simulateLongTask
val A_OIDC_DATA = OidcDetails(url = "a-url")
val AN_OAUTH_DATA = OAuthDetails(url = "a-url")
class FakeMatrixAuthenticationService(
var matrixClientResult: ((SessionId) -> Result<MatrixClient>)? = null,
@ -37,8 +37,8 @@ class FakeMatrixAuthenticationService(
private val setElementClassicSessionResult: (ElementClassicSession?) -> Unit = { lambdaError() },
private val doSecretsContainBackupKeyResult: (UserId, String, String) -> Boolean = { _, _, _ -> lambdaError() },
) : MatrixAuthenticationService {
private var oidcError: Throwable? = null
private var oidcCancelError: Throwable? = null
private var oAuthError: Throwable? = null
private var oAuthCancelError: Throwable? = null
private var loginError: Throwable? = null
private var matrixClient: MatrixClient? = null
private var onAuthenticationListener: ((MatrixClient) -> Unit)? = null
@ -70,18 +70,18 @@ class FakeMatrixAuthenticationService(
return importCreatedSessionLambda(externalSession)
}
override suspend fun getOidcUrl(
prompt: OidcPrompt,
override suspend fun getOAuthUrl(
prompt: OAuthPrompt,
loginHint: String?,
): Result<OidcDetails> = simulateLongTask {
oidcError?.let { Result.failure(it) } ?: Result.success(A_OIDC_DATA)
): Result<OAuthDetails> = simulateLongTask {
oAuthError?.let { Result.failure(it) } ?: Result.success(AN_OAUTH_DATA)
}
override suspend fun cancelOidcLogin(): Result<Unit> {
return oidcCancelError?.let { Result.failure(it) } ?: Result.success(Unit)
override suspend fun cancelOAuthLogin(): Result<Unit> {
return oAuthCancelError?.let { Result.failure(it) } ?: Result.success(Unit)
}
override suspend fun loginWithOidc(callbackUrl: String): Result<SessionId> = simulateLongTask {
override suspend fun loginWithOAuth(callbackUrl: String): Result<SessionId> = simulateLongTask {
loginError?.let { Result.failure(it) } ?: run {
onAuthenticationListener?.invoke(matrixClient ?: FakeMatrixClient())
Result.success(A_USER_ID)
@ -97,12 +97,12 @@ class FakeMatrixAuthenticationService(
onAuthenticationListener = lambda
}
fun givenOidcError(throwable: Throwable?) {
oidcError = throwable
fun givenOAuthError(throwable: Throwable?) {
oAuthError = throwable
}
fun givenOidcCancelError(throwable: Throwable?) {
oidcCancelError = throwable
fun givenOAuthCancelError(throwable: Throwable?) {
oAuthCancelError = throwable
}
fun givenLoginError(throwable: Throwable?) {

View file

@ -8,12 +8,12 @@
package io.element.android.libraries.matrix.test.auth
import io.element.android.libraries.matrix.api.auth.OidcRedirectUrlProvider
import io.element.android.libraries.matrix.api.auth.OAuthRedirectUrlProvider
const val FAKE_REDIRECT_URL = "io.element.android:/"
class FakeOidcRedirectUrlProvider(
class FakeOAuthRedirectUrlProvider(
private val provideResult: String = FAKE_REDIRECT_URL,
) : OidcRedirectUrlProvider {
) : OAuthRedirectUrlProvider {
override fun provide() = provideResult
}

View file

@ -14,9 +14,9 @@ import io.element.android.libraries.matrix.test.A_HOMESERVER_URL
fun aMatrixHomeServerDetails(
url: String = A_HOMESERVER_URL,
supportsPasswordLogin: Boolean = false,
supportsOidcLogin: Boolean = false,
supportsOAuthLogin: Boolean = false,
) = MatrixHomeServerDetails(
url = url,
supportsPasswordLogin = supportsPasswordLogin,
supportsOidcLogin = supportsOidcLogin,
supportsOAuthLogin = supportsOAuthLogin,
)

View file

@ -8,16 +8,16 @@
package io.element.android.libraries.matrix.test.encryption
import io.element.android.libraries.matrix.api.encryption.IdentityOidcResetHandle
import io.element.android.libraries.matrix.api.encryption.IdentityOAuthResetHandle
import io.element.android.libraries.matrix.api.encryption.IdentityPasswordResetHandle
class FakeIdentityOidcResetHandle(
class FakeIdentityOAuthResetHandle(
override val url: String = "",
var resetOidcLambda: () -> Result<Unit> = { error("Not implemented") },
var resetOAuthLambda: () -> Result<Unit> = { error("Not implemented") },
var cancelLambda: () -> Unit = { error("Not implemented") },
) : IdentityOidcResetHandle {
override suspend fun resetOidc(): Result<Unit> {
return resetOidcLambda()
) : IdentityOAuthResetHandle {
override suspend fun resetOAuth(): Result<Unit> {
return resetOAuthLambda()
}
override suspend fun cancel() {