Fix API update regrading OidcPrompt.
This commit is contained in:
parent
8acc4173d3
commit
3f58f4b793
6 changed files with 84 additions and 5 deletions
|
|
@ -27,6 +27,7 @@ import io.element.android.libraries.architecture.AsyncData
|
||||||
import io.element.android.libraries.architecture.Presenter
|
import io.element.android.libraries.architecture.Presenter
|
||||||
import io.element.android.libraries.architecture.runCatchingUpdatingState
|
import io.element.android.libraries.architecture.runCatchingUpdatingState
|
||||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
||||||
|
import io.element.android.libraries.matrix.api.auth.OidcPrompt
|
||||||
import io.element.android.libraries.oidc.api.OidcAction
|
import io.element.android.libraries.oidc.api.OidcAction
|
||||||
import io.element.android.libraries.oidc.api.OidcActionFlow
|
import io.element.android.libraries.oidc.api.OidcActionFlow
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
@ -92,7 +93,7 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor(
|
||||||
val matrixHomeServerDetails = authenticationService.getHomeserverDetails().value!!
|
val matrixHomeServerDetails = authenticationService.getHomeserverDetails().value!!
|
||||||
if (matrixHomeServerDetails.supportsOidcLogin) {
|
if (matrixHomeServerDetails.supportsOidcLogin) {
|
||||||
// Retrieve the details right now
|
// Retrieve the details right now
|
||||||
LoginFlow.OidcFlow(authenticationService.getOidcUrl().getOrThrow())
|
LoginFlow.OidcFlow(authenticationService.getOidcUrl(OidcPrompt.Consent).getOrThrow())
|
||||||
} else if (params.isAccountCreation) {
|
} else if (params.isAccountCreation) {
|
||||||
val url = webClientUrlForAuthenticationRetriever.retrieve(homeserverUrl)
|
val url = webClientUrlForAuthenticationRetriever.retrieve(homeserverUrl)
|
||||||
LoginFlow.AccountCreationFlow(url)
|
LoginFlow.AccountCreationFlow(url)
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ interface MatrixAuthenticationService {
|
||||||
/**
|
/**
|
||||||
* Get the Oidc url to display to the user.
|
* Get the Oidc url to display to the user.
|
||||||
*/
|
*/
|
||||||
suspend fun getOidcUrl(): Result<OidcDetails>
|
suspend fun getOidcUrl(prompt: OidcPrompt): Result<OidcDetails>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancel Oidc login sequence.
|
* Cancel Oidc login sequence.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 New Vector Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
* Please see LICENSE in the repository root for full details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.libraries.matrix.api.auth
|
||||||
|
|
||||||
|
sealed interface OidcPrompt {
|
||||||
|
/**
|
||||||
|
* The Authorization Server must not display any authentication or consent
|
||||||
|
* user interface pages.
|
||||||
|
*/
|
||||||
|
data object None : OidcPrompt
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Authorization Server should prompt the End-User for
|
||||||
|
* reauthentication.
|
||||||
|
*/
|
||||||
|
data object Login : OidcPrompt
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Authorization Server should prompt the End-User for consent before
|
||||||
|
* returning information to the Client.
|
||||||
|
*/
|
||||||
|
data object Consent : OidcPrompt
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Authorization Server should prompt the End-User to select a user
|
||||||
|
* account.
|
||||||
|
*
|
||||||
|
* This enables an End-User who has multiple accounts at the Authorization
|
||||||
|
* Server to select amongst the multiple accounts that they might have
|
||||||
|
* current sessions for.
|
||||||
|
*/
|
||||||
|
data object SelectAccount : OidcPrompt
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Authorization Server should prompt the End-User to create a user
|
||||||
|
* account.
|
||||||
|
*
|
||||||
|
* Defined in [Initiating User Registration via OpenID Connect](https://openid.net/specs/openid-connect-prompt-create-1_0.html).
|
||||||
|
*/
|
||||||
|
data object Create : OidcPrompt
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An unknown value.
|
||||||
|
*/
|
||||||
|
data class Unknown(val value: String) : OidcPrompt
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 New Vector Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
* Please see LICENSE in the repository root for full details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.libraries.matrix.impl.auth
|
||||||
|
|
||||||
|
import io.element.android.libraries.matrix.api.auth.OidcPrompt
|
||||||
|
import org.matrix.rustcomponents.sdk.OidcPrompt as RustOidcPrompt
|
||||||
|
|
||||||
|
internal fun OidcPrompt.toRustPrompt(): RustOidcPrompt {
|
||||||
|
return when (this) {
|
||||||
|
OidcPrompt.None -> RustOidcPrompt.None
|
||||||
|
OidcPrompt.Login -> RustOidcPrompt.Login
|
||||||
|
OidcPrompt.Consent -> RustOidcPrompt.Consent
|
||||||
|
OidcPrompt.SelectAccount -> RustOidcPrompt.SelectAccount
|
||||||
|
OidcPrompt.Create -> RustOidcPrompt.Create
|
||||||
|
is OidcPrompt.Unknown -> RustOidcPrompt.Unknown(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -17,6 +17,7 @@ import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
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.MatrixHomeServerDetails
|
||||||
import io.element.android.libraries.matrix.api.auth.OidcDetails
|
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.external.ExternalSession
|
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.MatrixQrCodeLoginData
|
||||||
import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep
|
import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep
|
||||||
|
|
@ -181,11 +182,14 @@ class RustMatrixAuthenticationService @Inject constructor(
|
||||||
|
|
||||||
private var pendingOidcAuthorizationData: OidcAuthorizationData? = null
|
private var pendingOidcAuthorizationData: OidcAuthorizationData? = null
|
||||||
|
|
||||||
override suspend fun getOidcUrl(): Result<OidcDetails> {
|
override suspend fun getOidcUrl(prompt: OidcPrompt): Result<OidcDetails> {
|
||||||
return withContext(coroutineDispatchers.io) {
|
return withContext(coroutineDispatchers.io) {
|
||||||
runCatching {
|
runCatching {
|
||||||
val client = currentClient ?: error("You need to call `setHomeserver()` first")
|
val client = currentClient ?: error("You need to call `setHomeserver()` first")
|
||||||
val oidcAuthenticationData = client.urlForOidcLogin(oidcConfigurationProvider.get())
|
val oidcAuthenticationData = client.urlForOidc(
|
||||||
|
oidcConfiguration = oidcConfigurationProvider.get(),
|
||||||
|
prompt = prompt.toRustPrompt(),
|
||||||
|
)
|
||||||
val url = oidcAuthenticationData.loginUrl()
|
val url = oidcAuthenticationData.loginUrl()
|
||||||
pendingOidcAuthorizationData = oidcAuthenticationData
|
pendingOidcAuthorizationData = oidcAuthenticationData
|
||||||
OidcDetails(url)
|
OidcDetails(url)
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
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.MatrixHomeServerDetails
|
||||||
import io.element.android.libraries.matrix.api.auth.OidcDetails
|
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.external.ExternalSession
|
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.MatrixQrCodeLoginData
|
||||||
import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep
|
import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep
|
||||||
|
|
@ -80,7 +81,7 @@ class FakeMatrixAuthenticationService(
|
||||||
return importCreatedSessionLambda(externalSession)
|
return importCreatedSessionLambda(externalSession)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getOidcUrl(): Result<OidcDetails> = simulateLongTask {
|
override suspend fun getOidcUrl(prompt: OidcPrompt): Result<OidcDetails> = simulateLongTask {
|
||||||
oidcError?.let { Result.failure(it) } ?: Result.success(A_OIDC_DATA)
|
oidcError?.let { Result.failure(it) } ?: Result.success(A_OIDC_DATA)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue