diff --git a/account/applications.ftl b/account/applications.ftl index 0c0906d..c9e7022 100755 --- a/account/applications.ftl +++ b/account/applications.ftl @@ -69,7 +69,6 @@ <#if (application.client.consentRequired && application.clientScopesGranted?has_content) || application.additionalGrants?has_content> + diff --git a/common/resources/css/index.css b/common/resources/css/index.css index af3c3cf..d9442d5 100644 --- a/common/resources/css/index.css +++ b/common/resources/css/index.css @@ -27,10 +27,11 @@ html { .ps-container { display: flex; - flex-direction: column; } + flex-direction: column; + align-items: stretch; } .ps-container > * { margin: 0; - margin-bottom: 1rem; } + margin-bottom: 1.25rem; } .ps-link { cursor: pointer; @@ -64,18 +65,38 @@ html { cursor: pointer; } .ps-button:hover, .ps-button:focus { border-color: var(--accent); } + .ps-button_primary { + border: 4px solid var(--foreground); + background-color: var(--background); + color: var(--foreground); + font-weight: bold; } + .ps-button_primary:focus, .ps-button_primary:hover { + background-color: var(--foreground); + color: var(--background); } .ps-input { - padding: 0.5rem 1rem; - border: 2px solid var(--foreground-light); } + padding: 0.5rem 0.5rem; + border: 2px solid var(--foreground-light); + font-size: 1.2rem; } .ps-input:hover, .ps-input:focus { border-color: var(--accent); } + .ps-input:focus { + color: var(--background); + background-color: var(--foreground); } + .ps-input:disabled { + background-color: var(--background-alt-2); } + .ps-input:disabled:hover { + border-color: var(--foreground-light); } .ps-form-group { display: flex; flex-direction: column; } .ps-form-group--label { - display: flex; } + margin-bottom: 0.5rem; + display: flex; + font-weight: bold; } + .ps-form-group .ps-button { + align-self: flex-start; } .ps-main { display: flex; @@ -171,7 +192,8 @@ html { pointer-events: all; color: var(--foreground); background: white; - word-break: break-word; + overflow-wrap: break-word; + hyphens: auto; pointer-events: all; } @media screen and (min-width: 1200px) { .ps-page--section { diff --git a/common/resources/scss/button.scss b/common/resources/scss/button.scss index ba1afee..2e8410b 100644 --- a/common/resources/scss/button.scss +++ b/common/resources/scss/button.scss @@ -11,4 +11,17 @@ &:focus { border-color: var(--accent); } + + &_primary { + border: 4px solid var(--foreground); + background-color: var(--background); + color: var(--foreground); + font-weight: bold; + + &:focus, + &:hover { + background-color: var(--foreground); + color: var(--background); + } + } } diff --git a/common/resources/scss/container.scss b/common/resources/scss/container.scss index b8fe727..464244b 100644 --- a/common/resources/scss/container.scss +++ b/common/resources/scss/container.scss @@ -1,9 +1,10 @@ .ps-container { display: flex; flex-direction: column; + align-items: stretch; > * { margin: 0; - margin-bottom: 1rem; + margin-bottom: 1.25rem; } } diff --git a/common/resources/scss/form-group.scss b/common/resources/scss/form-group.scss index 3338c5a..e82c9c4 100644 --- a/common/resources/scss/form-group.scss +++ b/common/resources/scss/form-group.scss @@ -3,6 +3,12 @@ flex-direction: column; &--label { + margin-bottom: 0.5rem; display: flex; + font-weight: bold; + } + + .ps-button { + align-self: flex-start; } } diff --git a/common/resources/scss/input.scss b/common/resources/scss/input.scss index d08c225..61f2e18 100644 --- a/common/resources/scss/input.scss +++ b/common/resources/scss/input.scss @@ -1,9 +1,23 @@ .ps-input { - padding: 0.5rem 1rem; + padding: 0.5rem 0.5rem; border: 2px solid var(--foreground-light); + font-size: 1.2rem; &:hover, &:focus { border-color: var(--accent); } + + &:focus { + color: var(--background); + background-color: var(--foreground); + } + + &:disabled { + background-color: var(--background-alt-2); + + &:hover { + border-color: var(--foreground-light); + } + } } diff --git a/common/resources/scss/page.scss b/common/resources/scss/page.scss index 7d4ae40..3545a2f 100644 --- a/common/resources/scss/page.scss +++ b/common/resources/scss/page.scss @@ -38,7 +38,8 @@ pointer-events: all; color: var(--foreground); background: white; - word-break: break-word; + overflow-wrap: break-word; + hyphens: auto; pointer-events: all; @media screen and (min-width: 1200px) { diff --git a/common/resources/scss/table.scss b/common/resources/scss/table.scss new file mode 100644 index 0000000..609a2dd --- /dev/null +++ b/common/resources/scss/table.scss @@ -0,0 +1,3 @@ +.ps-table { + overflow: auto; +} diff --git a/login/cli_splash.ftl b/login/cli_splash.ftl new file mode 100644 index 0000000..cd9ebbb --- /dev/null +++ b/login/cli_splash.ftl @@ -0,0 +1,7 @@ + _ __ _ _ +| |/ /___ _ _ ___| | ___ __ _| | __ +| ' // _ \ | | |/ __| |/ _ \ / _` | |/ / +| . \ __/ |_| | (__| | (_) | (_| | < +|_|\_\___|\__, |\___|_|\___/ \__,_|_|\_\ + |___/ + diff --git a/login/code.ftl b/login/code.ftl new file mode 100755 index 0000000..6830fc4 --- /dev/null +++ b/login/code.ftl @@ -0,0 +1,19 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + <#if code.success> + ${msg("codeSuccessTitle")} + <#else> + ${msg("codeErrorTitle", code.error)} + + <#elseif section = "form"> +
+ <#if code.success> +

