Skip to content

Commit af1282b

Browse files
authored
Allow response_mode to be null and if so do not add the query param (#3700)
1 parent 0bbf0a0 commit af1282b

File tree

15 files changed

+56
-48
lines changed

15 files changed

+56
-48
lines changed

crates/cli/src/sync.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,14 +235,16 @@ pub async fn config_sync(
235235
}
236236
};
237237

238-
let response_mode = match provider.response_mode {
239-
mas_config::UpstreamOAuth2ResponseMode::Query => {
240-
mas_data_model::UpstreamOAuthProviderResponseMode::Query
241-
}
242-
mas_config::UpstreamOAuth2ResponseMode::FormPost => {
243-
mas_data_model::UpstreamOAuthProviderResponseMode::FormPost
244-
}
245-
};
238+
let response_mode = provider
239+
.response_mode
240+
.map(|response_mode| match response_mode {
241+
mas_config::UpstreamOAuth2ResponseMode::Query => {
242+
mas_data_model::UpstreamOAuthProviderResponseMode::Query
243+
}
244+
mas_config::UpstreamOAuth2ResponseMode::FormPost => {
245+
mas_data_model::UpstreamOAuthProviderResponseMode::FormPost
246+
}
247+
});
246248

247249
if discovery_mode.is_disabled() {
248250
if provider.authorization_endpoint.is_none() {

crates/config/src/sections/upstream_oauth2.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,11 @@ impl ConfigurationSection for UpstreamOAuth2Config {
114114
}
115115

116116
/// The response mode we ask the provider to use for the callback
117-
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, JsonSchema)]
117+
#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema)]
118118
#[serde(rename_all = "snake_case")]
119119
pub enum ResponseMode {
120120
/// `query`: The provider will send the response as a query string in the
121121
/// URL search parameters
122-
#[default]
123122
Query,
124123

125124
/// `form_post`: The provider will send the response as a POST request with
@@ -129,13 +128,6 @@ pub enum ResponseMode {
129128
FormPost,
130129
}
131130

132-
impl ResponseMode {
133-
#[allow(clippy::trivially_copy_pass_by_ref)]
134-
const fn is_default(&self) -> bool {
135-
matches!(self, ResponseMode::Query)
136-
}
137-
}
138-
139131
/// Authentication methods used against the OAuth 2.0 provider
140132
#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema)]
141133
#[serde(rename_all = "snake_case")]
@@ -561,8 +553,8 @@ pub struct Provider {
561553
pub jwks_uri: Option<Url>,
562554

563555
/// The response mode we ask the provider to use for the callback
564-
#[serde(default, skip_serializing_if = "ResponseMode::is_default")]
565-
pub response_mode: ResponseMode,
556+
#[serde(skip_serializing_if = "Option::is_none")]
557+
pub response_mode: Option<ResponseMode>,
566558

567559
/// How claims should be imported from the `id_token` provided by the
568560
/// provider

crates/data-model/src/upstream_oauth2/provider.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ pub struct UpstreamOAuthProvider {
236236
pub token_endpoint_signing_alg: Option<JsonWebSignatureAlg>,
237237
pub token_endpoint_auth_method: TokenAuthMethod,
238238
pub id_token_signed_response_alg: JsonWebSignatureAlg,
239-
pub response_mode: ResponseMode,
239+
pub response_mode: Option<ResponseMode>,
240240
pub created_at: DateTime<Utc>,
241241
pub disabled_at: Option<DateTime<Utc>>,
242242
pub claims_imports: ClaimsImports,

crates/handlers/src/upstream_oauth2/authorize.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,15 @@ pub(crate) async fn get(
8383

8484
let redirect_uri = url_builder.upstream_oauth_callback(provider.id);
8585

86-
let data = AuthorizationRequestData::new(
86+
let mut data = AuthorizationRequestData::new(
8787
provider.client_id.clone(),
8888
provider.scope.clone(),
8989
redirect_uri,
90-
)
91-
.with_response_mode(provider.response_mode.into());
90+
);
91+
92+
if let Some(response_mode) = provider.response_mode {
93+
data = data.with_response_mode(response_mode.into());
94+
}
9295

9396
let data = if let Some(methods) = lazy_metadata.pkce_methods().await? {
9497
data.with_code_challenge_methods_supported(methods)

crates/handlers/src/upstream_oauth2/cache.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,8 +417,8 @@ mod tests {
417417
encrypted_client_secret: None,
418418
token_endpoint_signing_alg: None,
419419
token_endpoint_auth_method: UpstreamOAuthProviderTokenAuthMethod::None,
420-
response_mode: mas_data_model::UpstreamOAuthProviderResponseMode::Query,
421420
id_token_signed_response_alg: JsonWebSignatureAlg::Rs256,
421+
response_mode: None,
422422
created_at: clock.now(),
423423
disabled_at: None,
424424
claims_imports: UpstreamOAuthProviderClaimsImports::default(),

crates/handlers/src/upstream_oauth2/callback.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ pub(crate) enum RouteError {
109109
MissingFormParams,
110110

111111
#[error("Invalid response mode, expected '{expected}'")]
112-
InvalidParamsMode {
112+
InvalidResponseMode {
113113
expected: UpstreamOAuthProviderResponseMode,
114114
},
115115

@@ -185,8 +185,7 @@ pub(crate) async fn handler(
185185
// the query parameters for GET requests. We need to then look at the method do
186186
// make sure it matches the expected `response_mode`
187187
match (provider.response_mode, method) {
188-
(UpstreamOAuthProviderResponseMode::Query, Method::GET) => {}
189-
(UpstreamOAuthProviderResponseMode::FormPost, Method::POST) => {
188+
(Some(UpstreamOAuthProviderResponseMode::FormPost) | None, Method::POST) => {
190189
// We set the cookies with a `Same-Site` policy set to `Lax`, so because this is
191190
// usually a cross-site form POST, we need to render a form with the
192191
// same values, which posts back to the same URL. However, there are
@@ -202,7 +201,8 @@ pub(crate) async fn handler(
202201
return Ok(Html(html).into_response());
203202
}
204203
}
205-
(expected, _) => return Err(RouteError::InvalidParamsMode { expected }),
204+
(None, _) | (Some(UpstreamOAuthProviderResponseMode::Query), Method::GET) => {}
205+
(Some(expected), _) => return Err(RouteError::InvalidResponseMode { expected }),
206206
}
207207

208208
let (session_id, _post_auth_action) = sessions_cookie

crates/handlers/src/upstream_oauth2/link.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ mod tests {
934934
jwks_uri_override: None,
935935
discovery_mode: mas_data_model::UpstreamOAuthProviderDiscoveryMode::Oidc,
936936
pkce_mode: mas_data_model::UpstreamOAuthProviderPkceMode::Auto,
937-
response_mode: mas_data_model::UpstreamOAuthProviderResponseMode::Query,
937+
response_mode: None,
938938
additional_authorization_parameters: Vec::new(),
939939
},
940940
)

crates/handlers/src/views/login.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ mod test {
416416
jwks_uri_override: None,
417417
discovery_mode: mas_data_model::UpstreamOAuthProviderDiscoveryMode::Oidc,
418418
pkce_mode: mas_data_model::UpstreamOAuthProviderPkceMode::Auto,
419-
response_mode: mas_data_model::UpstreamOAuthProviderResponseMode::Query,
419+
response_mode: None,
420420
additional_authorization_parameters: Vec::new(),
421421
},
422422
)
@@ -456,7 +456,7 @@ mod test {
456456
jwks_uri_override: None,
457457
discovery_mode: mas_data_model::UpstreamOAuthProviderDiscoveryMode::Oidc,
458458
pkce_mode: mas_data_model::UpstreamOAuthProviderPkceMode::Auto,
459-
response_mode: mas_data_model::UpstreamOAuthProviderResponseMode::Query,
459+
response_mode: None,
460460
additional_authorization_parameters: Vec::new(),
461461
},
462462
)

crates/storage-pg/.sqlx/query-1d758df58ccfead4cb39ee8f88f60b382b7881e9c4ead31ff257ff5ff4414b6e.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/storage-pg/.sqlx/query-27d6f228a9a608b5d03d30cb4074be94dc893df9107e982583aa954b5067dfd1.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)