Skip to content

Commit

Permalink
chore(ffi): Expose supported OIDC prompts in the login details.
Browse files Browse the repository at this point in the history
  • Loading branch information
pixlwave committed Oct 28, 2024
1 parent 40f4fc1 commit 4829f48
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
9 changes: 8 additions & 1 deletion bindings/matrix-sdk-ffi/src/authentication.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@ use matrix_sdk::{
};
use url::Url;

use crate::client::{Client, SlidingSyncVersion};
use crate::client::{Client, OidcPrompt, SlidingSyncVersion};

#[derive(uniffi::Object)]
pub struct HomeserverLoginDetails {
pub(crate) url: String,
pub(crate) sliding_sync_version: SlidingSyncVersion,
pub(crate) supports_oidc_login: bool,
pub(crate) supported_oidc_prompts: Vec<OidcPrompt>,
pub(crate) supports_password_login: bool,
}

Expand All @@ -46,6 +47,12 @@ impl HomeserverLoginDetails {
self.supports_oidc_login
}

/// The prompts advertised by the authentication issuer for use in the login
/// URL.
pub fn supported_oidc_prompts(&self) -> Vec<OidcPrompt> {
self.supported_oidc_prompts.clone()
}

/// Whether the current homeserver supports the password login flow.
pub fn supports_password_login(&self) -> bool {
self.supports_password_login
Expand Down
43 changes: 41 additions & 2 deletions bindings/matrix-sdk-ffi/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,14 +266,39 @@ impl Client {
impl Client {
/// Information about login options for the client's homeserver.
pub async fn homeserver_login_details(&self) -> Arc<HomeserverLoginDetails> {
let supports_oidc_login = self.inner.oidc().fetch_authentication_issuer().await.is_ok();
let oidc = self.inner.oidc();
let (supports_oidc_login, supported_oidc_prompts) = match oidc
.fetch_authentication_issuer()
.await
{
Ok(issuer) => match &oidc.given_provider_metadata(&issuer).await {
Ok(metadata) => {
let prompts = metadata
.prompt_values_supported
.as_ref()
.map_or_else(Vec::new, |prompts| prompts.iter().map(Into::into).collect());

(true, prompts)
}
Err(error) => {
error!("Failed to fetch OIDC provider metadata: {error}");
(true, Default::default())
}
},
Err(error) => {
error!("Failed to fetch authentication issuer: {error}");
(false, Default::default())
}
};

let supports_password_login = self.supports_password_login().await.ok().unwrap_or(false);
let sliding_sync_version = self.sliding_sync_version();

Arc::new(HomeserverLoginDetails {
url: self.homeserver(),
sliding_sync_version,
supports_oidc_login,
supported_oidc_prompts,
supports_password_login,
})
}
Expand Down Expand Up @@ -1758,7 +1783,7 @@ impl TryFrom<SlidingSyncVersion> for SdkSlidingSyncVersion {
}
}

#[derive(uniffi::Enum)]
#[derive(Clone, uniffi::Enum)]
pub enum OidcPrompt {
/// The Authorization Server must not display any authentication or consent
/// user interface pages.
Expand Down Expand Up @@ -1790,6 +1815,20 @@ pub enum OidcPrompt {
Unknown { value: String },
}

impl From<&SdkOidcPrompt> for OidcPrompt {
fn from(value: &SdkOidcPrompt) -> Self {
match value {
SdkOidcPrompt::None => Self::None,
SdkOidcPrompt::Login => Self::Login,
SdkOidcPrompt::Consent => Self::Consent,
SdkOidcPrompt::SelectAccount => Self::SelectAccount,
SdkOidcPrompt::Create => Self::Create,
SdkOidcPrompt::Unknown(value) => Self::Unknown { value: value.to_owned() },
_ => Self::Unknown { value: value.to_string() },
}
}
}

impl From<OidcPrompt> for SdkOidcPrompt {
fn from(value: OidcPrompt) -> Self {
match value {
Expand Down

0 comments on commit 4829f48

Please sign in to comment.