From 4f1182a23099d9c4d7f6b8b0ad30557a8e9de041 Mon Sep 17 00:00:00 2001 From: garronej Date: Thu, 20 Apr 2023 20:51:46 +0200 Subject: [PATCH] Feat sml-post-form.ftl #277 --- src/bin/keycloakify/generateFtl/pageId.ts | 3 ++- src/login/Fallback.tsx | 3 +++ src/login/kcContext/KcContext.ts | 24 +++++++++++++++-- src/login/kcContext/kcContextMocks.ts | 26 ++++++++++++++++++- src/login/pages/RegisterUserProfile.tsx | 4 ++- src/login/pages/SamlPostForm.tsx | 27 ++++++++++++++++++++ stories/login/pages/SamlPostForm.stories.tsx | 24 +++++++++++++++++ 7 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 src/login/pages/SamlPostForm.tsx create mode 100644 stories/login/pages/SamlPostForm.stories.tsx diff --git a/src/bin/keycloakify/generateFtl/pageId.ts b/src/bin/keycloakify/generateFtl/pageId.ts index a9504723..fc93e917 100644 --- a/src/bin/keycloakify/generateFtl/pageId.ts +++ b/src/bin/keycloakify/generateFtl/pageId.ts @@ -21,7 +21,8 @@ export const loginThemePageIds = [ "update-user-profile.ftl", "idp-review-user-profile.ftl", "update-email.ftl", - "select-authenticator.ftl" + "select-authenticator.ftl", + "saml-post-form.ftl" ] as const; export const accountThemePageIds = ["password.ftl", "account.ftl"] as const; diff --git a/src/login/Fallback.tsx b/src/login/Fallback.tsx index 6a3dbbec..bffb3a78 100644 --- a/src/login/Fallback.tsx +++ b/src/login/Fallback.tsx @@ -27,6 +27,7 @@ const UpdateUserProfile = lazy(() => import("keycloakify/login/pages/UpdateUserP const IdpReviewUserProfile = lazy(() => import("keycloakify/login/pages/IdpReviewUserProfile")); const UpdateEmail = lazy(() => import("keycloakify/login/pages/UpdateEmail")); const SelectAuthenticator = lazy(() => import("keycloakify/login/pages/SelectAuthenticator")); +const SamlPostForm = lazy(() => import("keycloakify/login/pages/SamlPostForm")); export default function Fallback(props: PageProps) { const { kcContext, ...rest } = props; @@ -81,6 +82,8 @@ export default function Fallback(props: PageProps) { return ; case "select-authenticator.ftl": return ; + case "saml-post-form.ftl": + return ; } assert>(false); })()} diff --git a/src/login/kcContext/KcContext.ts b/src/login/kcContext/KcContext.ts index 8b276c98..9766d0ea 100644 --- a/src/login/kcContext/KcContext.ts +++ b/src/login/kcContext/KcContext.ts @@ -32,7 +32,8 @@ export type KcContext = | KcContext.UpdateUserProfile | KcContext.IdpReviewUserProfile | KcContext.UpdateEmail - | KcContext.SelectAuthenticator; + | KcContext.SelectAuthenticator + | KcContext.SamlPostForm; export declare namespace KcContext { export type Common = { @@ -85,6 +86,16 @@ export declare namespace KcContext { }; }; + export type SamlPostForm = Common & { + pageId: "saml-post-form.ftl"; + samlPost: { + url: string; + SAMLRequest?: string; + SAMLResponse?: string; + RelayState?: string; + }; + }; + export type Login = Common & { pageId: "login.ftl"; url: { @@ -543,4 +554,13 @@ export declare namespace Validators { }; } -assert>(); +{ + type Got = KcContext["pageId"]; + type Expected = LoginThemePageId; + + type OnlyInGot = Exclude; + type OnlyInExpected = Exclude; + + assert>(); + assert>(); +} diff --git a/src/login/kcContext/kcContextMocks.ts b/src/login/kcContext/kcContextMocks.ts index 429c65a3..94fdbd71 100644 --- a/src/login/kcContext/kcContextMocks.ts +++ b/src/login/kcContext/kcContextMocks.ts @@ -3,6 +3,8 @@ import type { KcContext, Attribute } from "./KcContext"; import { resourcesCommonDirPathRelativeToPublicDir, resourcesDirPathRelativeToPublicDir } from "keycloakify/bin/mockTestingResourcesPath"; import { pathJoin } from "keycloakify/bin/tools/pathJoin"; import { id } from "tsafe/id"; +import { assert, type Equals } from "tsafe/assert"; +import type { LoginThemePageId } from "keycloakify/bin/keycloakify/generateFtl"; const PUBLIC_URL = process.env["PUBLIC_URL"] ?? "/"; @@ -243,7 +245,7 @@ const loginUrl = { "registrationUrl": "/auth/realms/myrealm/login-actions/registration?client_id=account&tab_id=HoAx28ja4xg" }; -export const kcContextMocks: KcContext[] = [ +export const kcContextMocks = [ id({ ...kcContextCommonMock, "pageId": "login.ftl", @@ -519,5 +521,27 @@ export const kcContextMocks: KcContext[] = [ } ] } + }), + id({ + ...kcContextCommonMock, + pageId: "saml-post-form.ftl", + "samlPost": { + "url": "https://saml-post-url" + } + }), + id({ + ...kcContextCommonMock, + pageId: "login-page-expired.ftl" }) ]; + +{ + type Got = (typeof kcContextMocks)[number]["pageId"]; + type Expected = LoginThemePageId; + + type OnlyInGot = Exclude; + type OnlyInExpected = Exclude; + + assert>(); + assert>(); +} diff --git a/src/login/pages/RegisterUserProfile.tsx b/src/login/pages/RegisterUserProfile.tsx index 1e9d7f6c..6b9bde0a 100644 --- a/src/login/pages/RegisterUserProfile.tsx +++ b/src/login/pages/RegisterUserProfile.tsx @@ -14,7 +14,9 @@ export default function RegisterUserProfile(props: PageProps, I18n>) { + const { kcContext, i18n, doUseDefaultCss, Template, classes } = props; + + const { msgStr, msg } = i18n; + + const { samlPost } = kcContext; + + return ( +