@authup/server-core 1.0.0-beta.57 → 1.0.0-beta.59

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 (416) hide show
  1. package/dist/adapters/database/logger/module.mjs +2 -4
  2. package/dist/adapters/database/logger/module.mjs.map +1 -1
  3. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
  4. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +1 -1
  5. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
  6. package/dist/adapters/http/controllers/index.mjs +2 -1
  7. package/dist/adapters/http/controllers/workflows/account/index.d.ts +2 -0
  8. package/dist/adapters/http/controllers/workflows/account/index.d.ts.map +1 -0
  9. package/dist/adapters/http/controllers/workflows/account/index.mjs +5 -0
  10. package/dist/adapters/http/controllers/workflows/account/module.d.ts +24 -0
  11. package/dist/adapters/http/controllers/workflows/account/module.d.ts.map +1 -0
  12. package/dist/adapters/http/controllers/workflows/account/module.mjs +63 -0
  13. package/dist/adapters/http/controllers/workflows/account/module.mjs.map +1 -0
  14. package/dist/adapters/http/controllers/workflows/activate/module.mjs +1 -1
  15. package/dist/adapters/http/controllers/workflows/authorize/module.mjs +2 -2
  16. package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
  17. package/dist/adapters/http/controllers/workflows/index.d.ts +1 -0
  18. package/dist/adapters/http/controllers/workflows/index.d.ts.map +1 -1
  19. package/dist/adapters/http/controllers/workflows/index.mjs +3 -1
  20. package/dist/adapters/http/controllers/workflows/logout/module.mjs +2 -2
  21. package/dist/adapters/http/controllers/workflows/logout/module.mjs.map +1 -1
  22. package/dist/adapters/http/controllers/workflows/password-forgot/module.mjs +1 -1
  23. package/dist/adapters/http/controllers/workflows/password-reset/module.mjs +1 -1
  24. package/dist/adapters/http/controllers/workflows/register/module.mjs +1 -1
  25. package/dist/adapters/http/controllers/workflows/userinfo/module.d.ts.map +1 -1
  26. package/dist/adapters/http/controllers/workflows/userinfo/module.mjs +5 -1
  27. package/dist/adapters/http/controllers/workflows/userinfo/module.mjs.map +1 -1
  28. package/dist/adapters/http/index.mjs +3 -1
  29. package/dist/adapters/http/middleware/built-in/assets.d.ts +8 -1
  30. package/dist/adapters/http/middleware/built-in/assets.d.ts.map +1 -1
  31. package/dist/adapters/http/middleware/built-in/assets.mjs +48 -4
  32. package/dist/adapters/http/middleware/built-in/assets.mjs.map +1 -1
  33. package/dist/adapters/http/middleware/built-in/authorization/module.mjs +2 -1
  34. package/dist/adapters/http/middleware/built-in/authorization/module.mjs.map +1 -1
  35. package/dist/adapters/http/middleware/built-in/index.d.ts +2 -0
  36. package/dist/adapters/http/middleware/built-in/index.d.ts.map +1 -1
  37. package/dist/adapters/http/middleware/built-in/index.mjs +2 -1
  38. package/dist/adapters/http/middleware/built-in/rate-limit.mjs +2 -2
  39. package/dist/adapters/http/middleware/built-in/rate-limit.mjs.map +1 -1
  40. package/dist/adapters/http/middleware/built-in/theme.d.ts +15 -0
  41. package/dist/adapters/http/middleware/built-in/theme.d.ts.map +1 -0
  42. package/dist/adapters/http/middleware/built-in/theme.mjs +27 -0
  43. package/dist/adapters/http/middleware/built-in/theme.mjs.map +1 -0
  44. package/dist/adapters/http/middleware/built-in/types.d.ts +14 -0
  45. package/dist/adapters/http/middleware/built-in/types.d.ts.map +1 -0
  46. package/dist/adapters/http/middleware/built-in/ui-http-client.d.ts +1 -1
  47. package/dist/adapters/http/middleware/built-in/ui-http-client.mjs +1 -1
  48. package/dist/adapters/http/middleware/built-in/ui-http-client.mjs.map +1 -1
  49. package/dist/adapters/http/middleware/index.mjs +2 -1
  50. package/dist/adapters/http/request/client-certificate.mjs +1 -1
  51. package/dist/adapters/http/request/client-certificate.mjs.map +1 -1
  52. package/dist/adapters/http/request/helpers/locations.mjs +1 -3
  53. package/dist/adapters/http/request/helpers/locations.mjs.map +1 -1
  54. package/dist/adapters/http/ui/account-console/index.d.ts +4 -0
  55. package/dist/adapters/http/ui/account-console/index.d.ts.map +1 -0
  56. package/dist/adapters/http/ui/account-console/index.mjs +6 -0
  57. package/dist/adapters/http/ui/account-console/module.d.ts +28 -0
  58. package/dist/adapters/http/ui/account-console/module.d.ts.map +1 -0
  59. package/dist/adapters/http/ui/account-console/module.mjs +80 -0
  60. package/dist/adapters/http/ui/account-console/module.mjs.map +1 -0
  61. package/dist/adapters/http/ui/account-console/ref.d.ts +30 -0
  62. package/dist/adapters/http/ui/account-console/ref.d.ts.map +1 -0
  63. package/dist/adapters/http/ui/account-console/ref.mjs +50 -0
  64. package/dist/adapters/http/ui/account-console/ref.mjs.map +1 -0
  65. package/dist/adapters/http/ui/account-console/types.d.ts +11 -0
  66. package/dist/adapters/http/ui/account-console/types.d.ts.map +1 -0
  67. package/dist/adapters/http/ui/account-console/types.mjs +4 -0
  68. package/dist/adapters/http/ui/{internal-http-client.d.ts → auth-console/http-client.d.ts} +1 -1
  69. package/dist/adapters/http/ui/auth-console/http-client.d.ts.map +1 -0
  70. package/dist/adapters/http/ui/{internal-http-client.mjs → auth-console/http-client.mjs} +2 -2
  71. package/dist/adapters/http/ui/auth-console/http-client.mjs.map +1 -0
  72. package/dist/adapters/http/ui/auth-console/index.d.ts +6 -0
  73. package/dist/adapters/http/ui/auth-console/index.d.ts.map +1 -0
  74. package/dist/adapters/http/ui/auth-console/index.mjs +8 -0
  75. package/dist/adapters/http/ui/auth-console/module.d.ts +4 -0
  76. package/dist/adapters/http/ui/auth-console/module.d.ts.map +1 -0
  77. package/dist/adapters/http/ui/auth-console/module.mjs +73 -0
  78. package/dist/adapters/http/ui/auth-console/module.mjs.map +1 -0
  79. package/dist/adapters/http/ui/auth-console/resolve.d.ts +21 -0
  80. package/dist/adapters/http/ui/auth-console/resolve.d.ts.map +1 -0
  81. package/dist/adapters/http/ui/auth-console/resolve.mjs +53 -0
  82. package/dist/adapters/http/ui/auth-console/resolve.mjs.map +1 -0
  83. package/dist/adapters/http/ui/{serve.d.ts → auth-console/serve.d.ts} +1 -8
  84. package/dist/adapters/http/ui/auth-console/serve.d.ts.map +1 -0
  85. package/dist/adapters/http/ui/{serve.mjs → auth-console/serve.mjs} +5 -5
  86. package/dist/adapters/http/ui/auth-console/serve.mjs.map +1 -0
  87. package/dist/adapters/http/ui/auth-console/types.d.ts +26 -0
  88. package/dist/adapters/http/ui/auth-console/types.d.ts.map +1 -0
  89. package/dist/adapters/http/ui/auth-console/types.mjs +4 -0
  90. package/dist/adapters/http/ui/console-packages/index.d.ts +3 -0
  91. package/dist/adapters/http/ui/console-packages/index.d.ts.map +1 -0
  92. package/dist/adapters/http/ui/console-packages/index.mjs +5 -0
  93. package/dist/adapters/http/ui/console-packages/module.d.ts +33 -0
  94. package/dist/adapters/http/ui/console-packages/module.d.ts.map +1 -0
  95. package/dist/adapters/http/ui/console-packages/module.mjs +70 -0
  96. package/dist/adapters/http/ui/console-packages/module.mjs.map +1 -0
  97. package/dist/adapters/http/ui/console-packages/types.d.ts +12 -0
  98. package/dist/adapters/http/ui/console-packages/types.d.ts.map +1 -0
  99. package/dist/adapters/http/ui/console-packages/types.mjs +4 -0
  100. package/dist/adapters/http/ui/index.d.ts +5 -5
  101. package/dist/adapters/http/ui/index.d.ts.map +1 -1
  102. package/dist/adapters/http/ui/index.mjs +22 -5
  103. package/dist/adapters/http/ui/shared/html.d.ts +76 -0
  104. package/dist/adapters/http/ui/shared/html.d.ts.map +1 -0
  105. package/dist/adapters/http/ui/shared/html.mjs +103 -0
  106. package/dist/adapters/http/ui/shared/html.mjs.map +1 -0
  107. package/dist/adapters/http/ui/shared/index.d.ts +2 -0
  108. package/dist/adapters/http/ui/shared/index.d.ts.map +1 -0
  109. package/dist/adapters/http/ui/shared/index.mjs +5 -0
  110. package/dist/adapters/http/ui/theme/apply.d.ts +12 -0
  111. package/dist/adapters/http/ui/theme/apply.d.ts.map +1 -0
  112. package/dist/adapters/http/ui/theme/apply.mjs +29 -0
  113. package/dist/adapters/http/ui/theme/apply.mjs.map +1 -0
  114. package/dist/adapters/http/ui/theme/assets.d.ts +20 -0
  115. package/dist/adapters/http/ui/theme/assets.d.ts.map +1 -0
  116. package/dist/adapters/http/ui/theme/assets.mjs +86 -0
  117. package/dist/adapters/http/ui/theme/assets.mjs.map +1 -0
  118. package/dist/adapters/http/ui/theme/constants.d.ts +16 -0
  119. package/dist/adapters/http/ui/theme/constants.d.ts.map +1 -0
  120. package/dist/adapters/http/ui/theme/constants.mjs +20 -0
  121. package/dist/adapters/http/ui/theme/constants.mjs.map +1 -0
  122. package/dist/adapters/http/ui/theme/contract/constants.d.ts +120 -0
  123. package/dist/adapters/http/ui/theme/contract/constants.d.ts.map +1 -0
  124. package/dist/adapters/http/ui/theme/contract/constants.mjs +136 -0
  125. package/dist/adapters/http/ui/theme/contract/constants.mjs.map +1 -0
  126. package/dist/adapters/http/ui/theme/contract/head.d.ts +12 -0
  127. package/dist/adapters/http/ui/theme/contract/head.d.ts.map +1 -0
  128. package/dist/adapters/http/ui/theme/contract/head.mjs +61 -0
  129. package/dist/adapters/http/ui/theme/contract/head.mjs.map +1 -0
  130. package/dist/adapters/http/ui/theme/contract/index.d.ts +6 -0
  131. package/dist/adapters/http/ui/theme/contract/index.d.ts.map +1 -0
  132. package/dist/adapters/http/ui/theme/contract/index.mjs +8 -0
  133. package/dist/adapters/http/ui/theme/contract/manifest.d.ts +25 -0
  134. package/dist/adapters/http/ui/theme/contract/manifest.d.ts.map +1 -0
  135. package/dist/adapters/http/ui/theme/contract/manifest.mjs +77 -0
  136. package/dist/adapters/http/ui/theme/contract/manifest.mjs.map +1 -0
  137. package/dist/adapters/http/ui/theme/contract/types.d.ts +26 -0
  138. package/dist/adapters/http/ui/theme/contract/types.d.ts.map +1 -0
  139. package/dist/adapters/http/ui/theme/contract/types.mjs +4 -0
  140. package/dist/adapters/http/ui/theme/contract/utils.d.ts +11 -0
  141. package/dist/adapters/http/ui/theme/contract/utils.d.ts.map +1 -0
  142. package/dist/adapters/http/ui/theme/contract/utils.mjs +22 -0
  143. package/dist/adapters/http/ui/theme/contract/utils.mjs.map +1 -0
  144. package/dist/adapters/http/ui/theme/index.d.ts +7 -0
  145. package/dist/adapters/http/ui/theme/index.d.ts.map +1 -0
  146. package/dist/adapters/http/ui/theme/index.mjs +13 -0
  147. package/dist/adapters/http/ui/theme/module.d.ts +79 -0
  148. package/dist/adapters/http/ui/theme/module.d.ts.map +1 -0
  149. package/dist/adapters/http/ui/theme/module.mjs +206 -0
  150. package/dist/adapters/http/ui/theme/module.mjs.map +1 -0
  151. package/dist/adapters/http/ui/theme/types.d.ts +42 -0
  152. package/dist/adapters/http/ui/theme/types.d.ts.map +1 -0
  153. package/dist/adapters/http/ui/theme/types.mjs +4 -0
  154. package/dist/app/index.mjs +3 -1
  155. package/dist/app/modules/authentication/module.mjs +6 -3
  156. package/dist/app/modules/authentication/module.mjs.map +1 -1
  157. package/dist/app/modules/config/constants.d.ts +5 -0
  158. package/dist/app/modules/config/constants.d.ts.map +1 -1
  159. package/dist/app/modules/config/constants.mjs +5 -0
  160. package/dist/app/modules/config/constants.mjs.map +1 -1
  161. package/dist/app/modules/config/helpers.mjs +3 -2
  162. package/dist/app/modules/config/helpers.mjs.map +1 -1
  163. package/dist/app/modules/config/normalize.d.ts.map +1 -1
  164. package/dist/app/modules/config/normalize.mjs +8 -0
  165. package/dist/app/modules/config/normalize.mjs.map +1 -1
  166. package/dist/app/modules/config/origins.d.ts.map +1 -1
  167. package/dist/app/modules/config/origins.mjs +2 -0
  168. package/dist/app/modules/config/origins.mjs.map +1 -1
  169. package/dist/app/modules/config/read/env.d.ts.map +1 -1
  170. package/dist/app/modules/config/read/env.mjs +10 -0
  171. package/dist/app/modules/config/read/env.mjs.map +1 -1
  172. package/dist/app/modules/config/read/module.mjs +8 -3
  173. package/dist/app/modules/config/read/module.mjs.map +1 -1
  174. package/dist/app/modules/config/types.d.ts +63 -3
  175. package/dist/app/modules/config/types.d.ts.map +1 -1
  176. package/dist/app/modules/config/validator.d.ts.map +1 -1
  177. package/dist/app/modules/config/validator.mjs +5 -0
  178. package/dist/app/modules/config/validator.mjs.map +1 -1
  179. package/dist/app/modules/database/module.mjs +2 -1
  180. package/dist/app/modules/database/module.mjs.map +1 -1
  181. package/dist/app/modules/http/module.d.ts.map +1 -1
  182. package/dist/app/modules/http/module.mjs +7 -1
  183. package/dist/app/modules/http/module.mjs.map +1 -1
  184. package/dist/app/modules/http/modules/controller.d.ts +2 -1
  185. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  186. package/dist/app/modules/http/modules/controller.mjs +214 -128
  187. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  188. package/dist/app/modules/http/modules/middleware.d.ts +9 -1
  189. package/dist/app/modules/http/modules/middleware.d.ts.map +1 -1
  190. package/dist/app/modules/http/modules/middleware.mjs +28 -8
  191. package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
  192. package/dist/app/modules/identity/module.mjs +6 -3
  193. package/dist/app/modules/identity/module.mjs.map +1 -1
  194. package/dist/app/modules/index.mjs +3 -1
  195. package/dist/app/modules/oauth2/module.mjs +37 -17
  196. package/dist/app/modules/oauth2/module.mjs.map +1 -1
  197. package/dist/app/modules/oauth2/repositories/authorize/state/repository.mjs +1 -1
  198. package/dist/app/modules/oauth2/repositories/authorize/state/repository.mjs.map +1 -1
  199. package/dist/app/modules/oauth2/repositories/token/repository.mjs +1 -1
  200. package/dist/app/modules/oauth2/repositories/token/repository.mjs.map +1 -1
  201. package/dist/app/modules/provisioning/constants.d.ts +12 -0
  202. package/dist/app/modules/provisioning/constants.d.ts.map +1 -0
  203. package/dist/app/modules/provisioning/constants.mjs +16 -0
  204. package/dist/app/modules/provisioning/constants.mjs.map +1 -0
  205. package/dist/app/modules/provisioning/index.d.ts +2 -0
  206. package/dist/app/modules/provisioning/index.d.ts.map +1 -1
  207. package/dist/app/modules/provisioning/index.mjs +3 -1
  208. package/dist/app/modules/provisioning/lazy-wildcard.d.ts +15 -0
  209. package/dist/app/modules/provisioning/lazy-wildcard.d.ts.map +1 -0
  210. package/dist/app/modules/provisioning/lazy-wildcard.mjs +23 -0
  211. package/dist/app/modules/provisioning/lazy-wildcard.mjs.map +1 -0
  212. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  213. package/dist/app/modules/provisioning/module.mjs +30 -11
  214. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  215. package/dist/app/modules/provisioning/sources/composite/module.d.ts +0 -19
  216. package/dist/app/modules/provisioning/sources/composite/module.d.ts.map +1 -1
  217. package/dist/app/modules/provisioning/sources/composite/module.mjs +7 -77
  218. package/dist/app/modules/provisioning/sources/composite/module.mjs.map +1 -1
  219. package/dist/app/modules/provisioning/sources/file/module.d.ts.map +1 -1
  220. package/dist/app/modules/provisioning/sources/file/module.mjs +11 -2
  221. package/dist/app/modules/provisioning/sources/file/module.mjs.map +1 -1
  222. package/dist/core/authentication/session/module.mjs +2 -4
  223. package/dist/core/authentication/session/module.mjs.map +1 -1
  224. package/dist/core/entities/client/index.d.ts +1 -1
  225. package/dist/core/entities/client/index.d.ts.map +1 -1
  226. package/dist/core/entities/client/index.mjs +2 -2
  227. package/dist/core/entities/client/service.d.ts.map +1 -1
  228. package/dist/core/entities/client/service.mjs +1 -1
  229. package/dist/core/entities/client/service.mjs.map +1 -1
  230. package/dist/core/entities/client/system-clients.d.ts +95 -0
  231. package/dist/core/entities/client/system-clients.d.ts.map +1 -0
  232. package/dist/core/entities/client/system-clients.mjs +158 -0
  233. package/dist/core/entities/client/system-clients.mjs.map +1 -0
  234. package/dist/core/entities/client/types.d.ts +17 -4
  235. package/dist/core/entities/client/types.d.ts.map +1 -1
  236. package/dist/core/entities/client-permission/service.mjs +12 -9
  237. package/dist/core/entities/client-permission/service.mjs.map +1 -1
  238. package/dist/core/entities/index.mjs +2 -2
  239. package/dist/core/entities/key/service.mjs +4 -2
  240. package/dist/core/entities/key/service.mjs.map +1 -1
  241. package/dist/core/entities/permission/service.d.ts.map +1 -1
  242. package/dist/core/entities/permission/service.mjs +1 -1
  243. package/dist/core/entities/permission/service.mjs.map +1 -1
  244. package/dist/core/entities/policy/service.d.ts.map +1 -1
  245. package/dist/core/entities/policy/service.mjs +3 -2
  246. package/dist/core/entities/policy/service.mjs.map +1 -1
  247. package/dist/core/entities/realm/service.d.ts +8 -6
  248. package/dist/core/entities/realm/service.d.ts.map +1 -1
  249. package/dist/core/entities/realm/service.mjs +6 -9
  250. package/dist/core/entities/realm/service.mjs.map +1 -1
  251. package/dist/core/entities/role/service.d.ts.map +1 -1
  252. package/dist/core/entities/role/service.mjs +1 -1
  253. package/dist/core/entities/role/service.mjs.map +1 -1
  254. package/dist/core/entities/role-permission/service.mjs +12 -9
  255. package/dist/core/entities/role-permission/service.mjs.map +1 -1
  256. package/dist/core/entities/scope/service.d.ts.map +1 -1
  257. package/dist/core/entities/scope/service.mjs +1 -1
  258. package/dist/core/entities/scope/service.mjs.map +1 -1
  259. package/dist/core/entities/user/service.d.ts.map +1 -1
  260. package/dist/core/entities/user/service.mjs +1 -1
  261. package/dist/core/entities/user/service.mjs.map +1 -1
  262. package/dist/core/entities/user-authenticator/helpers.mjs +1 -1
  263. package/dist/core/entities/user-authenticator/helpers.mjs.map +1 -1
  264. package/dist/core/entities/user-authenticator/service.mjs +7 -7
  265. package/dist/core/entities/user-authenticator/service.mjs.map +1 -1
  266. package/dist/core/entities/user-permission/service.mjs +12 -9
  267. package/dist/core/entities/user-permission/service.mjs.map +1 -1
  268. package/dist/core/identity/password-recovery/service.mjs +1 -1
  269. package/dist/core/identity/password-recovery/service.mjs.map +1 -1
  270. package/dist/core/index.mjs +6 -2
  271. package/dist/core/key/types.d.ts +2 -1
  272. package/dist/core/key/types.d.ts.map +1 -1
  273. package/dist/core/oauth2/authorization/code-request/verifier/module.d.ts.map +1 -1
  274. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +2 -2
  275. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
  276. package/dist/core/oauth2/end-session/service.d.ts.map +1 -1
  277. package/dist/core/oauth2/end-session/service.mjs +2 -2
  278. package/dist/core/oauth2/end-session/service.mjs.map +1 -1
  279. package/dist/core/provisioning/constants.d.ts +8 -0
  280. package/dist/core/provisioning/constants.d.ts.map +1 -0
  281. package/dist/core/provisioning/constants.mjs +14 -0
  282. package/dist/core/provisioning/constants.mjs.map +1 -0
  283. package/dist/core/provisioning/entities/index.mjs +2 -1
  284. package/dist/core/provisioning/entities/realm/index.d.ts +1 -0
  285. package/dist/core/provisioning/entities/realm/index.d.ts.map +1 -1
  286. package/dist/core/provisioning/entities/realm/index.mjs +2 -1
  287. package/dist/core/provisioning/entities/realm/validator.d.ts +11 -0
  288. package/dist/core/provisioning/entities/realm/validator.d.ts.map +1 -1
  289. package/dist/core/provisioning/entities/realm/validator.mjs +14 -0
  290. package/dist/core/provisioning/entities/realm/validator.mjs.map +1 -1
  291. package/dist/core/provisioning/entities/realm/wildcard-validator.d.ts +19 -0
  292. package/dist/core/provisioning/entities/realm/wildcard-validator.d.ts.map +1 -0
  293. package/dist/core/provisioning/entities/realm/wildcard-validator.mjs +65 -0
  294. package/dist/core/provisioning/entities/realm/wildcard-validator.mjs.map +1 -0
  295. package/dist/core/provisioning/index.d.ts +3 -0
  296. package/dist/core/provisioning/index.d.ts.map +1 -1
  297. package/dist/core/provisioning/index.mjs +7 -1
  298. package/dist/core/provisioning/merge/index.d.ts +3 -0
  299. package/dist/core/provisioning/merge/index.d.ts.map +1 -0
  300. package/dist/core/provisioning/merge/index.mjs +5 -0
  301. package/dist/core/provisioning/merge/module.d.ts +18 -0
  302. package/dist/core/provisioning/merge/module.d.ts.map +1 -0
  303. package/dist/core/provisioning/merge/module.mjs +82 -0
  304. package/dist/core/provisioning/merge/module.mjs.map +1 -0
  305. package/dist/core/provisioning/merge/types.d.ts +34 -0
  306. package/dist/core/provisioning/merge/types.d.ts.map +1 -0
  307. package/dist/core/provisioning/merge/types.mjs +4 -0
  308. package/dist/core/provisioning/synchronizer/client/module.mjs +0 -1
  309. package/dist/core/provisioning/synchronizer/client/module.mjs.map +1 -1
  310. package/dist/core/provisioning/synchronizer/permission/module.mjs +0 -1
  311. package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
  312. package/dist/core/provisioning/synchronizer/realm/module.mjs +0 -1
  313. package/dist/core/provisioning/synchronizer/realm/module.mjs.map +1 -1
  314. package/dist/core/provisioning/synchronizer/role/module.mjs +0 -1
  315. package/dist/core/provisioning/synchronizer/role/module.mjs.map +1 -1
  316. package/dist/core/provisioning/synchronizer/scope/module.mjs +0 -1
  317. package/dist/core/provisioning/synchronizer/scope/module.mjs.map +1 -1
  318. package/dist/core/provisioning/synchronizer/user/module.mjs +0 -1
  319. package/dist/core/provisioning/synchronizer/user/module.mjs.map +1 -1
  320. package/dist/core/provisioning/types.d.ts +10 -0
  321. package/dist/core/provisioning/types.d.ts.map +1 -1
  322. package/dist/core/provisioning/wildcard/index.d.ts +3 -0
  323. package/dist/core/provisioning/wildcard/index.d.ts.map +1 -0
  324. package/dist/core/provisioning/wildcard/index.mjs +5 -0
  325. package/dist/core/provisioning/wildcard/module.d.ts +53 -0
  326. package/dist/core/provisioning/wildcard/module.d.ts.map +1 -0
  327. package/dist/core/provisioning/wildcard/module.mjs +91 -0
  328. package/dist/core/provisioning/wildcard/module.mjs.map +1 -0
  329. package/dist/core/provisioning/wildcard/types.d.ts +19 -0
  330. package/dist/core/provisioning/wildcard/types.d.ts.map +1 -0
  331. package/dist/core/provisioning/wildcard/types.mjs +4 -0
  332. package/dist/index.mjs +5 -1
  333. package/dist/path.d.ts +0 -2
  334. package/dist/path.d.ts.map +1 -1
  335. package/dist/path.mjs +1 -3
  336. package/dist/path.mjs.map +1 -1
  337. package/dist/swagger.json +485 -17
  338. package/package.json +26 -63
  339. package/dist/adapters/http/ui/base-path.d.ts +0 -9
  340. package/dist/adapters/http/ui/base-path.d.ts.map +0 -1
  341. package/dist/adapters/http/ui/base-path.mjs +0 -18
  342. package/dist/adapters/http/ui/base-path.mjs.map +0 -1
  343. package/dist/adapters/http/ui/internal-http-client.d.ts.map +0 -1
  344. package/dist/adapters/http/ui/internal-http-client.mjs.map +0 -1
  345. package/dist/adapters/http/ui/render.d.ts +0 -4
  346. package/dist/adapters/http/ui/render.d.ts.map +0 -1
  347. package/dist/adapters/http/ui/render.mjs +0 -63
  348. package/dist/adapters/http/ui/render.mjs.map +0 -1
  349. package/dist/adapters/http/ui/serve.d.ts.map +0 -1
  350. package/dist/adapters/http/ui/serve.mjs.map +0 -1
  351. package/dist/adapters/http/ui/types.d.ts +0 -20
  352. package/dist/adapters/http/ui/types.d.ts.map +0 -1
  353. package/dist/core/entities/client/web-client.d.ts +0 -72
  354. package/dist/core/entities/client/web-client.d.ts.map +0 -1
  355. package/dist/core/entities/client/web-client.mjs +0 -123
  356. package/dist/core/entities/client/web-client.mjs.map +0 -1
  357. package/dist/ui/client/.vite/ssr-manifest.json +0 -54812
  358. package/dist/ui/client/assets/asap-latin-400-normal-Dc37g3Il.woff +0 -0
  359. package/dist/ui/client/assets/asap-latin-400-normal-DnZ1MOsG.woff2 +0 -0
  360. package/dist/ui/client/assets/asap-latin-700-normal-Dqcopq14.woff +0 -0
  361. package/dist/ui/client/assets/asap-latin-700-normal-l2Y8pi-F.woff2 +0 -0
  362. package/dist/ui/client/assets/asap-latin-ext-400-normal-C-fcRdtE.woff +0 -0
  363. package/dist/ui/client/assets/asap-latin-ext-400-normal-DwYtpHbV.woff2 +0 -0
  364. package/dist/ui/client/assets/asap-latin-ext-700-normal-D00OESsZ.woff +0 -0
  365. package/dist/ui/client/assets/asap-latin-ext-700-normal-y8bo5aW5.woff2 +0 -0
  366. package/dist/ui/client/assets/asap-vietnamese-400-normal-DGyJlJLT.woff2 +0 -0
  367. package/dist/ui/client/assets/asap-vietnamese-400-normal-lfLaoF2x.woff +0 -0
  368. package/dist/ui/client/assets/asap-vietnamese-700-normal-B-e19ug5.woff +0 -0
  369. package/dist/ui/client/assets/asap-vietnamese-700-normal-D-SxY94i.woff2 +0 -0
  370. package/dist/ui/client/assets/index-Bk6-OZy9.css +0 -2
  371. package/dist/ui/client/assets/index-DO6_7NTJ.js +0 -106
  372. package/dist/ui/client/assets/nunito-cyrillic-300-normal-BPQV259B.woff2 +0 -0
  373. package/dist/ui/client/assets/nunito-cyrillic-300-normal-g5qSsvc0.woff +0 -0
  374. package/dist/ui/client/assets/nunito-cyrillic-400-normal-D1j0u8EH.woff +0 -0
  375. package/dist/ui/client/assets/nunito-cyrillic-400-normal-xAOo5cBP.woff2 +0 -0
  376. package/dist/ui/client/assets/nunito-cyrillic-600-normal-BUjmtIuu.woff +0 -0
  377. package/dist/ui/client/assets/nunito-cyrillic-600-normal-DJGQ2h05.woff2 +0 -0
  378. package/dist/ui/client/assets/nunito-cyrillic-700-normal-DP36NgGt.woff2 +0 -0
  379. package/dist/ui/client/assets/nunito-cyrillic-700-normal-DfHRUDv-.woff +0 -0
  380. package/dist/ui/client/assets/nunito-cyrillic-ext-300-normal-BDHtqmCR.woff +0 -0
  381. package/dist/ui/client/assets/nunito-cyrillic-ext-300-normal-ChMQLIrm.woff2 +0 -0
  382. package/dist/ui/client/assets/nunito-cyrillic-ext-400-normal-CuPM9foi.woff2 +0 -0
  383. package/dist/ui/client/assets/nunito-cyrillic-ext-400-normal-xaE7D4Sw.woff +0 -0
  384. package/dist/ui/client/assets/nunito-cyrillic-ext-600-normal-CWPPjBOD.woff2 +0 -0
  385. package/dist/ui/client/assets/nunito-cyrillic-ext-600-normal-vnfu4DTE.woff +0 -0
  386. package/dist/ui/client/assets/nunito-cyrillic-ext-700-normal-BuR0mlCG.woff2 +0 -0
  387. package/dist/ui/client/assets/nunito-cyrillic-ext-700-normal-DfoqN4Gs.woff +0 -0
  388. package/dist/ui/client/assets/nunito-latin-300-normal-C3ZIKvzv.woff +0 -0
  389. package/dist/ui/client/assets/nunito-latin-300-normal-COoPE5VN.woff2 +0 -0
  390. package/dist/ui/client/assets/nunito-latin-400-normal-DKg4f3fz.woff +0 -0
  391. package/dist/ui/client/assets/nunito-latin-400-normal-r8SDr6Up.woff2 +0 -0
  392. package/dist/ui/client/assets/nunito-latin-600-normal-Br8yIETf.woff2 +0 -0
  393. package/dist/ui/client/assets/nunito-latin-600-normal-Cd0eNu1l.woff +0 -0
  394. package/dist/ui/client/assets/nunito-latin-700-normal-Dort48En.woff2 +0 -0
  395. package/dist/ui/client/assets/nunito-latin-700-normal-OcDqTBcA.woff +0 -0
  396. package/dist/ui/client/assets/nunito-latin-ext-300-normal-D1SyVuPt.woff2 +0 -0
  397. package/dist/ui/client/assets/nunito-latin-ext-300-normal-DfqbmdMl.woff +0 -0
  398. package/dist/ui/client/assets/nunito-latin-ext-400-normal-CjMJVfGn.woff +0 -0
  399. package/dist/ui/client/assets/nunito-latin-ext-400-normal-i-8OOpdj.woff2 +0 -0
  400. package/dist/ui/client/assets/nunito-latin-ext-600-normal-BKUpuB78.woff +0 -0
  401. package/dist/ui/client/assets/nunito-latin-ext-600-normal-Dd9Zuxh1.woff2 +0 -0
  402. package/dist/ui/client/assets/nunito-latin-ext-700-normal-BWeMsAzO.woff2 +0 -0
  403. package/dist/ui/client/assets/nunito-latin-ext-700-normal-D4woHhbd.woff +0 -0
  404. package/dist/ui/client/assets/nunito-vietnamese-300-normal-DATld5Vw.woff +0 -0
  405. package/dist/ui/client/assets/nunito-vietnamese-300-normal-mLneKULB.woff2 +0 -0
  406. package/dist/ui/client/assets/nunito-vietnamese-400-normal-BHkVbP3T.woff2 +0 -0
  407. package/dist/ui/client/assets/nunito-vietnamese-400-normal-DtOtW02z.woff +0 -0
  408. package/dist/ui/client/assets/nunito-vietnamese-600-normal-BY8O6Cug.woff2 +0 -0
  409. package/dist/ui/client/assets/nunito-vietnamese-600-normal-DO1RqFw5.woff +0 -0
  410. package/dist/ui/client/assets/nunito-vietnamese-700-normal-C9SQsXvj.woff +0 -0
  411. package/dist/ui/client/assets/nunito-vietnamese-700-normal-Ch8EUCfz.woff2 +0 -0
  412. package/dist/ui/client/index.html +0 -22
  413. package/dist/ui/server/assets/multipart-parser-BCMy8Xwv.js +0 -181
  414. package/dist/ui/server/assets/multipart-parser-BVY8pIV2.js +0 -176
  415. package/dist/ui/server/server.js +0 -158420
  416. /package/dist/adapters/http/{ui → middleware/built-in}/types.mjs +0 -0