${msg("copyCodeInstruction")}

+ + <#else> +

${code.error}

+ +
+ + diff --git a/login/delete-account-confirm.ftl b/login/delete-account-confirm.ftl new file mode 100644 index 0000000..6aa93f0 --- /dev/null +++ b/login/delete-account-confirm.ftl @@ -0,0 +1,33 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + + <#if section = "header"> + ${msg("deleteAccountConfirm")} + + <#elseif section = "form"> + +
+ +
+ + ${msg("irreversibleAction")} +
+ +

${msg("deletingImplies")}

+ + +

${msg("finalDeletionConfirmation")}

+ +
+ + <#if triggered_from_aia> + + +
+
+ + + \ No newline at end of file diff --git a/login/error.ftl b/login/error.ftl new file mode 100755 index 0000000..112ded3 --- /dev/null +++ b/login/error.ftl @@ -0,0 +1,16 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=false; section> + <#if section = "header"> + ${kcSanitize(msg("errorTitle"))?no_esc} + <#elseif section = "form"> +
+

${kcSanitize(message.summary)?no_esc}

+ <#if skipLink??> + <#else> + <#if client?? && client.baseUrl?has_content> +

${kcSanitize(msg("backToApplication"))?no_esc}

+ + +
+ + \ No newline at end of file diff --git a/login/frontchannel-logout.ftl b/login/frontchannel-logout.ftl new file mode 100644 index 0000000..3de7d25 --- /dev/null +++ b/login/frontchannel-logout.ftl @@ -0,0 +1,30 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + + ${msg("frontchannel-logout.title")} + <#elseif section = "form"> +

${msg("frontchannel-logout.message")}

+ + <#if logout.logoutRedirectUri?has_content> + + ${msg("doContinue")} + + + diff --git a/login/idp-review-user-profile.ftl b/login/idp-review-user-profile.ftl new file mode 100644 index 0000000..1b70aec --- /dev/null +++ b/login/idp-review-user-profile.ftl @@ -0,0 +1,23 @@ +<#import "template.ftl" as layout> +<#import "user-profile-commons.ftl" as userProfileCommons> +<@layout.registrationLayout displayMessage=messagesPerField.exists('global') displayRequiredFields=true; section> + <#if section = "header"> + ${msg("loginIdpReviewProfileTitle")} + <#elseif section = "form"> +
+ + <@userProfileCommons.userProfileFormFields/> + +
+
+
+
+
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/login/info.ftl b/login/info.ftl new file mode 100755 index 0000000..8da0cb7 --- /dev/null +++ b/login/info.ftl @@ -0,0 +1,24 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=false; section> + <#if section = "header"> + <#if messageHeader??> + ${messageHeader} + <#else> + ${message.summary} + + <#elseif section = "form"> +
+

${message.summary}<#if requiredActions??><#list requiredActions>: <#items as reqActionItem>${msg("requiredAction.${reqActionItem}")}<#sep>, <#else>

+ <#if skipLink??> + <#else> + <#if pageRedirectUri?has_content> +

${kcSanitize(msg("backToApplication"))?no_esc}

+ <#elseif actionUri?has_content> +

${kcSanitize(msg("proceedWithAction"))?no_esc}

+ <#elseif (client.baseUrl)?has_content> +

${kcSanitize(msg("backToApplication"))?no_esc}

