From dece99dd70bc6a72866bdb9c4cf2e38b025e0824 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 8 Oct 2023 13:31:51 +0200 Subject: [PATCH] add support for single tenant microsoft login --- backend/windmill-api/src/oauth2.rs | 23 ++++++++-- .../src/lib/components/OAuthSetting.svelte | 43 ++++++++++++++++--- .../common/seconds/SecondsInput.svelte | 4 +- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/backend/windmill-api/src/oauth2.rs b/backend/windmill-api/src/oauth2.rs index b1d2300d43..dc1f4034b8 100644 --- a/backend/windmill-api/src/oauth2.rs +++ b/backend/windmill-api/src/oauth2.rs @@ -934,6 +934,15 @@ async fn slack_command( )); } +fn transform_name_to_email(x: String) -> String { + let r = x.replace(' ', "_"); + if r.contains('@') { + return r; + } else { + return format!("{r}@windmill.dev"); + } +} + #[allow(non_snake_case)] async fn login_callback( Path(client_name): Path, @@ -955,11 +964,11 @@ async fn login_callback( if let Ok(token) = token_res { let token = &token.access_token.to_string(); + let userinfo_url = client_w_config.userinfo_url.as_ref().ok_or_else(|| { Error::BadConfig(format!("Missing userinfo_url in client {client_name}")) })?; let user = http_get_user_info::(&HTTP_CLIENT, userinfo_url, token).await?; - let email = match client_name.as_str() { "github" => http_get_user_info::>( &HTTP_CLIENT, @@ -974,9 +983,15 @@ async fn login_callback( )))? .email .to_string(), - _ => user.email.clone().ok_or_else(|| { - error::Error::BadRequest("email address not fetchable from user info".to_string()) - })?, + _ => user + .email + .clone() + .or(user.name.clone().map(transform_name_to_email)) + .ok_or_else(|| { + error::Error::BadRequest( + "email address not fetchable from user info".to_string(), + ) + })?, } .to_lowercase(); diff --git a/frontend/src/lib/components/OAuthSetting.svelte b/frontend/src/lib/components/OAuthSetting.svelte index 80a8fb8931..59e9367e47 100644 --- a/frontend/src/lib/components/OAuthSetting.svelte +++ b/frontend/src/lib/components/OAuthSetting.svelte @@ -10,6 +10,29 @@ $: enabled = value != undefined let allowed_domains = value?.['allowed_domains'] ?? '' + + let tenant: string = '' + $: name == 'microsoft' && changeTenantId(tenant) + + function changeTenantId(tenant: string) { + if (value && tenant) { + if (tenant != '') { + value = { + ...value, + login_config: { + auth_url: `https://login.microsoftonline.com/${tenant}/oauth2/v2.0/authorize`, + token_url: `https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token`, + userinfo_url: `https://graph.microsoft.com/oidc/userinfo`, + scopes: ['openid', 'profile', 'email'] + } + } + } else { + if (value['login_config']) { + delete value['login_config'] + } + } + } + }
@@ -35,7 +58,12 @@ Client Secret - {#if login} + {#if name == 'microsoft'} + + {:else if login}
{/if} diff --git a/frontend/src/lib/components/common/seconds/SecondsInput.svelte b/frontend/src/lib/components/common/seconds/SecondsInput.svelte index fc5641e0a7..74f988b5bc 100644 --- a/frontend/src/lib/components/common/seconds/SecondsInput.svelte +++ b/frontend/src/lib/components/common/seconds/SecondsInput.svelte @@ -41,7 +41,7 @@ } -
+
{#if !hideDisplay} {/if}