@@ -45,7 +45,7 @@ import { userRoleSchema } from "./entities/user-role/schema.mjs";
45
45
  import { appendQueryConditions, decodeQuery, queryCodec, schemaRegistry } from "./query/module.mjs";
46
46
  import "./query/index.mjs";
47
47
  import { ClientService } from "./entities/client/service.mjs";
48
- import { WEB_CLIENT_SCOPE_NAMES, WebClientProvisioner, buildWebClientAttributes } from "./entities/client/web-client.mjs";
48
+ import { SYSTEM_CLIENT_DEFINITIONS, SYSTEM_CLIENT_SCOPE_NAMES, SystemClientProvisioner, buildSystemClientAttributes } from "./entities/client/system-clients.mjs";
49
49
  import { applyJunctionCreateGrant, buildJunctionUpdateData } from "./identity/permission/junction-grant.mjs";
50
50
  import { ClientPermissionService } from "./entities/client-permission/service.mjs";
51
51
  import { ClientRoleService } from "./entities/client-role/service.mjs";
@@ -150,6 +150,7 @@ import { RegistrationService } from "./identity/registration/service.mjs";
150
150
  import { IdentityResolver } from "./identity/resolver/module.mjs";
151
151
  import { IdentityRoleProvider } from "./identity/role/module.mjs";