+ + +
+ + \ No newline at end of file diff --git a/login/login-config-totp.ftl b/login/login-config-totp.ftl new file mode 100755 index 0000000..8014585 --- /dev/null +++ b/login/login-config-totp.ftl @@ -0,0 +1,108 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayRequiredFields=false displayMessage=!messagesPerField.existsError('totp','userLabel'); section> + + <#if section = "header"> + ${msg("loginTotpTitle")} + <#elseif section = "form"> +
    +
  1. +

    ${msg("loginTotpStep1")}

    + + +
  2. + + <#if mode?? && mode = "manual"> +
  3. +

    ${msg("loginTotpManualStep2")}

    +

    ${totp.totpSecretEncoded}

    +

    ${msg("loginTotpScanBarcode")}

    +
  4. +
  5. +

    ${msg("loginTotpManualStep3")}

    +

    +

    +

    +
  6. + <#else> +
  7. +

    ${msg("loginTotpStep2")}

    + Figure: Barcode
    +

    ${msg("loginTotpUnableToScan")}

    +
  8. + +
  9. +

    ${msg("loginTotpStep3")}

    +

    ${msg("loginTotpStep3DeviceName")}

    +
  10. +
+ +
+
+
+ * +
+
+ + + <#if messagesPerField.existsError('totp')> + + ${kcSanitize(messagesPerField.get('totp'))?no_esc} + + + +
+ + <#if mode??> +
+ +
+
+ <#if totp.otpCredentials?size gte 1>* +
+ +
+ + + <#if messagesPerField.existsError('userLabel')> + + ${kcSanitize(messagesPerField.get('userLabel'))?no_esc} + + +
+
+ + <#if isAppInitiatedAction??> + + + <#else> + + +
+ + \ No newline at end of file diff --git a/login/login-idp-link-confirm.ftl b/login/login-idp-link-confirm.ftl new file mode 100644 index 0000000..c3537c5 --- /dev/null +++ b/login/login-idp-link-confirm.ftl @@ -0,0 +1,13 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + ${msg("confirmLinkIdpTitle")} + <#elseif section = "form"> +
+
+ + +
+
+ + diff --git a/login/login-idp-link-email.ftl b/login/login-idp-link-email.ftl new file mode 100644 index 0000000..0020178 --- /dev/null +++ b/login/login-idp-link-email.ftl @@ -0,0 +1,16 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + ${msg("emailLinkIdpTitle", idpDisplayName)} + <#elseif section = "form"> +

+ ${msg("emailLinkIdp1", idpDisplayName, brokerContext.username, realm.displayName)} +

+

+ ${msg("emailLinkIdp2")} ${msg("doClickHere")} ${msg("emailLinkIdp3")} +

+

+ ${msg("emailLinkIdp4")} ${msg("doClickHere")} ${msg("emailLinkIdp5")} +

+ + \ No newline at end of file diff --git a/login/login-oauth-grant.ftl b/login/login-oauth-grant.ftl new file mode 100755 index 0000000..d5cfc4a --- /dev/null +++ b/login/login-oauth-grant.ftl @@ -0,0 +1,68 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout bodyClass="oauth"; section> + <#if section = "header"> + <#if client.attributes.logoUri??> + + +

+ <#if client.name?has_content> + ${msg("oauthGrantTitle",advancedMsg(client.name))} + <#else> + ${msg("oauthGrantTitle",client.clientId)} + +

+ <#elseif section = "form"> +
+

${msg("oauthGrantRequest")}

+ + <#if client.attributes.policyUri?? || client.attributes.tosUri??> +

+ <#if client.name?has_content> + ${msg("oauthGrantInformation",advancedMsg(client.name))} + <#else> + ${msg("oauthGrantInformation",client.clientId)} + + <#if client.attributes.tosUri??> + ${msg("oauthGrantReview")} + ${msg("oauthGrantTos")} + + <#if client.attributes.policyUri??> + ${msg("oauthGrantReview")} + ${msg("oauthGrantPolicy")} + +

