From a9e8bf89a909316a3e46e33ae701adf931f4039a Mon Sep 17 00:00:00 2001 From: Stavros Date: Wed, 30 Apr 2025 19:57:49 +0300 Subject: [PATCH] feat: map info from OIDC claims to headers (#122) * refactor: return all values from body in the providers * refactor: only accept claims following the OIDC spec * feat: map info from OIDC claims to headers * feat: add support for required oauth groups * fix: bot suggestions * feat: get claims from github and google * fix: close body correctly --- cmd/root.go | 9 +- frontend/bun.lockb | Bin 141204 -> 140836 bytes frontend/src/index.css | 4 + frontend/src/lib/i18n/locales/en-US.json | 3 +- frontend/src/lib/i18n/locales/en.json | 3 +- frontend/src/main.tsx | 6 +- frontend/src/pages/logout-page.tsx | 4 +- frontend/src/pages/unauthorized-page.tsx | 65 +++++--- frontend/src/schemas/user-context-schema.ts | 2 + internal/api/api_test.go | 7 +- internal/auth/auth.go | 86 ++++++---- internal/constants/constants.go | 9 ++ internal/docker/docker.go | 11 +- internal/handlers/handlers.go | 168 +++++++++++++++----- internal/hooks/hooks.go | 59 +++---- internal/providers/generic.go | 24 ++- internal/providers/github.go | 95 +++++++++-- internal/providers/google.go | 35 ++-- internal/providers/providers.go | 50 +++--- internal/types/api.go | 3 + internal/types/config.go | 5 + internal/types/types.go | 7 + internal/utils/utils.go | 21 +++ internal/utils/utils_test.go | 62 ++++++++ 24 files changed, 528 insertions(+), 210 deletions(-) create mode 100644 frontend/src/index.css diff --git a/cmd/root.go b/cmd/root.go index beaa5d2..d416702 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -111,6 +111,11 @@ var rootCmd = &cobra.Command{ LoginMaxRetries: config.LoginMaxRetries, } + // Create hooks config + hooksConfig := types.HooksConfig{ + Domain: domain, + } + // Create docker service docker := docker.NewDocker() @@ -128,7 +133,7 @@ var rootCmd = &cobra.Command{ providers.Init() // Create hooks service - hooks := hooks.NewHooks(auth, providers) + hooks := hooks.NewHooks(hooksConfig, auth, providers) // Create handlers handlers := handlers.NewHandlers(handlersConfig, auth, hooks, providers, docker) @@ -189,7 +194,7 @@ func init() { rootCmd.Flags().String("generic-auth-url", "", "Generic OAuth auth URL.") rootCmd.Flags().String("generic-token-url", "", "Generic OAuth token URL.") rootCmd.Flags().String("generic-user-url", "", "Generic OAuth user info URL.") - rootCmd.Flags().String("generic-name", "Other", "Generic OAuth provider name.") + rootCmd.Flags().String("generic-name", "Generic", "Generic OAuth provider name.") rootCmd.Flags().Bool("disable-continue", false, "Disable continue screen and redirect to app directly.") rootCmd.Flags().String("oauth-whitelist", "", "Comma separated list of email addresses to whitelist when using OAuth.") rootCmd.Flags().Int("session-expiry", 86400, "Session (cookie) expiration time in seconds.") diff --git a/frontend/bun.lockb b/frontend/bun.lockb index f5d3b69d28ec64f5ef81c9c4a844c18261042a3f..0b06ed59018728bbf30e6106610b97b17a360cd3 100755 GIT binary patch delta 24183 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 TVonXky|0+dzB{K`#DM<=MLRQa diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000..2ddf63c --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,4 @@ +span, +p { + word-break: break-word; +} diff --git a/frontend/src/lib/i18n/locales/en-US.json b/frontend/src/lib/i18n/locales/en-US.json index 12135fe..6d1af3c 100644 --- a/frontend/src/lib/i18n/locales/en-US.json +++ b/frontend/src/lib/i18n/locales/en-US.json @@ -41,7 +41,8 @@ "totpTitle": "Enter your TOTP code", "unauthorizedTitle": "Unauthorized", "unauthorizedResourceSubtitle": "The user with username {{username}} is not authorized to access the resource {{resource}}.", - "unaothorizedLoginSubtitle": "The user with username {{username}} is not authorized to login.", + "unauthorizedLoginSubtitle": "The user with username {{username}} is not authorized to login.", + "unauthorizedGroupsSubtitle": "The user with username {{username}} is not in the groups required by the resource {{resource}}.", "unauthorizedButton": "Try again", "untrustedRedirectTitle": "Untrusted redirect", "untrustedRedirectSubtitle": "You are trying to redirect to a domain that does not match your configured domain ({{domain}}). Are you sure you want to continue?", diff --git a/frontend/src/lib/i18n/locales/en.json b/frontend/src/lib/i18n/locales/en.json index 12135fe..6d1af3c 100644 --- a/frontend/src/lib/i18n/locales/en.json +++ b/frontend/src/lib/i18n/locales/en.json @@ -41,7 +41,8 @@ "totpTitle": "Enter your TOTP code", "unauthorizedTitle": "Unauthorized", "unauthorizedResourceSubtitle": "The user with username {{username}} is not authorized to access the resource {{resource}}.", - "unaothorizedLoginSubtitle": "The user with username {{username}} is not authorized to login.", + "unauthorizedLoginSubtitle": "The user with username {{username}} is not authorized to login.", + "unauthorizedGroupsSubtitle": "The user with username {{username}} is not in the groups required by the resource {{resource}}.", "unauthorizedButton": "Try again", "untrustedRedirectTitle": "Untrusted redirect", "untrustedRedirectSubtitle": "You are trying to redirect to a domain that does not match your configured domain ({{domain}}). Are you sure you want to continue?", diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index c5a39d6..2efd797 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -19,6 +19,7 @@ import { TotpPage } from "./pages/totp-page.tsx"; import { AppContextProvider } from "./context/app-context.tsx"; import "./lib/i18n/i18n.ts"; import { ForgotPasswordPage } from "./pages/forgot-password-page.tsx"; +import "./index.css"; const queryClient = new QueryClient(); @@ -38,7 +39,10 @@ createRoot(document.getElementById("root")!).render( } /> } /> } /> - } /> + } + /> } /> diff --git a/frontend/src/pages/logout-page.tsx b/frontend/src/pages/logout-page.tsx index 5ef6041..06a9421 100644 --- a/frontend/src/pages/logout-page.tsx +++ b/frontend/src/pages/logout-page.tsx @@ -10,7 +10,7 @@ import { useAppContext } from "../context/app-context"; import { Trans, useTranslation } from "react-i18next"; export const LogoutPage = () => { - const { isLoggedIn, username, oauth, provider } = useUserContext(); + const { isLoggedIn, oauth, provider, email, username } = useUserContext(); const { genericName } = useAppContext(); const { t } = useTranslation(); @@ -56,7 +56,7 @@ export const LogoutPage = () => { values={{ provider: provider === "generic" ? genericName : capitalize(provider), - username: username, + username: email, }} /> ) : ( diff --git a/frontend/src/pages/unauthorized-page.tsx b/frontend/src/pages/unauthorized-page.tsx index 6825bd2..84bb8d6 100644 --- a/frontend/src/pages/unauthorized-page.tsx +++ b/frontend/src/pages/unauthorized-page.tsx @@ -3,11 +3,13 @@ import { Layout } from "../components/layouts/layout"; import { Navigate } from "react-router"; import { isQueryValid } from "../utils/utils"; import { Trans, useTranslation } from "react-i18next"; +import React from "react"; export const UnauthorizedPage = () => { const queryString = window.location.search; const params = new URLSearchParams(queryString); const username = params.get("username") ?? ""; + const groupErr = params.get("groupErr") ?? ""; const resource = params.get("resource") ?? ""; const { t } = useTranslation(); @@ -16,33 +18,54 @@ export const UnauthorizedPage = () => { return ; } + if (isQueryValid(resource) && !isQueryValid(groupErr)) { + return ( + + }} + values={{ resource, username }} + /> + + ); + } + + if (isQueryValid(groupErr) && isQueryValid(resource)) { + return ( + + }} + values={{ username, resource }} + /> + + ); + } + + return ( + + }} + values={{ username }} + /> + + ); +}; + +const UnauthorizedLayout = ({ children }: { children: React.ReactNode }) => { + const { t } = useTranslation(); + return ( {t("Unauthorized")} - - {isQueryValid(resource) ? ( - - }} - values={{ resource, username }} - /> - - ) : ( - - }} - values={{ username }} - /> - - )} - + {children}