152
152
  import "./identity/index.mjs";
153
+ import { REALM_WILDCARD_NAME } from "./provisioning/constants.mjs";
153
154
  import { ProvisioningEntityStrategyType } from "./provisioning/strategy/constants.mjs";
154
155
  import { normalizeEntityProvisioningStrategy } from "./provisioning/strategy/normalize.mjs";
155
156
  import { ProvisioningStrategyValidator } from "./provisioning/strategy/validator.mjs";
@@ -161,8 +162,10 @@ import { ClientProvisioningValidator } from "./provisioning/entities/client/vali
161
162
  import { PolicyProvisioningValidator } from "./provisioning/entities/policy/validator.mjs";
162
163
  import { ScopeProvisioningValidator } from "./provisioning/entities/scope/validator.mjs";
163
164
  import { UserProvisioningValidator } from "./provisioning/entities/user/validator.mjs";
165
+ import { RealmWildcardProvisioningValidator } from "./provisioning/entities/realm/wildcard-validator.mjs";
164
166
  import { RealmProvisioningValidator } from "./provisioning/entities/realm/validator.mjs";
165
167
  import { RootProvisioningValidator } from "./provisioning/entities/root/validator.mjs";
168
+ import { buildProvisioningEntityKey, mergeProvisioningEntities, mergeProvisioningEntity } from "./provisioning/merge/module.mjs";
166
169
  import { ProvisioningEntityResolver } from "./provisioning/synchronizer/entity-resolver.mjs";
167
170
  import { ProvisioningJunctionSynchronizer } from "./provisioning/synchronizer/junction-synchronizer.mjs";
168
171
  import { ClientProvisioningSynchronizer } from "./provisioning/synchronizer/client/module.mjs";
@@ -173,6 +176,7 @@ import { RoleProvisioningSynchronizer } from "./provisioning/synchronizer/role/m
173
176
  import { GraphProvisioningSynchronizer } from "./provisioning/synchronizer/root/module.mjs";
174
177
  import { ScopeProvisioningSynchronizer } from "./provisioning/synchronizer/scope/module.mjs";
175
178
  import { UserProvisioningSynchronizer } from "./provisioning/synchronizer/user/module.mjs";
179
+ import { WildcardRealmProvisioner, expandWildcardRealmEntry, extractWildcardRealmEntry } from "./provisioning/wildcard/module.mjs";
176
180
  import "./provisioning/index.mjs";
177
181
  import "./security/index.mjs";
178
- export { BaseCredentialsAuthenticator, CLIENT_READ_PERMISSIONS, CONSENT_FILTER_KEYS, CONSENT_SCOPE_MAX_LENGTH, ClientAuthenticator, ClientCertificateValidator, ClientCredentialsGrant, ClientCredentialsService, ClientPermissionService, ClientProvisioningSynchronizer, ClientProvisioningValidator, ClientRoleService, ClientScopeService, ClientService, ConsentService, CredentialsAuthenticator, EVENT_ACTOR_NAME_MAX_LENGTH, EVENT_DIFF_SECRET_KEY_REGEX, EVENT_DIFF_VALUE_MAX_LENGTH, EVENT_LOG_RETENTION_DAYS_DEFAULT, EntityEventHandler, EventService, GraphProvisioningSynchronizer, IDENTITY_PROVIDER_LDAP_COLLECTION_AUTHENTICATOR_TOKEN, IdentityGrantType, IdentityPermissionProvider, IdentityProviderAccountBaseMapper, IdentityProviderAccountManager, IdentityProviderAttributeMapper, IdentityProviderFacebookAuthenticator, IdentityProviderGithubAuthenticator, IdentityProviderGoogleAuthenticator, IdentityProviderInstagramAuthenticator, IdentityProviderLdapAuthenticator, IdentityProviderLdapCollectionAuthenticator, IdentityProviderMapperOperation, IdentityProviderOAuth2Authenticator, IdentityProviderOpenIDAuthenticator, IdentityProviderPaypalAuthenticator, IdentityProviderPermissionMapper, IdentityProviderRoleMapper, IdentityProviderRoleMappingService, IdentityResolver, IdentityRoleProvider, KEY_CERTIFICATE_ERROR_INSTANCE, KeyCertificateError, KeyProvisioner, KeyService, LoginThrottleService, MAIL_TEMPLATE_REGISTRY, MailTemplateName, MailTemplateRenderer, NoopAuthFlowMetrics, OAuth2AccessPolicyEvaluator, OAuth2AccessTokenIssuer, OAuth2Authorization, OAuth2AuthorizationCodeIssuer, OAuth2AuthorizationCodeRequestValidator, OAuth2AuthorizationCodeRequestVerifier, OAuth2AuthorizationCodeVerifier, OAuth2AuthorizationStateManager, OAuth2AuthorizeGrant, OAuth2ClientAuthenticator, OAuth2EndSessionRequestValidator, OAuth2EndSessionService, OAuth2MfaLoginService, OAuth2MfaTokenIssuer, OAuth2OpenIDClaimsBuilder, OAuth2OpenIDTokenIssuer, OAuth2RefreshTokenGrant, OAuth2RefreshTokenIssuer, OAuth2ScopeAttributesResolver, OAuth2TokenRevoker, OAuth2TokenSigner, OAuth2TokenVerifier, PASSWORD_RESET_EXPIRES_IN_MINUTES, PasswordGrantType, PasswordRecoveryService, PermissionBindingPolicyEvaluator, PermissionCheckerService, PermissionPolicyService, PermissionProvisioningRelationsValidator, PermissionProvisioningSynchronizer, PermissionProvisioningValidator, PermissionService, PolicyCheckerService, PolicyEngine, PolicyProvisioningSynchronizer, PolicyProvisioningValidator, PolicyService, ProvisioningEntityResolver, ProvisioningEntityStrategyType, ProvisioningJunctionSynchronizer, ProvisioningStrategyValidator, REALM_CIPHER_BLOB_ERROR_INSTANCE, REALM_CIPHER_BLOB_VERSION, RECORD_QUERY_PARAMETERS, RealmCipher, RealmCipherBlobError, RealmProvisioningSynchronizer, RealmProvisioningValidator, RealmService, RegistrationService, RoleAttributeService, RolePermissionService, RoleProvisioningSynchronizer, RoleProvisioningValidator, RoleService, RootProvisioningValidator, SESSION_FILTER_KEYS, ScopeProvisioningSynchronizer, ScopeProvisioningValidator, ScopeService, SessionManager, SessionService, TrustAnchorService, USER_AUTHENTICATOR_ATTEMPT_CACHE_PREFIX, USER_AUTHENTICATOR_ATTEMPT_LOCK_FACTOR, USER_AUTHENTICATOR_ATTEMPT_LOCK_MAX, USER_AUTHENTICATOR_ATTEMPT_WINDOW, USER_AUTHENTICATOR_EMAIL_CODE_CACHE_PREFIX, USER_AUTHENTICATOR_EMAIL_CODE_EXPIRES_IN_MINUTES, USER_AUTHENTICATOR_EMAIL_CODE_LENGTH, USER_AUTHENTICATOR_EMAIL_SEND_CACHE_PREFIX, USER_AUTHENTICATOR_EMAIL_SEND_COOLDOWN, USER_AUTHENTICATOR_FILTER_KEYS, USER_AUTHENTICATOR_RECOVERY_CODE_COUNT, USER_AUTHENTICATOR_THROTTLE_CACHE_PREFIX, USER_AUTHENTICATOR_TOTP_ALGORITHM, USER_AUTHENTICATOR_TOTP_DIGITS, USER_AUTHENTICATOR_TOTP_PERIOD, USER_AUTHENTICATOR_VERIFY_LOCK_CACHE_PREFIX, USER_AUTHENTICATOR_VERIFY_LOCK_RENEW_INTERVAL, USER_AUTHENTICATOR_VERIFY_LOCK_TTL, USER_AUTHENTICATOR_WEBAUTHN_AUTH_CACHE_PREFIX, USER_AUTHENTICATOR_WEBAUTHN_CHALLENGE_WINDOW, USER_AUTHENTICATOR_WEBAUTHN_REG_CACHE_PREFIX, UserAttributeService, UserAuthenticator, UserAuthenticatorService, UserCredentialsService, UserPermissionService, UserProvisioningSynchronizer, UserProvisioningValidator, UserRoleService, UserService, WEB_CLIENT_SCOPE_NAMES, WRAPPED_KEY_MATERIAL_PREFIX, WebClientProvisioner, appendQueryConditions, applyJunctionCreateGrant, assertCertificateMatchesKey, assertClientCertificateEvidenceValidForBinding, assertClientGrantAllowed, base64URLEncode, buildCertificateJwkFields, buildClientCertificateThumbprint, buildEntityDiff, buildJunctionUpdateData, buildOAuth2BearerTokenResponse, buildOAuth2CodeChallenge, buildOAuth2TokenHash, buildWebClientAttributes, buildWebauthnAuthenticationOptions, buildWebauthnRegistrationOptions, buildX5c, buildX5tS256, clientPermissionSchema, clientRoleSchema, clientSchema, clientScopeSchema, consentSchema, createIdentityProviderOAuth2Authenticator, createProvisioningEntitiesValidator, createRelationsReadGate, decodeQuery, defineMailTemplate, deriveAmrAcr, describeQuerySchema, eventSchema, generateNumericCode, generateOAuth2CodeVerifier, generateRecoveryCode, guessUserAuthenticatorKindByResponse, identityProviderRoleMappingSchema, identityProviderSchema, isRealmCipherBlobError, isWrappedKeyMaterial, keySchema, normalizeEntityProvisioningStrategy, parseCertificateChain, parseClientCertificateChain, permissionPolicySchema, permissionSchema, policySchema, queryCodec, realmSchema, roleAttributeSchema, rolePermissionSchema, roleSchema, sanitizeEventData, schemaRegistry, scopeSchema, sessionSchema, toIdentityPolicyData, trustAnchorSchema, unwrapKeyMaterial, userAttributeSchema, userAuthenticatorSchema, userPermissionSchema, userRoleSchema, userSchema, verifyWebauthnAuthentication, verifyWebauthnRegistration, wrapKeyMaterial };
182
+ export { BaseCredentialsAuthenticator, CLIENT_READ_PERMISSIONS, CONSENT_FILTER_KEYS, CONSENT_SCOPE_MAX_LENGTH, ClientAuthenticator, ClientCertificateValidator, ClientCredentialsGrant, ClientCredentialsService, ClientPermissionService, ClientProvisioningSynchronizer, ClientProvisioningValidator, ClientRoleService, ClientScopeService, ClientService, ConsentService, CredentialsAuthenticator, EVENT_ACTOR_NAME_MAX_LENGTH, EVENT_DIFF_SECRET_KEY_REGEX, EVENT_DIFF_VALUE_MAX_LENGTH, EVENT_LOG_RETENTION_DAYS_DEFAULT, EntityEventHandler, EventService, GraphProvisioningSynchronizer, IDENTITY_PROVIDER_LDAP_COLLECTION_AUTHENTICATOR_TOKEN, IdentityGrantType, IdentityPermissionProvider, IdentityProviderAccountBaseMapper, IdentityProviderAccountManager, IdentityProviderAttributeMapper, IdentityProviderFacebookAuthenticator, IdentityProviderGithubAuthenticator, IdentityProviderGoogleAuthenticator, IdentityProviderInstagramAuthenticator, IdentityProviderLdapAuthenticator, IdentityProviderLdapCollectionAuthenticator, IdentityProviderMapperOperation, IdentityProviderOAuth2Authenticator, IdentityProviderOpenIDAuthenticator, IdentityProviderPaypalAuthenticator, IdentityProviderPermissionMapper, IdentityProviderRoleMapper, IdentityProviderRoleMappingService, IdentityResolver, IdentityRoleProvider, KEY_CERTIFICATE_ERROR_INSTANCE, KeyCertificateError, KeyProvisioner, KeyService, LoginThrottleService, MAIL_TEMPLATE_REGISTRY, MailTemplateName, MailTemplateRenderer, NoopAuthFlowMetrics, OAuth2AccessPolicyEvaluator, OAuth2AccessTokenIssuer, OAuth2Authorization, OAuth2AuthorizationCodeIssuer, OAuth2AuthorizationCodeRequestValidator, OAuth2AuthorizationCodeRequestVerifier, OAuth2AuthorizationCodeVerifier, OAuth2AuthorizationStateManager, OAuth2AuthorizeGrant, OAuth2ClientAuthenticator, OAuth2EndSessionRequestValidator, OAuth2EndSessionService, OAuth2MfaLoginService, OAuth2MfaTokenIssuer, OAuth2OpenIDClaimsBuilder, OAuth2OpenIDTokenIssuer, OAuth2RefreshTokenGrant, OAuth2RefreshTokenIssuer, OAuth2ScopeAttributesResolver, OAuth2TokenRevoker, OAuth2TokenSigner, OAuth2TokenVerifier, PASSWORD_RESET_EXPIRES_IN_MINUTES, PasswordGrantType, PasswordRecoveryService, PermissionBindingPolicyEvaluator, PermissionCheckerService, PermissionPolicyService, PermissionProvisioningRelationsValidator, PermissionProvisioningSynchronizer, PermissionProvisioningValidator, PermissionService, PolicyCheckerService, PolicyEngine, PolicyProvisioningSynchronizer, PolicyProvisioningValidator, PolicyService, ProvisioningEntityResolver, ProvisioningEntityStrategyType, ProvisioningJunctionSynchronizer, ProvisioningStrategyValidator, REALM_CIPHER_BLOB_ERROR_INSTANCE, REALM_CIPHER_BLOB_VERSION, REALM_WILDCARD_NAME, RECORD_QUERY_PARAMETERS, RealmCipher, RealmCipherBlobError, RealmProvisioningSynchronizer, RealmProvisioningValidator, RealmService, RealmWildcardProvisioningValidator, RegistrationService, RoleAttributeService, RolePermissionService, RoleProvisioningSynchronizer, RoleProvisioningValidator, RoleService, RootProvisioningValidator, SESSION_FILTER_KEYS, SYSTEM_CLIENT_DEFINITIONS, SYSTEM_CLIENT_SCOPE_NAMES, ScopeProvisioningSynchronizer, ScopeProvisioningValidator, ScopeService, SessionManager, SessionService, SystemClientProvisioner, TrustAnchorService, USER_AUTHENTICATOR_ATTEMPT_CACHE_PREFIX, USER_AUTHENTICATOR_ATTEMPT_LOCK_FACTOR, USER_AUTHENTICATOR_ATTEMPT_LOCK_MAX, USER_AUTHENTICATOR_ATTEMPT_WINDOW, USER_AUTHENTICATOR_EMAIL_CODE_CACHE_PREFIX, USER_AUTHENTICATOR_EMAIL_CODE_EXPIRES_IN_MINUTES, USER_AUTHENTICATOR_EMAIL_CODE_LENGTH, USER_AUTHENTICATOR_EMAIL_SEND_CACHE_PREFIX, USER_AUTHENTICATOR_EMAIL_SEND_COOLDOWN, USER_AUTHENTICATOR_FILTER_KEYS, USER_AUTHENTICATOR_RECOVERY_CODE_COUNT, USER_AUTHENTICATOR_THROTTLE_CACHE_PREFIX, USER_AUTHENTICATOR_TOTP_ALGORITHM, USER_AUTHENTICATOR_TOTP_DIGITS, USER_AUTHENTICATOR_TOTP_PERIOD, USER_AUTHENTICATOR_VERIFY_LOCK_CACHE_PREFIX, USER_AUTHENTICATOR_VERIFY_LOCK_RENEW_INTERVAL, USER_AUTHENTICATOR_VERIFY_LOCK_TTL, USER_AUTHENTICATOR_WEBAUTHN_AUTH_CACHE_PREFIX, USER_AUTHENTICATOR_WEBAUTHN_CHALLENGE_WINDOW, USER_AUTHENTICATOR_WEBAUTHN_REG_CACHE_PREFIX, UserAttributeService, UserAuthenticator, UserAuthenticatorService, UserCredentialsService, UserPermissionService, UserProvisioningSynchronizer, UserProvisioningValidator, UserRoleService, UserService, WRAPPED_KEY_MATERIAL_PREFIX, WildcardRealmProvisioner, appendQueryConditions, applyJunctionCreateGrant, assertCertificateMatchesKey, assertClientCertificateEvidenceValidForBinding, assertClientGrantAllowed, base64URLEncode, buildCertificateJwkFields, buildClientCertificateThumbprint, buildEntityDiff, buildJunctionUpdateData, buildOAuth2BearerTokenResponse, buildOAuth2CodeChallenge, buildOAuth2TokenHash, buildProvisioningEntityKey, buildSystemClientAttributes, buildWebauthnAuthenticationOptions, buildWebauthnRegistrationOptions, buildX5c, buildX5tS256, clientPermissionSchema, clientRoleSchema, clientSchema, clientScopeSchema, consentSchema, createIdentityProviderOAuth2Authenticator, createProvisioningEntitiesValidator, createRelationsReadGate, decodeQuery, defineMailTemplate, deriveAmrAcr, describeQuerySchema, eventSchema, expandWildcardRealmEntry, extractWildcardRealmEntry, generateNumericCode, generateOAuth2CodeVerifier, generateRecoveryCode, guessUserAuthenticatorKindByResponse, identityProviderRoleMappingSchema, identityProviderSchema, isRealmCipherBlobError, isWrappedKeyMaterial, keySchema, mergeProvisioningEntities, mergeProvisioningEntity, normalizeEntityProvisioningStrategy, parseCertificateChain, parseClientCertificateChain, permissionPolicySchema, permissionSchema, policySchema, queryCodec, realmSchema, roleAttributeSchema, rolePermissionSchema, roleSchema, sanitizeEventData, schemaRegistry, scopeSchema, sessionSchema, toIdentityPolicyData, trustAnchorSchema, unwrapKeyMaterial, userAttributeSchema, userAuthenticatorSchema, userPermissionSchema, userRoleSchema, userSchema, verifyWebauthnAuthentication, verifyWebauthnRegistration, wrapKeyMaterial };
@@ -1,6 +1,7 @@
1
1
  import type { Key } from '@authup/core-kit';