+ + +
+ +
+
+
+
+
+ +
+
+ + +
+
+
+
+
+
+ + diff --git a/login/login-oauth2-device-verify-user-code.ftl b/login/login-oauth2-device-verify-user-code.ftl new file mode 100644 index 0000000..dfb625f --- /dev/null +++ b/login/login-oauth2-device-verify-user-code.ftl @@ -0,0 +1,31 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + ${msg("oauth2DeviceVerificationTitle")} + <#elseif section = "form"> +
+
+
+ +
+ +
+ +
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+ + \ No newline at end of file diff --git a/login/login-otp.ftl b/login/login-otp.ftl new file mode 100755 index 0000000..a43778d --- /dev/null +++ b/login/login-otp.ftl @@ -0,0 +1,58 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=!messagesPerField.existsError('totp'); section> + <#if section="header"> + ${msg("doLogIn")} + <#elseif section="form"> +
+ <#if otpLogin.userOtpCredentials?size gt 1> +
+
+ <#list otpLogin.userOtpCredentials as otpCredential> + checked="checked"> + + +
+
+ + +
+
+ +
+ +
+ + + <#if messagesPerField.existsError('totp')> + + ${kcSanitize(messagesPerField.get('totp'))?no_esc} + + +
+
+ +
+
+
+
+
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/login/login-page-expired.ftl b/login/login-page-expired.ftl new file mode 100644 index 0000000..2b470e0 --- /dev/null +++ b/login/login-page-expired.ftl @@ -0,0 +1,11 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + ${msg("pageExpiredTitle")} + <#elseif section = "form"> +

+ ${msg("pageExpiredMsg1")} ${msg("doClickHere")} .
+ ${msg("pageExpiredMsg2")} ${msg("doClickHere")} . +

+ + diff --git a/login/login-password.ftl b/login/login-password.ftl new file mode 100755 index 0000000..a0b5bcc --- /dev/null +++ b/login/login-password.ftl @@ -0,0 +1,43 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=!messagesPerField.existsError('password'); section> + <#if section = "header"> + ${msg("doLogIn")} + <#elseif section = "form"> +
+
+
+
+
+ + + <#if messagesPerField.existsError('password')> + + ${kcSanitize(messagesPerField.get('password'))?no_esc} + + +
+ +
+
+
+
+ <#if realm.resetPasswordAllowed> + ${msg("doForgotPassword")} + +
+
+ +
+ +
+
+
+
+ + + diff --git a/login/login-recovery-authn-code-config.ftl b/login/login-recovery-authn-code-config.ftl new file mode 100644 index 0000000..5bd3559 --- /dev/null +++ b/login/login-recovery-authn-code-config.ftl @@ -0,0 +1,184 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + +<#if section = "header"> + ${msg("recovery-code-config-header")} +<#elseif section = "form"> + +
+
+ +
+

+ Warning alert: + ${msg("recovery-code-config-warning-title")} +

+
+

${msg("recovery-code-config-warning-message")}

+
+
+ +
    + <#list recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList as code> +
  1. ${code?counter}: ${code[0..3]}-${code[4..7]}-${code[8..]}
  2. + +
