keycloakify 11.4.0-rc.0 → 11.4.0

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.
Files changed (93) hide show
  1. package/README.md +2 -0
  2. package/account/i18n/noJsx/getI18n.js +5 -7
  3. package/account/i18n/noJsx/getI18n.js.map +1 -1
  4. package/account/i18n/withJsx/useI18n.js +15 -4
  5. package/account/i18n/withJsx/useI18n.js.map +1 -1
  6. package/bin/20.index.js +0 -85
  7. package/bin/33.index.js +55 -212
  8. package/bin/356.index.js +106 -45
  9. package/bin/36.index.js +1 -2922
  10. package/bin/{526.index.js → 392.index.js} +89 -3
  11. package/bin/40.index.js +1 -86
  12. package/bin/453.index.js +85 -22
  13. package/bin/573.index.js +4 -86
  14. package/bin/653.index.js +752 -0
  15. package/bin/658.index.js +197 -0
  16. package/bin/735.index.js +343 -116
  17. package/bin/786.index.js +78 -14
  18. package/bin/805.index.js +15 -18
  19. package/bin/921.index.js +79 -18
  20. package/bin/97.index.js +64 -13
  21. package/bin/main.js +165 -86
  22. package/bin/shared/constants.d.ts +2 -0
  23. package/bin/shared/constants.js +3 -1
  24. package/bin/shared/constants.js.map +1 -1
  25. package/bin/start-keycloak/startViteDevServer.d.ts +7 -0
  26. package/bin/tools/crawlAsync.d.ts +1 -1
  27. package/bin/tools/isTrackedByGit.d.ts +3 -0
  28. package/bin/tools/runPrettier.d.ts +5 -5
  29. package/bin/tools/untrackFromGit.d.ts +3 -0
  30. package/lib/getKcClsx.js +1 -2
  31. package/lib/getKcClsx.js.map +1 -1
  32. package/login/KcContext/KcContext.d.ts +2 -2
  33. package/login/KcContext/kcContextMocks.d.ts +1 -1
  34. package/login/TemplateProps.d.ts +0 -1
  35. package/login/i18n/noJsx/getI18n.js +5 -7
  36. package/login/i18n/noJsx/getI18n.js.map +1 -1
  37. package/login/i18n/withJsx/useI18n.js +15 -4
  38. package/login/i18n/withJsx/useI18n.js.map +1 -1
  39. package/login/pages/LoginConfigTotp.js +1 -1
  40. package/login/pages/LoginConfigTotp.js.map +1 -1
  41. package/login/pages/LoginPasskeysConditionalAuthenticate.js +16 -18
  42. package/login/pages/LoginPasskeysConditionalAuthenticate.js.map +1 -1
  43. package/package.json +17 -7
  44. package/src/account/i18n/noJsx/getI18n.tsx +5 -7
  45. package/src/account/i18n/withJsx/useI18n.tsx +18 -4
  46. package/src/bin/eject-page.ts +28 -10
  47. package/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +3 -18
  48. package/src/bin/initialize-account-theme/updateAccountThemeImplementationInConfig.ts +1 -2
  49. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +39 -0
  50. package/src/bin/keycloakify/generateResources/generateResources.ts +6 -2
  51. package/src/bin/main.ts +51 -4
  52. package/src/bin/postinstall/getUiModuleFileSourceCodeReadyToBeCopied.ts +30 -19
  53. package/src/bin/postinstall/installUiModulesPeerDependencies.ts +3 -3
  54. package/src/bin/postinstall/managedGitignoreFile.ts +4 -3
  55. package/src/bin/postinstall/postinstall.ts +24 -2
  56. package/src/bin/postinstall/uiModuleMeta.ts +14 -9
  57. package/src/bin/shared/buildContext.ts +1 -2
  58. package/src/bin/shared/constants.ts +4 -1
  59. package/src/bin/start-keycloak/myrealm-realm-25.json +21 -34
  60. package/src/bin/start-keycloak/myrealm-realm-26.json +32 -35
  61. package/src/bin/start-keycloak/start-keycloak.ts +93 -1
  62. package/src/bin/start-keycloak/startViteDevServer.ts +39 -0
  63. package/src/bin/tools/crawlAsync.ts +6 -6
  64. package/src/bin/tools/isTrackedByGit.ts +29 -0
  65. package/src/bin/tools/listInstalledModules.ts +1 -2
  66. package/src/bin/tools/npmInstall.ts +396 -1
  67. package/src/bin/tools/runPrettier.ts +63 -14
  68. package/src/bin/tools/untrackFromGit.ts +24 -0
  69. package/src/bin/tsconfig.json +1 -1
  70. package/src/bin/update-kc-gen.ts +17 -2
  71. package/src/lib/getKcClsx.ts +1 -2
  72. package/src/login/KcContext/KcContext.ts +2 -2
  73. package/src/login/KcContext/kcContextMocks.ts +1 -1
  74. package/src/login/TemplateProps.ts +0 -1
  75. package/src/login/i18n/noJsx/getI18n.tsx +5 -7
  76. package/src/login/i18n/withJsx/useI18n.tsx +18 -4
  77. package/src/login/pages/LoginConfigTotp.tsx +18 -20
  78. package/src/login/pages/LoginPasskeysConditionalAuthenticate.tsx +51 -52
  79. package/src/tools/StatefulObservable/StatefulObservable.ts +1 -2
  80. package/src/tools/deepAssign.ts +1 -2
  81. package/src/tools/extractLastParenthesisContent.ts +43 -0
  82. package/src/vite-plugin/vite-plugin.ts +67 -0
  83. package/stories/login/pages/Info.stories.tsx +3 -39
  84. package/tools/StatefulObservable/StatefulObservable.js +1 -2
  85. package/tools/StatefulObservable/StatefulObservable.js.map +1 -1
  86. package/tools/deepAssign.js +1 -2
  87. package/tools/deepAssign.js.map +1 -1
  88. package/tools/extractLastParenthesisContent.d.ts +6 -0
  89. package/tools/extractLastParenthesisContent.js +36 -0
  90. package/tools/extractLastParenthesisContent.js.map +1 -0
  91. package/vite-plugin/index.js +326 -186
  92. package/bin/124.index.js +0 -348
  93. package/stories/login/pages/LoginDeviceVerifyUserCode.stories.tsx +0 -18
