From 244ab94e5eaf67d2d1df2d7b594d43af01bc8286 Mon Sep 17 00:00:00 2001 From: olivierdelcroix Date: Tue, 20 Jan 2026 15:34:47 +0100 Subject: [PATCH] add unstable prefix for MSC3824 --- .../handlers/src/compat/login_sso_redirect.rs | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/crates/handlers/src/compat/login_sso_redirect.rs b/crates/handlers/src/compat/login_sso_redirect.rs index f085bb82f..1ad47c55e 100644 --- a/crates/handlers/src/compat/login_sso_redirect.rs +++ b/crates/handlers/src/compat/login_sso_redirect.rs @@ -24,6 +24,9 @@ pub struct Params { #[serde(rename = "redirectUrl")] redirect_url: Option, action: Option, + + #[serde(rename = "org.matrix.msc3824.action")] + unstable_action: Option, } #[derive(Debug, Error)] @@ -81,5 +84,41 @@ pub async fn get( repo.save().await?; - Ok(url_builder.absolute_redirect(&CompatLoginSsoComplete::new(login.id, params.action))) + Ok(url_builder.absolute_redirect(&CompatLoginSsoComplete::new( + login.id, + params.action.or(params.unstable_action), + ))) +} + +#[cfg(test)] +mod tests { + use hyper::{Request, StatusCode}; + use sqlx::PgPool; + + use crate::test_utils::{RequestBuilderExt, ResponseExt, TestState}; + + #[sqlx::test(migrator = "mas_storage_pg::MIGRATOR")] + async fn test_unstable_action_fallback(pool: PgPool) { + let state: TestState = TestState::from_pool(pool).await.unwrap(); + + let request = Request::get( + "/_matrix/client/v3/login/sso/redirect?\ + redirectUrl=http://example.com/\ + &org.matrix.msc3824.action=register", + ) + .empty(); + + let response = state.request(request).await; + + response.assert_status(StatusCode::SEE_OTHER); + + let location = response + .headers() + .get("Location") + .unwrap() + .to_str() + .unwrap(); + assert!(location.contains("org.matrix.msc3824.action=register")); + assert!(location.contains("action=register")); + } }