+ + +
+ + + +
+ + +
+ + +
+ +
+ + + + + <#if isAppInitiatedAction??> + + + <#else> + + +
+ + + + diff --git a/login/login-recovery-authn-code-input.ftl b/login/login-recovery-authn-code-input.ftl new file mode 100644 index 0000000..f6cad67 --- /dev/null +++ b/login/login-recovery-authn-code-input.ftl @@ -0,0 +1,32 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + + <#if section = "header"> + ${msg("auth-recovery-code-header")} + <#elseif section = "form"> +
+
+
+ +
+ +
+ +
+
+ +
+
+
+
+
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/login/login-reset-password.ftl b/login/login-reset-password.ftl new file mode 100755 index 0000000..518e3e6 --- /dev/null +++ b/login/login-reset-password.ftl @@ -0,0 +1,50 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayInfo=true displayMessage=!messagesPerField.existsError('username'); section> + <#if section = "header"> + ${msg("emailForgotTitle")} + <#elseif section = "info" > + <#if realm.duplicateEmailsAllowed> + ${msg("emailInstructionUsername")} + <#else> + ${msg("emailInstruction")} + + <#elseif section = "form"> +
+
+ + + <#if messagesPerField.existsError('username')> + + ${kcSanitize(messagesPerField.get('username'))?no_esc} + + +
+
+
+ +
+
+ +
+ +
+
+ + diff --git a/login/login-update-password.ftl b/login/login-update-password.ftl new file mode 100755 index 0000000..b884d75 --- /dev/null +++ b/login/login-update-password.ftl @@ -0,0 +1,71 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=!messagesPerField.existsError('password','password-confirm'); section> + <#if section = "header"> + ${msg("updatePasswordTitle")} + <#elseif section = "form"> +
+ + + +
+
+ +
+
+ + + <#if messagesPerField.existsError('password')> + + ${kcSanitize(messagesPerField.get('password'))?no_esc} + + +
+
+ +
+
+ +
+
+ + + <#if messagesPerField.existsError('password-confirm')> + + ${kcSanitize(messagesPerField.get('password-confirm'))?no_esc} + + + +
+
+ +
+
+
+ <#if isAppInitiatedAction??> +
+ +
+ +
+
+ +
+ <#if isAppInitiatedAction??> + + + <#else> + + +
+
+
+ + \ No newline at end of file diff --git a/login/login-update-profile.ftl b/login/login-update-profile.ftl new file mode 100755 index 0000000..be579b0 --- /dev/null +++ b/login/login-update-profile.ftl @@ -0,0 +1,99 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username','email','firstName','lastName'); section> + <#if section = "header"> + ${msg("loginProfileTitle")} + <#elseif section = "form"> +
+ <#if user.editUsernameAllowed> +
+
+ +
+
+ + + <#if messagesPerField.existsError('username')> + + ${kcSanitize(messagesPerField.get('username'))?no_esc} + + +
+
+ + <#if user.editEmailAllowed> +
+
+ +
+
+ + + <#if messagesPerField.existsError('email')> + + ${kcSanitize(messagesPerField.get('email'))?no_esc} + + +
+
+ + +
+
+ +
+
+ + + <#if messagesPerField.existsError('firstName')> + + ${kcSanitize(messagesPerField.get('firstName'))?no_esc} + + +
+
+ +
+
+ +
+
+ + + <#if messagesPerField.existsError('lastName')> + + ${kcSanitize(messagesPerField.get('lastName'))?no_esc} + + +
+
+ +
+
+
+
+
+ +
+ <#if isAppInitiatedAction??> + + + <#else> + + +
+
+
+ + diff --git a/login/login-username.ftl b/login/login-username.ftl new file mode 100755 index 0000000..02ced45 --- /dev/null +++ b/login/login-username.ftl @@ -0,0 +1,87 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username') displayInfo=(realm.password && realm.registrationAllowed && !registrationDisabled??); section> + <#if section = "header"> + ${msg("loginAccountTitle")} + <#elseif section = "form"> +
+
+ <#if realm.password> +
+ <#if !usernameHidden??> +
+ + + + + <#if messagesPerField.existsError('username')> + + ${kcSanitize(messagesPerField.get('username'))?no_esc} + + +
+ + +
+
+ <#if realm.rememberMe && !usernameHidden??> +
+ +
+ +
+
+ +
+ +
+
+ +
+
+ + <#elseif section = "info" > + <#if realm.password && realm.registrationAllowed && !registrationDisabled??> +
+ ${msg("noAccount")} ${msg("doRegister")} +
+ + <#elseif section = "socialProviders" > + <#if realm.password && social.providers??> +
+
+

${msg("identity-provider-login-label")}

+ + +
+ + + + diff --git a/login/login-verify-email.ftl b/login/login-verify-email.ftl new file mode 100755 index 0000000..b47d8ca --- /dev/null +++ b/login/login-verify-email.ftl @@ -0,0 +1,14 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayInfo=true; section> + <#if section = "header"> + ${msg("emailVerifyTitle")} + <#elseif section = "form"> +

${msg("emailVerifyInstruction1",user.email)}

+ <#elseif section = "info"> +

+ ${msg("emailVerifyInstruction2")} +
+ ${msg("doClickHere")} ${msg("emailVerifyInstruction3")} +

+ + diff --git a/login/login-x509-info.ftl b/login/login-x509-info.ftl new file mode 100644 index 0000000..0228b06 --- /dev/null +++ b/login/login-x509-info.ftl @@ -0,0 +1,55 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + ${msg("doLogIn")} + <#elseif section = "form"> + +
+
+ +
+ +
+ <#if x509.formData.subjectDN??> +
+ +
+ <#else> +
+ +
+ +
+ +
+ + <#if x509.formData.isUserEnabled??> +
+ +
+
+ +
+ + +
+ +
+
+
+
+
+ +
+
+ + <#if x509.formData.isUserEnabled??> + + +
+
+
+
+ + + diff --git a/login/login.ftl b/login/login.ftl index 17b524f..51d2102 100644 --- a/login/login.ftl +++ b/login/login.ftl @@ -58,6 +58,11 @@ + <#if realm.resetPasswordAllowed> +
+ ${msg("doForgotPassword")} +
+
@@ -72,11 +77,6 @@
- <#if realm.resetPasswordAllowed> -
- ${msg("doForgotPassword")} -
-
diff --git a/login/logout-confirm.ftl b/login/logout-confirm.ftl new file mode 100644 index 0000000..6c0b4e9 --- /dev/null +++ b/login/logout-confirm.ftl @@ -0,0 +1,38 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + ${msg("logoutConfirmTitle")} + <#elseif section = "form"> +
+

${msg("logoutConfirmHeader")}

+ +
+ +
+
+
+
+
+ +
+ +
+ +
+
+ +
+ <#if logoutConfirm.skipLink> + <#else> + <#if (client.baseUrl)?has_content> +

