keycloakify 10.0.0-rc.21 → 10.0.0-rc.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/account/i18n/i18n.d.ts +19 -4
- package/account/i18n/i18n.js +26 -17
- package/account/i18n/i18n.js.map +1 -1
- package/account/pages/Totp.js +2 -2
- package/account/pages/Totp.js.map +1 -1
- package/login/i18n/i18n.d.ts +19 -4
- package/login/i18n/i18n.js +22 -15
- package/login/i18n/i18n.js.map +1 -1
- package/login/pages/LoginConfigTotp.js +2 -2
- package/login/pages/LoginConfigTotp.js.map +1 -1
- package/login/pages/WebauthnAuthenticate.js +2 -2
- package/login/pages/WebauthnAuthenticate.js.map +1 -1
- package/package.json +1 -1
- package/src/account/i18n/i18n.tsx +55 -26
- package/src/account/pages/Totp.tsx +2 -5
- package/src/login/i18n/i18n.tsx +47 -16
- package/src/login/pages/LoginConfigTotp.tsx +2 -3
- package/src/login/pages/WebauthnAuthenticate.tsx +2 -3
package/account/i18n/i18n.d.ts
CHANGED
@@ -46,16 +46,31 @@ export type GenericI18n<MessageKey extends string> = {
|
|
46
46
|
*/
|
47
47
|
msgStr: (key: MessageKey, ...args: (string | undefined)[]) => string;
|
48
48
|
/**
|
49
|
+
* This is meant to be used when the key argument is variable, something that might have been configured by the user
|
50
|
+
* in the Keycloak admin for example.
|
51
|
+
*
|
49
52
|
* Examples assuming currentLanguageTag === "en"
|
50
|
-
*
|
53
|
+
* {
|
54
|
+
* en: {
|
55
|
+
* "access-denied": "Access denied",
|
56
|
+
* "foo": "Foo {0} {1}",
|
57
|
+
* "bar": "Bar {0}"
|
58
|
+
* }
|
59
|
+
* }
|
60
|
+
*
|
61
|
+
* advancedMsg("${access-denied} foo bar") === <span>{msgStr("access-denied")} foo bar<span> === <span>Access denied foo bar</span>
|
51
62
|
* advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied") === <span>Access denied</span>
|
52
63
|
* advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === <span>not-a-message-key</span>
|
64
|
+
* advancedMsg("${bar}", "<strong>c</strong>")
|
65
|
+
* === <span>{msgStr("bar", "<strong>XXX</strong>")}<span>
|
66
|
+
* === <span>Bar <strong>XXX</strong></span> (The html in the arg is partially escaped for security reasons, it might be untrusted)
|
67
|
+
* advancedMsg("${foo} xx ${bar}", "a", "b", "c")
|
68
|
+
* === <span>{msgStr("foo", "a", "b")} xx {msgStr("bar")}<span>
|
69
|
+
* === <span>Foo a b xx Bar {0}</span> (The substitution are only applied in the first message)
|
53
70
|
*/
|
54
71
|
advancedMsg: (key: string, ...args: (string | undefined)[]) => JSX.Element;
|
55
72
|
/**
|
56
|
-
*
|
57
|
-
* advancedMsg("${access-denied} foo bar") === msg("access-denied") + " foo bar" === "Access denied foo bar"
|
58
|
-
* advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === "not-a-message-key"
|
73
|
+
* See advancedMsg() but instead of returning a JSX.Element it returns a string.
|
59
74
|
*/
|
60
75
|
advancedMsgStr: (key: string, ...args: (string | undefined)[]) => string;
|
61
76
|
};
|
package/account/i18n/i18n.js
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
2
2
|
import "minimal-polyfills/Object.fromEntries";
|
3
|
-
//NOTE for later: https://github.com/remarkjs/react-markdown/blob/236182ecf30bd89c1e5a7652acaf8d0bf81e6170/src/renderers.js#L7-L35
|
4
3
|
import { useEffect, useState, useRef } from "react";
|
5
4
|
import fallbackMessages from "./baseMessages/en";
|
6
5
|
import { getMessages } from "./baseMessages";
|
7
6
|
import { assert } from "tsafe/assert";
|
8
|
-
import { Markdown } from "../../tools/Markdown";
|
9
7
|
export const fallbackLanguageTag = "en";
|
10
8
|
assert();
|
11
9
|
export function createUseI18n(extraMessages) {
|
@@ -41,7 +39,7 @@ function createI18nTranslationFunctions(params) {
|
|
41
39
|
const { fallbackMessages, messages } = params;
|
42
40
|
function resolveMsg(props) {
|
43
41
|
var _a;
|
44
|
-
const { key, args,
|
42
|
+
const { key, args, doRenderAsHtml } = props;
|
45
43
|
const messageOrUndefined = (_a = messages[key]) !== null && _a !== void 0 ? _a : fallbackMessages[key];
|
46
44
|
if (messageOrUndefined === undefined) {
|
47
45
|
return undefined;
|
@@ -60,35 +58,46 @@ function createI18nTranslationFunctions(params) {
|
|
60
58
|
if (arg === undefined) {
|
61
59
|
return;
|
62
60
|
}
|
63
|
-
messageWithArgsInjected = messageWithArgsInjected.replace(new RegExp(`\\{${i + startIndex}\\}`, "g"), arg);
|
61
|
+
messageWithArgsInjected = messageWithArgsInjected.replace(new RegExp(`\\{${i + startIndex}\\}`, "g"), arg.replace(/</g, "<").replace(/>/g, ">"));
|
64
62
|
});
|
65
63
|
return messageWithArgsInjected;
|
66
64
|
})();
|
67
|
-
return
|
65
|
+
return doRenderAsHtml ? (_jsx("span", {
|
66
|
+
// NOTE: The message is trusted. The arguments are not but are escaped.
|
67
|
+
dangerouslySetInnerHTML: {
|
68
|
+
__html: messageWithArgsInjectedIfAny
|
69
|
+
} })) : (messageWithArgsInjectedIfAny);
|
68
70
|
}
|
69
71
|
function resolveMsgAdvanced(props) {
|
70
|
-
const { key, args,
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
const { key, args, doRenderAsHtml } = props;
|
73
|
+
if (!/\$\{[^}]+\}/.test(key)) {
|
74
|
+
const resolvedMessage = resolveMsg({ key, args, doRenderAsHtml });
|
75
|
+
if (resolvedMessage === undefined) {
|
76
|
+
return doRenderAsHtml ? _jsx("span", { dangerouslySetInnerHTML: { __html: key } }) : key;
|
77
|
+
}
|
78
|
+
return resolvedMessage;
|
79
|
+
}
|
80
|
+
let isFirstMatch = true;
|
81
|
+
const resolvedComplexMessage = key.replace(/\$\{([^}]+)\}/g, (...[, key_i]) => {
|
82
|
+
var _a;
|
83
|
+
const replaceBy = (_a = resolveMsg({ key: key_i, args: isFirstMatch ? args : [], doRenderAsHtml: false })) !== null && _a !== void 0 ? _a : key_i;
|
84
|
+
isFirstMatch = false;
|
85
|
+
return replaceBy;
|
77
86
|
});
|
78
|
-
return
|
87
|
+
return doRenderAsHtml ? _jsx("span", { dangerouslySetInnerHTML: { __html: resolvedComplexMessage } }) : resolvedComplexMessage;
|
79
88
|
}
|
80
89
|
return {
|
81
|
-
msgStr: (key, ...args) => resolveMsg({ key, args,
|
82
|
-
msg: (key, ...args) => resolveMsg({ key, args,
|
90
|
+
msgStr: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: false }),
|
91
|
+
msg: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: true }),
|
83
92
|
advancedMsg: (key, ...args) => resolveMsgAdvanced({
|
84
93
|
key,
|
85
94
|
args,
|
86
|
-
|
95
|
+
doRenderAsHtml: true
|
87
96
|
}),
|
88
97
|
advancedMsgStr: (key, ...args) => resolveMsgAdvanced({
|
89
98
|
key,
|
90
99
|
args,
|
91
|
-
|
100
|
+
doRenderAsHtml: false
|
92
101
|
})
|
93
102
|
};
|
94
103
|
}
|
package/account/i18n/i18n.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/account/i18n/i18n.tsx"],"names":[],"mappings":";AAAA,OAAO,sCAAsC,CAAC;AAC9C,
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/account/i18n/i18n.tsx"],"names":[],"mappings":"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"}
|
package/account/pages/Totp.js
CHANGED
@@ -9,12 +9,12 @@ export default function Totp(props) {
|
|
9
9
|
classes
|
10
10
|
});
|
11
11
|
const { totp, mode, url, messagesPerField, stateChecker } = kcContext;
|
12
|
-
const { msg, msgStr } = i18n;
|
12
|
+
const { msg, msgStr, advancedMsg } = i18n;
|
13
13
|
const algToKeyUriAlg = {
|
14
14
|
HmacSHA1: "SHA1",
|
15
15
|
HmacSHA256: "SHA256",
|
16
16
|
HmacSHA512: "SHA512"
|
17
17
|
};
|
18
|
-
return (_jsx(Template, { kcContext, i18n, doUseDefaultCss, classes, active: "totp", children: _jsxs(_Fragment, { children: [_jsxs("div", { className: "row", children: [_jsx("div", { className: "col-md-10", children: _jsx("h2", { children: msg("authenticatorTitle") }) }), totp.otpCredentials.length === 0 && (_jsxs("div", { className: "subtitle col-md-2", children: [_jsx("span", { className: "required", children: "*" }), msg("requiredFields")] }))] }), totp.enabled && (_jsxs("table", { className: "table table-bordered table-striped", children: [_jsx("thead", { children: totp.otpCredentials.length > 1 ? (_jsx("tr", { children: _jsx("th", { colSpan: 4, children: msg("configureAuthenticators") }) })) : (_jsx("tr", { children: _jsx("th", { colSpan: 3, children: msg("configureAuthenticators") }) })) }), _jsx("tbody", { children: totp.otpCredentials.map((credential, index) => (_jsxs("tr", { children: [_jsx("td", { className: "provider", children: msg("mobile") }), totp.otpCredentials.length > 1 && _jsx("td", { className: "provider", children: credential.id }), _jsx("td", { className: "provider", children: credential.userLabel || "" }), _jsx("td", { className: "action", children: _jsxs("form", { action: url.totpUrl, method: "post", className: "form-inline", children: [_jsx("input", { type: "hidden", id: "stateChecker", name: "stateChecker", value: stateChecker }), _jsx("input", { type: "hidden", id: "submitAction", name: "submitAction", value: "Delete" }), _jsx("input", { type: "hidden", id: "credentialId", name: "credentialId", value: credential.id }), _jsx("button", { id: `remove-mobile-${index}`, className: "btn btn-default", children: _jsx("i", { className: "pficon pficon-delete" }) })] }) })] }, index))) })] })), !totp.enabled && (_jsxs("div", { children: [_jsx("hr", {}), _jsxs("ol", { id: "kc-totp-settings", children: [_jsxs("li", { children: [_jsx("p", { children: msg("totpStep1") }), _jsx("ul", { id: "kc-totp-supported-apps", children: (_a = totp.supportedApplications) === null || _a === void 0 ? void 0 : _a.map(app => _jsx("li", { children:
|
18
|
+
return (_jsx(Template, { kcContext, i18n, doUseDefaultCss, classes, active: "totp", children: _jsxs(_Fragment, { children: [_jsxs("div", { className: "row", children: [_jsx("div", { className: "col-md-10", children: _jsx("h2", { children: msg("authenticatorTitle") }) }), totp.otpCredentials.length === 0 && (_jsxs("div", { className: "subtitle col-md-2", children: [_jsx("span", { className: "required", children: "*" }), msg("requiredFields")] }))] }), totp.enabled && (_jsxs("table", { className: "table table-bordered table-striped", children: [_jsx("thead", { children: totp.otpCredentials.length > 1 ? (_jsx("tr", { children: _jsx("th", { colSpan: 4, children: msg("configureAuthenticators") }) })) : (_jsx("tr", { children: _jsx("th", { colSpan: 3, children: msg("configureAuthenticators") }) })) }), _jsx("tbody", { children: totp.otpCredentials.map((credential, index) => (_jsxs("tr", { children: [_jsx("td", { className: "provider", children: msg("mobile") }), totp.otpCredentials.length > 1 && _jsx("td", { className: "provider", children: credential.id }), _jsx("td", { className: "provider", children: credential.userLabel || "" }), _jsx("td", { className: "action", children: _jsxs("form", { action: url.totpUrl, method: "post", className: "form-inline", children: [_jsx("input", { type: "hidden", id: "stateChecker", name: "stateChecker", value: stateChecker }), _jsx("input", { type: "hidden", id: "submitAction", name: "submitAction", value: "Delete" }), _jsx("input", { type: "hidden", id: "credentialId", name: "credentialId", value: credential.id }), _jsx("button", { id: `remove-mobile-${index}`, className: "btn btn-default", children: _jsx("i", { className: "pficon pficon-delete" }) })] }) })] }, index))) })] })), !totp.enabled && (_jsxs("div", { children: [_jsx("hr", {}), _jsxs("ol", { id: "kc-totp-settings", children: [_jsxs("li", { children: [_jsx("p", { children: msg("totpStep1") }), _jsx("ul", { id: "kc-totp-supported-apps", children: (_a = totp.supportedApplications) === null || _a === void 0 ? void 0 : _a.map(app => _jsx("li", { children: advancedMsg(app) }, app)) })] }), mode && mode == "manual" ? (_jsxs(_Fragment, { children: [_jsxs("li", { children: [_jsx("p", { children: msg("totpManualStep2") }), _jsx("p", { children: _jsx("span", { id: "kc-totp-secret-key", children: totp.totpSecretEncoded }) }), _jsx("p", { children: _jsx("a", { href: totp.qrUrl, id: "mode-barcode", children: msg("totpScanBarcode") }) })] }), _jsxs("li", { children: [_jsx("p", { children: msg("totpManualStep3") }), _jsxs("ul", { children: [_jsxs("li", { id: "kc-totp-type", children: [msg("totpType"), ": ", msg(`totp.${totp.policy.type}`)] }), _jsxs("li", { id: "kc-totp-algorithm", children: [msg("totpAlgorithm"), ": ", (_b = algToKeyUriAlg === null || algToKeyUriAlg === void 0 ? void 0 : algToKeyUriAlg[totp.policy.algorithm]) !== null && _b !== void 0 ? _b : totp.policy.algorithm] }), _jsxs("li", { id: "kc-totp-digits", children: [msg("totpDigits"), ": ", totp.policy.digits] }), totp.policy.type === "totp" ? (_jsxs("li", { id: "kc-totp-period", children: [msg("totpInterval"), ": ", totp.policy.period] })) : (_jsxs("li", { id: "kc-totp-counter", children: [msg("totpCounter"), ": ", totp.policy.initialCounter] }))] })] })] })) : (_jsxs("li", { children: [_jsx("p", { children: msg("totpStep2") }), _jsx("p", { children: _jsx("img", { id: "kc-totp-secret-qr-code", src: `data:image/png;base64, ${totp.totpSecretQrCode}`, alt: "Figure: Barcode" }) }), _jsx("p", { children: _jsx("a", { href: totp.manualUrl, id: "mode-manual", children: msg("totpUnableToScan") }) })] })), _jsxs("li", { children: [_jsx("p", { children: msg("totpStep3") }), _jsx("p", { children: msg("totpStep3DeviceName") })] })] }), _jsx("hr", {}), _jsxs("form", { action: url.totpUrl, className: getClassName("kcFormClass"), id: "kc-totp-settings-form", method: "post", children: [_jsx("input", { type: "hidden", id: "stateChecker", name: "stateChecker", value: stateChecker }), _jsxs("div", { className: getClassName("kcFormGroupClass"), children: [_jsxs("div", { className: "col-sm-2 col-md-2", children: [_jsx("label", { htmlFor: "totp", className: "control-label", children: msg("authenticatorCode") }), _jsx("span", { className: "required", children: "*" })] }), _jsxs("div", { className: "col-sm-10 col-md-10", children: [_jsx("input", { type: "text", id: "totp", name: "totp", autoComplete: "off", className: getClassName("kcInputClass"), "aria-invalid": messagesPerField.existsError("totp") }), messagesPerField.existsError("totp") && (_jsx("span", { id: "input-error-otp-code", className: getClassName("kcInputErrorMessageClass"), "aria-live": "polite", children: messagesPerField.get("totp") }))] }), _jsx("input", { type: "hidden", id: "totpSecret", name: "totpSecret", value: totp.totpSecret }), mode && _jsx("input", { type: "hidden", id: "mode", value: mode })] }), _jsxs("div", { className: getClassName("kcFormGroupClass"), children: [_jsxs("div", { className: "col-sm-2 col-md-2", children: [_jsx("label", { htmlFor: "userLabel", className: getClassName("kcLabelClass"), children: msg("totpDeviceName") }), totp.otpCredentials.length >= 1 && _jsx("span", { className: "required", children: "*" })] }), _jsxs("div", { className: "col-sm-10 col-md-10", children: [_jsx("input", { type: "text", id: "userLabel", name: "userLabel", autoComplete: "off", className: getClassName("kcInputClass"), "aria-invalid": messagesPerField.existsError("userLabel") }), messagesPerField.existsError("userLabel") && (_jsx("span", { id: "input-error-otp-label", className: getClassName("kcInputErrorMessageClass"), "aria-live": "polite", children: messagesPerField.get("userLabel") }))] })] }), _jsx("div", { id: "kc-form-buttons", className: clsx(getClassName("kcFormGroupClass"), "text-right"), children: _jsxs("div", { className: getClassName("kcInputWrapperClass"), children: [_jsx("input", { type: "submit", className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonLargeClass")), id: "saveTOTPBtn", value: msgStr("doSave") }), _jsx("button", { type: "submit", className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonDefaultClass"), getClassName("kcButtonLargeClass"), getClassName("kcButtonLargeClass")), id: "cancelTOTPBtn", name: "submitAction", value: "Cancel", children: msg("doCancel") })] }) })] })] }))] }) }));
|
19
19
|
}
|
20
20
|
//# sourceMappingURL=Totp.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Totp.js","sourceRoot":"","sources":["../../src/account/pages/Totp.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;
|
1
|
+
{"version":3,"file":"Totp.js","sourceRoot":"","sources":["../../src/account/pages/Totp.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAI1E,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,KAAkE;;IAC3F,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAEtE,MAAM,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC;QACrC,eAAe;QACf,OAAO;KACV,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IAEtE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAE1C,MAAM,cAAc,GAAsE;QACtF,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,QAAQ;KACvB,CAAC;IAEF,OAAO,CACH,KAAC,QAAQ,IAAO,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAI,MAAM,EAAC,MAAM,YACtE,8BACI,eAAK,SAAS,EAAC,KAAK,aAChB,cAAK,SAAS,EAAC,WAAW,YACtB,uBAAK,GAAG,CAAC,oBAAoB,CAAC,GAAM,GAClC,EACL,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,CACjC,eAAK,SAAS,EAAC,mBAAmB,aAC9B,eAAM,SAAS,EAAC,UAAU,kBAAS,EAClC,GAAG,CAAC,gBAAgB,CAAC,IACpB,CACT,IACC,EACL,IAAI,CAAC,OAAO,IAAI,CACb,iBAAO,SAAS,EAAC,oCAAoC,aACjD,0BACK,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC9B,uBACI,aAAI,OAAO,EAAE,CAAC,YAAG,GAAG,CAAC,yBAAyB,CAAC,GAAM,GACpD,CACR,CAAC,CAAC,CAAC,CACA,uBACI,aAAI,OAAO,EAAE,CAAC,YAAG,GAAG,CAAC,yBAAyB,CAAC,GAAM,GACpD,CACR,GACG,EACR,0BACK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CAC5C,yBACI,aAAI,SAAS,EAAC,UAAU,YAAE,GAAG,CAAC,QAAQ,CAAC,GAAM,EAC5C,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,aAAI,SAAS,EAAC,UAAU,YAAE,UAAU,CAAC,EAAE,GAAM,EAChF,aAAI,SAAS,EAAC,UAAU,YAAE,UAAU,CAAC,SAAS,IAAI,EAAE,GAAM,EAC1D,aAAI,SAAS,EAAC,QAAQ,YAClB,gBAAM,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,aAAa,aAC5D,gBAAO,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,cAAc,EAAC,IAAI,EAAC,cAAc,EAAC,KAAK,EAAE,YAAY,GAAI,EAClF,gBAAO,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,cAAc,EAAC,IAAI,EAAC,cAAc,EAAC,KAAK,EAAC,QAAQ,GAAG,EAC5E,gBAAO,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,cAAc,EAAC,IAAI,EAAC,cAAc,EAAC,KAAK,EAAE,UAAU,CAAC,EAAE,GAAI,EACnF,iBAAQ,EAAE,EAAE,iBAAiB,KAAK,EAAE,EAAE,SAAS,EAAC,iBAAiB,YAC7D,YAAG,SAAS,EAAC,sBAAsB,GAAK,GACnC,IACN,GACN,KAbA,KAAK,CAcT,CACR,CAAC,GACE,IACJ,CACX,EACA,CAAC,IAAI,CAAC,OAAO,IAAI,CACd,0BACI,cAAM,EACN,cAAI,EAAE,EAAC,kBAAkB,aACrB,yBACI,sBAAI,GAAG,CAAC,WAAW,CAAC,GAAK,EAEzB,aAAI,EAAE,EAAC,wBAAwB,YAAE,MAAA,IAAI,CAAC,qBAAqB,0CAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,uBAAe,WAAW,CAAC,GAAG,CAAC,IAAtB,GAAG,CAAyB,CAAC,GAAM,IACnH,EAEJ,IAAI,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CACxB,8BACI,yBACI,sBAAI,GAAG,CAAC,iBAAiB,CAAC,GAAK,EAC/B,sBACI,eAAM,EAAE,EAAC,oBAAoB,YAAE,IAAI,CAAC,iBAAiB,GAAQ,GAC7D,EACJ,sBACI,YAAG,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAC,cAAc,YACjC,GAAG,CAAC,iBAAiB,CAAC,GACvB,GACJ,IACH,EACL,yBACI,sBAAI,GAAG,CAAC,iBAAiB,CAAC,GAAK,EAC/B,yBACI,cAAI,EAAE,EAAC,cAAc,aAChB,GAAG,CAAC,UAAU,CAAC,QAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAClD,EACL,cAAI,EAAE,EAAC,mBAAmB,aACrB,GAAG,CAAC,eAAe,CAAC,QAAI,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,mCAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IACxF,EACL,cAAI,EAAE,EAAC,gBAAgB,aAClB,GAAG,CAAC,YAAY,CAAC,QAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IACvC,EACJ,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAC3B,cAAI,EAAE,EAAC,gBAAgB,aAClB,GAAG,CAAC,cAAc,CAAC,QAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IACzC,CACR,CAAC,CAAC,CAAC,CACA,cAAI,EAAE,EAAC,iBAAiB,aACnB,GAAG,CAAC,aAAa,CAAC,QAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAChD,CACR,IACA,IACJ,IACN,CACN,CAAC,CAAC,CAAC,CACA,yBACI,sBAAI,GAAG,CAAC,WAAW,CAAC,GAAK,EACzB,sBACI,cACI,EAAE,EAAC,wBAAwB,EAC3B,GAAG,EAAE,0BAA0B,IAAI,CAAC,gBAAgB,EAAE,EACtD,GAAG,EAAC,iBAAiB,GACvB,GACF,EACJ,sBACI,YAAG,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAC,aAAa,YACpC,GAAG,CAAC,kBAAkB,CAAC,GACxB,GACJ,IACH,CACR,EACD,yBACI,sBAAI,GAAG,CAAC,WAAW,CAAC,GAAK,EACzB,sBAAI,GAAG,CAAC,qBAAqB,CAAC,GAAK,IAClC,IACJ,EACL,cAAM,EACN,gBAAM,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,aAAa,CAAC,EAAE,EAAE,EAAC,uBAAuB,EAAC,MAAM,EAAC,MAAM,aACvG,gBAAO,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,cAAc,EAAC,IAAI,EAAC,cAAc,EAAC,KAAK,EAAE,YAAY,GAAI,EAClF,eAAK,SAAS,EAAE,YAAY,CAAC,kBAAkB,CAAC,aAC5C,eAAK,SAAS,EAAC,mBAAmB,aAC9B,gBAAO,OAAO,EAAC,MAAM,EAAC,SAAS,EAAC,eAAe,YAC1C,GAAG,CAAC,mBAAmB,CAAC,GACrB,EACR,eAAM,SAAS,EAAC,UAAU,kBAAS,IACjC,EACN,eAAK,SAAS,EAAC,qBAAqB,aAChC,gBACI,IAAI,EAAC,MAAM,EACX,EAAE,EAAC,MAAM,EACT,IAAI,EAAC,MAAM,EACX,YAAY,EAAC,KAAK,EAClB,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,kBACzB,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,GACpD,EAED,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CACrC,eAAM,EAAE,EAAC,sBAAsB,EAAC,SAAS,EAAE,YAAY,CAAC,0BAA0B,CAAC,eAAY,QAAQ,YAClG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAC1B,CACV,IACC,EACN,gBAAO,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,YAAY,EAAC,IAAI,EAAC,YAAY,EAAC,KAAK,EAAE,IAAI,CAAC,UAAU,GAAI,EAChF,IAAI,IAAI,gBAAO,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,MAAM,EAAC,KAAK,EAAE,IAAI,GAAI,IACrD,EAEN,eAAK,SAAS,EAAE,YAAY,CAAC,kBAAkB,CAAC,aAC5C,eAAK,SAAS,EAAC,mBAAmB,aAC9B,gBAAO,OAAO,EAAC,WAAW,EAAC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,YAC7D,GAAG,CAAC,gBAAgB,CAAC,GAClB,EACP,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,IAAI,eAAM,SAAS,EAAC,UAAU,kBAAS,IACrE,EACN,eAAK,SAAS,EAAC,qBAAqB,aAChC,gBACI,IAAI,EAAC,MAAM,EACX,EAAE,EAAC,WAAW,EACd,IAAI,EAAC,WAAW,EAChB,YAAY,EAAC,KAAK,EAClB,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,kBACzB,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,GACzD,EACD,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAC1C,eAAM,EAAE,EAAC,uBAAuB,EAAC,SAAS,EAAE,YAAY,CAAC,0BAA0B,CAAC,eAAY,QAAQ,YACnG,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,GAC/B,CACV,IACC,IACJ,EAEN,cAAK,EAAE,EAAC,iBAAiB,EAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,YAAY,CAAC,YACrF,eAAK,SAAS,EAAE,YAAY,CAAC,qBAAqB,CAAC,aAC/C,gBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CACX,YAAY,CAAC,eAAe,CAAC,EAC7B,YAAY,CAAC,sBAAsB,CAAC,EACpC,YAAY,CAAC,oBAAoB,CAAC,CACrC,EACD,EAAE,EAAC,aAAa,EAChB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,GACzB,EACF,iBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CACX,YAAY,CAAC,eAAe,CAAC,EAC7B,YAAY,CAAC,sBAAsB,CAAC,EACpC,YAAY,CAAC,oBAAoB,CAAC,EAClC,YAAY,CAAC,oBAAoB,CAAC,CACrC,EACD,EAAE,EAAC,eAAe,EAClB,IAAI,EAAC,cAAc,EACnB,KAAK,EAAC,QAAQ,YAEb,GAAG,CAAC,UAAU,CAAC,GACX,IACP,GACJ,IACH,IACL,CACT,IACF,GACI,CACd,CAAC;AACN,CAAC"}
|
package/login/i18n/i18n.d.ts
CHANGED
@@ -47,16 +47,31 @@ export type GenericI18n<MessageKey extends string> = {
|
|
47
47
|
*/
|
48
48
|
msgStr: (key: MessageKey, ...args: (string | undefined)[]) => string;
|
49
49
|
/**
|
50
|
+
* This is meant to be used when the key argument is variable, something that might have been configured by the user
|
51
|
+
* in the Keycloak admin for example.
|
52
|
+
*
|
50
53
|
* Examples assuming currentLanguageTag === "en"
|
51
|
-
*
|
54
|
+
* {
|
55
|
+
* en: {
|
56
|
+
* "access-denied": "Access denied",
|
57
|
+
* "foo": "Foo {0} {1}",
|
58
|
+
* "bar": "Bar {0}"
|
59
|
+
* }
|
60
|
+
* }
|
61
|
+
*
|
62
|
+
* advancedMsg("${access-denied} foo bar") === <span>{msgStr("access-denied")} foo bar<span> === <span>Access denied foo bar</span>
|
52
63
|
* advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied") === <span>Access denied</span>
|
53
64
|
* advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === <span>not-a-message-key</span>
|
65
|
+
* advancedMsg("${bar}", "<strong>c</strong>")
|
66
|
+
* === <span>{msgStr("bar", "<strong>XXX</strong>")}<span>
|
67
|
+
* === <span>Bar <strong>XXX</strong></span> (The html in the arg is partially escaped for security reasons, it might be untrusted)
|
68
|
+
* advancedMsg("${foo} xx ${bar}", "a", "b", "c")
|
69
|
+
* === <span>{msgStr("foo", "a", "b")} xx {msgStr("bar")}<span>
|
70
|
+
* === <span>Foo a b xx Bar {0}</span> (The substitution are only applied in the first message)
|
54
71
|
*/
|
55
72
|
advancedMsg: (key: string, ...args: (string | undefined)[]) => JSX.Element;
|
56
73
|
/**
|
57
|
-
*
|
58
|
-
* advancedMsg("${access-denied} foo bar") === msg("access-denied") + " foo bar" === "Access denied foo bar"
|
59
|
-
* advancedMsg("${not-a-message-key}") === advancedMsg("not-a-message-key") === "not-a-message-key"
|
74
|
+
* See advancedMsg() but instead of returning a JSX.Element it returns a string.
|
60
75
|
*/
|
61
76
|
advancedMsgStr: (key: string, ...args: (string | undefined)[]) => string;
|
62
77
|
};
|
package/login/i18n/i18n.js
CHANGED
@@ -37,7 +37,7 @@ export function createUseI18n(extraMessages) {
|
|
37
37
|
return { useI18n };
|
38
38
|
}
|
39
39
|
function createI18nTranslationFunctions(params) {
|
40
|
-
const { fallbackMessages, messages
|
40
|
+
const { fallbackMessages, messages, __localizationRealmOverridesUserProfile } = params;
|
41
41
|
function resolveMsg(props) {
|
42
42
|
var _a;
|
43
43
|
const { key, args, doRenderAsHtml } = props;
|
@@ -71,22 +71,29 @@ function createI18nTranslationFunctions(params) {
|
|
71
71
|
}
|
72
72
|
function resolveMsgAdvanced(props) {
|
73
73
|
const { key, args, doRenderAsHtml } = props;
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
74
|
+
if (key in __localizationRealmOverridesUserProfile) {
|
75
|
+
const resolvedMessage = __localizationRealmOverridesUserProfile[key];
|
76
|
+
return doRenderAsHtml ? (_jsx("span", {
|
77
|
+
// NOTE: The message is trusted. The arguments are not but are escaped.
|
78
|
+
dangerouslySetInnerHTML: {
|
79
|
+
__html: resolvedMessage
|
80
|
+
} })) : (resolvedMessage);
|
80
81
|
}
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
82
|
+
if (!/\$\{[^}]+\}/.test(key)) {
|
83
|
+
const resolvedMessage = resolveMsg({ key, args, doRenderAsHtml });
|
84
|
+
if (resolvedMessage === undefined) {
|
85
|
+
return doRenderAsHtml ? _jsx("span", { dangerouslySetInnerHTML: { __html: key } }) : key;
|
86
|
+
}
|
87
|
+
return resolvedMessage;
|
88
|
+
}
|
89
|
+
let isFirstMatch = true;
|
90
|
+
const resolvedComplexMessage = key.replace(/\$\{([^}]+)\}/g, (...[, key_i]) => {
|
91
|
+
var _a;
|
92
|
+
const replaceBy = (_a = resolveMsg({ key: key_i, args: isFirstMatch ? args : [], doRenderAsHtml: false })) !== null && _a !== void 0 ? _a : key_i;
|
93
|
+
isFirstMatch = false;
|
94
|
+
return replaceBy;
|
88
95
|
});
|
89
|
-
return
|
96
|
+
return doRenderAsHtml ? _jsx("span", { dangerouslySetInnerHTML: { __html: resolvedComplexMessage } }) : resolvedComplexMessage;
|
90
97
|
}
|
91
98
|
return {
|
92
99
|
msgStr: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: false }),
|
package/login/i18n/i18n.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/login/i18n/i18n.tsx"],"names":[],"mappings":";AAAA,OAAO,sCAAsC,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,gBAAgB,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAUxC,MAAM,EAAkD,CAAC;
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/login/i18n/i18n.tsx"],"names":[],"mappings":"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"}
|
@@ -8,8 +8,8 @@ export default function LoginConfigTotp(props) {
|
|
8
8
|
classes
|
9
9
|
});
|
10
10
|
const { url, isAppInitiatedAction, totp, mode, messagesPerField } = kcContext;
|
11
|
-
const { msg, msgStr } = i18n;
|
12
|
-
return (_jsx(Template, { kcContext, i18n, doUseDefaultCss, classes, headerNode: msg("loginTotpTitle"), children: _jsxs(_Fragment, { children: [_jsxs("ol", { id: "kc-totp-settings", children: [_jsxs("li", { children: [_jsx("p", { children: msg("loginTotpStep1") }), _jsx("ul", { id: "kc-totp-supported-apps", children: totp.supportedApplications.map(app => (_jsx("li", { children:
|
11
|
+
const { msg, msgStr, advancedMsg } = i18n;
|
12
|
+
return (_jsx(Template, { kcContext, i18n, doUseDefaultCss, classes, headerNode: msg("loginTotpTitle"), children: _jsxs(_Fragment, { children: [_jsxs("ol", { id: "kc-totp-settings", children: [_jsxs("li", { children: [_jsx("p", { children: msg("loginTotpStep1") }), _jsx("ul", { id: "kc-totp-supported-apps", children: totp.supportedApplications.map(app => (_jsx("li", { children: advancedMsg(app) }))) })] }), mode == "manual" ? (_jsxs(_Fragment, { children: [_jsxs("li", { children: [_jsx("p", { children: msg("loginTotpManualStep2") }), _jsx("p", { children: _jsx("span", { id: "kc-totp-secret-key", children: totp.totpSecretEncoded }) }), _jsx("p", { children: _jsx("a", { href: totp.qrUrl, id: "mode-barcode", children: msg("loginTotpScanBarcode") }) })] }), _jsxs("li", { children: [_jsx("p", { children: msg("loginTotpManualStep3") }), _jsx("p", { children: _jsxs("ul", { children: [_jsxs("li", { id: "kc-totp-type", children: [msg("loginTotpType"), ": ", msg(`loginTotp.${totp.policy.type}`)] }), _jsxs("li", { id: "kc-totp-algorithm", children: [msg("loginTotpAlgorithm"), ": ", totp.policy.getAlgorithmKey()] }), _jsxs("li", { id: "kc-totp-digits", children: [msg("loginTotpDigits"), ": ", totp.policy.digits] }), totp.policy.type === "totp" ? (_jsxs("li", { id: "kc-totp-period", children: [msg("loginTotpInterval"), ": ", totp.policy.period] })) : (_jsxs("li", { id: "kc-totp-counter", children: [msg("loginTotpCounter"), ": ", totp.policy.initialCounter] }))] }) })] })] })) : (_jsxs("li", { children: [_jsx("p", { children: msg("loginTotpStep2") }), _jsx("img", { id: "kc-totp-secret-qr-code", src: `data:image/png;base64, ${totp.totpSecretQrCode}`, alt: "Figure: Barcode" }), _jsx("br", {}), _jsx("p", { children: _jsx("a", { href: totp.manualUrl, id: "mode-manual", children: msg("loginTotpUnableToScan") }) })] })), _jsxs("li", { children: [_jsx("p", { children: msg("loginTotpStep3") }), _jsx("p", { children: msg("loginTotpStep3DeviceName") })] })] }), _jsxs("form", { action: url.loginAction, className: getClassName("kcFormClass"), id: "kc-totp-settings-form", method: "post", children: [_jsxs("div", { className: getClassName("kcFormGroupClass"), children: [_jsxs("div", { className: getClassName("kcInputWrapperClass"), children: [_jsx("label", { htmlFor: "totp", className: getClassName("kcLabelClass"), children: msg("authenticatorCode") }), " ", _jsx("span", { className: "required", children: "*" })] }), _jsxs("div", { className: getClassName("kcInputWrapperClass"), children: [_jsx("input", { type: "text", id: "totp", name: "totp", autoComplete: "off", className: getClassName("kcInputClass"), "aria-invalid": messagesPerField.existsError("totp") }), messagesPerField.existsError("totp") && (_jsx("span", { id: "input-error-otp-code", className: getClassName("kcInputErrorMessageClass"), "aria-live": "polite", children: messagesPerField.get("totp") }))] }), _jsx("input", { type: "hidden", id: "totpSecret", name: "totpSecret", value: totp.totpSecret }), mode && _jsx("input", { type: "hidden", id: "mode", value: mode })] }), _jsxs("div", { className: getClassName("kcFormGroupClass"), children: [_jsxs("div", { className: getClassName("kcInputWrapperClass"), children: [_jsx("label", { htmlFor: "userLabel", className: getClassName("kcLabelClass"), children: msg("loginTotpDeviceName") }), " ", totp.otpCredentials.length >= 1 && _jsx("span", { className: "required", children: "*" })] }), _jsxs("div", { className: getClassName("kcInputWrapperClass"), children: [_jsx("input", { type: "text", id: "userLabel", name: "userLabel", autoComplete: "off", className: getClassName("kcInputClass"), "aria-invalid": messagesPerField.existsError("userLabel") }), messagesPerField.existsError("userLabel") && (_jsx("span", { id: "input-error-otp-label", className: getClassName("kcInputErrorMessageClass"), "aria-live": "polite", children: messagesPerField.get("userLabel") }))] })] }), _jsx("div", { className: getClassName("kcFormGroupClass"), children: _jsx(LogoutOtherSessions, { getClassName, i18n }) }), isAppInitiatedAction ? (_jsxs(_Fragment, { children: [_jsx("input", { type: "submit", className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonLargeClass")), id: "saveTOTPBtn", value: msgStr("doSubmit") }), _jsx("button", { type: "submit", className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonDefaultClass"), getClassName("kcButtonLargeClass"), getClassName("kcButtonLargeClass")), id: "cancelTOTPBtn", name: "cancel-aia", value: "true", children: msg("doCancel") })] })) : (_jsx("input", { type: "submit", className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonLargeClass")), id: "saveTOTPBtn", value: msgStr("doSubmit") }))] })] }) }));
|
13
13
|
}
|
14
14
|
function LogoutOtherSessions(props) {
|
15
15
|
const { getClassName, i18n } = props;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LoginConfigTotp.js","sourceRoot":"","sources":["../../src/login/pages/LoginConfigTotp.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;
|
1
|
+
{"version":3,"file":"LoginConfigTotp.js","sourceRoot":"","sources":["../../src/login/pages/LoginConfigTotp.tsx"],"names":[],"mappings":"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"}
|
@@ -9,7 +9,7 @@ export default function WebauthnAuthenticate(props) {
|
|
9
9
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
10
10
|
const { getClassName } = useGetClassName({ doUseDefaultCss, classes });
|
11
11
|
const { url, isUserIdentified, challenge, userVerification, rpId, createTimeout, messagesPerField, realm, registrationDisabled, authenticators, shouldDisplayAuthenticators } = kcContext;
|
12
|
-
const { msg, msgStr } = i18n;
|
12
|
+
const { msg, msgStr, advancedMsg } = i18n;
|
13
13
|
const { insertScriptTags } = useInsertScriptTags({
|
14
14
|
scriptTags: [
|
15
15
|
{
|
@@ -121,7 +121,7 @@ export default function WebauthnAuthenticate(props) {
|
|
121
121
|
return getClassName("kcWebAuthnDefaultIcon");
|
122
122
|
}
|
123
123
|
return className;
|
124
|
-
})(), getClassName("kcSelectAuthListItemIconPropertyClass")) }) }), _jsxs("div", { className: getClassName("kcSelectAuthListItemArrowIconClass"), children: [_jsx("div", { id: "kc-webauthn-authenticator-label", className: getClassName("kcSelectAuthListItemHeadingClass"), children:
|
124
|
+
})(), getClassName("kcSelectAuthListItemIconPropertyClass")) }) }), _jsxs("div", { className: getClassName("kcSelectAuthListItemArrowIconClass"), children: [_jsx("div", { id: "kc-webauthn-authenticator-label", className: getClassName("kcSelectAuthListItemHeadingClass"), children: advancedMsg(authenticator.label) }), ((_a = authenticator.transports.displayNameProperties) === null || _a === void 0 ? void 0 : _a.length) && (_jsx("div", { id: "kc-webauthn-authenticator-transport", className: getClassName("kcSelectAuthListItemDescriptionClass"), children: authenticator.transports.displayNameProperties
|
125
125
|
.map((nameProperty, i, arr) => ({
|
126
126
|
nameProperty,
|
127
127
|
hasNext: i !== arr.length - 1
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WebauthnAuthenticate.js","sourceRoot":"","sources":["../../src/login/pages/WebauthnAuthenticate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;
|
1
|
+
{"version":3,"file":"WebauthnAuthenticate.js","sourceRoot":"","sources":["../../src/login/pages/WebauthnAuthenticate.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
import "minimal-polyfills/Object.fromEntries";
|
2
|
-
//NOTE for later: https://github.com/remarkjs/react-markdown/blob/236182ecf30bd89c1e5a7652acaf8d0bf81e6170/src/renderers.js#L7-L35
|
3
2
|
import { useEffect, useState, useRef } from "react";
|
4
3
|
import fallbackMessages from "./baseMessages/en";
|
5
4
|
import { getMessages } from "./baseMessages";
|
6
5
|
import { assert } from "tsafe/assert";
|
7
6
|
import type { KcContext } from "../kcContext/KcContext";
|
8
|
-
import { Markdown } from "keycloakify/tools/Markdown";
|
9
7
|
|
10
8
|
export const fallbackLanguageTag = "en";
|
11
9
|
|
@@ -53,16 +51,31 @@ export type GenericI18n<MessageKey extends string> = {
|
|
53
51
|
*/
|
54
52
|
msgStr: (key: MessageKey, ...args: (string | undefined)[]) => string;
|
55
53
|
/**
|
54
|
+
* This is meant to be used when the key argument is variable, something that might have been configured by the user
|
55
|
+
* in the Keycloak admin for example.
|
56
|
+
*
|
56
57
|
* Examples assuming currentLanguageTag === "en"
|
57
|
-
*
|
58
|
+
* {
|
59
|
+
* en: {
|
60
|
+
* "access-denied": "Access denied",
|
61
|
+
* "foo": "Foo {0} {1}",
|
62
|
+
* "bar": "Bar {0}"
|
63
|
+
* }
|
64
|
+
* }
|
65
|
+
*
|
66
|
+
* advancedMsg("${access-denied} foo bar") === <span>{msgStr("access-denied")} foo bar<span> === <span>Access denied foo bar</span>
|
58
67
|
* advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied") === <span>Access denied</span>
|
59
68
|
* advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === <span>not-a-message-key</span>
|
69
|
+
* advancedMsg("${bar}", "<strong>c</strong>")
|
70
|
+
* === <span>{msgStr("bar", "<strong>XXX</strong>")}<span>
|
71
|
+
* === <span>Bar <strong>XXX</strong></span> (The html in the arg is partially escaped for security reasons, it might be untrusted)
|
72
|
+
* advancedMsg("${foo} xx ${bar}", "a", "b", "c")
|
73
|
+
* === <span>{msgStr("foo", "a", "b")} xx {msgStr("bar")}<span>
|
74
|
+
* === <span>Foo a b xx Bar {0}</span> (The substitution are only applied in the first message)
|
60
75
|
*/
|
61
76
|
advancedMsg: (key: string, ...args: (string | undefined)[]) => JSX.Element;
|
62
77
|
/**
|
63
|
-
*
|
64
|
-
* advancedMsg("${access-denied} foo bar") === msg("access-denied") + " foo bar" === "Access denied foo bar"
|
65
|
-
* advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === "not-a-message-key"
|
78
|
+
* See advancedMsg() but instead of returning a JSX.Element it returns a string.
|
66
79
|
*/
|
67
80
|
advancedMsgStr: (key: string, ...args: (string | undefined)[]) => string;
|
68
81
|
};
|
@@ -133,8 +146,8 @@ function createI18nTranslationFunctions<MessageKey extends string>(params: {
|
|
133
146
|
}): Pick<GenericI18n<MessageKey>, "msg" | "msgStr" | "advancedMsg" | "advancedMsgStr"> {
|
134
147
|
const { fallbackMessages, messages } = params;
|
135
148
|
|
136
|
-
function resolveMsg(props: { key: string; args: (string | undefined)[];
|
137
|
-
const { key, args,
|
149
|
+
function resolveMsg(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): string | JSX.Element | undefined {
|
150
|
+
const { key, args, doRenderAsHtml } = props;
|
138
151
|
|
139
152
|
const messageOrUndefined: string | undefined = (messages as any)[key] ?? (fallbackMessages as any)[key];
|
140
153
|
|
@@ -163,51 +176,67 @@ function createI18nTranslationFunctions<MessageKey extends string>(params: {
|
|
163
176
|
return;
|
164
177
|
}
|
165
178
|
|
166
|
-
messageWithArgsInjected = messageWithArgsInjected.replace(
|
179
|
+
messageWithArgsInjected = messageWithArgsInjected.replace(
|
180
|
+
new RegExp(`\\{${i + startIndex}\\}`, "g"),
|
181
|
+
arg.replace(/</g, "<").replace(/>/g, ">")
|
182
|
+
);
|
167
183
|
});
|
168
184
|
|
169
185
|
return messageWithArgsInjected;
|
170
186
|
})();
|
171
187
|
|
172
|
-
return
|
173
|
-
<
|
174
|
-
|
175
|
-
|
188
|
+
return doRenderAsHtml ? (
|
189
|
+
<span
|
190
|
+
// NOTE: The message is trusted. The arguments are not but are escaped.
|
191
|
+
dangerouslySetInnerHTML={{
|
192
|
+
__html: messageWithArgsInjectedIfAny
|
193
|
+
}}
|
194
|
+
/>
|
176
195
|
) : (
|
177
196
|
messageWithArgsInjectedIfAny
|
178
197
|
);
|
179
198
|
}
|
180
199
|
|
181
|
-
function resolveMsgAdvanced(props: { key: string; args: (string | undefined)[];
|
182
|
-
const { key, args,
|
200
|
+
function resolveMsgAdvanced(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): JSX.Element | string {
|
201
|
+
const { key, args, doRenderAsHtml } = props;
|
202
|
+
|
203
|
+
if (!/\$\{[^}]+\}/.test(key)) {
|
204
|
+
const resolvedMessage = resolveMsg({ key, args, doRenderAsHtml });
|
205
|
+
|
206
|
+
if (resolvedMessage === undefined) {
|
207
|
+
return doRenderAsHtml ? <span dangerouslySetInnerHTML={{ __html: key }} /> : key;
|
208
|
+
}
|
209
|
+
|
210
|
+
return resolvedMessage;
|
211
|
+
}
|
212
|
+
|
213
|
+
let isFirstMatch = true;
|
183
214
|
|
184
|
-
const
|
215
|
+
const resolvedComplexMessage = key.replace(/\$\{([^}]+)\}/g, (...[, key_i]) => {
|
216
|
+
const replaceBy = resolveMsg({ key: key_i, args: isFirstMatch ? args : [], doRenderAsHtml: false }) ?? key_i;
|
185
217
|
|
186
|
-
|
218
|
+
isFirstMatch = false;
|
187
219
|
|
188
|
-
|
189
|
-
key: keyUnwrappedFromCurlyBraces,
|
190
|
-
args,
|
191
|
-
doRenderMarkdown
|
220
|
+
return replaceBy;
|
192
221
|
});
|
193
222
|
|
194
|
-
return
|
223
|
+
return doRenderAsHtml ? <span dangerouslySetInnerHTML={{ __html: resolvedComplexMessage }} /> : resolvedComplexMessage;
|
195
224
|
}
|
196
225
|
|
197
226
|
return {
|
198
|
-
msgStr: (key, ...args) => resolveMsg({ key, args,
|
199
|
-
msg: (key, ...args) => resolveMsg({ key, args,
|
227
|
+
msgStr: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: false }) as string,
|
228
|
+
msg: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: true }) as JSX.Element,
|
200
229
|
advancedMsg: (key, ...args) =>
|
201
230
|
resolveMsgAdvanced({
|
202
231
|
key,
|
203
232
|
args,
|
204
|
-
|
233
|
+
doRenderAsHtml: true
|
205
234
|
}) as JSX.Element,
|
206
235
|
advancedMsgStr: (key, ...args) =>
|
207
236
|
resolveMsgAdvanced({
|
208
237
|
key,
|
209
238
|
args,
|
210
|
-
|
239
|
+
doRenderAsHtml: false
|
211
240
|
}) as string
|
212
241
|
};
|
213
242
|
}
|
@@ -3,7 +3,6 @@ import type { PageProps } from "keycloakify/account/pages/PageProps";
|
|
3
3
|
import { useGetClassName } from "keycloakify/account/lib/useGetClassName";
|
4
4
|
import type { KcContext } from "../kcContext";
|
5
5
|
import type { I18n } from "../i18n";
|
6
|
-
import { MessageKey } from "keycloakify/account/i18n/i18n";
|
7
6
|
|
8
7
|
export default function Totp(props: PageProps<Extract<KcContext, { pageId: "totp.ftl" }>, I18n>) {
|
9
8
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
@@ -15,7 +14,7 @@ export default function Totp(props: PageProps<Extract<KcContext, { pageId: "totp
|
|
15
14
|
|
16
15
|
const { totp, mode, url, messagesPerField, stateChecker } = kcContext;
|
17
16
|
|
18
|
-
const { msg, msgStr } = i18n;
|
17
|
+
const { msg, msgStr, advancedMsg } = i18n;
|
19
18
|
|
20
19
|
const algToKeyUriAlg: Record<(typeof kcContext)["totp"]["policy"]["algorithm"], string> = {
|
21
20
|
HmacSHA1: "SHA1",
|
@@ -78,9 +77,7 @@ export default function Totp(props: PageProps<Extract<KcContext, { pageId: "totp
|
|
78
77
|
<li>
|
79
78
|
<p>{msg("totpStep1")}</p>
|
80
79
|
|
81
|
-
<ul id="kc-totp-supported-apps">
|
82
|
-
{totp.supportedApplications?.map(app => <li key={app}>{msg(app as MessageKey)}</li>)}
|
83
|
-
</ul>
|
80
|
+
<ul id="kc-totp-supported-apps">{totp.supportedApplications?.map(app => <li key={app}>{advancedMsg(app)}</li>)}</ul>
|
84
81
|
</li>
|
85
82
|
|
86
83
|
{mode && mode == "manual" ? (
|
package/src/login/i18n/i18n.tsx
CHANGED
@@ -52,16 +52,31 @@ export type GenericI18n<MessageKey extends string> = {
|
|
52
52
|
*/
|
53
53
|
msgStr: (key: MessageKey, ...args: (string | undefined)[]) => string;
|
54
54
|
/**
|
55
|
+
* This is meant to be used when the key argument is variable, something that might have been configured by the user
|
56
|
+
* in the Keycloak admin for example.
|
57
|
+
*
|
55
58
|
* Examples assuming currentLanguageTag === "en"
|
56
|
-
*
|
59
|
+
* {
|
60
|
+
* en: {
|
61
|
+
* "access-denied": "Access denied",
|
62
|
+
* "foo": "Foo {0} {1}",
|
63
|
+
* "bar": "Bar {0}"
|
64
|
+
* }
|
65
|
+
* }
|
66
|
+
*
|
67
|
+
* advancedMsg("${access-denied} foo bar") === <span>{msgStr("access-denied")} foo bar<span> === <span>Access denied foo bar</span>
|
57
68
|
* advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied") === <span>Access denied</span>
|
58
69
|
* advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === <span>not-a-message-key</span>
|
70
|
+
* advancedMsg("${bar}", "<strong>c</strong>")
|
71
|
+
* === <span>{msgStr("bar", "<strong>XXX</strong>")}<span>
|
72
|
+
* === <span>Bar <strong>XXX</strong></span> (The html in the arg is partially escaped for security reasons, it might be untrusted)
|
73
|
+
* advancedMsg("${foo} xx ${bar}", "a", "b", "c")
|
74
|
+
* === <span>{msgStr("foo", "a", "b")} xx {msgStr("bar")}<span>
|
75
|
+
* === <span>Foo a b xx Bar {0}</span> (The substitution are only applied in the first message)
|
59
76
|
*/
|
60
77
|
advancedMsg: (key: string, ...args: (string | undefined)[]) => JSX.Element;
|
61
78
|
/**
|
62
|
-
*
|
63
|
-
* advancedMsg("${access-denied} foo bar") === msg("access-denied") + " foo bar" === "Access denied foo bar"
|
64
|
-
* advancedMsg("${not-a-message-key}") === advancedMsg("not-a-message-key") === "not-a-message-key"
|
79
|
+
* See advancedMsg() but instead of returning a JSX.Element it returns a string.
|
65
80
|
*/
|
66
81
|
advancedMsgStr: (key: string, ...args: (string | undefined)[]) => string;
|
67
82
|
};
|
@@ -132,7 +147,7 @@ function createI18nTranslationFunctions<MessageKey extends string>(params: {
|
|
132
147
|
messages: Record<MessageKey, string>;
|
133
148
|
__localizationRealmOverridesUserProfile: Record<string, string>;
|
134
149
|
}): Pick<GenericI18n<MessageKey>, "msg" | "msgStr" | "advancedMsg" | "advancedMsgStr"> {
|
135
|
-
const { fallbackMessages, messages
|
150
|
+
const { fallbackMessages, messages, __localizationRealmOverridesUserProfile } = params;
|
136
151
|
|
137
152
|
function resolveMsg(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): string | JSX.Element | undefined {
|
138
153
|
const { key, args, doRenderAsHtml } = props;
|
@@ -188,26 +203,42 @@ function createI18nTranslationFunctions<MessageKey extends string>(params: {
|
|
188
203
|
function resolveMsgAdvanced(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): JSX.Element | string {
|
189
204
|
const { key, args, doRenderAsHtml } = props;
|
190
205
|
|
191
|
-
|
192
|
-
|
193
|
-
|
206
|
+
if (key in __localizationRealmOverridesUserProfile) {
|
207
|
+
const resolvedMessage = __localizationRealmOverridesUserProfile[key];
|
208
|
+
|
209
|
+
return doRenderAsHtml ? (
|
210
|
+
<span
|
211
|
+
// NOTE: The message is trusted. The arguments are not but are escaped.
|
212
|
+
dangerouslySetInnerHTML={{
|
213
|
+
__html: resolvedMessage
|
214
|
+
}}
|
215
|
+
/>
|
216
|
+
) : (
|
217
|
+
resolvedMessage
|
218
|
+
);
|
219
|
+
}
|
194
220
|
|
221
|
+
if (!/\$\{[^}]+\}/.test(key)) {
|
222
|
+
const resolvedMessage = resolveMsg({ key, args, doRenderAsHtml });
|
195
223
|
|
224
|
+
if (resolvedMessage === undefined) {
|
225
|
+
return doRenderAsHtml ? <span dangerouslySetInnerHTML={{ __html: key }} /> : key;
|
226
|
+
}
|
196
227
|
|
228
|
+
return resolvedMessage;
|
197
229
|
}
|
198
|
-
*/
|
199
230
|
|
200
|
-
|
231
|
+
let isFirstMatch = true;
|
232
|
+
|
233
|
+
const resolvedComplexMessage = key.replace(/\$\{([^}]+)\}/g, (...[, key_i]) => {
|
234
|
+
const replaceBy = resolveMsg({ key: key_i, args: isFirstMatch ? args : [], doRenderAsHtml: false }) ?? key_i;
|
201
235
|
|
202
|
-
|
236
|
+
isFirstMatch = false;
|
203
237
|
|
204
|
-
|
205
|
-
key: keyUnwrappedFromCurlyBraces,
|
206
|
-
args,
|
207
|
-
doRenderAsHtml
|
238
|
+
return replaceBy;
|
208
239
|
});
|
209
240
|
|
210
|
-
return
|
241
|
+
return doRenderAsHtml ? <span dangerouslySetInnerHTML={{ __html: resolvedComplexMessage }} /> : resolvedComplexMessage;
|
211
242
|
}
|
212
243
|
|
213
244
|
return {
|
@@ -3,7 +3,6 @@ import type { PageProps } from "keycloakify/login/pages/PageProps";
|
|
3
3
|
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
4
4
|
import type { KcContext } from "../kcContext";
|
5
5
|
import type { I18n } from "../i18n";
|
6
|
-
import { MessageKey } from "keycloakify/login/i18n/i18n";
|
7
6
|
|
8
7
|
export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pageId: "login-config-totp.ftl" }>, I18n>) {
|
9
8
|
const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
|
@@ -15,7 +14,7 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
|
|
15
14
|
|
16
15
|
const { url, isAppInitiatedAction, totp, mode, messagesPerField } = kcContext;
|
17
16
|
|
18
|
-
const { msg, msgStr } = i18n;
|
17
|
+
const { msg, msgStr, advancedMsg } = i18n;
|
19
18
|
|
20
19
|
return (
|
21
20
|
<Template {...{ kcContext, i18n, doUseDefaultCss, classes }} headerNode={msg("loginTotpTitle")}>
|
@@ -26,7 +25,7 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
|
|
26
25
|
|
27
26
|
<ul id="kc-totp-supported-apps">
|
28
27
|
{totp.supportedApplications.map(app => (
|
29
|
-
<li>{
|
28
|
+
<li>{advancedMsg(app)}</li>
|
30
29
|
))}
|
31
30
|
</ul>
|
32
31
|
</li>
|
@@ -1,6 +1,5 @@
|
|
1
1
|
import { useEffect, Fragment } from "react";
|
2
2
|
import { clsx } from "keycloakify/tools/clsx";
|
3
|
-
import type { MessageKey } from "keycloakify/login/i18n/i18n";
|
4
3
|
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
5
4
|
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
6
5
|
import { assert } from "tsafe/assert";
|
@@ -29,7 +28,7 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
29
28
|
shouldDisplayAuthenticators
|
30
29
|
} = kcContext;
|
31
30
|
|
32
|
-
const { msg, msgStr } = i18n;
|
31
|
+
const { msg, msgStr, advancedMsg } = i18n;
|
33
32
|
|
34
33
|
const { insertScriptTags } = useInsertScriptTags({
|
35
34
|
scriptTags: [
|
@@ -198,7 +197,7 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
198
197
|
id="kc-webauthn-authenticator-label"
|
199
198
|
className={getClassName("kcSelectAuthListItemHeadingClass")}
|
200
199
|
>
|
201
|
-
{
|
200
|
+
{advancedMsg(authenticator.label)}
|
202
201
|
</div>
|
203
202
|
{authenticator.transports.displayNameProperties?.length && (
|
204
203
|
<div
|