From 206e602d73f8ede4d6a5fdb7b4e3db90925120c7 Mon Sep 17 00:00:00 2001 From: garronej Date: Thu, 15 Jun 2023 17:10:15 +0200 Subject: [PATCH] Accomodate #218 and #359 --- package.json | 2 +- src/account/kcContext/KcContext.ts | 27 +- ..._object_to_js_code_declaring_an_object.ftl | 426 +++++++++++++++--- src/login/kcContext/KcContext.ts | 27 +- 4 files changed, 410 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index d044062f..fa07e4ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "keycloakify", - "version": "7.12.2", + "version": "7.12.4", "description": "Create Keycloak themes using React", "repository": { "type": "git", diff --git a/src/account/kcContext/KcContext.ts b/src/account/kcContext/KcContext.ts index 6187c77c..0e49c5f2 100644 --- a/src/account/kcContext/KcContext.ts +++ b/src/account/kcContext/KcContext.ts @@ -52,9 +52,34 @@ export declare namespace KcContext { name: string; // Client id }; messagesPerField: { - printIfExists: (fieldName: string, x: T) => T | undefined; + /** + * Return text if message for given field exists. Useful eg. to add css styles for fields with message. + * + * @param fieldName to check for + * @param text to return + * @return text if message exists for given field, else undefined + */ + printIfExists: (fieldName: string, text: T) => T | undefined; + /** + * Check if exists error message for given fields + * + * @param fields + * @return boolean + */ existsError: (fieldName: string) => boolean; + /** + * Get message for given field. + * + * @param fieldName + * @return message text or empty string + */ get: (fieldName: string) => string; + /** + * Check if message for given field exists + * + * @param field + * @return boolean + */ exists: (fieldName: string) => boolean; }; account: { diff --git a/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl b/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl index a9d9cd90..1ae52808 100644 --- a/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +++ b/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl @@ -28,85 +28,373 @@ <#recover> - "printIfExists": function (fieldName, x) { - <#if !messagesPerField?? > - return undefined; - <#else> - <#list fieldNames as fieldName> - if(fieldName === "${fieldName}" ){ - <#attempt> - <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> - return <#if messagesPerField.existsError('username', 'password')>x<#else>undefined; - <#else> - return <#if messagesPerField.existsError('${fieldName}')>x<#else>undefined; - - <#recover> - - } - - throw new Error("There is no " + fieldName + " field"); + "printIfExists": function (fieldName, text) { + + <#if !messagesPerField?? || !(messagesPerField?is_hash)> + throw new Error("You're not supposed to use messagesPerField.printIfExists in this page"); + + <#list fieldNames as fieldName> + if(fieldName === "${fieldName}" ){ + + <#-- https://github.com/keycloakify/keycloakify/pull/359 Compat with Keycloak prior v12 --> + <#if !messagesPerField.existsError??> + + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> + + <#local doExistMessageForUsernameOrPassword = ""> + + <#attempt> + <#local doExistMessageForUsernameOrPassword = messagesPerField.exists('username')> + <#recover> + <#local doExistMessageForUsernameOrPassword = true> + + + <#if !doExists> + <#attempt> + <#local doExistMessageForUsernameOrPassword = messagesPerField.exists('password')> + <#recover> + <#local doExistMessageForUsernameOrPassword = true> + + + + return <#if doExistMessageForUsernameOrPassword>text<#else>undefined; + + <#else> + + <#local doExistMessageForField = ""> + + <#attempt> + <#local doExistMessageForField = messagesPerField.exists('${fieldName}')> + <#recover> + <#local doExistMessageForField = true> + + + return <#if doExistMessageForField>text<#else>undefined; + + + + <#else> + + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> + + <#local doExistErrorOnUsernameOrPassword = ""> + + <#attempt> + <#local doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')> + <#recover> + <#local doExistErrorOnUsernameOrPassword = true> + + + <#if doExistErrorOnUsernameOrPassword> + return text; + <#else> + + <#local doExistMessageForField = ""> + + <#attempt> + <#local doExistMessageForField = messagesPerField.exists('${fieldName}')> + <#recover> + <#local doExistMessageForField = true> + + + return <#if doExistMessageForField>text<#else>undefined; + + + + <#else> + + <#local doExistMessageForField = ""> + + <#attempt> + <#local doExistMessageForField = messagesPerField.exists('${fieldName}')> + <#recover> + <#local doExistMessageForField = true> + + + return <#if doExistMessageForField>text<#else>undefined; + + + + + + } + + + throw new Error("There is no " + fieldName + " field. See: https://docs.keycloakify.dev/build-options#keycloakify.customuserattributes"); }, "existsError": function (fieldName) { - <#if !messagesPerField?? > - return false; - <#else> - <#list fieldNames as fieldName> - if(fieldName === "${fieldName}" ){ - <#attempt> - <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> - return <#if messagesPerField.existsError('username', 'password')>true<#else>false; - <#else> - return <#if messagesPerField.existsError('${fieldName}')>true<#else>false; - - <#recover> - - } - - throw new Error("There is no " + fieldName + " field"); + + <#if !messagesPerField?? || !(messagesPerField?is_hash)> + throw new Error("You're not supposed to use messagesPerField.printIfExists in this page"); + + <#list fieldNames as fieldName> + if(fieldName === "${fieldName}" ){ + + <#-- https://github.com/keycloakify/keycloakify/pull/359 Compat with Keycloak prior v12 --> + <#if !messagesPerField.existsError??> + + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> + + <#local doExistMessageForUsernameOrPassword = ""> + + <#attempt> + <#local doExistMessageForUsernameOrPassword = messagesPerField.exists('username')> + <#recover> + <#local doExistMessageForUsernameOrPassword = true> + + + <#if !doExistMessageForUsernameOrPassword> + <#attempt> + <#local doExistMessageForUsernameOrPassword = messagesPerField.exists('password')> + <#recover> + <#local doExistMessageForUsernameOrPassword = true> + + + + return <#if doExistMessageForUsernameOrPassword>true<#else>false; + + <#else> + + <#local doExistMessageForField = ""> + + <#attempt> + <#local doExistMessageForField = messagesPerField.exists('${fieldName}')> + <#recover> + <#local doExistMessageForField = true> + + + return <#if doExistMessageForField>true<#else>false; + + + + <#else> + + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> + + <#local doExistErrorOnUsernameOrPassword = ""> + + <#attempt> + <#local doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')> + <#recover> + <#local doExistErrorOnUsernameOrPassword = true> + + + return <#if doExistErrorOnUsernameOrPassword>true<#else>false; + + <#else> + + <#local doExistErrorMessageForField = ""> + + <#attempt> + <#local doExistErrorMessageForField = messagesPerField.existsError('${fieldName}')> + <#recover> + <#local doExistErrorMessageForField = true> + + + return <#if doExistErrorMessageForField>true<#else>false; + + + + + + } + + + throw new Error("There is no " + fieldName + " field. See: https://docs.keycloakify.dev/build-options#keycloakify.customuserattributes"); + }, "get": function (fieldName) { - <#if !messagesPerField?? > - return ''; - <#else> - <#list fieldNames as fieldName> - if(fieldName === "${fieldName}" ){ - <#attempt> - <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> - <#if messagesPerField.existsError('username', 'password')> - return 'Invalid username or password.'; - - <#else> - <#if messagesPerField.existsError('${fieldName}')> - return "${messagesPerField.get('${fieldName}')?no_esc}"; - - - <#recover> - - } - - throw new Error("There is no " + fieldName + " field"); + + + <#if !messagesPerField?? || !(messagesPerField?is_hash)> + throw new Error("You're not supposed to use messagesPerField.get in this page"); + + <#list fieldNames as fieldName> + if(fieldName === "${fieldName}" ){ + + <#-- https://github.com/keycloakify/keycloakify/pull/359 Compat with Keycloak prior v12 --> + <#if !messagesPerField.existsError??> + + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> + + <#local doExistMessageForUsernameOrPassword = ""> + + <#attempt> + <#local doExistMessageForUsernameOrPassword = messagesPerField.exists('username')> + <#recover> + <#local doExistMessageForUsernameOrPassword = true> + + + <#if !doExistMessageForUsernameOrPassword> + <#attempt> + <#local doExistMessageForUsernameOrPassword = messagesPerField.exists('password')> + <#recover> + <#local doExistMessageForUsernameOrPassword = true> + + + + <#if !doExistMessageForUsernameOrPassword> + return ""; + <#else> + <#attempt> + return "${kcSanitize(msg('invalidUserMessage'))?no_esc}"; + <#recover> + return "Invalid username or password."; + + + + <#else> + + <#attempt> + return "${messagesPerField.get('${fieldName}')?no_esc}"; + <#recover> + return "invalid field"; + + + + + <#else> + + // CONITNUE HERE!!!!! + + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> + + <#local doExistErrorOnUsernameOrPassword = ""> + + <#attempt> + <#local doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')> + <#recover> + <#local doExistErrorOnUsernameOrPassword = true> + + + <#if doExistErrorOnUsernameOrPassword> + + <#attempt> + return "${kcSanitize(msg('invalidUserMessage'))?no_esc}"; + <#recover> + return "Invalid username or password."; + + + <#else> + + <#attempt> + return "${messagesPerField.get('${fieldName}')?no_esc}"; + <#recover> + return ""; + + + + + <#else> + + <#attempt> + return "${messagesPerField.get('${fieldName}')?no_esc}"; + <#recover> + return "invalid field"; + + + + + + + } + + + throw new Error("There is no " + fieldName + " field. See: https://docs.keycloakify.dev/build-options#keycloakify.customuserattributes"); + }, "exists": function (fieldName) { - <#if !messagesPerField?? > - return false; - <#else> - <#list fieldNames as fieldName> - if(fieldName === "${fieldName}" ){ - <#attempt> - <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> - return <#if messagesPerField.exists('username') || messagesPerField.exists('password')>true<#else>false; - <#else> - return <#if messagesPerField.exists('${fieldName}')>true<#else>false; - - <#recover> - - } - - throw new Error("There is no " + fieldName + " field"); + + <#if !messagesPerField?? || !(messagesPerField?is_hash)> + throw new Error("You're not supposed to use messagesPerField.exists in this page"); + + <#list fieldNames as fieldName> + if(fieldName === "${fieldName}" ){ + + <#-- https://github.com/keycloakify/keycloakify/pull/359 Compat with Keycloak prior v12 --> + <#if !messagesPerField.existsError??> + + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> + + <#local doExistMessageForUsernameOrPassword = ""> + + <#attempt> + <#local doExistMessageForUsernameOrPassword = messagesPerField.exists('username')> + <#recover> + <#local doExistMessageForUsernameOrPassword = true> + + + <#if !doExistMessageForUsernameOrPassword> + <#attempt> + <#local doExistMessageForUsernameOrPassword = messagesPerField.exists('password')> + <#recover> + <#local doExistMessageForUsernameOrPassword = true> + + + + return <#if doExistMessageForUsernameOrPassword>true<#else>false; + + <#else> + + <#local doExistMessageForField = ""> + + <#attempt> + <#local doExistMessageForField = messagesPerField.exists('${fieldName}')> + <#recover> + <#local doExistMessageForField = true> + + + return <#if doExistMessageForField>true<#else>false; + + + + <#else> + + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if '${fieldName}' == 'username' || '${fieldName}' == 'password'> + + <#local doExistErrorOnUsernameOrPassword = ""> + + <#attempt> + <#local doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')> + <#recover> + <#local doExistErrorOnUsernameOrPassword = true> + + + return <#if doExistErrorOnUsernameOrPassword>true<#else>false; + + <#else> + + <#local doExistErrorMessageForField = ""> + + <#attempt> + <#local doExistErrorMessageForField = messagesPerField.exists('${fieldName}')> + <#recover> + <#local doExistErrorMessageForField = true> + + + return <#if doExistErrorMessageForField>true<#else>false; + + + + + + } + + + throw new Error("There is no " + fieldName + " field. See: https://docs.keycloakify.dev/build-options#keycloakify.customuserattributes"); + } }; diff --git a/src/login/kcContext/KcContext.ts b/src/login/kcContext/KcContext.ts index 075f4e51..8324feb2 100644 --- a/src/login/kcContext/KcContext.ts +++ b/src/login/kcContext/KcContext.ts @@ -81,9 +81,34 @@ export declare namespace KcContext { }; isAppInitiatedAction: boolean; messagesPerField: { - printIfExists: (fieldName: string, x: T) => T | undefined; + /** + * Return text if message for given field exists. Useful eg. to add css styles for fields with message. + * + * @param fieldName to check for + * @param text to return + * @return text if message exists for given field, else undefined + */ + printIfExists: (fieldName: string, text: T) => T | undefined; + /** + * Check if exists error message for given fields + * + * @param fields + * @return boolean + */ existsError: (fieldName: string) => boolean; + /** + * Get message for given field. + * + * @param fieldName + * @return message text or empty string + */ get: (fieldName: string) => string; + /** + * Check if message for given field exists + * + * @param field + * @return boolean + */ exists: (fieldName: string) => boolean; }; };