${kcSanitize(msg("backToApplication"))?no_esc}

+ + +
+ +
+
+ + diff --git a/login/register-user-profile.ftl b/login/register-user-profile.ftl new file mode 100755 index 0000000..5550d6d --- /dev/null +++ b/login/register-user-profile.ftl @@ -0,0 +1,62 @@ +<#import "template.ftl" as layout> +<#import "user-profile-commons.ftl" as userProfileCommons> +<@layout.registrationLayout displayMessage=messagesPerField.exists('global') displayRequiredFields=true; section> + <#if section = "header"> + ${msg("registerTitle")} + <#elseif section = "form"> +
+ + <@userProfileCommons.userProfileFormFields; callback, attribute> + <#if callback = "afterField"> + <#-- render password fields just under the username or email (if used as username) --> + <#if passwordRequired?? && (attribute.name == 'username' || (attribute.name == 'email' && realm.registrationEmailAsUsername))> +
+ * + + + <#if messagesPerField.existsError('password')> + + ${kcSanitize(messagesPerField.get('password'))?no_esc} + + +
+ +
+ * + + + <#if messagesPerField.existsError('password-confirm')> + + ${kcSanitize(messagesPerField.get('password-confirm'))?no_esc} + + +
+ + + + + <#if recaptchaRequired??> +
+
+
+ + + +
+ + diff --git a/login/register.ftl b/login/register.ftl new file mode 100755 index 0000000..62e1eb1 --- /dev/null +++ b/login/register.ftl @@ -0,0 +1,112 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=!messagesPerField.existsError('firstName','lastName','email','username','password','password-confirm'); section> + <#if section = "header"> + ${msg("registerTitle")} + <#elseif section = "form"> +
+ + + <#if !realm.registrationEmailAsUsername> +
+ + + + <#if messagesPerField.existsError('username')> + + ${kcSanitize(messagesPerField.get('username'))?no_esc} + + +
+ + +
+ + + + <#if messagesPerField.existsError('email')> + + ${kcSanitize(messagesPerField.get('email'))?no_esc} + + +
+ + <#if passwordRequired??> +
+ + + + <#if messagesPerField.existsError('password')> + + ${kcSanitize(messagesPerField.get('password'))?no_esc} + + +
+ +
+ + + + <#if messagesPerField.existsError('password-confirm')> + + ${kcSanitize(messagesPerField.get('password-confirm'))?no_esc} + + +
+ + + <#if recaptchaRequired??> +
+
+
+ + +
+ +
+ +
+ + diff --git a/login/saml-post-form.ftl b/login/saml-post-form.ftl new file mode 100644 index 0000000..94b0c30 --- /dev/null +++ b/login/saml-post-form.ftl @@ -0,0 +1,25 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + ${msg("saml.post-form.title")} + <#elseif section = "form"> + +

${msg("saml.post-form.message")}