package/src/bin/main.ts CHANGED
@@ -5,6 +5,9 @@ import { readThisNpmPackageVersion } from "./tools/readThisNpmPackageVersion";
5
5
  import * as child_process from "child_process";
6
6
  import { assertNoPnpmDlx } from "./tools/assertNoPnpmDlx";
7
7
  import { getBuildContext } from "./shared/buildContext";
8
+ import { SemVer } from "./tools/SemVer";
9
+ import { assert, is } from "tsafe/assert";
10
+ import chalk from "chalk";
8
11
 
9
12
  type CliCommandOptions = {
10
13
  projectDirPath: string | undefined;
@@ -80,7 +83,7 @@ program
80
83
  program
81
84
  .command<{
82
85
  port: number | undefined;
83
- keycloakVersion: string | undefined;
86
+ keycloakVersion: string | number | undefined;
84
87
  realmJsonFilePath: string | undefined;
85
88
  }>({
86
89
  name: "start-keycloak",
@@ -134,9 +137,50 @@ program
134
137
  handler: async ({ projectDirPath, keycloakVersion, port, realmJsonFilePath }) => {
135
138
  const { command } = await import("./start-keycloak");
136
139
 
140
+ validate_keycloak_version: {
141
+ if (keycloakVersion === undefined) {
142
+ break validate_keycloak_version;
143
+ }
144
+
145
+ const isValidVersion = (() => {
146
+ if (typeof keycloakVersion === "number") {
147
+ return false;
148
+ }
149
+
150
+ try {
151
+ SemVer.parse(keycloakVersion);
152
+ } catch {
153
+ return false;
154
+ }
155
+
156
+ return;
157
+ })();
158
+
159
+ if (isValidVersion) {
160
+ break validate_keycloak_version;
161
+ }
162
+
163
+ console.log(
164
+ chalk.red(
165
+ [
166
+ `Invalid Keycloak version: ${keycloakVersion}`,
167
+ "It should be a valid semver version example: 26.0.4"
168
+ ].join(" ")
169
+ )
170
+ );
171
+
172
+ process.exit(1);
173
+ }
174
+
175
+ assert(is<string | undefined>(keycloakVersion));
176
+
137
177
  await command({
138
178
  buildContext: getBuildContext({ projectDirPath }),
139
- cliCommandOptions: { keycloakVersion, port, realmJsonFilePath }
179
+ cliCommandOptions: {
180
+ keycloakVersion,
181
+ port,
182
+ realmJsonFilePath
183
+ }
140
184
  });
141
185
  }
142
186
  });
@@ -201,7 +245,7 @@ program
201
245
  .command({
202
246
  name: "copy-keycloak-resources-to-public",
203
247
  description:
204
- "(Webpack/Create-React-App only) Copy Keycloak default theme resources to the public directory."
248
+ "(Internal) Copy Keycloak default theme resources to the public directory."
205
249
  })
206
250
  .task({
207
251
  skip,
@@ -246,7 +290,10 @@ program
246
290
  file: string;
247
291
  }>({
248
292
  name: "eject-file",
249
- description: "Take ownership over a given file"
293
+ description: [
294
+ "WARNING: Not usable yet, will be used for future features",
295
+ "Take ownership over a given file"
296
+ ].join(" ")
250
297
  })
251
298
  .option({
252
299
  key: "file",
@@ -32,27 +32,38 @@ export async function getUiModuleFileSourceCodeReadyToBeCopied(params: {
32
32
  await fsPr.readFile(pathJoin(uiModuleDirPath, KEYCLOAK_THEME, fileRelativePath))
33
33
  ).toString("utf8");
34
34
 
35
- const comment = (() => {
36
- if (isForEjection) {
37
- return [
38
- `/*`,
39
- `This file was ejected from ${uiModuleName} version ${uiModuleVersion}.`,
40
- `*/`
41
- ].join("\n");
42
- } else {
43
- return [
44
- `/*`,
45
- `WARNING: Before modifying this file run the following command:`,
46
- ``,
47
- `npx keycloakify eject-file --file ${fileRelativePath.split(pathSep).join("/")}\``,
48
- ``,
49
- `This file comes from ${uiModuleName} version ${uiModuleVersion}.`,
50
- `*/`
51
- ];
35
+ const toComment = (lines: string[]) => {
36
+ for (const ext of [".ts", ".tsx", ".css", ".less", ".sass", ".js", ".jsx"]) {
37
+ if (!fileRelativePath.endsWith(ext)) {
38
+ continue;
39
+ }
40
+
41
+ return [`/**`, ...lines.map(line => ` * ${line}`), ` */`].join("\n");
42
+ }
43
+
44
+ if (fileRelativePath.endsWith(".html")) {
45
+ return [`<!--`, ...lines.map(line => ` ${line}`), `-->`].join("\n");
52
46
  }
53
- })();
54
47
 
55
- sourceCode = [comment, ``, sourceCode].join("\n");
48
+ return undefined;
49
+ };
50
+
51
+ const comment = toComment(
52
+ isForEjection
53
+ ? [`This file was ejected from ${uiModuleName} version ${uiModuleVersion}.`]
54
+ : [
55
+ `WARNING: Before modifying this file run the following command:`,
56
+ ``,
57
+ `$ npx keycloakify eject-file --file ${fileRelativePath.split(pathSep).join("/")}`,
58
+ ``,
59
+ `This file comes from ${uiModuleName} version ${uiModuleVersion}.`,
60
+ `This file has been copied over to your repo by your postinstall script: \`npx keycloakify postinstall\``
61
+ ]
62
+ );
63
+
64
+ if (comment !== undefined) {
65
+ sourceCode = [comment, ``, sourceCode].join("\n");
66
+ }
56
67
 
57
68
  const destFilePath = pathJoin(buildContext.themeSrcDirPath, fileRelativePath);
58
69
 
@@ -1,5 +1,4 @@
1
- import { assert, type Equals } from "tsafe/assert";
2
- import { is } from "tsafe/is";
1
+ import { assert, type Equals, is } from "tsafe/assert";
3
2
  import type { BuildContext } from "../shared/buildContext";
4
3
  import type { UiModuleMeta } from "./uiModuleMeta";
5
4
  import { z } from "zod";
@@ -9,6 +8,7 @@ import { SemVer } from "../tools/SemVer";
9
8
  import { same } from "evt/tools/inDepth/same";
10
9
  import { runPrettier, getIsPrettierAvailable } from "../tools/runPrettier";
11
10
  import { npmInstall } from "../tools/npmInstall";
11
+ import { dirname as pathDirname } from "path";
12
12
 
13
13
  export type BuildContextLike = {
14
14
  packageJsonFilePath: string;
@@ -150,7 +150,7 @@ export async function installUiModulesPeerDependencies(params: {
150
150
  await fsPr.writeFile(buildContext.packageJsonFilePath, packageJsonContentStr);
151
151
 
152
152
  npmInstall({
153
- packageJsonDirPath: buildContext.packageJsonFilePath
153
+ packageJsonDirPath: pathDirname(buildContext.packageJsonFilePath)
154
154
  });
155
155
 
156
156
  process.exit(0);
@@ -38,9 +38,9 @@ export async function writeManagedGitignoreFile(params: {
38
38
  `# This file is managed by Keycloakify, do not edit it manually.`,
39
39
  ``,
40
40
  DELIMITER_START,
41
- ...ejectedFilesRelativePaths.map(fileRelativePath =>
42
- fileRelativePath.split(pathSep).join("/")
43
- ),
41
+ ...ejectedFilesRelativePaths
42
+ .map(fileRelativePath => fileRelativePath.split(pathSep).join("/"))
43
+ .map(line => `# ${line}`),
44
44
  DELIMITER_END,
45
45
  ``,
46
46
  ...uiModuleMetas
@@ -122,6 +122,7 @@ export async function readManagedGitignoreFile(params: {
122
122
  const ejectedFilesRelativePaths = payload
123
123
  .split("\n")
124
124
  .map(line => line.trim())
125
+ .map(line => line.replace(/^# /, ""))
125
126
  .filter(line => line !== "")
126
127
  .map(line =>
127
128
  getAbsoluteAndInOsFormatPath({
@@ -9,6 +9,8 @@ import { dirname as pathDirname } from "path";
9
9
  import { join as pathJoin } from "path";
10
10
  import { existsAsync } from "../tools/fs.existsAsync";
11
11
  import * as fsPr from "fs/promises";
12
+ import { getIsTrackedByGit } from "../tools/isTrackedByGit";
13
+ import { untrackFromGit } from "../tools/untrackFromGit";
12
14
 
13
15
  export async function command(params: { buildContext: BuildContext }) {
14
16
  const { buildContext } = params;
@@ -45,8 +47,10 @@ export async function command(params: { buildContext: BuildContext }) {
45
47
  fileRelativePath
46
48
  );
47
49
 
50
+ const doesFileExist = await existsAsync(destFilePath);
51
+
48
52
  skip_condition: {
49
- if (!(await existsAsync(destFilePath))) {
53
+ if (!doesFileExist) {
50
54
  break skip_condition;
51
55
  }
52
56
 
@@ -61,8 +65,26 @@ export async function command(params: { buildContext: BuildContext }) {
61
65
  return;
62
66
  }
63
67
 
68
+ git_untrack: {
69
+ if (!doesFileExist) {
70
+ break git_untrack;
71
+ }
72
+
73
+ const isTracked = await getIsTrackedByGit({
74
+ filePath: destFilePath
75
+ });
76
+
77
+ if (!isTracked) {
78
+ break git_untrack;
79
+ }
80
+
81
+ await untrackFromGit({
82
+ filePath: destFilePath
83
+ });
84
+ }
85
+
64
86
  {
65
- const dirName = pathDirname(copyableFilePath);
87
+ const dirName = pathDirname(destFilePath);
66
88
 
67
89
  if (!(await existsAsync(dirName))) {
68
90
  await fsPr.mkdir(dirName, { recursive: true });
@@ -1,14 +1,13 @@
1
- import { assert, type Equals } from "tsafe/assert";
1
+ import { assert, type Equals, is } from "tsafe/assert";
2
2
  import { id } from "tsafe/id";
3
3
  import { z } from "zod";
4
4
  import { join as pathJoin, dirname as pathDirname } from "path";
5
5
  import * as fsPr from "fs/promises";
6
6
  import type { BuildContext } from "../shared/buildContext";
7
- import { is } from "tsafe/is";
8
7
  import { existsAsync } from "../tools/fs.existsAsync";
9
8
  import { listInstalledModules } from "../tools/listInstalledModules";
10
9
  import { crawlAsync } from "../tools/crawlAsync";
11
- import { getIsPrettierAvailable, getPrettierAndConfig } from "../tools/runPrettier";
10
+ import { getIsPrettierAvailable, getPrettier } from "../tools/runPrettier";
12
11
  import { readThisNpmPackageVersion } from "../tools/readThisNpmPackageVersion";
13
12
  import {
14
13
  getUiModuleFileSourceCodeReadyToBeCopied,
@@ -16,6 +15,7 @@ import {
16
15
  } from "./getUiModuleFileSourceCodeReadyToBeCopied";
17
16
  import * as crypto from "crypto";
18
17
  import { KEYCLOAK_THEME } from "../shared/constants";
18
+ import { exclude } from "tsafe/exclude";
19
19
 
20
20
  export type UiModuleMeta = {
21
21
  moduleName: string;
@@ -100,9 +100,9 @@ export async function getUiModuleMetas(params: {
100
100
  return null;
101
101
  }
102
102
 
103
- const { config } = await getPrettierAndConfig();
103
+ const { configHash } = await getPrettier();
104
104
 
105
- return crypto.createHash("sha256").update(JSON.stringify(config)).digest("hex");
105
+ return configHash;
106
106
  })();
107
107
 
108
108
  const installedUiModules = await (async () => {
@@ -113,11 +113,16 @@ export async function getUiModuleMetas(params: {
113
113
  moduleName.includes("keycloakify") && moduleName !== "keycloakify"
114
114
  });
115
115
 
116
- return Promise.all(
117
- installedModulesWithKeycloakifyInTheName.filter(async ({ dirPath }) =>
118
- existsAsync(pathJoin(dirPath, KEYCLOAK_THEME))
116
+ return (
117
+ await Promise.all(
118
+ installedModulesWithKeycloakifyInTheName.map(async entry => {
119
+ if (!(await existsAsync(pathJoin(entry.dirPath, KEYCLOAK_THEME)))) {
120
+ return undefined;
121
+ }
122
+ return entry;
123
+ })
119
124
  )
120
- );
125
+ ).filter(exclude(undefined));
121
126
  })();
122
127
 
123
128
  const cacheContent = await (async () => {
@@ -9,7 +9,7 @@ import {
9
9
  import { getAbsoluteAndInOsFormatPath } from "../tools/getAbsoluteAndInOsFormatPath";
10
10
  import { z } from "zod";
11
11
  import * as fs from "fs";
12
- import { assert, type Equals } from "tsafe/assert";
12
+ import { assert, type Equals, is } from "tsafe/assert";
13
13
  import * as child_process from "child_process";
14
14
  import {
15
15
  VITE_PLUGIN_SUB_SCRIPTS_ENV_NAMES,
@@ -23,7 +23,6 @@ import { objectEntries } from "tsafe/objectEntries";
23
23
  import { id } from "tsafe/id";
24
24
  import chalk from "chalk";
25
25
  import { getProxyFetchOptions, type FetchOptionsLike } from "../tools/fetchProxyOptions";
26
- import { is } from "tsafe/is";
27
26
 
28
27
  export type BuildContext = {
29
28
  themeVersion: string;
@@ -10,7 +10,8 @@ export type ThemeType = (typeof THEME_TYPES)[number];
10
10
 
11
11
  export const VITE_PLUGIN_SUB_SCRIPTS_ENV_NAMES = {
12
12
  RUN_POST_BUILD_SCRIPT: "KEYCLOAKIFY_RUN_POST_BUILD_SCRIPT",
13
- RESOLVE_VITE_CONFIG: "KEYCLOAKIFY_RESOLVE_VITE_CONFIG"
13
+ RESOLVE_VITE_CONFIG: "KEYCLOAKIFY_RESOLVE_VITE_CONFIG",
14
+ READ_KC_CONTEXT_FROM_URL: "KEYCLOAKIFY_READ_KC_CONTEXT_FROM_URL"
14
15
  } as const;
15
16
 
16
17
  export const BUILD_FOR_KEYCLOAK_MAJOR_VERSION_ENV_NAME =
@@ -78,3 +79,5 @@ export const CUSTOM_HANDLER_ENV_NAMES = {
78
79
  };
79
80
 
80
81
  export const KEYCLOAK_THEME = "keycloak-theme";
82
+
83
+ export const KEYCLOAKIFY_SPA_DEV_SERVER_PORT = "KEYCLOAKIFY_SPA_DEV_SERVER_PORT";
@@ -628,14 +628,16 @@
628
628
  "id": "d8f14dc4-5f0f-4a1d-8c0b-cfe78ee55cb3",
629
629
  "clientId": "account-console",
630
630
  "name": "${client_account-console}",
631
+ "description": "",
631
632
  "rootUrl": "${authBaseUrl}",
633
+ "adminUrl": "",
632
634
  "baseUrl": "/realms/myrealm/account/",
633
635
  "surrogateAuthRequired": false,
634
636
  "enabled": true,
635
637
  "alwaysDisplayInConsole": false,
636
638
  "clientAuthenticatorType": "client-secret",
637
- "redirectUris": ["/realms/myrealm/account/*"],
638
- "webOrigins": [],
639
+ "redirectUris": ["*"],
640
+ "webOrigins": ["*"],
639
641
  "notBefore": 0,
640
642
  "bearerOnly": false,
641
643
  "consentRequired": false,
@@ -647,8 +649,13 @@
647
649
  "frontchannelLogout": false,
648
650
  "protocol": "openid-connect",
649
651
  "attributes": {
652
+ "oidc.ciba.grant.enabled": "false",
653
+ "backchannel.logout.session.required": "true",
650
654
  "post.logout.redirect.uris": "+",
651
- "pkce.code.challenge.method": "S256"
655
+ "oauth2.device.authorization.grant.enabled": "false",
656
+ "display.on.consent.screen": "false",
657
+ "pkce.code.challenge.method": "S256",
658
+ "backchannel.logout.revoke.offline.tokens": "false"
652
659
  },
653
660
  "authenticationFlowBindingOverrides": {},
654
661
  "fullScopeAllowed": false,
@@ -1574,14 +1581,14 @@
1574
1581
  "subComponents": {},
1575
1582
  "config": {
1576
1583
  "allowed-protocol-mapper-types": [
1584
+ "oidc-sha256-pairwise-sub-mapper",
1577
1585
  "oidc-full-name-mapper",
1578
- "oidc-usermodel-attribute-mapper",
1579
- "oidc-address-mapper",
1580
- "saml-user-attribute-mapper",
1581
1586
  "oidc-usermodel-property-mapper",
1582
- "saml-user-property-mapper",
1583
1587
  "saml-role-list-mapper",
1584
- "oidc-sha256-pairwise-sub-mapper"
1588
+ "saml-user-attribute-mapper",
1589
+ "saml-user-property-mapper",
1590
+ "oidc-usermodel-attribute-mapper",
1591
+ "oidc-address-mapper"
1585
1592
  ]
1586
1593
  }
1587
1594
  },
@@ -1612,13 +1619,13 @@
1612
1619
  "config": {
1613
1620
  "allowed-protocol-mapper-types": [
1614
1621
  "oidc-sha256-pairwise-sub-mapper",
1615
- "oidc-usermodel-property-mapper",
1616
- "oidc-address-mapper",
1622
+ "saml-user-property-mapper",
1617
1623
  "oidc-usermodel-attribute-mapper",
1618
- "oidc-full-name-mapper",
1624
+ "oidc-address-mapper",
1625
+ "saml-role-list-mapper",
1626
+ "oidc-usermodel-property-mapper",
1619
1627
  "saml-user-attribute-mapper",
1620
- "saml-user-property-mapper",
1621
- "saml-role-list-mapper"
1628
+ "oidc-full-name-mapper"
1622
1629
  ]
1623
1630
  }
1624
1631
  },
@@ -1671,13 +1678,6 @@
1671
1678
  "providerId": "rsa-generated",
1672
1679
  "subComponents": {},
1673
1680
  "config": {
1674
- "privateKey": [
1675
- "MIIEowIBAAKCAQEAsYUWzVfZMd6ywpBmLJYeF1U9Mgd/z3xWvl1Yq76oRPPfpcqQitN+cktWqu0hPerCVSl2ltwXDMrUwFzswG9MiM9hb+BLEld7kYiYkcFNt3lCtmmeRQEae7JwWimzeNV96Qlz0tHY8f9Zh0ffPDsLTN1HGAeRJJhI7mNQm6qCJNMCfVA/O5SWumsIn2XLnSMiQ05AACVHOLUq6rAZ2zCCaYmXTmJkuSOb8e26V303P6l63DSe5HSNXDdI00tjfFFf37q870zhvfsotrjjx0RMijy9Kjj8OZF+pFHpDRaGEi8tpQxZDnCTofTieB/Vp3QP+aTlvAyD3Q1ZnJxGQCLygwIDAQABAoIBABUJ9XMJGNQzamiVwuOWN7ht4UP8ezYvgdEA8NaLUO0PIYVIKyD7l4OwkHPPM9PfRACM2qG0MZp8sCyg4WxIeepy+D979oRqJYUmNRLSipqWlASuItRXIPjiY99uYXdjh2R8Os5pvCD+MZxPX9KHGuaVXmzSJMO7YAAPeYkMHcLYTp/U0c65Ztaaz1zz1FeyvpjkLr9SHiMcIN51zFmhvT1tcRIqy4zidisjrTSUr/KPVxeJtrEfyhTGk3z41yJf5YbeaxaMjJR5x0WXzt1fWVmA/V1bWa2Zlj9d8AxDReA1p7Lpstz34PRoCMj9bmFguI2+RTw6K0D++Jydfxmh8vUCgYEA5Zwk2r3TFO3i3V70LOn6CLzn15yLeuSIJ9p2os70jQOmFMCreLdcUbCaiUe7UV/IIVftbcxhFm9zECXZXX0wubcmHZqyptlbuAn1de4QkLJixXo1A7ZQXBEZk22WN2naXHQF5oK6lh/VSLcZBajTsyvBm5JWXrd8djjG06MugA8CgYEAxexKI5IwcLhpMDV9UPQb/+lDWHVqCT2xwYxnZ85y+5gmrOyyT7mIChz3DFYiaw4CHJWmBkIDBaiDgLEgQk4QXWzYshXawShBHnv1h08bVMMw98Ivec7ZRkV+/ET30YRwC2Uyk4bm4HpwVV5GCFhC4aAvRcCA1CIJk3MwcOwksk0CgYEAqxyaOomMbOR7VQ4WWgJkW26sOHppV8RH06tzDhG9HfnCI2USZHwBSL+b6wKSDiqbMn4cat8M23NjBH2wZ4OMdFqRBS7sRHtnZtfFHYW0wqCuCwzvxTxw1qvHq57Xe6RfHtc4LnjuJELE59PLyfPvEG9jcVS1GREUp+XYBpBtbvECgYAMhWBDU9JAr0noRNoCrw6+Z9Fc3UCyCPcf2XQJOyRHCl8X/XliVchna2GtpB1VTHORv13bc32hdAGtuIbj6vBaGLK0wXEvWw6TkR/9SWHfQOHuKpi6Sf2w1mCsMOjElm5IKkTC1Hvyo4xLukUP7hV9FJcpAH6l7OlSLK1Z13aS2QKBgB6w4gvmVEQruHV5+K60OatuFojr+kxJwmzCb5uKOULUFezT2pA3p3l6IWxGL2XtM+LD0SiZE3KZJUzf+LatYlBU9ek4F1krkVNUTRZpzUa0oADbymCL1chM4oPIs7sISQlFIH2wOSZt6Blvcw0E0wfjd9Gv/LHxcMnlRb1t1sLk"
1676
- ],
1677
- "keyUse": ["SIG"],
1678
- "certificate": [
1679
- "MIICnTCCAYUCBgGQBsyplzANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdteXJlYWxtMB4XDTI0MDYxMTEwMTQ1NFoXDTM0MDYxMTEwMTYzNFowEjEQMA4GA1UEAwwHbXlyZWFsbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALGFFs1X2THessKQZiyWHhdVPTIHf898Vr5dWKu+qETz36XKkIrTfnJLVqrtIT3qwlUpdpbcFwzK1MBc7MBvTIjPYW/gSxJXe5GImJHBTbd5QrZpnkUBGnuycFops3jVfekJc9LR2PH/WYdH3zw7C0zdRxgHkSSYSO5jUJuqgiTTAn1QPzuUlrprCJ9ly50jIkNOQAAlRzi1KuqwGdswgmmJl05iZLkjm/Htuld9Nz+petw0nuR0jVw3SNNLY3xRX9+6vO9M4b37KLa448dETIo8vSo4/DmRfqRR6Q0WhhIvLaUMWQ5wk6H04ngf1ad0D/mk5bwMg90NWZycRkAi8oMCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAVS+gJshIFX6cmBGI8UaOOI/9+XFb4Gi+DHaHVWVVHTd14MoqNK1bmmyTHbGIZbvK8UqgJ9+FhJX1ejx17d4KBzkZI3tYvPnVacHvaw1CIUMZ1Ini6u+UGUTnIlnQzCG0pcTKjOZXf3ih1B2CKdwyC7XeXyEJHicAIG7XfzYfYd9DYHvA+h6hrXaQcNJMW7WFNbtb3fJhtlv5P1Iw+ZEGdj15ukMI0bg2OEQA0F3jIw6QZpigSAGuai3HOY6OgoPO82d7TyTYlNhuwyutWr9izl6QMc2R7BmRfW9XQj4ICR2VWJiL9nqz+SOyqnjQiOObuw8Vywb8c36R1Ym1aaGjOw=="
1680
- ],
1681
1681
  "priority": ["100"]
1682
1682
  }
1683
1683
  },
@@ -1687,13 +1687,6 @@
1687
1687
  "providerId": "rsa-enc-generated",
1688
1688
  "subComponents": {},
1689
1689
  "config": {
1690
- "privateKey": [
1691
- "MIIEogIBAAKCAQEAkQtefHy82e8d5dVWN00LnGI5YmBOTKh0tgqayVRjqLH6u3NfgJVVIe0tFnxa7Wka/ySHrn1KSsW52czZ4uPXLUo4sXBkQxyyFXeZiWN8H+9WiUQ+0hefZF4es5ZPhY2VpeMK9XAnphC362LFLVycXulkpJcQ+4DjI99To4LLyJmjQvsVaJ7amoVJ5xd62eUv+D7f2+jwuaTwjGE3+MWZADXjVxsUY1qJuGLGKnLkNNxJNMDhvnKYw+aa3Z4V90fQVyjN1Volgw3DdA59o4wrWEy+2xHc6j2ESi8+cM60fWzZU9sp2XkyJoCnV7nmwk7pZkDy3zvAkeOWzrr3OWeR3wIDAQABAoIBACWMcet8R0+L7YuATQ+H7IeRjhV/pQWHXp9541RXem1DlgtM9N5Oynk78z4s90Uavphqlo1/deohgdl2hLmODjh1THPzCqGtHhUcnyzICmwiA58JgdHVt7e9/eiz8uY6HxGQ01dyr3D4RwSyzyTNItYXSayqRwU0+phgykA8LhFCAQM/UkRXDf6UCFKBhDyE7VPBaDv0xyxNb7dKtE7C6Qo5t5D40xCfQ8ni8OcD5RvshQq5xOWcw7igxAhlmXCu1fuO2CDiSiqXLMENs4NlwilQ3caMXAIzUiblaKwCrrK2noBoitx6vuOR2tKmIZSlTyDAG4vLQQtOHk53hBoupGECgYEAx4jSmLM9uUzNwNY1zfs8iNswxbU3YibNe2Q+IFmOQofvTaq1jBBxdPWX5ifIbuTvOAA33pmJRh+BtWzOBBQC7Z4i9mdfvyWB6s8t9nnTnWIY5Hj+hV5gaqae59MjdudsORR887fxzPIeAwwaETfKaZnYpC6zLaE3BXwhIcjlFTcCgYEAuhcKf16JkEYNIwanVHpUXjFxwAThAogHWZAngRokmai67Iulx+rSUhhtOIXtmjj/EaObsrqo5yCKAVZ5EbPTOajdd9RtFzH6q3bRjRdp8o8ZVx4c1vMNaOnLbvK4YzJlKSZN9N7m255Mg+/ea3veKVZsSVHDMnuYmH8GjncjPJkCgYAOIUlQmPjZA3BapJDA2nbJ9kO47IFUiQzqHQotPkpNudSfemRK2+s87htoqA6Qk9PA8nsCX3sSJS8JSwA317bxXs55Bo8IOT6/AxbtKmlq7sR2gX78sNdBFjWQkyoixHasgB/tHmyYJ9kqPBQoffvuiH+H+OqlY5JC6CxseQ6H9wKBgF69Hj4MDjLiRwve9k9+2/b8azHcCgX05PEG/+WtPpbwHQIScnseJKdhAjH1lSqf+9OqHLlYaGcK3Nejg42spEvFmcLI5iUZ78lde3++PNUdX0RH81zHbrtL06MPdSojXPcfJi8VUCjdJY1CEFVeQZOACS8mrh7EZ8KzYM4k/055AoGAYqjBv3WS8ul7kAsjpZKpIw1QZZaTjBSmLpjB6X8InF+Zihjgm80Dd4RMFnMnEawhFBvnpklvyw5Ce6NSwcC137kN3NVpJypykkXuYkimg7OxgJjR7YFdbQWJWlc+1eB81WTHcEOHVI/DmeV2yVJcv6kA2iC+3/JA0VoJxvrRBKc="
1692
- ],
1693
- "keyUse": ["ENC"],
1694
- "certificate": [
1695
- "MIICnTCCAYUCBgGQBsyq0jANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdteXJlYWxtMB4XDTI0MDYxMTEwMTQ1NFoXDTM0MDYxMTEwMTYzNFowEjEQMA4GA1UEAwwHbXlyZWFsbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJELXnx8vNnvHeXVVjdNC5xiOWJgTkyodLYKmslUY6ix+rtzX4CVVSHtLRZ8Wu1pGv8kh659SkrFudnM2eLj1y1KOLFwZEMcshV3mYljfB/vVolEPtIXn2ReHrOWT4WNlaXjCvVwJ6YQt+tixS1cnF7pZKSXEPuA4yPfU6OCy8iZo0L7FWie2pqFSecXetnlL/g+39vo8Lmk8IxhN/jFmQA141cbFGNaibhixipy5DTcSTTA4b5ymMPmmt2eFfdH0FcozdVaJYMNw3QOfaOMK1hMvtsR3Oo9hEovPnDOtH1s2VPbKdl5MiaAp1e55sJO6WZA8t87wJHjls669zlnkd8CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAD9wQ+CJ0FRgls3JrUzxwHLgrJ3Yo4+mDFpSe1rh2XYK5FEIWDWSqxaXI3p0cOZq75RZmI2xV8oaiJMUz9WMZkbNe/KtGRzHY1N9AZooicGIsnFu1t++b8taFxxpvKWZgnbOum2PZlfcNiXL0QeMv0wwhfn9zKA9W1DRcqYGbIamoyVlumvbNyIjqXJKwGYIOW6GNt7v3wJl5AJw8qAU/O/DQwWwmzcnFGNRxRxAwI7we8EiQ5JlG0Wi+nyAQn74o3RhNr3zsY0ndmFx9bFV4BBo2AiYGozCDOCCG5HvrmoDbrm//wmGRv0tCwueBzWHL2mhtbZ6sGWmMWfiTJ2HPpg=="
1696
- ],
1697
1690
  "priority": ["100"],
1698
1691
  "algorithm": ["RSA-OAEP"]
1699
1692
  }
@@ -1704,8 +1697,6 @@
1704
1697
  "providerId": "aes-generated",
1705
1698
  "subComponents": {},
1706
1699
  "config": {
1707
- "kid": ["1c1d0c8a-6f0b-48a9-a66f-488489137d85"],
1708
- "secret": ["N4wzheVYYBWxFn9VGWTPQQ"],
1709
1700
  "priority": ["100"]
1710
1701
  }
1711
1702
  },
@@ -1715,10 +1706,6 @@
1715
1706
  "providerId": "hmac-generated",
1716
1707
  "subComponents": {},
1717
1708
  "config": {
1718
- "kid": ["ce43821c-6cfd-4ea9-a29a-a724a37e6955"],
1719
- "secret": [
1720
- "j_8WeQHYt5R6coay0IOUeu9hGvCoJsgnENSoYm0gDlDx6IHOg-f6p17QIaesNmgrzXtJDRpYMhSjpTMHOnHCHLxwUM4eVg9TcszffndB850Yj3PHPeCc5aoHcpYzWN9NDZZ02nBYA04nfbkdlLXiGlpS3I3e502e4DX3rFtbFZ0"
1721
- ],
1722
1709
  "priority": ["100"],
1723
1710
  "algorithm": ["HS512"]
1724
1711
  }
@@ -2388,7 +2375,7 @@
2388
2375
  "clientSessionMaxLifespan": "0",
2389
2376
  "organizationsEnabled": "false"
2390
2377
  },
2391
- "keycloakVersion": "25.0.0",
2378
+ "keycloakVersion": "25.0.6",
2392
2379
  "userManagedAccessAllowed": false,
2393
2380
  "organizationsEnabled": false,
2394
2381
  "clientProfiles": {