keycloakify 10.1.0-rc.1 → 10.1.1

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 (205) hide show
  1. package/PUBLIC_URL.js +2 -2
  2. package/PUBLIC_URL.js.map +1 -1
  3. package/account/KcContext/kcContextMocks.js +3 -3
  4. package/account/KcContext/kcContextMocks.js.map +1 -1
  5. package/bin/193.index.js +198 -62
  6. package/bin/{365.index.js → 20.index.js} +302 -263
  7. package/bin/31.index.js +15 -23
  8. package/bin/{430.index.js → 33.index.js} +579 -4
  9. package/bin/{678.index.js → 36.index.js} +2 -577
  10. package/bin/{440.index.js → 499.index.js} +259 -181
  11. package/bin/526.index.js +12 -793
  12. package/bin/599.index.js +4 -1
  13. package/bin/780.index.js +1 -1
  14. package/bin/{525.index.js → 903.index.js} +4840 -97
  15. package/bin/932.index.js +115 -886
  16. package/bin/main.js +4 -4
  17. package/bin/shared/buildContext.d.ts +0 -2
  18. package/bin/shared/buildContext.js.map +1 -1
  19. package/bin/shared/constants.d.ts +5 -6
  20. package/bin/shared/constants.js +5 -6
  21. package/bin/shared/constants.js.map +1 -1
  22. package/bin/shared/copyKeycloakResourcesToPublic.d.ts +2 -4
  23. package/bin/shared/copyKeycloakResourcesToPublic.js.map +1 -1
  24. package/login/KcContext/KcContext.d.ts +9 -18
  25. package/login/KcContext/KcContext.js.map +1 -1
  26. package/login/KcContext/kcContextMocks.js +6 -10
  27. package/login/KcContext/kcContextMocks.js.map +1 -1
  28. package/login/Template.js +4 -59
  29. package/login/Template.js.map +1 -1
  30. package/login/Template.useStylesAndScripts.d.ts +17 -0
  31. package/login/Template.useStylesAndScripts.js +69 -0
  32. package/login/Template.useStylesAndScripts.js.map +1 -0
  33. package/login/pages/Login.js +1 -1
  34. package/login/pages/Login.js.map +1 -1
  35. package/login/pages/LoginIdpLinkConfirmOverride.js +0 -1
  36. package/login/pages/LoginIdpLinkConfirmOverride.js.map +1 -1
  37. package/login/pages/LoginPasskeysConditionalAuthenticate.js +6 -49
  38. package/login/pages/LoginPasskeysConditionalAuthenticate.js.map +1 -1
  39. package/login/pages/LoginPasskeysConditionalAuthenticate.useScript.d.ts +20 -0
  40. package/login/pages/LoginPasskeysConditionalAuthenticate.useScript.js +49 -0
  41. package/login/pages/LoginPasskeysConditionalAuthenticate.useScript.js.map +1 -0
  42. package/login/pages/LoginRecoveryAuthnCodeConfig.js +4 -126
  43. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
  44. package/login/pages/LoginRecoveryAuthnCodeConfig.useScript.d.ts +9 -0
  45. package/login/pages/LoginRecoveryAuthnCodeConfig.useScript.js +133 -0
  46. package/login/pages/LoginRecoveryAuthnCodeConfig.useScript.js.map +1 -0
  47. package/login/pages/LoginUsername.js +1 -1
  48. package/login/pages/LoginUsername.js.map +1 -1
  49. package/login/pages/Register.js +6 -3
  50. package/login/pages/Register.js.map +1 -1
  51. package/login/pages/WebauthnAuthenticate.js +13 -116
  52. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  53. package/login/pages/WebauthnAuthenticate.useScript.d.ts +21 -0
  54. package/login/pages/WebauthnAuthenticate.useScript.js +41 -0
  55. package/login/pages/WebauthnAuthenticate.useScript.js.map +1 -0
  56. package/login/pages/WebauthnRegister.js +8 -178
  57. package/login/pages/WebauthnRegister.js.map +1 -1
  58. package/login/pages/WebauthnRegister.useScript.d.ts +27 -0
  59. package/login/pages/WebauthnRegister.useScript.js +49 -0
  60. package/login/pages/WebauthnRegister.useScript.js.map +1 -0
  61. package/package.json +125 -15
  62. package/res/account-v1/account.ftl +70 -0
  63. package/res/account-v1/applications.ftl +76 -0
  64. package/res/account-v1/federatedIdentity.ftl +42 -0
  65. package/res/account-v1/log.ftl +35 -0
  66. package/res/account-v1/messages/messages_ar.properties +406 -0
  67. package/res/account-v1/messages/messages_ca.properties +147 -0
  68. package/res/account-v1/messages/messages_cs.properties +171 -0
  69. package/res/account-v1/messages/messages_da.properties +339 -0
  70. package/res/account-v1/messages/messages_de.properties +353 -0
  71. package/res/account-v1/messages/messages_en.properties +404 -0
  72. package/res/account-v1/messages/messages_es.properties +147 -0
  73. package/res/account-v1/messages/messages_fi.properties +400 -0
  74. package/res/account-v1/messages/messages_fr.properties +180 -0
  75. package/res/account-v1/messages/messages_hu.properties +334 -0
  76. package/res/account-v1/messages/messages_it.properties +336 -0
  77. package/res/account-v1/messages/messages_ja.properties +335 -0
  78. package/res/account-v1/messages/messages_lt.properties +154 -0
  79. package/res/account-v1/messages/messages_lv.properties +197 -0
  80. package/res/account-v1/messages/messages_nl.properties +371 -0
  81. package/res/account-v1/messages/messages_no.properties +152 -0
  82. package/res/account-v1/messages/messages_pl.properties +248 -0
  83. package/res/account-v1/messages/messages_pt_BR.properties +349 -0
  84. package/res/account-v1/messages/messages_ru.properties +235 -0
  85. package/res/account-v1/messages/messages_sk.properties +196 -0
  86. package/res/account-v1/messages/messages_sv.properties +150 -0
  87. package/res/account-v1/messages/messages_tr.properties +315 -0
  88. package/res/account-v1/messages/messages_zh_CN.properties +153 -0
  89. package/res/account-v1/password.ftl +59 -0
  90. package/res/account-v1/resource-detail.ftl +277 -0
  91. package/res/account-v1/resources/css/account.css +277 -0
  92. package/res/account-v1/resources/img/icon-sidebar-active.png +0 -0
  93. package/res/account-v1/resources/img/keycloak-logo.png +0 -0
  94. package/res/account-v1/resources/img/logo.png +0 -0
  95. package/res/account-v1/resources/resources-common/img/favicon.ico +0 -0
  96. package/res/account-v1/resources/resources-common/node_modules/patternfly/dist/css/patternfly-additions.min.css +5 -0
  97. package/res/account-v1/resources/resources-common/node_modules/patternfly/dist/css/patternfly.min.css +8 -0
  98. package/res/account-v1/resources/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Bold-webfont.woff2 +0 -0
  99. package/res/account-v1/resources/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Light-webfont.woff2 +0 -0
  100. package/res/account-v1/resources/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Regular-webfont.woff2 +0 -0
  101. package/res/account-v1/resources/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Semibold-webfont.woff2 +0 -0
  102. package/res/account-v1/resources/resources-common/node_modules/patternfly/dist/fonts/PatternFlyIcons-webfont.ttf +0 -0
  103. package/res/account-v1/resources/resources-common/node_modules/patternfly/dist/fonts/PatternFlyIcons-webfont.woff +0 -0
  104. package/res/account-v1/resources.ftl +403 -0
  105. package/res/account-v1/sessions.ftl +44 -0
  106. package/res/account-v1/template.ftl +88 -0
  107. package/res/account-v1/theme.properties +14 -0
  108. package/res/account-v1/totp.ftl +141 -0
  109. package/res/public/.keycloakify/account/css/account.css +277 -0
  110. package/res/public/.keycloakify/account/img/icon-sidebar-active.png +0 -0
  111. package/res/public/.keycloakify/account/img/keycloak-logo.png +0 -0
  112. package/res/public/.keycloakify/account/img/logo.png +0 -0
  113. package/res/public/.keycloakify/account/resources-common/img/favicon.ico +0 -0
  114. package/res/public/.keycloakify/account/resources-common/node_modules/patternfly/dist/css/patternfly-additions.min.css +5 -0
  115. package/res/public/.keycloakify/account/resources-common/node_modules/patternfly/dist/css/patternfly.min.css +8 -0
  116. package/res/public/.keycloakify/account/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Bold-webfont.woff2 +0 -0
  117. package/res/public/.keycloakify/account/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Light-webfont.woff2 +0 -0
  118. package/res/public/.keycloakify/account/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Regular-webfont.woff2 +0 -0
  119. package/res/public/.keycloakify/account/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Semibold-webfont.woff2 +0 -0
  120. package/res/public/.keycloakify/account/resources-common/node_modules/patternfly/dist/fonts/PatternFlyIcons-webfont.ttf +0 -0
  121. package/res/public/.keycloakify/account/resources-common/node_modules/patternfly/dist/fonts/PatternFlyIcons-webfont.woff +0 -0
  122. package/res/public/.keycloakify/login/css/login.css +629 -0
  123. package/res/public/.keycloakify/login/img/feedback-error-arrow-down.png +0 -0
  124. package/res/public/.keycloakify/login/img/feedback-error-sign.png +0 -0
  125. package/res/public/.keycloakify/login/img/feedback-success-arrow-down.png +0 -0
  126. package/res/public/.keycloakify/login/img/feedback-success-sign.png +0 -0
  127. package/res/public/.keycloakify/login/img/feedback-warning-arrow-down.png +0 -0
  128. package/res/public/.keycloakify/login/img/feedback-warning-sign.png +0 -0
  129. package/res/public/.keycloakify/login/img/keycloak-bg.png +0 -0
  130. package/res/public/.keycloakify/login/img/keycloak-logo-text.png +0 -0
  131. package/res/public/.keycloakify/login/img/keycloak-logo.png +0 -0
  132. package/res/public/.keycloakify/login/js/authChecker.js +49 -0
  133. package/res/public/.keycloakify/login/js/common.js +48 -0
  134. package/res/public/.keycloakify/login/js/kcMultivalued.js +106 -0
  135. package/res/public/.keycloakify/login/js/kcNumberFormat.js +21 -0
  136. package/res/public/.keycloakify/login/js/kcNumberUnFormat.js +19 -0
  137. package/res/public/.keycloakify/login/js/menu-button-links.js +315 -0
  138. package/{src/bin/shared/downloadKeycloakDefaultTheme/extra-assets → res/public/.keycloakify/login/js}/passkeysConditionalAuth.js +1 -1
  139. package/res/public/.keycloakify/login/js/passwordVisibility.js +15 -0
  140. package/res/public/.keycloakify/login/js/userProfile.js +71 -0
  141. package/res/public/.keycloakify/login/js/webauthnRegister.js +140 -0
  142. package/res/public/.keycloakify/login/resources-common/img/favicon.ico +0 -0
  143. package/res/public/.keycloakify/login/resources-common/lib/pficon/pficon.css +22 -0
  144. package/res/public/.keycloakify/login/resources-common/lib/pficon/pficon.woff2 +0 -0
  145. package/res/public/.keycloakify/login/resources-common/node_modules/@patternfly/patternfly/patternfly.min.css +2 -0
  146. package/res/public/.keycloakify/login/resources-common/node_modules/jquery/dist/jquery.min.js +2 -0
  147. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/css/patternfly-additions.min.css +5 -0
  148. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/css/patternfly.min.css +8 -0
  149. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Bold-webfont.ttf +0 -0
  150. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Bold-webfont.woff +0 -0
  151. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Bold-webfont.woff2 +0 -0
  152. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Light-webfont.woff2 +0 -0
  153. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Regular-webfont.woff2 +0 -0
  154. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/OpenSans-Semibold-webfont.woff2 +0 -0
  155. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/PatternFlyIcons-webfont.ttf +0 -0
  156. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/PatternFlyIcons-webfont.woff +0 -0
  157. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/fonts/fontawesome-webfont.woff2 +0 -0
  158. package/res/public/.keycloakify/login/resources-common/node_modules/patternfly/dist/img/bg-login.jpg +0 -0
  159. package/res/public/.keycloakify/login/resources-common/node_modules/rfc4648/lib/rfc4648.js +178 -0
  160. package/src/PUBLIC_URL.ts +5 -3
  161. package/src/account/KcContext/kcContextMocks.ts +3 -3
  162. package/src/bin/copy-keycloak-resources-to-public.ts +1 -1
  163. package/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +4 -1
  164. package/src/bin/initialize-email-theme.ts +28 -8
  165. package/src/bin/keycloakify/buildJars/buildJar.ts +3 -7
  166. package/src/bin/keycloakify/generateFtl/generateFtl.ts +3 -7
  167. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +65 -90
  168. package/src/bin/keycloakify/keycloakify.ts +38 -21
  169. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +2 -2
  170. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +3 -3
  171. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +3 -3
  172. package/src/bin/shared/buildContext.ts +1 -8
  173. package/src/bin/shared/constants.ts +5 -7
  174. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +30 -40
  175. package/src/bin/start-keycloak/start-keycloak.ts +10 -12
  176. package/src/login/KcContext/KcContext.ts +9 -18
  177. package/src/login/KcContext/kcContextMocks.ts +5 -13
  178. package/src/login/Template.tsx +4 -67
  179. package/src/login/Template.useStylesAndScripts.ts +94 -0
  180. package/src/login/pages/Login.tsx +1 -1
  181. package/src/login/pages/LoginIdpLinkConfirmOverride.tsx +0 -1
  182. package/src/login/pages/LoginPasskeysConditionalAuthenticate.tsx +6 -81
  183. package/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.tsx +72 -0
  184. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +4 -126
  185. package/src/login/pages/LoginRecoveryAuthnCodeConfig.useScript.tsx +142 -0
  186. package/src/login/pages/LoginUsername.tsx +1 -1
  187. package/src/login/pages/Register.tsx +35 -13
  188. package/src/login/pages/WebauthnAuthenticate.tsx +20 -133
  189. package/src/login/pages/WebauthnAuthenticate.useScript.tsx +64 -0
  190. package/src/login/pages/WebauthnRegister.tsx +8 -195
  191. package/src/login/pages/WebauthnRegister.useScript.tsx +93 -0
  192. package/src/tools/useInsertScriptTags.ts +14 -4
  193. package/src/vite-plugin/vite-plugin.ts +11 -15
  194. package/tools/useInsertScriptTags.d.ts +2 -2
  195. package/tools/useInsertScriptTags.js +8 -2
  196. package/tools/useInsertScriptTags.js.map +1 -1
  197. package/vite-plugin/index.js +3357 -47132
  198. package/bin/697.index.js +0 -4749
  199. package/bin/shared/downloadKeycloakStaticResources.d.ts +0 -9
  200. package/bin/shared/downloadKeycloakStaticResources.js.map +0 -1
  201. package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +0 -89
  202. package/src/bin/shared/downloadKeycloakDefaultTheme/downloadKeycloakDefaultTheme.ts +0 -338
  203. package/src/bin/shared/downloadKeycloakDefaultTheme/index.ts +0 -1
  204. package/src/bin/shared/downloadKeycloakStaticResources.ts +0 -53
  205. /package/{src/bin/shared/downloadKeycloakDefaultTheme/extra-assets → res/public/.keycloakify/login/js}/webauthnAuthenticate.js +0 -0