+
+ <#if samlPost.SAMLRequest??> + + + <#if samlPost.SAMLResponse??> + + + <#if samlPost.relayState??> + + + + +
+ + diff --git a/login/select-authenticator.ftl b/login/select-authenticator.ftl new file mode 100644 index 0000000..3a73174 --- /dev/null +++ b/login/select-authenticator.ftl @@ -0,0 +1,43 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayInfo=false; section> + <#if section = "header" || section = "show-username"> + + <#if section = "header"> + ${msg("loginChooseAuthenticator")} + + <#elseif section = "form"> + +
+
+ <#list auth.authenticationSelections as authenticationSelection> +
+ +
+ +
+
+
+ ${msg('${authenticationSelection.displayName}')} +
+
+ ${msg('${authenticationSelection.helpText}')} +
+
+
+
+ +
+
+ + +
+
+ + + + diff --git a/login/terms.ftl b/login/terms.ftl new file mode 100755 index 0000000..687b192 --- /dev/null +++ b/login/terms.ftl @@ -0,0 +1,15 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=false; section> + <#if section = "header"> + ${msg("termsTitle")} + <#elseif section = "form"> +
+ ${kcSanitize(msg("termsText"))?no_esc} +
+
+ + +
+
+ + diff --git a/login/theme.properties b/login/theme.properties index c2074dd..33f9bb6 100644 --- a/login/theme.properties +++ b/login/theme.properties @@ -3,6 +3,8 @@ import=common/pub.solar styles= +kcInputClass=ps-input + kcButtonClass=ps-button kcButtonPrimaryClass=ps-button_primary kcButtonLargeClass=ps-button_large diff --git a/login/update-email.ftl b/login/update-email.ftl new file mode 100644 index 0000000..4c85e5b --- /dev/null +++ b/login/update-email.ftl @@ -0,0 +1,42 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=!messagesPerField.existsError('email'); section> + <#if section = "header"> + ${msg("updateEmailTitle")} + <#elseif section = "form"> +
+
+
+ +
+
+ + + <#if messagesPerField.existsError('email')> + + ${kcSanitize(messagesPerField.get('email'))?no_esc} + + +
+
+ +
+
+
+
+
+ +
+ <#if isAppInitiatedAction??> + + + <#else> + + +
+
+
+ + diff --git a/login/update-user-profile.ftl b/login/update-user-profile.ftl new file mode 100755 index 0000000..e09f5c3 --- /dev/null +++ b/login/update-user-profile.ftl @@ -0,0 +1,28 @@ +<#import "template.ftl" as layout> +<#import "user-profile-commons.ftl" as userProfileCommons> +<@layout.registrationLayout displayMessage=messagesPerField.exists('global') displayRequiredFields=true; section> + <#if section = "header"> + ${msg("loginProfileTitle")} + <#elseif section = "form"> +
+ + <@userProfileCommons.userProfileFormFields/> + +
+
+
+
+
+ +
+ <#if isAppInitiatedAction??> + + + <#else> + + +
+
+
+ + \ No newline at end of file diff --git a/login/user-profile-commons.ftl b/login/user-profile-commons.ftl new file mode 100644 index 0000000..140eea3 --- /dev/null +++ b/login/user-profile-commons.ftl @@ -0,0 +1,187 @@ +<#macro userProfileFormFields> + <#assign currentGroup=""> + + <#list profile.attributes as attribute> + + <#assign groupName = attribute.group!""> + <#if groupName != currentGroup> + <#assign currentGroup=groupName> + <#if currentGroup != "" > +
+ + <#assign groupDisplayHeader=attribute.groupDisplayHeader!""> + <#if groupDisplayHeader != ""> + <#assign groupHeaderText=advancedMsg(attribute.groupDisplayHeader)!groupName> + <#else> + <#assign groupHeaderText=groupName> + +
+ +
+ + <#assign groupDisplayDescription=attribute.groupDisplayDescription!""> + <#if groupDisplayDescription != ""> + <#assign groupDescriptionText=advancedMsg(attribute.groupDisplayDescription)!""> +
+ +
+ +
+ + + + <#nested "beforeField" attribute> +
+
+ + <#if attribute.required>* +
+
+ <#if attribute.annotations.inputHelperTextBefore??> +
${kcSanitize(advancedMsg(attribute.annotations.inputHelperTextBefore))?no_esc}
+ + <@inputFieldByType attribute=attribute/> + <#if messagesPerField.existsError('${attribute.name}')> + + ${kcSanitize(messagesPerField.get('${attribute.name}'))?no_esc} + + + <#if attribute.annotations.inputHelperTextAfter??> +
${kcSanitize(advancedMsg(attribute.annotations.inputHelperTextAfter))?no_esc}
+ +
+
+ <#nested "afterField" attribute> + + + +<#macro inputFieldByType attribute> + <#switch attribute.annotations.inputType!''> + <#case 'textarea'> + <@textareaTag attribute=attribute/> + <#break> + <#case 'select'> + <#case 'multiselect'> + <@selectTag attribute=attribute/> + <#break> + <#case 'select-radiobuttons'> + <#case 'multiselect-checkboxes'> + <@inputTagSelects attribute=attribute/> + <#break> + <#default> + <@inputTag attribute=attribute/> + + + +<#macro inputTag attribute> + disabled + <#if attribute.autocomplete??>autocomplete="${attribute.autocomplete}" + <#if attribute.annotations.inputTypePlaceholder??>placeholder="${attribute.annotations.inputTypePlaceholder}" + <#if attribute.annotations.inputTypePattern??>pattern="${attribute.annotations.inputTypePattern}" + <#if attribute.annotations.inputTypeSize??>size="${attribute.annotations.inputTypeSize}" + <#if attribute.annotations.inputTypeMaxlength??>maxlength="${attribute.annotations.inputTypeMaxlength}" + <#if attribute.annotations.inputTypeMinlength??>minlength="${attribute.annotations.inputTypeMinlength}" + <#if attribute.annotations.inputTypeMax??>max="${attribute.annotations.inputTypeMax}" + <#if attribute.annotations.inputTypeMin??>min="${attribute.annotations.inputTypeMin}" + <#if attribute.annotations.inputTypeStep??>step="${attribute.annotations.inputTypeStep}" + /> + + +<#macro inputTagType attribute> + <#compress> + <#if attribute.annotations.inputType??> + <#if attribute.annotations.inputType?starts_with("html5-")> + ${attribute.annotations.inputType[6..]} + <#else> + ${attribute.annotations.inputType} + + <#else> + text + + + + +<#macro textareaTag attribute> + + + +<#macro selectTag attribute> + + + +<#macro inputTagSelects attribute> + <#if attribute.annotations.inputType=='select-radiobuttons'> + <#assign inputType='radio'> + <#assign classDiv=properties.kcInputClassRadio!> + <#assign classInput=properties.kcInputClassRadioInput!> + <#assign classLabel=properties.kcInputClassRadioLabel!> + <#else> + <#assign inputType='checkbox'> + <#assign classDiv=properties.kcInputClassCheckbox!> + <#assign classInput=properties.kcInputClassCheckboxInput!> + <#assign classLabel=properties.kcInputClassCheckboxLabel!> + + + <#if attribute.annotations.inputOptionsFromValidation?? && attribute.validators[attribute.annotations.inputOptionsFromValidation]?? && attribute.validators[attribute.annotations.inputOptionsFromValidation].options??> + <#assign options=attribute.validators[attribute.annotations.inputOptionsFromValidation].options> + <#elseif attribute.validators.options?? && attribute.validators.options.options??> + <#assign options=attribute.validators.options.options> + + + <#if options??> + <#list options as option> +
+ disabled + <#if attribute.values?seq_contains(option)>checked + /> + +
+ + + + + +<#macro selectOptionLabelText attribute option> + <#compress> + <#if attribute.annotations.inputOptionLabels??> + ${advancedMsg(attribute.annotations.inputOptionLabels[option]!option)} + <#else> + <#if attribute.annotations.inputOptionLabelsI18nPrefix??> + ${msg(attribute.annotations.inputOptionLabelsI18nPrefix + '.' + option)} + <#else> + ${option} + + + + \ No newline at end of file diff --git a/login/webauthn-authenticate.ftl b/login/webauthn-authenticate.ftl new file mode 100644 index 0000000..a07f750 --- /dev/null +++ b/login/webauthn-authenticate.ftl @@ -0,0 +1,168 @@ + <#import "template.ftl" as layout> + <@layout.registrationLayout; section> + <#if section = "title"> + title + <#elseif section = "header"> + ${kcSanitize(msg("webauthn-login-title"))?no_esc} + <#elseif section = "form"> +
+
+ + + + + + +
+ +
+ <#if authenticators??> +
+ <#list authenticators.authenticators as authenticator> + + +
+ + <#if shouldDisplayAuthenticators?? && shouldDisplayAuthenticators> + <#if authenticators.authenticators?size gt 1> +