2
2
  import type { JWKUse } from '@authup/specs';
3
- export interface IKeyProvisioner {
3
+ import type { IRealmProvisioner } from '../provisioning/types.ts';
4
+ export interface IKeyProvisioner extends IRealmProvisioner {
4
5
  /**
5
6
  * Ensure the realm holds at least one sig and one enc key row.
6
7
  * Idempotent; never throws (provisioning must not fail realm creation
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/key/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC5B;;;;;;OAMG;IACH,cAAc,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,SAAS;IACtB;;;;;;;;;OASG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,GAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAElE;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CACjD;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IACzB;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1D;;;;;;;OAOG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/key/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACtD;;;;;;OAMG;IACH,cAAc,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,SAAS;IACtB;;;;;;;;;OASG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,GAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAElE;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CACjD;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IACzB;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1D;;;;;;;OAOG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/core/oauth2/authorization/code-request/verifier/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAWvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EACR,uCAAuC,EACvC,gDAAgD,EAChD,6CAA6C,EAChD,MAAM,YAAY,CAAC;AAEpB,qBAAa,sCAAuC,YAAW,uCAAuC;IAClG,SAAS,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IAEpD,SAAS,CAAC,eAAe,EAAE,sBAAsB,CAAC;gBAEtC,GAAG,EAAE,6CAA6C;IAK9D;;;OAGG;IACG,MAAM,CACR,IAAI,EAAE,8BAA8B,GACpC,OAAO,CAAC,gDAAgD,CAAC;CAsFhE"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/core/oauth2/authorization/code-request/verifier/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAWvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EACR,uCAAuC,EACvC,gDAAgD,EAChD,6CAA6C,EAChD,MAAM,YAAY,CAAC;AAEpB,qBAAa,sCAAuC,YAAW,uCAAuC;IAClG,SAAS,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IAEpD,SAAS,CAAC,eAAe,EAAE,sBAAsB,CAAC;gBAEtC,GAAG,EAAE,6CAA6C;IAK9D;;;OAGG;IACG,MAAM,CACR,IAAI,EAAE,8BAA8B,GACpC,OAAO,CAAC,gDAAgD,CAAC;CA6FhE"}
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { assertClientGrantAllowed } from "../../../client/grant-type.mjs";
5
5
  import "../../../client/index.mjs";
6
- import { isSimpleMatch, isUUID } from "@authup/kit";
6
+ import { isSimpleURLMatch, isUUID } from "@authup/kit";
7
7
  import { ScopeName, isClientPublic } from "@authup/core-kit";
8
8
  import { OAuth2ClientError, OAuth2GrantError, OAuth2RequestError, OAuth2ScopeError, OAuth2TokenGrant, hasOAuth2Scopes } from "@authup/specs";
9
9
  //#region src/core/oauth2/authorization/code-request/verifier/module.ts
@@ -37,7 +37,7 @@ var OAuth2AuthorizationCodeRequestVerifier = class {
37
37
  const redirectUriVerified = !!data.redirect_uri;
38
38
  if (data.redirect_uri) {
39
39
  const redirectUris = client.redirectUri.split(",");
40
- if (!isSimpleMatch(data.redirect_uri, redirectUris)) throw OAuth2GrantError.redirectUriMismatch();
40
+ if (!isSimpleURLMatch(data.redirect_uri, redirectUris)) throw OAuth2GrantError.redirectUriMismatch();
41
41
  }
42
42
  return {
43
43
  data,
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["ScopeName","isClientPublic","isSimpleMatch","isUUID","OAuth2ClientError","OAuth2GrantError","OAuth2RequestError","OAuth2ScopeError","OAuth2TokenGrant","hasOAuth2Scopes","assertClientGrantAllowed","OAuth2AuthorizationCodeRequestVerifier","clientRepository","scopeRepository","ctx","verify","data","client_id","invalid","realm_id","malformed","client","findOneByIdOrName","active","inactive","AUTHORIZATION_CODE","redirectUri","redirectUriMismatch","code_challenge","state","id","realmId","scopes","findByClientId","scopeNames","map","scope","name","GLOBAL","insufficient","join","redirectUriVerified","redirect_uri","redirectUris","split"],"sources":["../../../../../../src/core/oauth2/authorization/code-request/verifier/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { ScopeName, isClientPublic } from '@authup/core-kit';\nimport { isSimpleMatch, isUUID } from '@authup/kit';\nimport {\n OAuth2ClientError,\n OAuth2GrantError,\n OAuth2RequestError,\n OAuth2ScopeError,\n OAuth2TokenGrant,\n hasOAuth2Scopes,\n} from '@authup/specs';\nimport type { IOAuth2ClientRepository } from '../../../client/index.ts';\nimport { assertClientGrantAllowed } from '../../../client/index.ts';\nimport type { IOAuth2ScopeRepository } from '../../../scope/index.ts';\nimport type {\n IOAuth2AuthorizationCodeRequestVerifier,\n OAuth2AuthorizationCodeRequestVerificationResult,\n OAuth2AuthorizationCodeRequestVerifierContext,\n} from './types.ts';\n\nexport class OAuth2AuthorizationCodeRequestVerifier implements IOAuth2AuthorizationCodeRequestVerifier {\n protected clientRepository: IOAuth2ClientRepository;\n\n protected scopeRepository: IOAuth2ScopeRepository;\n\n constructor(ctx: OAuth2AuthorizationCodeRequestVerifierContext) {\n this.clientRepository = ctx.clientRepository;\n this.scopeRepository = ctx.scopeRepository;\n }\n\n /**\n * Verify validated authorization code request.\n * @param data\n */\n async verify(\n data: OAuth2AuthorizationCodeRequest,\n ) : Promise<OAuth2AuthorizationCodeRequestVerificationResult> {\n if (!data.client_id) {\n throw OAuth2ClientError.invalid();\n }\n\n // A name-identified client needs a realm hint to resolve deterministically\n // — every realm has a built-in `web` client, so `client_id=web` without a\n // realm would bind to an arbitrary realm's client (and, post realm-gate,\n // produce a confusing mismatch against a random realm). Require the hint.\n if (!isUUID(data.client_id) && !data.realm_id) {\n throw OAuth2RequestError.malformed('A realm is required to resolve a client by name.');\n }\n\n const client = await this.clientRepository.findOneByIdOrName(data.client_id, data.realm_id);\n if (!client) {\n throw OAuth2ClientError.invalid();\n }\n\n if (!client.active) {\n throw OAuth2ClientError.inactive();\n }\n\n // A non-null grant_types allowlist must cover the code flow — an RP\n // misconfiguration fails at the front door, not at code redemption.\n assertClientGrantAllowed(client, OAuth2TokenGrant.AUTHORIZATION_CODE);\n\n // OAuth 2.1 posture: a client with no registered redirect_uri pattern\n // can never be matched — reject outright instead of trusting whatever\n // redirect_uri the request carries (the server would otherwise issue a\n // code to an attacker-supplied URI).\n if (!client.redirectUri) {\n throw OAuth2GrantError.redirectUriMismatch();\n }\n\n // Public clients MUST use PKCE (RFC 7636 §4.4.1, OAuth 2.1). Without\n // PKCE a public client's code flow has no second factor — anyone who\n // intercepts the redirect can redeem the code at /token. The code flow\n // is the only supported response type, so this holds unconditionally.\n if (isClientPublic(client) && !data.code_challenge) {\n throw OAuth2RequestError.malformed('PKCE code_challenge is required for public clients.');\n }\n\n // Public clients SHOULD include state to bind the redirect to the\n // initiating session and prevent CSRF (RFC 6749 §10.12). Confidential\n // clients are exempt because the /token exchange already authenticates\n // them via client_secret.\n if (isClientPublic(client) && !data.state) {\n throw OAuth2RequestError.malformed('state is required for public clients in the code flow.');\n }\n\n data.client_id = client.id;\n data.realm_id = client.realmId;\n\n const scopes = await this.scopeRepository.findByClientId(client.id);\n const scopeNames = scopes.map((scope) => scope.name);\n if (data.scope) {\n if (\n !hasOAuth2Scopes(scopeNames, data.scope) &&\n !hasOAuth2Scopes(data.scope, ScopeName.GLOBAL)\n ) {\n throw OAuth2ScopeError.insufficient();\n }\n } else {\n data.scope = scopeNames.join(' ');\n }\n\n // Verified only when the request's redirect_uri matched a registered\n // pattern (pattern-less clients were rejected above). A request without\n // a redirect_uri (e.g. the GET page render) stays unverified so\n // consumers never auto-redirect without a match.\n const redirectUriVerified = !!data.redirect_uri;\n if (data.redirect_uri) {\n const redirectUris = client.redirectUri.split(',');\n\n if (!isSimpleMatch(data.redirect_uri, redirectUris)) {\n throw OAuth2GrantError.redirectUriMismatch();\n }\n }\n\n return {\n data,\n client,\n scopes,\n redirectUriVerified,\n };\n }\n}\n"],"mappings":";;;;;;;;;AA2BA,IAAaW,yCAAb,MAAaA;CACCC;CAEAC;CAEV,YAAYC,KAAoD;EAC5D,KAAKF,mBAAmBE,IAAIF;EAC5B,KAAKC,kBAAkBC,IAAID;CAC/B;;;;IAMA,MAAME,OACFC,MAC0D;EAC1D,IAAI,CAACA,KAAKC,WACN,MAAMb,kBAAkBc,QAAO;EAOnC,IAAI,CAACf,OAAOa,KAAKC,SAAS,KAAK,CAACD,KAAKG,UACjC,MAAMb,mBAAmBc,UAAU,kDAAA;EAGvC,MAAMC,SAAS,MAAM,KAAKT,iBAAiBU,kBAAkBN,KAAKC,WAAWD,KAAKG,QAAQ;EAC1F,IAAI,CAACE,QACD,MAAMjB,kBAAkBc,QAAO;EAGnC,IAAI,CAACG,OAAOE,QACR,MAAMnB,kBAAkBoB,SAAQ;EAKpCd,yBAAyBW,QAAQb,iBAAiBiB,kBAAkB;EAMpE,IAAI,CAACJ,OAAOK,aACR,MAAMrB,iBAAiBsB,oBAAmB;EAO9C,IAAI1B,eAAeoB,MAAAA,KAAW,CAACL,KAAKY,gBAChC,MAAMtB,mBAAmBc,UAAU,qDAAA;EAOvC,IAAInB,eAAeoB,MAAAA,KAAW,CAACL,KAAKa,OAChC,MAAMvB,mBAAmBc,UAAU,wDAAA;EAGvCJ,KAAKC,YAAYI,OAAOS;EACxBd,KAAKG,WAAWE,OAAOU;EAEvB,MAAMC,SAAS,MAAM,KAAKnB,gBAAgBoB,eAAeZ,OAAOS,EAAE;EAClE,MAAMI,aAAaF,OAAOG,KAAKC,UAAUA,MAAMC,IAAI;EACnD,IAAIrB,KAAKoB,OAED;OAAA,CAAC3B,gBAAgByB,YAAYlB,KAAKoB,KAAK,KACvC,CAAC3B,gBAAgBO,KAAKoB,OAAOpC,UAAUsC,MAAM,GAE7C,MAAM/B,iBAAiBgC,aAAY;EAAA,OAGvCvB,KAAKoB,QAAQF,WAAWM,KAAK,GAAA;EAOjC,MAAMC,sBAAsB,CAAC,CAACzB,KAAK0B;EACnC,IAAI1B,KAAK0B,cAAc;GACnB,MAAMC,eAAetB,OAAOK,YAAYkB,MAAM,GAAA;GAE9C,IAAI,CAAC1C,cAAcc,KAAK0B,cAAcC,YAAAA,GAClC,MAAMtC,iBAAiBsB,oBAAmB;EAElD;EAEA,OAAO;GACHX;GACAK;GACAW;GACAS;EACJ;CACJ;AACJ"}
1
+ {"version":3,"file":"module.mjs","names":["ScopeName","isClientPublic","isSimpleURLMatch","isUUID","OAuth2ClientError","OAuth2GrantError","OAuth2RequestError","OAuth2ScopeError","OAuth2TokenGrant","hasOAuth2Scopes","assertClientGrantAllowed","OAuth2AuthorizationCodeRequestVerifier","clientRepository","scopeRepository","ctx","verify","data","client_id","invalid","realm_id","malformed","client","findOneByIdOrName","active","inactive","AUTHORIZATION_CODE","redirectUri","redirectUriMismatch","code_challenge","state","id","realmId","scopes","findByClientId","scopeNames","map","scope","name","GLOBAL","insufficient","join","redirectUriVerified","redirect_uri","redirectUris","split"],"sources":["../../../../../../src/core/oauth2/authorization/code-request/verifier/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { ScopeName, isClientPublic } from '@authup/core-kit';\nimport { isSimpleURLMatch, isUUID } from '@authup/kit';\nimport {\n OAuth2ClientError,\n OAuth2GrantError,\n OAuth2RequestError,\n OAuth2ScopeError,\n OAuth2TokenGrant,\n hasOAuth2Scopes,\n} from '@authup/specs';\nimport type { IOAuth2ClientRepository } from '../../../client/index.ts';\nimport { assertClientGrantAllowed } from '../../../client/index.ts';\nimport type { IOAuth2ScopeRepository } from '../../../scope/index.ts';\nimport type {\n IOAuth2AuthorizationCodeRequestVerifier,\n OAuth2AuthorizationCodeRequestVerificationResult,\n OAuth2AuthorizationCodeRequestVerifierContext,\n} from './types.ts';\n\nexport class OAuth2AuthorizationCodeRequestVerifier implements IOAuth2AuthorizationCodeRequestVerifier {\n protected clientRepository: IOAuth2ClientRepository;\n\n protected scopeRepository: IOAuth2ScopeRepository;\n\n constructor(ctx: OAuth2AuthorizationCodeRequestVerifierContext) {\n this.clientRepository = ctx.clientRepository;\n this.scopeRepository = ctx.scopeRepository;\n }\n\n /**\n * Verify validated authorization code request.\n * @param data\n */\n async verify(\n data: OAuth2AuthorizationCodeRequest,\n ) : Promise<OAuth2AuthorizationCodeRequestVerificationResult> {\n if (!data.client_id) {\n throw OAuth2ClientError.invalid();\n }\n\n // A name-identified client needs a realm hint to resolve deterministically\n // — client names are only unique per realm (every realm carries the\n // same-named system clients, and a wildcard-provisioned client exists in\n // every realm), so a bare name would bind to an arbitrary realm's client\n // (and, post realm-gate, produce a confusing mismatch against a random\n // realm). Require the hint.\n if (!isUUID(data.client_id) && !data.realm_id) {\n throw OAuth2RequestError.malformed('A realm is required to resolve a client by name.');\n }\n\n const client = await this.clientRepository.findOneByIdOrName(data.client_id, data.realm_id);\n if (!client) {\n throw OAuth2ClientError.invalid();\n }\n\n if (!client.active) {\n throw OAuth2ClientError.inactive();\n }\n\n // A non-null grant_types allowlist must cover the code flow — an RP\n // misconfiguration fails at the front door, not at code redemption.\n assertClientGrantAllowed(client, OAuth2TokenGrant.AUTHORIZATION_CODE);\n\n // OAuth 2.1 posture: a client with no registered redirect_uri pattern\n // can never be matched — reject outright instead of trusting whatever\n // redirect_uri the request carries (the server would otherwise issue a\n // code to an attacker-supplied URI).\n if (!client.redirectUri) {\n throw OAuth2GrantError.redirectUriMismatch();\n }\n\n // Public clients MUST use PKCE (RFC 7636 §4.4.1, OAuth 2.1). Without\n // PKCE a public client's code flow has no second factor — anyone who\n // intercepts the redirect can redeem the code at /token. The code flow\n // is the only supported response type, so this holds unconditionally.\n if (isClientPublic(client) && !data.code_challenge) {\n throw OAuth2RequestError.malformed('PKCE code_challenge is required for public clients.');\n }\n\n // Public clients SHOULD include state to bind the redirect to the\n // initiating session and prevent CSRF (RFC 6749 §10.12). Confidential\n // clients are exempt because the /token exchange already authenticates\n // them via client_secret.\n if (isClientPublic(client) && !data.state) {\n throw OAuth2RequestError.malformed('state is required for public clients in the code flow.');\n }\n\n data.client_id = client.id;\n data.realm_id = client.realmId;\n\n const scopes = await this.scopeRepository.findByClientId(client.id);\n const scopeNames = scopes.map((scope) => scope.name);\n if (data.scope) {\n if (\n !hasOAuth2Scopes(scopeNames, data.scope) &&\n !hasOAuth2Scopes(data.scope, ScopeName.GLOBAL)\n ) {\n throw OAuth2ScopeError.insufficient();\n }\n } else {\n data.scope = scopeNames.join(' ');\n }\n\n // Verified only when the request's redirect_uri matched a registered\n // pattern (pattern-less clients were rejected above). A request without\n // a redirect_uri (e.g. the GET page render) stays unverified so\n // consumers never auto-redirect without a match.\n const redirectUriVerified = !!data.redirect_uri;\n if (data.redirect_uri) {\n const redirectUris = client.redirectUri.split(',');\n\n // isSimpleURLMatch, never isSimpleMatch: the raw matcher treats `/`\n // as its only boundary, so a `*` in a registered pattern's host\n // absorbs a `?`, `#` or `\\` and the pattern's remaining host\n // literal lands in the query of a foreign origin. The code would\n // then be issued to that origin.\n if (!isSimpleURLMatch(data.redirect_uri, redirectUris)) {\n throw OAuth2GrantError.redirectUriMismatch();\n }\n }\n\n return {\n data,\n client,\n scopes,\n redirectUriVerified,\n };\n }\n}\n"],"mappings":";;;;;;;;;AA2BA,IAAaW,yCAAb,MAAaA;CACCC;CAEAC;CAEV,YAAYC,KAAoD;EAC5D,KAAKF,mBAAmBE,IAAIF;EAC5B,KAAKC,kBAAkBC,IAAID;CAC/B;;;;IAMA,MAAME,OACFC,MAC0D;EAC1D,IAAI,CAACA,KAAKC,WACN,MAAMb,kBAAkBc,QAAO;EASnC,IAAI,CAACf,OAAOa,KAAKC,SAAS,KAAK,CAACD,KAAKG,UACjC,MAAMb,mBAAmBc,UAAU,kDAAA;EAGvC,MAAMC,SAAS,MAAM,KAAKT,iBAAiBU,kBAAkBN,KAAKC,WAAWD,KAAKG,QAAQ;EAC1F,IAAI,CAACE,QACD,MAAMjB,kBAAkBc,QAAO;EAGnC,IAAI,CAACG,OAAOE,QACR,MAAMnB,kBAAkBoB,SAAQ;EAKpCd,yBAAyBW,QAAQb,iBAAiBiB,kBAAkB;EAMpE,IAAI,CAACJ,OAAOK,aACR,MAAMrB,iBAAiBsB,oBAAmB;EAO9C,IAAI1B,eAAeoB,MAAAA,KAAW,CAACL,KAAKY,gBAChC,MAAMtB,mBAAmBc,UAAU,qDAAA;EAOvC,IAAInB,eAAeoB,MAAAA,KAAW,CAACL,KAAKa,OAChC,MAAMvB,mBAAmBc,UAAU,wDAAA;EAGvCJ,KAAKC,YAAYI,OAAOS;EACxBd,KAAKG,WAAWE,OAAOU;EAEvB,MAAMC,SAAS,MAAM,KAAKnB,gBAAgBoB,eAAeZ,OAAOS,EAAE;EAClE,MAAMI,aAAaF,OAAOG,KAAKC,UAAUA,MAAMC,IAAI;EACnD,IAAIrB,KAAKoB,OAED;OAAA,CAAC3B,gBAAgByB,YAAYlB,KAAKoB,KAAK,KACvC,CAAC3B,gBAAgBO,KAAKoB,OAAOpC,UAAUsC,MAAM,GAE7C,MAAM/B,iBAAiBgC,aAAY;EAAA,OAGvCvB,KAAKoB,QAAQF,WAAWM,KAAK,GAAA;EAOjC,MAAMC,sBAAsB,CAAC,CAACzB,KAAK0B;EACnC,IAAI1B,KAAK0B,cAAc;GACnB,MAAMC,eAAetB,OAAOK,YAAYkB,MAAM,GAAA;GAO9C,IAAI,CAAC1C,iBAAiBc,KAAK0B,cAAcC,YAAAA,GACrC,MAAMtC,iBAAiBsB,oBAAmB;EAElD;EAEA,OAAO;GACHX;GACAK;GACAW;GACAS;EACJ;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/end-session/service.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EACR,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EACjC,MAAM,YAAY,CAAC;AAEpB,qBAAa,uBAAwB,YAAW,wBAAwB;IACpE,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAE9C,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;IAE1C,SAAS,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IAEpD,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IAEvC,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC;gBAEtB,GAAG,EAAE,8BAA8B;IASzC,MAAM,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA+GtE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B/E;;;;;OAKG;IACH,SAAS,CAAC,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO;IAcvE;;;;OAIG;IACH,SAAS,CAAC,yBAAyB,CAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,SAAS,EAAE,MAAM,GAClB,OAAO;CAkBb"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/end-session/service.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EACR,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EACjC,MAAM,YAAY,CAAC;AAEpB,qBAAa,uBAAwB,YAAW,wBAAwB;IACpE,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAE9C,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;IAE1C,SAAS,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IAEpD,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IAEvC,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC;gBAEtB,GAAG,EAAE,8BAA8B;IASzC,MAAM,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAgHtE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B/E;;;;;OAKG;IACH,SAAS,CAAC,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO;IAcvE;;;;OAIG;IACH,SAAS,CAAC,yBAAyB,CAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,SAAS,EAAE,MAAM,GAClB,OAAO;CAsBb"}
@@ -1,7 +1,7 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
- import { isSimpleMatch, isUUID } from "@authup/kit";
4
+ import { isSimpleURLMatch, isUUID } from "@authup/kit";
5
5
  import { EventName, EventRefType, EventScope } from "@authup/core-kit";
6
6
  import { OAuth2TokenKind } from "@authup/specs";
7
7
  //#region src/core/oauth2/end-session/service.ts
@@ -121,7 +121,7 @@ var OAuth2EndSessionService = class {
121
121
  }
122
122
  if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return false;
123
123
  if (!registered) return false;
124
- return isSimpleMatch(candidate, registered.split(","));
124
+ return isSimpleURLMatch(candidate, registered.split(","));
125
125
  }
126
126
  };
127
127
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["isSimpleMatch","isUUID","EventName","EventRefType","EventScope","OAuth2TokenKind","OAuth2EndSessionService","tokenVerifier","sessionManager","clientRepository","realmRepository","eventService","hintGracePeriod","ctx","verify","data","hintVerified","sub","subKind","sessionId","hintRealmId","audiences","id_token_hint","payload","ignoreExpiry","skipActiveCheck","kind","ID_TOKEN","isWithinHintGraceWindow","sub_kind","sid","session_id","undefined","realm_id","aud","Array","isArray","filter","entry","clientId","client_id","length","client","realmKey","realm_name","realm","resolve","findOneByIdOrName","id","expected","includes","clientName","redirectUri","name","post_logout_redirect_uri","isValidPostLogoutRedirect","postLogoutRedirectUri","state","revoke","session","findOneById","record","scope","OAUTH2","LOGOUT","refType","SESSION","refId","actorType","actorId","realmId","revokedSessionId","exp","nowSeconds","Math","floor","Date","now","registered","candidate","parsed","URL","protocol","split"],"sources":["../../../../src/core/oauth2/end-session/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isSimpleMatch, isUUID } from '@authup/kit';\nimport type { Client, IdentityType } from '@authup/core-kit';\nimport { EventName, EventRefType, EventScope } from '@authup/core-kit';\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2TokenKind } from '@authup/specs';\nimport type { IEventService, IRealmRepository } from '../../entities/index.ts';\nimport type { ISessionManager } from '../../authentication/index.ts';\nimport type { IOAuth2ClientRepository } from '../client/index.ts';\nimport type { IOAuth2TokenVerifier } from '../token/index.ts';\nimport type {\n IOAuth2EndSessionService,\n OAuth2EndSessionRequest,\n OAuth2EndSessionResult,\n OAuth2EndSessionServiceContext,\n} from './types.ts';\n\nexport class OAuth2EndSessionService implements IOAuth2EndSessionService {\n protected tokenVerifier: IOAuth2TokenVerifier;\n\n protected sessionManager: ISessionManager;\n\n protected clientRepository: IOAuth2ClientRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected eventService?: IEventService;\n\n protected hintGracePeriod: number;\n\n constructor(ctx: OAuth2EndSessionServiceContext) {\n this.tokenVerifier = ctx.tokenVerifier;\n this.sessionManager = ctx.sessionManager;\n this.clientRepository = ctx.clientRepository;\n this.realmRepository = ctx.realmRepository;\n this.eventService = ctx.eventService;\n this.hintGracePeriod = ctx.hintGracePeriod ?? 0;\n }\n\n async verify(data: OAuth2EndSessionRequest): Promise<OAuth2EndSessionResult> {\n let hintVerified = false;\n let sub: string | undefined;\n let subKind: string | undefined;\n let sessionId: string | undefined;\n let hintRealmId: string | undefined;\n let audiences: string[] = [];\n\n if (data.id_token_hint) {\n try {\n // Signature + kind are the anchors; exp is skipped (a logout hint\n // is routinely expired) and the cache blocklist is irrelevant.\n const payload = await this.tokenVerifier.verify(data.id_token_hint, {\n ignoreExpiry: true,\n skipActiveCheck: true,\n });\n\n // MUST be an id_token — access/refresh tokens also carry\n // session_id, so accepting them would let a leaked access token\n // act as a logout weapon.\n if (payload.kind === OAuth2TokenKind.ID_TOKEN && this.isWithinHintGraceWindow(payload)) {\n hintVerified = true;\n sub = payload.sub;\n subKind = payload.sub_kind;\n sessionId = payload.sid ?? payload.session_id ?? undefined;\n hintRealmId = payload.realm_id ?? undefined;\n // aud may be a single string or an array (JWT spec).\n const { aud } = payload;\n if (Array.isArray(aud)) {\n audiences = aud.filter((entry): entry is string => typeof entry === 'string');\n } else if (typeof aud === 'string') {\n audiences = [aud];\n }\n }\n } catch {\n // forged / unverifiable hint → stays unverified (no revoke)\n }\n }\n\n // Resolve a single client for the aud cross-check and redirect\n // validation: the request's client_id, else the hint's sole audience\n // (ambiguous for a multi-aud hint).\n const clientId = data.client_id ?? (audiences.length === 1 ? audiences[0] : undefined);\n\n let client: Client | null = null;\n if (clientId) {\n // Scope a name-identified client to the request's realm hint; a\n // VERIFIED hint's own realm claim serves as fallback (claims from an\n // unverified hint are never trusted). No master fallback here\n // (unlike /token): a bogus hint must NOT silently resolve a\n // same-named client in master → null realm.\n const realmKey = data.realm_id ?? data.realm_name ?? (hintVerified ? hintRealmId : undefined);\n const realm = await this.realmRepository.resolve(realmKey, false);\n\n // Fail closed instead of dropping the realm predicate: a supplied\n // realm key that does not resolve never degrades to an unscoped\n // lookup, and a NAME-form client_id without any realm key is\n // ambiguous (every realm has a built-in `web` client — same rule as\n // the /authorize verifier). A UUID is globally unique and needs no\n // scope; the sole-aud-derived clientId is always a UUID.\n if (realm) {\n client = await this.clientRepository.findOneByIdOrName(clientId, realm.id);\n } else if (!realmKey && isUUID(clientId)) {\n client = await this.clientRepository.findOneByIdOrName(clientId);\n }\n }\n\n // aud/client_id cross-check: when the request supplies a client_id on a\n // verified hint, it MUST denote one of the hint's audiences. The aud is\n // the client UUID, so a name-form client_id is compared via its resolved\n // client's id. Fail closed: an aud-less hint, or a name that did not\n // resolve, counts as unverified.\n if (hintVerified && data.client_id) {\n const expected = isUUID(data.client_id) ? data.client_id : client?.id;\n if (audiences.length === 0 || !expected || !audiences.includes(expected)) {\n hintVerified = false;\n sub = undefined;\n subKind = undefined;\n sessionId = undefined;\n }\n }\n\n let clientName: string | undefined;\n let redirectUri: string | undefined;\n\n // Redirect validation is independent of hint verification — the\n // click-gated confirm page (unverified hint / hint-less request) still\n // honors a registered post-logout redirect.\n if (client) {\n clientName = client.name;\n if (\n data.post_logout_redirect_uri &&\n this.isValidPostLogoutRedirect(client.postLogoutRedirectUri, data.post_logout_redirect_uri)\n ) {\n redirectUri = data.post_logout_redirect_uri;\n }\n }\n\n return {\n hintVerified,\n ...(hintVerified ? {\n sub,\n subKind,\n sessionId,\n } : {}),\n ...(clientId ? { clientId } : {}),\n ...(clientName ? { clientName } : {}),\n ...(redirectUri ? { redirectUri, ...(data.state ? { state: data.state } : {}) } : {}),\n };\n }\n\n async revoke(sessionId: string, sub: string, subKind: string): Promise<boolean> {\n const session = await this.sessionManager.findOneById(sessionId);\n if (!session) {\n return false;\n }\n\n // Never revoke a session that does not belong to the hint's subject.\n if (session.sub !== sub || session.subKind !== subKind) {\n return false;\n }\n\n await this.sessionManager.revoke(sessionId);\n\n await this.eventService?.record({\n scope: EventScope.OAUTH2,\n name: EventName.LOGOUT,\n refType: EventRefType.SESSION,\n refId: sessionId,\n actorType: session.subKind as `${IdentityType}`,\n actorId: session.sub,\n realmId: session.realmId,\n data: { revokedSessionId: sessionId },\n });\n\n return true;\n }\n\n /**\n * With a positive `hintGracePeriod`, an expired hint is honored only within\n * the window past `exp` — beyond it a leaked id_token stops being a\n * replayable remote logout (the hint counts as unverified; the click-gated\n * confirm page still works). 0 keeps spec/Keycloak parity: any expired hint.\n */\n protected isWithinHintGraceWindow(payload: OAuth2TokenPayload): boolean {\n if (this.hintGracePeriod <= 0) {\n return true;\n }\n\n // a bounded window without an exp claim to judge against fails closed\n if (typeof payload.exp !== 'number') {\n return false;\n }\n\n const nowSeconds = Math.floor(Date.now() / 1000);\n return nowSeconds - payload.exp <= this.hintGracePeriod;\n }\n\n /**\n * A post-logout redirect is honored only when it is an absolute http(s) URL\n * that matches a registered client redirect pattern (defense against open\n * redirects to attacker-controlled URLs).\n */\n protected isValidPostLogoutRedirect(\n registered: string | null | undefined,\n candidate: string,\n ): boolean {\n let parsed: URL;\n try {\n parsed = new URL(candidate);\n } catch {\n return false;\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return false;\n }\n\n if (!registered) {\n return false;\n }\n\n return isSimpleMatch(candidate, registered.split(','));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.mjs","names":["isSimpleURLMatch","isUUID","EventName","EventRefType","EventScope","OAuth2TokenKind","OAuth2EndSessionService","tokenVerifier","sessionManager","clientRepository","realmRepository","eventService","hintGracePeriod","ctx","verify","data","hintVerified","sub","subKind","sessionId","hintRealmId","audiences","id_token_hint","payload","ignoreExpiry","skipActiveCheck","kind","ID_TOKEN","isWithinHintGraceWindow","sub_kind","sid","session_id","undefined","realm_id","aud","Array","isArray","filter","entry","clientId","client_id","length","client","realmKey","realm_name","realm","resolve","findOneByIdOrName","id","expected","includes","clientName","redirectUri","name","post_logout_redirect_uri","isValidPostLogoutRedirect","postLogoutRedirectUri","state","revoke","session","findOneById","record","scope","OAUTH2","LOGOUT","refType","SESSION","refId","actorType","actorId","realmId","revokedSessionId","exp","nowSeconds","Math","floor","Date","now","registered","candidate","parsed","URL","protocol","split"],"sources":["../../../../src/core/oauth2/end-session/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isSimpleURLMatch, isUUID } from '@authup/kit';\nimport type { Client, IdentityType } from '@authup/core-kit';\nimport { EventName, EventRefType, EventScope } from '@authup/core-kit';\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2TokenKind } from '@authup/specs';\nimport type { IEventService, IRealmRepository } from '../../entities/index.ts';\nimport type { ISessionManager } from '../../authentication/index.ts';\nimport type { IOAuth2ClientRepository } from '../client/index.ts';\nimport type { IOAuth2TokenVerifier } from '../token/index.ts';\nimport type {\n IOAuth2EndSessionService,\n OAuth2EndSessionRequest,\n OAuth2EndSessionResult,\n OAuth2EndSessionServiceContext,\n} from './types.ts';\n\nexport class OAuth2EndSessionService implements IOAuth2EndSessionService {\n protected tokenVerifier: IOAuth2TokenVerifier;\n\n protected sessionManager: ISessionManager;\n\n protected clientRepository: IOAuth2ClientRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected eventService?: IEventService;\n\n protected hintGracePeriod: number;\n\n constructor(ctx: OAuth2EndSessionServiceContext) {\n this.tokenVerifier = ctx.tokenVerifier;\n this.sessionManager = ctx.sessionManager;\n this.clientRepository = ctx.clientRepository;\n this.realmRepository = ctx.realmRepository;\n this.eventService = ctx.eventService;\n this.hintGracePeriod = ctx.hintGracePeriod ?? 0;\n }\n\n async verify(data: OAuth2EndSessionRequest): Promise<OAuth2EndSessionResult> {\n let hintVerified = false;\n let sub: string | undefined;\n let subKind: string | undefined;\n let sessionId: string | undefined;\n let hintRealmId: string | undefined;\n let audiences: string[] = [];\n\n if (data.id_token_hint) {\n try {\n // Signature + kind are the anchors; exp is skipped (a logout hint\n // is routinely expired) and the cache blocklist is irrelevant.\n const payload = await this.tokenVerifier.verify(data.id_token_hint, {\n ignoreExpiry: true,\n skipActiveCheck: true,\n });\n\n // MUST be an id_token — access/refresh tokens also carry\n // session_id, so accepting them would let a leaked access token\n // act as a logout weapon.\n if (payload.kind === OAuth2TokenKind.ID_TOKEN && this.isWithinHintGraceWindow(payload)) {\n hintVerified = true;\n sub = payload.sub;\n subKind = payload.sub_kind;\n sessionId = payload.sid ?? payload.session_id ?? undefined;\n hintRealmId = payload.realm_id ?? undefined;\n // aud may be a single string or an array (JWT spec).\n const { aud } = payload;\n if (Array.isArray(aud)) {\n audiences = aud.filter((entry): entry is string => typeof entry === 'string');\n } else if (typeof aud === 'string') {\n audiences = [aud];\n }\n }\n } catch {\n // forged / unverifiable hint → stays unverified (no revoke)\n }\n }\n\n // Resolve a single client for the aud cross-check and redirect\n // validation: the request's client_id, else the hint's sole audience\n // (ambiguous for a multi-aud hint).\n const clientId = data.client_id ?? (audiences.length === 1 ? audiences[0] : undefined);\n\n let client: Client | null = null;\n if (clientId) {\n // Scope a name-identified client to the request's realm hint; a\n // VERIFIED hint's own realm claim serves as fallback (claims from an\n // unverified hint are never trusted). No master fallback here\n // (unlike /token): a bogus hint must NOT silently resolve a\n // same-named client in master → null realm.\n const realmKey = data.realm_id ?? data.realm_name ?? (hintVerified ? hintRealmId : undefined);\n const realm = await this.realmRepository.resolve(realmKey, false);\n\n // Fail closed instead of dropping the realm predicate: a supplied\n // realm key that does not resolve never degrades to an unscoped\n // lookup, and a NAME-form client_id without any realm key is\n // ambiguous (client names are only unique per realm, and every\n // realm carries the same-named system clients — same rule as the\n // /authorize verifier). A UUID is globally unique and needs no\n // scope; the sole-aud-derived clientId is always a UUID.\n if (realm) {\n client = await this.clientRepository.findOneByIdOrName(clientId, realm.id);\n } else if (!realmKey && isUUID(clientId)) {\n client = await this.clientRepository.findOneByIdOrName(clientId);\n }\n }\n\n // aud/client_id cross-check: when the request supplies a client_id on a\n // verified hint, it MUST denote one of the hint's audiences. The aud is\n // the client UUID, so a name-form client_id is compared via its resolved\n // client's id. Fail closed: an aud-less hint, or a name that did not\n // resolve, counts as unverified.\n if (hintVerified && data.client_id) {\n const expected = isUUID(data.client_id) ? data.client_id : client?.id;\n if (audiences.length === 0 || !expected || !audiences.includes(expected)) {\n hintVerified = false;\n sub = undefined;\n subKind = undefined;\n sessionId = undefined;\n }\n }\n\n let clientName: string | undefined;\n let redirectUri: string | undefined;\n\n // Redirect validation is independent of hint verification — the\n // click-gated confirm page (unverified hint / hint-less request) still\n // honors a registered post-logout redirect.\n if (client) {\n clientName = client.name;\n if (\n data.post_logout_redirect_uri &&\n this.isValidPostLogoutRedirect(client.postLogoutRedirectUri, data.post_logout_redirect_uri)\n ) {\n redirectUri = data.post_logout_redirect_uri;\n }\n }\n\n return {\n hintVerified,\n ...(hintVerified ? {\n sub,\n subKind,\n sessionId,\n } : {}),\n ...(clientId ? { clientId } : {}),\n ...(clientName ? { clientName } : {}),\n ...(redirectUri ? { redirectUri, ...(data.state ? { state: data.state } : {}) } : {}),\n };\n }\n\n async revoke(sessionId: string, sub: string, subKind: string): Promise<boolean> {\n const session = await this.sessionManager.findOneById(sessionId);\n if (!session) {\n return false;\n }\n\n // Never revoke a session that does not belong to the hint's subject.\n if (session.sub !== sub || session.subKind !== subKind) {\n return false;\n }\n\n await this.sessionManager.revoke(sessionId);\n\n await this.eventService?.record({\n scope: EventScope.OAUTH2,\n name: EventName.LOGOUT,\n refType: EventRefType.SESSION,\n refId: sessionId,\n actorType: session.subKind as `${IdentityType}`,\n actorId: session.sub,\n realmId: session.realmId,\n data: { revokedSessionId: sessionId },\n });\n\n return true;\n }\n\n /**\n * With a positive `hintGracePeriod`, an expired hint is honored only within\n * the window past `exp` — beyond it a leaked id_token stops being a\n * replayable remote logout (the hint counts as unverified; the click-gated\n * confirm page still works). 0 keeps spec/Keycloak parity: any expired hint.\n */\n protected isWithinHintGraceWindow(payload: OAuth2TokenPayload): boolean {\n if (this.hintGracePeriod <= 0) {\n return true;\n }\n\n // a bounded window without an exp claim to judge against fails closed\n if (typeof payload.exp !== 'number') {\n return false;\n }\n\n const nowSeconds = Math.floor(Date.now() / 1000);\n return nowSeconds - payload.exp <= this.hintGracePeriod;\n }\n\n /**\n * A post-logout redirect is honored only when it is an absolute http(s) URL\n * that matches a registered client redirect pattern (defense against open\n * redirects to attacker-controlled URLs).\n */\n protected isValidPostLogoutRedirect(\n registered: string | null | undefined,\n candidate: string,\n ): boolean {\n let parsed: URL;\n try {\n parsed = new URL(candidate);\n } catch {\n return false;\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return false;\n }\n\n if (!registered) {\n return false;\n }\n\n // isSimpleURLMatch, never isSimpleMatch: matched against the raw\n // string, a `*` in a registered pattern's host absorbs a `?`, `#` or\n // `\\`, which would turn this endpoint into a server-issued open\n // redirect carrying `state`.\n return isSimpleURLMatch(candidate, registered.split(','));\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * A realm provisioning entry declared with this name is a WILDCARD entry:
3
+ * its relations are ensured in every realm (existing at boot, new at
4
+ * creation) instead of declaring one specific realm. Literal only; partial
5
+ * patterns (`tenant-*`) are not supported.
6
+ */
7
+ export declare const REALM_WILDCARD_NAME = "*";
8
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/core/provisioning/constants.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAC"}
@@ -0,0 +1,14 @@
1
+ import "node:path";
2
+ import "node:url";
3
+ import.meta.url;
4
+ //#region src/core/provisioning/constants.ts
5
+ /**
6
+ * A realm provisioning entry declared with this name is a WILDCARD entry:
7
+ * its relations are ensured in every realm (existing at boot, new at
8
+ * creation) instead of declaring one specific realm. Literal only; partial
9
+ * patterns (`tenant-*`) are not supported.
10
+ */ const REALM_WILDCARD_NAME = "*";
11
+ //#endregion
12
+ export { REALM_WILDCARD_NAME };
13
+
14
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","names":["REALM_WILDCARD_NAME"],"sources":["../../../src/core/provisioning/constants.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n/**\n * A realm provisioning entry declared with this name is a WILDCARD entry:\n * its relations are ensured in every realm (existing at boot, new at\n * creation) instead of declaring one specific realm. Literal only; partial\n * patterns (`tenant-*`) are not supported.\n */\nexport const REALM_WILDCARD_NAME = '*';\n"],"mappings":";;;;;;;;;GAaA,MAAaA,sBAAsB"}
@@ -15,8 +15,9 @@ import { ScopeProvisioningValidator } from "./scope/validator.mjs";
15
15
  import "./scope/index.mjs";
16
16
  import { UserProvisioningValidator } from "./user/validator.mjs";
17
17
  import "./user/index.mjs";
18
+ import { RealmWildcardProvisioningValidator } from "./realm/wildcard-validator.mjs";
18
19
  import { RealmProvisioningValidator } from "./realm/validator.mjs";
19
20
  import "./realm/index.mjs";
20
21
  import { RootProvisioningValidator } from "./root/validator.mjs";
21
22
  import "./root/index.mjs";
22
- export { ClientProvisioningValidator, PermissionProvisioningRelationsValidator, PermissionProvisioningValidator, PolicyProvisioningValidator, RealmProvisioningValidator, RoleProvisioningValidator, RootProvisioningValidator, ScopeProvisioningValidator, UserProvisioningValidator, createProvisioningEntitiesValidator };
23
+ export { ClientProvisioningValidator, PermissionProvisioningRelationsValidator, PermissionProvisioningValidator, PolicyProvisioningValidator, RealmProvisioningValidator, RealmWildcardProvisioningValidator, RoleProvisioningValidator, RootProvisioningValidator, ScopeProvisioningValidator, UserProvisioningValidator, createProvisioningEntitiesValidator };
@@ -1,3 +1,4 @@
1
1
  export * from './types.ts';
2
2
  export * from './validator.ts';
3
+ export * from './wildcard-validator.ts';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/entities/realm/index.ts"],"names":[],"mappings":"AAOA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/entities/realm/index.ts"],"names":[],"mappings":"AAOA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
+ import { RealmWildcardProvisioningValidator } from "./wildcard-validator.mjs";
4
5
  import { RealmProvisioningValidator } from "./validator.mjs";
5
- export { RealmProvisioningValidator };
6
+ export { RealmProvisioningValidator, RealmWildcardProvisioningValidator };
@@ -1,6 +1,17 @@
1
+ import type { ContainerInput, ContainerRunOptions } from 'validup';
1
2
  import { Container } from 'validup';
3
+ import { RealmWildcardProvisioningValidator } from './wildcard-validator.ts';
2
4
  import type { RealmProvisioningEntity } from './types.ts';
3
5
  export declare class RealmProvisioningValidator extends Container<RealmProvisioningEntity> {
6
+ protected wildcardValidator: RealmWildcardProvisioningValidator;
4
7
  protected initialize(): void;
8
+ /**
9
+ * A realm entry named with the literal wildcard ('*') is a selector
10
+ * over all realms and follows its own, stricter contract — dispatch it
11
+ * to the wildcard validator. Anything else (including partial patterns
12
+ * like 'tenant-*') runs the regular realm validation, where a
13
+ * non-name-safe character fails the name check.
14
+ */
15
+ run(input?: ContainerInput<RealmProvisioningEntity>, options?: ContainerRunOptions<RealmProvisioningEntity>): Promise<RealmProvisioningEntity>;
5
16
  }
6
17
  //# sourceMappingURL=validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/entities/realm/validator.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,0BAA2B,SAAQ,SAAS,CAAC,uBAAuB,CAAC;IAC9E,SAAS,CAAC,UAAU;CAYvB"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/entities/realm/validator.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpC,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,0BAA2B,SAAQ,SAAS,CAAC,uBAAuB,CAAC;IAC9E,SAAS,CAAC,iBAAiB,qCAA4C;IAEvE,SAAS,CAAC,UAAU;IAapB;;;;;;OAMG;IACY,GAAG,CACd,KAAK,CAAC,EAAE,cAAc,CAAC,uBAAuB,CAAC,EAC/C,OAAO,CAAC,EAAE,mBAAmB,CAAC,uBAAuB,CAAC,GACvD,OAAO,CAAC,uBAAuB,CAAC;CAWtC"}
@@ -1,13 +1,17 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
+ import "../../constants.mjs";
4
5
  import { ProvisioningStrategyValidator } from "../../strategy/validator.mjs";
5
6
  import "../../strategy/index.mjs";
6
7
  import { RealmProvisioningRelationsValidator } from "./relations-validator.mjs";
8
+ import { RealmWildcardProvisioningValidator } from "./wildcard-validator.mjs";
9
+ import { isObject } from "@authup/kit";
7
10
  import { RealmValidator } from "@authup/core-kit";
8
11
  import { Container } from "validup";
9
12
  //#region src/core/provisioning/entities/realm/validator.ts
10
13
  var RealmProvisioningValidator = class extends Container {
14
+ wildcardValidator = new RealmWildcardProvisioningValidator();
11
15
  initialize() {
12
16
  super.initialize();
13
17
  const strategyValidator = new ProvisioningStrategyValidator();
@@ -17,6 +21,16 @@ var RealmProvisioningValidator = class extends Container {
17
21
  const relationsValidator = new RealmProvisioningRelationsValidator();
18
22
  this.mount("relations", { optional: true }, relationsValidator);
19
23
  }
24
+ /**
25
+ * A realm entry named with the literal wildcard ('*') is a selector
26
+ * over all realms and follows its own, stricter contract — dispatch it
27
+ * to the wildcard validator. Anything else (including partial patterns
28
+ * like 'tenant-*') runs the regular realm validation, where a
29
+ * non-name-safe character fails the name check.
30
+ */ async run(input, options) {
31
+ if (isObject(input) && isObject(input.attributes) && input.attributes.name === "*") return this.wildcardValidator.run(input, options);
32
+ return super.run(input, options);
33
+ }
20
34
  };
21
35
  //#endregion
22
36
  export { RealmProvisioningValidator };
@@ -1 +1 @@
1
- {"version":3,"file":"validator.mjs","names":["RealmValidator","Container","ProvisioningStrategyValidator","RealmProvisioningRelationsValidator","RealmProvisioningValidator","initialize","strategyValidator","mount","optional","attributesValidator","relationsValidator"],"sources":["../../../../../src/core/provisioning/entities/realm/validator.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RealmValidator } from '@authup/core-kit';\nimport { Container } from 'validup';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\nimport { RealmProvisioningRelationsValidator } from './relations-validator.ts';\n\nimport type { RealmProvisioningEntity } from './types.ts';\n\nexport class RealmProvisioningValidator extends Container<RealmProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const attributesValidator = new RealmValidator();\n this.mount('attributes', attributesValidator);\n\n const relationsValidator = new RealmProvisioningRelationsValidator();\n this.mount('relations', { optional: true }, relationsValidator);\n }\n}\n"],"mappings":";;;;;;;;;AAcA,IAAaI,6BAAb,cAAgDH,UAAAA;CAClCI,aAAa;EACnB,MAAMA,WAAAA;EAEN,MAAMC,oBAAoB,IAAIJ,8BAAAA;EAC9B,KAAKK,MAAM,YAAY,EAAEC,UAAU,KAAK,GAAGF,iBAAAA;EAE3C,MAAMG,sBAAsB,IAAIT,eAAAA;EAChC,KAAKO,MAAM,cAAcE,mBAAAA;EAEzB,MAAMC,qBAAqB,IAAIP,oCAAAA;EAC/B,KAAKI,MAAM,aAAa,EAAEC,UAAU,KAAK,GAAGE,kBAAAA;CAChD;AACJ"}
1
+ {"version":3,"file":"validator.mjs","names":["RealmValidator","isObject","Container","REALM_WILDCARD_NAME","ProvisioningStrategyValidator","RealmProvisioningRelationsValidator","RealmWildcardProvisioningValidator","RealmProvisioningValidator","wildcardValidator","initialize","strategyValidator","mount","optional","attributesValidator","relationsValidator","run","input","options","attributes","name"],"sources":["../../../../../src/core/provisioning/entities/realm/validator.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RealmValidator } from '@authup/core-kit';\nimport { isObject } from '@authup/kit';\nimport type { ContainerInput, ContainerRunOptions } from 'validup';\nimport { Container } from 'validup';\nimport { REALM_WILDCARD_NAME } from '../../constants.ts';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\nimport { RealmProvisioningRelationsValidator } from './relations-validator.ts';\nimport { RealmWildcardProvisioningValidator } from './wildcard-validator.ts';\n\nimport type { RealmProvisioningEntity } from './types.ts';\n\nexport class RealmProvisioningValidator extends Container<RealmProvisioningEntity> {\n protected wildcardValidator = new RealmWildcardProvisioningValidator();\n\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const attributesValidator = new RealmValidator();\n this.mount('attributes', attributesValidator);\n\n const relationsValidator = new RealmProvisioningRelationsValidator();\n this.mount('relations', { optional: true }, relationsValidator);\n }\n\n /**\n * A realm entry named with the literal wildcard ('*') is a selector\n * over all realms and follows its own, stricter contract — dispatch it\n * to the wildcard validator. Anything else (including partial patterns\n * like 'tenant-*') runs the regular realm validation, where a\n * non-name-safe character fails the name check.\n */\n override async run(\n input?: ContainerInput<RealmProvisioningEntity>,\n options?: ContainerRunOptions<RealmProvisioningEntity>,\n ): Promise<RealmProvisioningEntity> {\n if (\n isObject(input) &&\n isObject(input.attributes) &&\n input.attributes.name === REALM_WILDCARD_NAME\n ) {\n return this.wildcardValidator.run(input, options);\n }\n\n return super.run(input, options);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,IAAaO,6BAAb,cAAgDL,UAAAA;CAClCM,oBAAoB,IAAIF,mCAAAA;CAExBG,aAAa;EACnB,MAAMA,WAAAA;EAEN,MAAMC,oBAAoB,IAAIN,8BAAAA;EAC9B,KAAKO,MAAM,YAAY,EAAEC,UAAU,KAAK,GAAGF,iBAAAA;EAE3C,MAAMG,sBAAsB,IAAIb,eAAAA;EAChC,KAAKW,MAAM,cAAcE,mBAAAA;EAEzB,MAAMC,qBAAqB,IAAIT,oCAAAA;EAC/B,KAAKM,MAAM,aAAa,EAAEC,UAAU,KAAK,GAAGE,kBAAAA;CAChD;;;;;;;IASA,MAAeC,IACXC,OACAC,SACgC;EAChC,IACIhB,SAASe,KAAAA,KACTf,SAASe,MAAME,UAAU,KACzBF,MAAME,WAAWC,SAAAA,KAEjB,OAAO,KAAKX,kBAAkBO,IAAIC,OAAOC,OAAAA;EAG7C,OAAO,MAAMF,IAAIC,OAAOC,OAAAA;CAC5B;AACJ"}
@@ -0,0 +1,19 @@
1
+ import type { ContainerInput, ContainerRunOptions } from 'validup';
2
+ import { Container } from 'validup';
3
+ import type { RealmProvisioningEntity } from './types.ts';
4
+ /**
5
+ * Validates a WILDCARD realm entry (attributes.name === '*'). A wildcard
6
+ * entry is a selector over realms, not a realm declaration, so it is
7
+ * relations-only: `attributes` may carry nothing but the literal wildcard
8
+ * name, and a realm-level `strategy` is rejected (`absent` would mean
9
+ * "delete every realm"). Child strategies stay fully supported.
10
+ *
11
+ * Reserved client names (system / console clients) are rejected: a
12
+ * template stamping one into every realm would fight the system client
13
+ * MERGE on every boot.
14
+ */
15
+ export declare class RealmWildcardProvisioningValidator extends Container<RealmProvisioningEntity> {
16
+ protected initialize(): void;
17
+ run(input?: ContainerInput<RealmProvisioningEntity>, options?: ContainerRunOptions<RealmProvisioningEntity>): Promise<RealmProvisioningEntity>;
18
+ }
19
+ //# sourceMappingURL=wildcard-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wildcard-validator.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/entities/realm/wildcard-validator.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAS,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAiC,MAAM,SAAS,CAAC;AAInE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,qBAAa,kCAAmC,SAAQ,SAAS,CAAC,uBAAuB,CAAC;IACtF,SAAS,CAAC,UAAU;IA8BL,GAAG,CACd,KAAK,CAAC,EAAE,cAAc,CAAC,uBAAuB,CAAC,EAC/C,OAAO,CAAC,EAAE,mBAAmB,CAAC,uBAAuB,CAAC,GACvD,OAAO,CAAC,uBAAuB,CAAC;CAsBtC"}
@@ -0,0 +1,65 @@
1
+ import "node:path";
2
+ import "node:url";
3
+ import.meta.url;
4
+ import "../../constants.mjs";
5
+ import { RealmProvisioningRelationsValidator } from "./relations-validator.mjs";
6
+ import { CLIENT_RESERVED_NAMES } from "@authup/core-kit";
7
+ import { Container, ValidupError, defineIssueItem } from "validup";
8
+ import { createValidator } from "@validup/zod";
9
+ import { z } from "zod";
10
+ //#region src/core/provisioning/entities/realm/wildcard-validator.ts
11
+ /**
12
+ * Validates a WILDCARD realm entry (attributes.name === '*'). A wildcard
13
+ * entry is a selector over realms, not a realm declaration, so it is
14
+ * relations-only: `attributes` may carry nothing but the literal wildcard
15
+ * name, and a realm-level `strategy` is rejected (`absent` would mean
16
+ * "delete every realm"). Child strategies stay fully supported.
17
+ *
18
+ * Reserved client names (system / console clients) are rejected: a
19
+ * template stamping one into every realm would fight the system client
20
+ * MERGE on every boot.
21
+ */ var RealmWildcardProvisioningValidator = class extends Container {
22
+ initialize() {
23
+ super.initialize();
24
+ this.mount("attributes", createValidator(z.looseObject({ name: z.literal("*") }).check((ctx) => {
25
+ if (Object.keys(ctx.value).length > 1) ctx.issues.push({
26
+ code: "custom",
27
+ input: ctx.value,
28
+ message: "A wildcard realm entry is relations-only and can not declare realm attributes."
29
+ });
30
+ })));
31
+ this.mount("strategy", { optional: true }, createValidator(z.any().check((ctx) => {
32
+ ctx.issues.push({
33
+ code: "custom",
34
+ input: ctx.value,
35
+ message: "A wildcard realm entry can not declare a realm-level strategy."
36
+ });
37
+ })));
38
+ const relationsValidator = new RealmProvisioningRelationsValidator();
39
+ this.mount("relations", { optional: true }, relationsValidator);
40
+ }
41
+ async run(input, options) {
42
+ const output = await super.run(input, options);
43
+ const issues = [];
44
+ (output.relations?.clients ?? []).forEach((client, index) => {
45
+ const name = client.attributes?.name;
46
+ if (name && CLIENT_RESERVED_NAMES.includes(name)) issues.push(defineIssueItem({
47
+ path: [
48
+ "relations",
49
+ "clients",
50
+ index,
51
+ "attributes",
52
+ "name"
53
+ ],
54
+ message: `The client name "${name}" is reserved for system clients and can not be declared in a wildcard realm entry.`,
55
+ received: name
56
+ }));
57
+ });
58
+ if (issues.length > 0) throw new ValidupError(issues);
59
+ return output;
60
+ }
61
+ };
62
+ //#endregion
63
+ export { RealmWildcardProvisioningValidator };
64
+
65
+ //# sourceMappingURL=wildcard-validator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wildcard-validator.mjs","names":["CLIENT_RESERVED_NAMES","createValidator","Container","ValidupError","defineIssueItem","z","REALM_WILDCARD_NAME","RealmProvisioningRelationsValidator","RealmWildcardProvisioningValidator","initialize","mount","looseObject","name","literal","check","ctx","keys","Object","value","length","issues","push","code","input","message","optional","any","relationsValidator","run","options","output","clients","relations","forEach","client","index","attributes","includes","path","received"],"sources":["../../../../../src/core/provisioning/entities/realm/wildcard-validator.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { CLIENT_RESERVED_NAMES } from '@authup/core-kit';\nimport { createValidator } from '@validup/zod';\nimport type { ContainerInput, ContainerRunOptions, Issue } from 'validup';\nimport { Container, ValidupError, defineIssueItem } from 'validup';\nimport { z } from 'zod';\nimport { REALM_WILDCARD_NAME } from '../../constants.ts';\nimport { RealmProvisioningRelationsValidator } from './relations-validator.ts';\nimport type { RealmProvisioningEntity } from './types.ts';\n\n/**\n * Validates a WILDCARD realm entry (attributes.name === '*'). A wildcard\n * entry is a selector over realms, not a realm declaration, so it is\n * relations-only: `attributes` may carry nothing but the literal wildcard\n * name, and a realm-level `strategy` is rejected (`absent` would mean\n * \"delete every realm\"). Child strategies stay fully supported.\n *\n * Reserved client names (system / console clients) are rejected: a\n * template stamping one into every realm would fight the system client\n * MERGE on every boot.\n */\nexport class RealmWildcardProvisioningValidator extends Container<RealmProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n this.mount('attributes', createValidator(\n z.looseObject({ name: z.literal(REALM_WILDCARD_NAME) }).check((ctx) => {\n const keys = Object.keys(ctx.value);\n if (keys.length > 1) {\n ctx.issues.push({\n code: 'custom',\n input: ctx.value,\n message: 'A wildcard realm entry is relations-only and can not declare realm attributes.',\n });\n }\n }),\n ));\n\n this.mount('strategy', { optional: true }, createValidator(\n z.any().check((ctx) => {\n ctx.issues.push({\n code: 'custom',\n input: ctx.value,\n message: 'A wildcard realm entry can not declare a realm-level strategy.',\n });\n }),\n ));\n\n const relationsValidator = new RealmProvisioningRelationsValidator();\n this.mount('relations', { optional: true }, relationsValidator);\n }\n\n override async run(\n input?: ContainerInput<RealmProvisioningEntity>,\n options?: ContainerRunOptions<RealmProvisioningEntity>,\n ): Promise<RealmProvisioningEntity> {\n const output = await super.run(input, options);\n\n const issues : Issue[] = [];\n const clients = output.relations?.clients ?? [];\n clients.forEach((client, index) => {\n const name = client.attributes?.name;\n if (name && (CLIENT_RESERVED_NAMES as string[]).includes(name)) {\n issues.push(defineIssueItem({\n path: ['relations', 'clients', index, 'attributes', 'name'],\n message: `The client name \"${name}\" is reserved for system clients and can not be declared in a wildcard realm entry.`,\n received: name,\n }));\n }\n });\n\n if (issues.length > 0) {\n throw new ValidupError(issues);\n }\n\n return output;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;GA2BA,IAAaQ,qCAAb,cAAwDN,UAAAA;CAC1CO,aAAa;EACnB,MAAMA,WAAAA;EAEN,KAAKC,MAAM,cAAcT,gBACrBI,EAAEM,YAAY,EAAEC,MAAMP,EAAEQ,QAAAA,GAAQP,EAAqB,CAAA,CAAA,CAAGQ,OAAOC,QAAAA;GAE3D,IADaE,OAAOD,KAAKD,IAAIG,KACzBF,CAAAA,CAAKG,SAAS,GACdJ,IAAIK,OAAOC,KAAK;IACZC,MAAM;IACNC,OAAOR,IAAIG;IACXM,SAAS;GACb,CAAA;EAER,CAAA,CAAA,CAAA;EAGJ,KAAKd,MAAM,YAAY,EAAEe,UAAU,KAAK,GAAGxB,gBACvCI,EAAEqB,IAAG,CAAA,CAAGZ,OAAOC,QAAAA;GACXA,IAAIK,OAAOC,KAAK;IACZC,MAAM;IACNC,OAAOR,IAAIG;IACXM,SAAS;GACb,CAAA;EACJ,CAAA,CAAA,CAAA;EAGJ,MAAMG,qBAAqB,IAAIpB,oCAAAA;EAC/B,KAAKG,MAAM,aAAa,EAAEe,UAAU,KAAK,GAAGE,kBAAAA;CAChD;CAEA,MAAeC,IACXL,OACAM,SACgC;EAChC,MAAMC,SAAS,MAAM,MAAMF,IAAIL,OAAOM,OAAAA;EAEtC,MAAMT,SAAmB,CAAA;EAEzBW,CADgBD,OAAOE,WAAWD,WAAW,CAAA,EAAA,CACrCE,SAASC,QAAQC,UAAAA;GACrB,MAAMvB,OAAOsB,OAAOE,YAAYxB;GAChC,IAAIA,QAAQ,sBAAoCyB,SAASzB,IAAAA,GACrDQ,OAAOC,KAAKjB,gBAAgB;IACxBkC,MAAM;KAAC;KAAa;KAAWH;KAAO;KAAc;IAAO;IAC3DX,SAAS,oBAAoBZ,KAAK;IAClC2B,UAAU3B;GACd,CAAA,CAAA;EAER,CAAA;EAEA,IAAIQ,OAAOD,SAAS,GAChB,MAAM,IAAIhB,aAAaiB,MAAAA;EAG3B,OAAOU;CACX;AACJ"}
@@ -1,5 +1,8 @@
1
+ export * from './constants.ts';
1
2
  export * from './entities/index.ts';
3
+ export * from './merge/index.ts';
2
4
  export * from './strategy/index.ts';
3
5
  export * from './synchronizer/index.ts';
4
6
  export * from './types.ts';
7
+ export * from './wildcard/index.ts';
5
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/provisioning/index.ts"],"names":[],"mappings":"AAOA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/provisioning/index.ts"],"names":[],"mappings":"AAOA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
+ import { REALM_WILDCARD_NAME } from "./constants.mjs";
4
5
  import { ProvisioningEntityStrategyType } from "./strategy/constants.mjs";
5
6
  import { normalizeEntityProvisioningStrategy } from "./strategy/normalize.mjs";
6
7
  import { ProvisioningStrategyValidator } from "./strategy/validator.mjs";
@@ -13,9 +14,12 @@ import { ClientProvisioningValidator } from "./entities/client/validator.mjs";
13
14
  import { PolicyProvisioningValidator } from "./entities/policy/validator.mjs";
14
15
  import { ScopeProvisioningValidator } from "./entities/scope/validator.mjs";
15
16
  import { UserProvisioningValidator } from "./entities/user/validator.mjs";
17
+ import { RealmWildcardProvisioningValidator } from "./entities/realm/wildcard-validator.mjs";
16
18
  import { RealmProvisioningValidator } from "./entities/realm/validator.mjs";
17
19
  import { RootProvisioningValidator } from "./entities/root/validator.mjs";
18
20
  import "./entities/index.mjs";
21
+ import { buildProvisioningEntityKey, mergeProvisioningEntities, mergeProvisioningEntity } from "./merge/module.mjs";
22
+ import "./merge/index.mjs";
19
23
  import { ProvisioningEntityResolver } from "./synchronizer/entity-resolver.mjs";
20
24
  import { ProvisioningJunctionSynchronizer } from "./synchronizer/junction-synchronizer.mjs";
21
25
  import { ClientProvisioningSynchronizer } from "./synchronizer/client/module.mjs";
@@ -27,4 +31,6 @@ import { GraphProvisioningSynchronizer } from "./synchronizer/root/module.mjs";
27
31
  import { ScopeProvisioningSynchronizer } from "./synchronizer/scope/module.mjs";
28
32
  import { UserProvisioningSynchronizer } from "./synchronizer/user/module.mjs";
29
33
  import "./synchronizer/index.mjs";
30
- export { ClientProvisioningSynchronizer, ClientProvisioningValidator, GraphProvisioningSynchronizer, PermissionProvisioningRelationsValidator, PermissionProvisioningSynchronizer, PermissionProvisioningValidator, PolicyProvisioningSynchronizer, PolicyProvisioningValidator, ProvisioningEntityResolver, ProvisioningEntityStrategyType, ProvisioningJunctionSynchronizer, ProvisioningStrategyValidator, RealmProvisioningSynchronizer, RealmProvisioningValidator, RoleProvisioningSynchronizer, RoleProvisioningValidator, RootProvisioningValidator, ScopeProvisioningSynchronizer, ScopeProvisioningValidator, UserProvisioningSynchronizer, UserProvisioningValidator, createProvisioningEntitiesValidator, normalizeEntityProvisioningStrategy };
34
+ import { WildcardRealmProvisioner, expandWildcardRealmEntry, extractWildcardRealmEntry } from "./wildcard/module.mjs";
35
+ import "./wildcard/index.mjs";
36
+ export { ClientProvisioningSynchronizer, ClientProvisioningValidator, GraphProvisioningSynchronizer, PermissionProvisioningRelationsValidator, PermissionProvisioningSynchronizer, PermissionProvisioningValidator, PolicyProvisioningSynchronizer, PolicyProvisioningValidator, ProvisioningEntityResolver, ProvisioningEntityStrategyType, ProvisioningJunctionSynchronizer, ProvisioningStrategyValidator, REALM_WILDCARD_NAME, RealmProvisioningSynchronizer, RealmProvisioningValidator, RealmWildcardProvisioningValidator, RoleProvisioningSynchronizer, RoleProvisioningValidator, RootProvisioningValidator, ScopeProvisioningSynchronizer, ScopeProvisioningValidator, UserProvisioningSynchronizer, UserProvisioningValidator, WildcardRealmProvisioner, buildProvisioningEntityKey, createProvisioningEntitiesValidator, expandWildcardRealmEntry, extractWildcardRealmEntry, mergeProvisioningEntities, mergeProvisioningEntity, normalizeEntityProvisioningStrategy };
@@ -0,0 +1,3 @@
1
+ export * from './module.ts';
2
+ export * from './types.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/provisioning/merge/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "node:path";
2
+ import "node:url";
3
+ import.meta.url;
4
+ import { buildProvisioningEntityKey, mergeProvisioningEntities, mergeProvisioningEntity } from "./module.mjs";
5
+ export { buildProvisioningEntityKey, mergeProvisioningEntities, mergeProvisioningEntity };
@@ -0,0 +1,18 @@
1
+ import type { MergeProvisioningOptions, MergeableProvisioningEntity } from './types.ts';
2
+ export declare function buildProvisioningEntityKey(attributes: MergeableProvisioningEntity['attributes']): string | undefined;
3
+ export declare function mergeProvisioningEntities<T extends MergeableProvisioningEntity>(target: T[] | undefined, source: T[] | undefined, options?: MergeProvisioningOptions): T[] | undefined;
4
+ /**
5
+ * Deep-merge two entries sharing a composite key. The later (source) side
6
+ * wins per attribute, but relations are UNIONED — a later source (e.g. a
7
+ * mounted provisioning file) extending a built-in entry (the default
8
+ * source's master realm) must not silently drop the built-in relations
9
+ * (admin user, system client).
10
+ *
11
+ * Policy extraAttributes merge per key with the later source winning —
12
+ * like attributes, NOT like relations: an EA value (a names denylist,
13
+ * an ATTRIBUTES query tree) is policy configuration, and unioning would
14
+ * make shrinking a list impossible and fabricate predicates neither
15
+ * source authored.
16
+ */
17
+ export declare function mergeProvisioningEntity(target: MergeableProvisioningEntity, source: MergeableProvisioningEntity, options?: MergeProvisioningOptions): MergeableProvisioningEntity;
18
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/core/provisioning/merge/module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAExF,wBAAgB,0BAA0B,CACtC,UAAU,EAAE,2BAA2B,CAAC,YAAY,CAAC,GACtD,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,2BAA2B,EAC3E,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EACvB,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EACvB,OAAO,GAAE,wBAA6B,GACvC,CAAC,EAAE,GAAG,SAAS,CAoBjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,2BAA2B,EACnC,MAAM,EAAE,2BAA2B,EACnC,OAAO,GAAE,wBAA6B,GACvC,2BAA2B,CAiC7B"}