@@ -0,0 +1,403 @@
1
+ <#import "template.ftl" as layout>
2
+ <@layout.mainLayout active='authorization' bodyClass='authorization'; section>
3
+ <style>
4
+ .search-box,.close-icon,.search-wrapper {
5
+ position: relative;
6
+ }
7
+ .search-wrapper {
8
+ width: 500px;
9
+ margin: auto;
10
+ margin-top: 50px;
11
+ }
12
+ .search-box {
13
+ font-weight: 600;
14
+ color: white;
15
+ border: 1px solid #006e9c;
16
+ outline: 0;
17
+ border-radius: 15px;
18
+ background-color: #0085cf;
19
+ padding: 2px 5px;
20
+ }
21
+ .search-box:focus {
22
+ box-shadow: 0 0 15px 5px #b0e0ee;
23
+ border: 2px solid #bebede;
24
+ }
25
+ .close-icon {
26
+ border:1px solid transparent;
27
+ background-color: transparent;
28
+ display: inline-block;
29
+ float: right;
30
+ outline: 0;
31
+ cursor: pointer;
32
+ }
33
+ .close-icon:after {
34
+ display: block;
35
+ width: 15px;
36
+ height: 15px;
37
+ background-color: #FA9595;
38
+ z-index:1;
39
+ right: 35px;
40
+ top: 0;
41
+ bottom: 0;
42
+ margin: auto;
43
+ padding: 2px;
44
+ border-radius: 50%;
45
+ text-align: center;
46
+ color: white;
47
+ font-weight: normal;
48
+ font-size: 12px;
49
+ box-shadow: 0 0 2px #E50F0F;
50
+ cursor: pointer;
51
+ }
52
+ .search-box:not(:valid) ~ .close-icon {
53
+ display: none;
54
+ }
55
+ </style>
56
+ <script>
57
+ function showHideActions(elm) {
58
+ if (elm.style.display == 'none') {
59
+ elm.style.display = '';
60
+ } else {
61
+ elm.style.display = 'none';
62
+ }
63
+ }
64
+ function removeScopeElm(elm) {
65
+ var td = elm.parentNode;
66
+ var tr = td.parentNode;
67
+ var tbody = tr.parentNode;
68
+
69
+ td.removeChild(elm);
70
+
71
+ var childCount = td.childNodes.length - 1;
72
+
73
+ for (i = 0; i < td.childNodes.length; i++) {
74
+ if (!td.childNodes[i].tagName || td.childNodes[i].tagName.toUpperCase() != 'DIV') {
75
+ td.removeChild(td.childNodes[i]);
76
+ childCount--;
77
+ }
78
+ }
79
+
80
+ if (childCount <= 0) {
81
+ tbody.removeChild(tr);
82
+ }
83
+ }
84
+
85
+ function removeAllScopes(id) {
86
+ var scopesElm = document.getElementsByName('removeScope-' + id);
87
+
88
+ for (i = 0; i < scopesElm.length; i++) {
89
+ var td = scopesElm[i].parentNode.parentNode;
90
+ var tr = td.parentNode;
91
+ var tbody = tr.parentNode;
92
+ tbody.removeChild(tr);
93
+ }
94
+ }
95
+
96
+ function selectAllCheckBoxes(formName, elm, name) {
97
+ var shares = document.forms[formName].getElementsByTagName('input');
98
+
99
+ for (i = 0; i < shares.length; i++) {
100
+ if (shares[i].name == name) {
101
+ shares[i].checked = elm.checked;
102
+ }
103
+ }
104
+ }
105
+ </script>
106
+ <div class="row">
107
+ <div class="col-md-10">
108
+ <h2>
109
+ ${msg("myResources")}
110
+ </h2>
111
+ </div>
112
+ </div>
113
+
114
+ <#if authorization.resourcesWaitingApproval?size != 0>
115
+ <div class="row">
116
+ <div class="col-md-12">
117
+ <h3>
118
+ ${msg("needMyApproval")}
119
+ </h3>
120
+ </div>
121
+ </div>
122
+ <div class="row">
123
+ <div class="col-md-12">
124
+ <table class="table table-striped table-bordered">
125
+ <thead>
126
+ <tr>
127
+ <th>${msg("resource")}</th>
128
+ <th>${msg("requestor")}</th>
129
+ <th>${msg("permissionRequestion")}</th>
130
+ <th>${msg("action")}</th>
131
+ </tr>
132
+ </thead>
133
+ <tbody>
134
+ <#list authorization.resourcesWaitingApproval as resource>
135
+ <#list resource.permissions as permission>
136
+ <form action="${url.getResourceGrant(resource.id)}" name="approveForm-${resource.id}-${permission.requester.username}" method="post">
137
+ <input type="hidden" name="action" value="grant">
138
+ <input type="hidden" name="requester" value="${permission.requester.username}">
139
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
140
+ <tr>
141
+ <td>
142
+ <#if resource.displayName??>${resource.displayName}<#else>${resource.name}</#if>
143
+ </td>
144
+ <td>
145
+ <#if permission.requester.email??>${permission.requester.email}<#else>${permission.requester.username}</#if>
146
+ </td>
147
+ <td>
148
+ <#list permission.scopes as scope>
149
+ <#if scope.scope??>
150
+ <div class="search-box">
151
+ <#if scope.scope.displayName??>
152
+ ${scope.scope.displayName}
153
+ <#else>
154
+ ${scope.scope.name}
155
+ </#if>
156
+ <button class="close-icon" type="button" id="grant-remove-scope-${resource.name}-${permission.requester.username}-${scope.scope.name}" name="removeScope-${resource.id}-${permission.requester.username}" onclick="removeScopeElm(this.parentNode);document.forms['approveForm-${resource.id}-${permission.requester.username}']['action'].value = 'deny';document.forms['approveForm-${resource.id}-${permission.requester.username}'].submit();"><i class="fa fa-times" aria-hidden="true"></i></button>
157
+ <input type="hidden" name="permission_id" value="${scope.id}"/>
158
+ </div>
159
+ <#else>
160
+ ${msg("anyPermission")}
161
+ </#if>
162
+ </#list>
163
+ </td>
164
+ <td width="20%" align="middle" style="vertical-align: middle">
165
+ <a href="#" id="grant-${resource.name}-${permission.requester.username}" onclick="document.forms['approveForm-${resource.id}-${permission.requester.username}']['action'].value = 'grant';document.forms['approveForm-${resource.id}-${permission.requester.username}'].submit();" type="submit" class="btn btn-primary">${msg("doApprove")}</a>
166
+ <a href="#" id="deny-${resource.name}-${permission.requester.username}" onclick="removeAllScopes('${resource.id}-${permission.requester.username}');document.forms['approveForm-${resource.id}-${permission.requester.username}']['action'].value = 'deny';document.forms['approveForm-${resource.id}-${permission.requester.username}'].submit();" type="submit" class="btn btn-danger">${msg("doDeny")}</a>
167
+ </td>
168
+ </tr>
169
+ </form>
170
+ </#list>
171
+ </#list>
172
+ </tbody>
173
+ </table>
174
+ </div>
175
+ </div>
176
+ </#if>
177
+
178
+ <div class="row">
179
+ <div class="col-md-12">
180
+ <h3>
181
+ ${msg("myResourcesSub")}
182
+ </h3>
183
+ </div>
184
+ </div>
185
+ <div class="row">
186
+ <div class="col-md-12">
187
+ <table class="table table-striped table-bordered">
188
+ <thead>
189
+ <tr>
190
+ <th>${msg("resource")}</th>
191
+ <th>${msg("application")}</th>
192
+ <th>${msg("peopleSharingThisResource")}</th>
193
+ </tr>
194
+ </thead>
195
+
196
+ <tbody>
197
+ <#if authorization.resources?size != 0>
198
+ <#list authorization.resources as resource>
199
+ <tr>
200
+ <td>
201
+ <a id="detail-${resource.name}" href="${url.getResourceDetailUrl(resource.id)}">
202
+ <#if resource.displayName??>${resource.displayName}<#else>${resource.name}</#if>
203
+ </a>
204
+ </td>
205
+ <td>
206
+ <#if resource.resourceServer.baseUri??>
207
+ <a href="${resource.resourceServer.baseUri}">${resource.resourceServer.name}</a>
208
+ <#else>
209
+ ${resource.resourceServer.name}
210
+ </#if>
211
+ </td>
212
+ <td>
213
+ <#if resource.shares?size != 0>
214
+ <a href="${url.getResourceDetailUrl(resource.id)}">${resource.shares?size} <i class="fa fa-users"></i></a>
215
+ <#else>
216
+ ${msg("notBeingShared")}
217
+ </#if>
218
+ </td>
219
+ </tr>
220
+ </#list>
221
+ <#else>
222
+ <tr>
223
+ <td colspan="4">${msg("notHaveAnyResource")}</td>
224
+ </tr>
225
+ </#if>
226
+ </tbody>
227
+ </table>
228
+ </div>
229
+ </div>
230
+
231
+ <div class="row">
232
+ <div class="col-md-12">
233
+ <h3>
234
+ ${msg("resourcesSharedWithMe")}
235
+ </h3>
236
+ </div>
237
+ </div>
238
+ <div class="row">
239
+ <div class="col-md-12">
240
+ <form action="${url.resourceUrl}" name="shareForm" method="post">
241
+ <input type="hidden" name="action" value="cancel"/>
242
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
243
+ <table class="table table-striped table-bordered">
244
+ <thead>
245
+ <tr>
246
+ <th width="5%"><input type="checkbox" onclick="selectAllCheckBoxes('shareForm', this, 'resource_id');" <#if authorization.sharedResources?size == 0>disabled="true"</#if></td>
247
+ <th>${msg("resource")}</th>
248
+ <th>${msg("owner")}</th>
249
+ <th>${msg("application")}</th>
250
+ <th>${msg("permission")}</th>
251
+ <th>${msg("date")}</th>
252
+ </tr>
253
+ </thead>
254
+ <tbody>
255
+ <#if authorization.sharedResources?size != 0>
256
+ <#list authorization.sharedResources as resource>
257
+ <tr>
258
+ <td>
259
+ <input type="checkbox" name="resource_id" value="${resource.id}"/>
260
+ </td>
261
+ <td>
262
+ <#if resource.displayName??>${resource.displayName}<#else>${resource.name}</#if>
263
+ </td>
264
+ <td>
265
+ ${resource.ownerName}
266
+ </td>
267
+ <td>
268
+ <#if resource.resourceServer.baseUri??>
269
+ <a href="${resource.resourceServer.baseUri}">${resource.resourceServer.name}</a>
270
+ <#else>
271
+ ${resource.resourceServer.name}
272
+ </#if>
273
+ </td>
274
+ <td>
275
+ <#if resource.permissions?size != 0>
276
+ <ul>
277
+ <#list resource.permissions as permission>
278
+ <#list permission.scopes as scope>
279
+ <#if scope.granted && scope.scope??>
280
+ <li>
281
+ <#if scope.scope.displayName??>
282
+ ${scope.scope.displayName}
283
+ <#else>
284
+ ${scope.scope.name}
285
+ </#if>
286
+ </li>
287
+ <#else>
288
+ ${msg("anyPermission")}
289
+ </#if>
290
+ </#list>
291
+ </#list>
292
+ </ul>
293
+ <#else>
294
+ Any action
295
+ </#if>
296
+ </td>
297
+ <td>
298
+ ${resource.permissions[0].grantedDate?datetime}
299
+ </td>
300
+ </tr>
301
+ </#list>
302
+ <#else>
303
+ <tr>
304
+ <td colspan="6">${msg("noResourcesSharedWithYou")}</td>
305
+ </tr>
306
+ </#if>
307
+ </tbody>
308
+ </table>
309
+ </form>
310
+ </div>
311
+ <#if authorization.sharedResources?size != 0>
312
+ <div class="col-md-12">
313
+ <a href="#" onclick="document.forms['shareForm'].submit();" type="submit" class="btn btn-danger">${msg("doRemoveSharing")}</a>
314
+ </div>
315
+ </#if>
316
+ </div>
317
+
318
+ <#if authorization.resourcesWaitingOthersApproval?size != 0>
319
+ <br/>
320
+ <div class="row">
321
+ <div class="col-md-12">
322
+ <h3>
323
+ ${msg("requestsWaitingApproval")}
324
+ </h3>
325
+ </div>
326
+ </div>
327
+ <div class="row">
328
+ <div class="col-md-12">
329
+ <i class="pficon pficon-info"></i> ${msg("havePermissionRequestsWaitingForApproval",authorization.resourcesWaitingOthersApproval?size)}
330
+ <a href="#" onclick="document.getElementById('waitingApproval').style.display=''">${msg("clickHereForDetails")}</a>
331
+ <div class="row">
332
+ <div class="col-md-12"></div>
333
+ </div>
334
+ <div class="row">
335
+ <div class="col-md-12"></div>
336
+ </div>
337
+ <div class="row">
338
+ <div class="col-md-12"></div>
339
+ </div>
340
+ <div class="row" id="waitingApproval" style="display:none">
341
+ <div class="col-md-12">
342
+ <form action="${url.resourceUrl}" name="waitingApprovalForm" method="post">
343
+ <input type="hidden" name="action" value="cancelRequest"/>
344
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
345
+ <table class="table table-striped table-bordered">
346
+ <thead>
347
+ <tr>
348
+ <th width="5%"><input type="checkbox" onclick="selectAllCheckBoxes('waitingApprovalForm', this, 'resource_id');" <#if authorization.resourcesWaitingOthersApproval?size == 0>disabled="true"</#if></th>
349
+ <th>${msg("resource")}</th>
350
+ <th>${msg("owner")}</th>
351
+ <th>${msg("action")}</th>
352
+ <th>${msg("date")}</th>
353
+ </tr>
354
+ </thead>
355
+ <tbody>
356
+ <#list authorization.resourcesWaitingOthersApproval as resource>
357
+ <tr>
358
+ <td>
359
+ <input type="checkbox" name="resource_id" value="${resource.id}"/>
360
+ </td>
361
+ <td>
362
+ <#if resource.displayName??>${resource.displayName}<#else>${resource.name}</#if>
363
+ </td>
364
+ <td>
365
+ ${resource.ownerName}
366
+ </td>
367
+ <td>
368
+ <ul>
369
+ <#list resource.permissions as permission>
370
+ <#list permission.scopes as scope>
371
+ <li>
372
+ <#if scope.scope??>
373
+ <#if scope.scope.displayName??>
374
+ ${scope.scope.displayName}
375
+ <#else>
376
+ ${scope.scope.name}
377
+ </#if>
378
+ <#else>
379
+ ${msg("anyPermission")}
380
+ </#if>
381
+ </li>
382
+ </#list>
383
+ </#list>
384
+ </ul>
385
+ </td>
386
+ <td>
387
+ ${resource.permissions[0].createdDate?datetime}
388
+ </td>
389
+ </tr>
390
+ </#list>
391
+ </tbody>
392
+ </table>
393
+ </form>
394
+ </div>
395
+ <div class="col-md-12">
396
+ <a href="#" onclick="document.forms['waitingApprovalForm'].submit();" type="submit" class="btn btn-danger">${msg("doRemoveRequest")}</a>
397
+ </div>
398
+ </div>
399
+ </div>
400
+ </div>
401
+ </#if>
402
+
403
+ </@layout.mainLayout>
@@ -0,0 +1,44 @@
1
+ <#import "template.ftl" as layout>
2
+ <@layout.mainLayout active='sessions' bodyClass='sessions'; section>
3
+
4
+ <div class="row">
5
+ <div class="col-md-10">
6
+ <h2>${msg("sessionsHtmlTitle")}</h2>
7
+ </div>
8
+ </div>
9
+
10
+ <table class="table table-striped table-bordered">
11
+ <thead>
12
+ <tr>
13
+ <td>${msg("ip")}</td>
14
+ <td>${msg("started")}</td>
15
+ <td>${msg("lastAccess")}</td>
16
+ <td>${msg("expires")}</td>
17
+ <td>${msg("clients")}</td>
18
+ </tr>
19
+ </thead>
20
+
21
+ <tbody>
22
+ <#list sessions.sessions as session>
23
+ <tr>
24
+ <td>${session.ipAddress}</td>
25
+ <td>${session.started?datetime}</td>
26
+ <td>${session.lastAccess?datetime}</td>
27
+ <td>${session.expires?datetime}</td>
28
+ <td>
29
+ <#list session.clients as client>
30
+ ${client}<br/>
31
+ </#list>
32
+ </td>
33
+ </tr>
34
+ </#list>
35
+ </tbody>
36
+
37
+ </table>
38
+
39
+ <form action="${url.sessionsUrl}" method="post">
40
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
41
+ <button id="logout-all-sessions" class="btn btn-default">${msg("doLogOutAllSessions")}</button>
42
+ </form>
43
+
44
+ </@layout.mainLayout>
@@ -0,0 +1,88 @@
1
+ <#macro mainLayout active bodyClass>
2
+ <!doctype html>
3
+ <html>
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
7
+ <meta name="robots" content="noindex, nofollow">
8
+
9
+ <title>${msg("accountManagementTitle")}</title>
10
+ <link rel="icon" href="${url.resourcesPath}/img/favicon.ico">
11
+ <#if properties.stylesCommon?has_content>
12
+ <#list properties.stylesCommon?split(' ') as style>
13
+ <link href="${url.resourcesCommonPath}/${style}" rel="stylesheet" />
14
+ </#list>
15
+ </#if>
16
+ <#if properties.styles?has_content>
17
+ <#list properties.styles?split(' ') as style>
18
+ <link href="${url.resourcesPath}/${style}" rel="stylesheet" />
19
+ </#list>
20
+ </#if>
21
+ <#if properties.scripts?has_content>
22
+ <#list properties.scripts?split(' ') as script>
23
+ <script type="text/javascript" src="${url.resourcesPath}/${script}"></script>
24
+ </#list>
25
+ </#if>
26
+ </head>
27
+ <body class="admin-console user ${bodyClass}">
28
+
29
+ <header class="navbar navbar-default navbar-pf navbar-main header">
30
+ <nav class="navbar" role="navigation">
31
+ <div class="navbar-header">
32
+ <div class="container">
33
+ <h1 class="navbar-title">Keycloak</h1>
34
+ </div>
35
+ </div>
36
+ <div class="navbar-collapse navbar-collapse-1">
37
+ <div class="container">
38
+ <ul class="nav navbar-nav navbar-utility">
39
+ <#if realm.internationalizationEnabled>
40
+ <li>
41
+ <div class="kc-dropdown" id="kc-locale-dropdown">
42
+ <a href="#" id="kc-current-locale-link">${locale.current}</a>
43
+ <ul>
44
+ <#list locale.supported as l>
45
+ <li class="kc-dropdown-item"><a href="${l.url}">${l.label}</a></li>
46
+ </#list>
47
+ </ul>
48
+ </div>
49
+ <li>
50
+ </#if>
51
+ <#if referrer?has_content && referrer.url?has_content><li><a href="${referrer.url}" id="referrer">${msg("backTo",referrer.name)}</a></li></#if>
52
+ <li><a href="${url.getLogoutUrl()}">${msg("doSignOut")}</a></li>
53
+ </ul>
54
+ </div>
55
+ </div>
56
+ </nav>
57
+ </header>
58
+
59
+ <div class="container">
60
+ <div class="bs-sidebar col-sm-3">
61
+ <ul>
62
+ <li class="<#if active=='account'>active</#if>"><a href="${url.accountUrl}">${msg("account")}</a></li>
63
+ <#if features.passwordUpdateSupported><li class="<#if active=='password'>active</#if>"><a href="${url.passwordUrl}">${msg("password")}</a></li></#if>
64
+ <li class="<#if active=='totp'>active</#if>"><a href="${url.totpUrl}">${msg("authenticator")}</a></li>
65
+ <#if features.identityFederation><li class="<#if active=='social'>active</#if>"><a href="${url.socialUrl}">${msg("federatedIdentity")}</a></li></#if>
66
+ <li class="<#if active=='sessions'>active</#if>"><a href="${url.sessionsUrl}">${msg("sessions")}</a></li>
67
+ <li class="<#if active=='applications'>active</#if>"><a href="${url.applicationsUrl}">${msg("applications")}</a></li>
68
+ <#if features.log><li class="<#if active=='log'>active</#if>"><a href="${url.logUrl}">${msg("log")}</a></li></#if>
69
+ <#if realm.userManagedAccessAllowed && features.authorization><li class="<#if active=='authorization'>active</#if>"><a href="${url.resourceUrl}">${msg("myResources")}</a></li></#if>
70
+ </ul>
71
+ </div>
72
+
73
+ <div class="col-sm-9 content-area">
74
+ <#if message?has_content>
75
+ <div class="alert alert-${message.type}">
76
+ <#if message.type=='success' ><span class="pficon pficon-ok"></span></#if>
77
+ <#if message.type=='error' ><span class="pficon pficon-error-circle-o"></span></#if>
78
+ <span class="kc-feedback-text">${kcSanitize(message.summary)?no_esc}</span>
79
+ </div>
80
+ </#if>
81
+
82
+ <#nested "content">
83
+ </div>
84
+ </div>
85
+
86
+ </body>
87
+ </html>
88
+ </#macro>
@@ -0,0 +1,14 @@
1
+ accountResourceProvider=account-v1
2
+
3
+ locales=en,ar,ca,cs,da,de,es,fi,fr,hu,it,ja,lt,lv,nl,no,pl,pt-BR,ru,sk,sv,tr,zh-CN
4
+
5
+ styles=css/account.css img/icon-sidebar-active.png img/logo.png resources-common/node_modules/patternfly/dist/css/patternfly.min.css resources-common/node_modules/patternfly/dist/css/patternfly-additions.min.css resources-common/node_modules/patternfly/dist/css/patternfly-additions.min.css
6
+
7
+ ##### css classes for form buttons
8
+ # main class used for all buttons
9
+ kcButtonClass=btn
10
+ # classes defining priority of the button - primary or default (there is typically only one priority button for the form)
11
+ kcButtonPrimaryClass=btn-primary
12
+ kcButtonDefaultClass=btn-default
13
+ # classes defining size of the button
14
+ kcButtonLargeClass=btn-lg