${kcSanitize(msg("webauthn-available-authenticators"))?no_esc}

+ + +
+ <#list authenticators.authenticators as authenticator> +
+
+ +
+
+
+ ${kcSanitize(msg('${authenticator.label}'))?no_esc} +
+ + <#if authenticator.transports?? && authenticator.transports.displayNameProperties?has_content> +
+ <#list authenticator.transports.displayNameProperties as nameProperty> + ${kcSanitize(msg('${nameProperty!}'))?no_esc} + <#if nameProperty?has_next> + , + + +
+ + +
+ + ${kcSanitize(msg('webauthn-createdAt-label'))?no_esc} + + + ${kcSanitize(authenticator.createdAt)?no_esc} + +
+
+
+
+ +
+ + + +
+ +
+
+
+ + + + + <#elseif section = "info"> + + + diff --git a/login/webauthn-error.ftl b/login/webauthn-error.ftl new file mode 100644 index 0000000..2474a3f --- /dev/null +++ b/login/webauthn-error.ftl @@ -0,0 +1,36 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout displayMessage=true; section> + <#if section = "header"> + ${kcSanitize(msg("webauthn-error-title"))?no_esc} + <#elseif section = "form"> + + + +
+ + +
+ + + + <#if isAppInitiatedAction??> +
+ +
+ + + + \ No newline at end of file diff --git a/login/webauthn-register.ftl b/login/webauthn-register.ftl new file mode 100644 index 0000000..1beb31e --- /dev/null +++ b/login/webauthn-register.ftl @@ -0,0 +1,197 @@ + <#import "template.ftl" as layout> + <@layout.registrationLayout; section> + <#if section = "title"> + title + <#elseif section = "header"> + + ${kcSanitize(msg("webauthn-registration-title"))?no_esc} + <#elseif section = "form"> + +
+
+ + + + + + +
+
+ + + + + + + <#if !isSetRetry?has_content && isAppInitiatedAction?has_content> +
+ +
+ + + +