@authup/server-core 1.0.0-beta.53 → 1.0.0-beta.55

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 (1255) hide show
  1. package/dist/adapters/database/data-source/options/module.d.ts.map +1 -1
  2. package/dist/adapters/database/data-source/options/module.mjs +0 -13
  3. package/dist/adapters/database/data-source/options/module.mjs.map +1 -1
  4. package/dist/adapters/database/domains/client/entity.d.ts +16 -16
  5. package/dist/adapters/database/domains/client/entity.d.ts.map +1 -1
  6. package/dist/adapters/database/domains/client/entity.mjs +54 -36
  7. package/dist/adapters/database/domains/client/entity.mjs.map +1 -1
  8. package/dist/adapters/database/domains/client/subscriber.mjs +3 -3
  9. package/dist/adapters/database/domains/client/subscriber.mjs.map +1 -1
  10. package/dist/adapters/database/domains/client-permission/entity.d.ts +10 -10
  11. package/dist/adapters/database/domains/client-permission/entity.d.ts.map +1 -1
  12. package/dist/adapters/database/domains/client-permission/entity.mjs +42 -23
  13. package/dist/adapters/database/domains/client-permission/entity.mjs.map +1 -1
  14. package/dist/adapters/database/domains/client-permission/subscriber.mjs +4 -4
  15. package/dist/adapters/database/domains/client-permission/subscriber.mjs.map +1 -1
  16. package/dist/adapters/database/domains/client-role/entity.d.ts +8 -8
  17. package/dist/adapters/database/domains/client-role/entity.d.ts.map +1 -1
  18. package/dist/adapters/database/domains/client-role/entity.mjs +31 -19
  19. package/dist/adapters/database/domains/client-role/entity.mjs.map +1 -1
  20. package/dist/adapters/database/domains/client-role/subscriber.mjs +4 -4
  21. package/dist/adapters/database/domains/client-role/subscriber.mjs.map +1 -1
  22. package/dist/adapters/database/domains/client-scope/entity.d.ts +8 -8
  23. package/dist/adapters/database/domains/client-scope/entity.d.ts.map +1 -1
  24. package/dist/adapters/database/domains/client-scope/entity.mjs +31 -19
  25. package/dist/adapters/database/domains/client-scope/entity.mjs.map +1 -1
  26. package/dist/adapters/database/domains/client-scope/subscriber.mjs +2 -2
  27. package/dist/adapters/database/domains/client-scope/subscriber.mjs.map +1 -1
  28. package/dist/adapters/database/domains/consent/entity.d.ts +7 -7
  29. package/dist/adapters/database/domains/consent/entity.d.ts.map +1 -1
  30. package/dist/adapters/database/domains/consent/entity.mjs +35 -20
  31. package/dist/adapters/database/domains/consent/entity.mjs.map +1 -1
  32. package/dist/adapters/database/domains/consent/subscriber.mjs +4 -4
  33. package/dist/adapters/database/domains/consent/subscriber.mjs.map +1 -1
  34. package/dist/adapters/database/domains/constants.d.ts +0 -3
  35. package/dist/adapters/database/domains/constants.d.ts.map +1 -1
  36. package/dist/adapters/database/domains/constants.mjs +0 -3
  37. package/dist/adapters/database/domains/constants.mjs.map +1 -1
  38. package/dist/adapters/database/domains/event/entity.d.ts +13 -13
  39. package/dist/adapters/database/domains/event/entity.d.ts.map +1 -1
  40. package/dist/adapters/database/domains/event/entity.mjs +45 -30
  41. package/dist/adapters/database/domains/event/entity.mjs.map +1 -1
  42. package/dist/adapters/database/domains/identity-provider/entity.d.ts +4 -4
  43. package/dist/adapters/database/domains/identity-provider/entity.d.ts.map +1 -1
  44. package/dist/adapters/database/domains/identity-provider/entity.mjs +19 -12
  45. package/dist/adapters/database/domains/identity-provider/entity.mjs.map +1 -1
  46. package/dist/adapters/database/domains/identity-provider/repository.mjs +3 -3
  47. package/dist/adapters/database/domains/identity-provider/repository.mjs.map +1 -1
  48. package/dist/adapters/database/domains/identity-provider/subscriber.mjs +3 -3
  49. package/dist/adapters/database/domains/identity-provider/subscriber.mjs.map +1 -1
  50. package/dist/adapters/database/domains/identity-provider-account/entity.d.ts +15 -15
  51. package/dist/adapters/database/domains/identity-provider-account/entity.d.ts.map +1 -1
  52. package/dist/adapters/database/domains/identity-provider-account/entity.mjs +52 -33
  53. package/dist/adapters/database/domains/identity-provider-account/entity.mjs.map +1 -1
  54. package/dist/adapters/database/domains/identity-provider-account/subscriber.mjs +2 -2
  55. package/dist/adapters/database/domains/identity-provider-account/subscriber.mjs.map +1 -1
  56. package/dist/adapters/database/domains/identity-provider-attribute/entity.d.ts +4 -4
  57. package/dist/adapters/database/domains/identity-provider-attribute/entity.d.ts.map +1 -1
  58. package/dist/adapters/database/domains/identity-provider-attribute/entity.mjs +20 -11
  59. package/dist/adapters/database/domains/identity-provider-attribute/entity.mjs.map +1 -1
  60. package/dist/adapters/database/domains/identity-provider-attribute/subscriber.mjs +2 -2
  61. package/dist/adapters/database/domains/identity-provider-attribute/subscriber.mjs.map +1 -1
  62. package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.d.ts +9 -9
  63. package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.d.ts.map +1 -1
  64. package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.mjs +31 -21
  65. package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.mjs.map +1 -1
  66. package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.d.ts +10 -10
  67. package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.d.ts.map +1 -1
  68. package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.mjs +34 -23
  69. package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.mjs.map +1 -1
  70. package/dist/adapters/database/domains/identity-provider-role-mapping/entity.d.ts +10 -10
  71. package/dist/adapters/database/domains/identity-provider-role-mapping/entity.d.ts.map +1 -1
  72. package/dist/adapters/database/domains/identity-provider-role-mapping/entity.mjs +34 -23
  73. package/dist/adapters/database/domains/identity-provider-role-mapping/entity.mjs.map +1 -1
  74. package/dist/adapters/database/domains/identity-provider-role-mapping/subscriber.mjs +3 -3
  75. package/dist/adapters/database/domains/identity-provider-role-mapping/subscriber.mjs.map +1 -1
  76. package/dist/adapters/database/domains/index.d.ts +0 -3
  77. package/dist/adapters/database/domains/index.d.ts.map +1 -1
  78. package/dist/adapters/database/domains/index.mjs +1 -10
  79. package/dist/adapters/database/domains/key/entity.d.ts +6 -6
  80. package/dist/adapters/database/domains/key/entity.d.ts.map +1 -1
  81. package/dist/adapters/database/domains/key/entity.mjs +26 -16
  82. package/dist/adapters/database/domains/key/entity.mjs.map +1 -1
  83. package/dist/adapters/database/domains/permission/entity.d.ts +7 -7
  84. package/dist/adapters/database/domains/permission/entity.d.ts.map +1 -1
  85. package/dist/adapters/database/domains/permission/entity.mjs +35 -20
  86. package/dist/adapters/database/domains/permission/entity.mjs.map +1 -1
  87. package/dist/adapters/database/domains/permission/subscriber.mjs +4 -4
  88. package/dist/adapters/database/domains/permission/subscriber.mjs.map +1 -1
  89. package/dist/adapters/database/domains/permission-policy/entity.d.ts +8 -8
  90. package/dist/adapters/database/domains/permission-policy/entity.d.ts.map +1 -1
  91. package/dist/adapters/database/domains/permission-policy/entity.mjs +31 -19
  92. package/dist/adapters/database/domains/permission-policy/entity.mjs.map +1 -1
  93. package/dist/adapters/database/domains/policy/entity.d.ts +6 -6
  94. package/dist/adapters/database/domains/policy/entity.d.ts.map +1 -1
  95. package/dist/adapters/database/domains/policy/entity.mjs +30 -16
  96. package/dist/adapters/database/domains/policy/entity.mjs.map +1 -1
  97. package/dist/adapters/database/domains/policy/repository.mjs +3 -3
  98. package/dist/adapters/database/domains/policy/repository.mjs.map +1 -1
  99. package/dist/adapters/database/domains/policy/subscriber.mjs +2 -2
  100. package/dist/adapters/database/domains/policy/subscriber.mjs.map +1 -1
  101. package/dist/adapters/database/domains/policy-attribute/entity.d.ts +4 -4
  102. package/dist/adapters/database/domains/policy-attribute/entity.d.ts.map +1 -1
  103. package/dist/adapters/database/domains/policy-attribute/entity.mjs +20 -11
  104. package/dist/adapters/database/domains/policy-attribute/entity.mjs.map +1 -1
  105. package/dist/adapters/database/domains/policy-attribute/subscriber.mjs +4 -4
  106. package/dist/adapters/database/domains/policy-attribute/subscriber.mjs.map +1 -1
  107. package/dist/adapters/database/domains/realm/entity.d.ts +4 -4
  108. package/dist/adapters/database/domains/realm/entity.d.ts.map +1 -1
  109. package/dist/adapters/database/domains/realm/entity.mjs +18 -10
  110. package/dist/adapters/database/domains/realm/entity.mjs.map +1 -1
  111. package/dist/adapters/database/domains/realm/subscriber.mjs +2 -2
  112. package/dist/adapters/database/domains/realm/subscriber.mjs.map +1 -1
  113. package/dist/adapters/database/domains/role/entity.d.ts +6 -6
  114. package/dist/adapters/database/domains/role/entity.d.ts.map +1 -1
  115. package/dist/adapters/database/domains/role/entity.mjs +32 -18
  116. package/dist/adapters/database/domains/role/entity.mjs.map +1 -1
  117. package/dist/adapters/database/domains/role/repository.mjs +3 -3
  118. package/dist/adapters/database/domains/role/repository.mjs.map +1 -1
  119. package/dist/adapters/database/domains/role/subscriber.mjs +3 -3
  120. package/dist/adapters/database/domains/role/subscriber.mjs.map +1 -1
  121. package/dist/adapters/database/domains/role-attribute/entity.d.ts +4 -4
  122. package/dist/adapters/database/domains/role-attribute/entity.d.ts.map +1 -1
  123. package/dist/adapters/database/domains/role-attribute/entity.mjs +20 -11
  124. package/dist/adapters/database/domains/role-attribute/entity.mjs.map +1 -1
  125. package/dist/adapters/database/domains/role-attribute/subscriber.mjs +4 -4
  126. package/dist/adapters/database/domains/role-attribute/subscriber.mjs.map +1 -1
  127. package/dist/adapters/database/domains/role-permission/entity.d.ts +10 -10
  128. package/dist/adapters/database/domains/role-permission/entity.d.ts.map +1 -1
  129. package/dist/adapters/database/domains/role-permission/entity.mjs +39 -23
  130. package/dist/adapters/database/domains/role-permission/entity.mjs.map +1 -1
  131. package/dist/adapters/database/domains/role-permission/subscriber.mjs +4 -4
  132. package/dist/adapters/database/domains/role-permission/subscriber.mjs.map +1 -1
  133. package/dist/adapters/database/domains/scope/entity.d.ts +5 -5
  134. package/dist/adapters/database/domains/scope/entity.d.ts.map +1 -1
  135. package/dist/adapters/database/domains/scope/entity.mjs +25 -14
  136. package/dist/adapters/database/domains/scope/entity.mjs.map +1 -1
  137. package/dist/adapters/database/domains/scope/subscriber.mjs +3 -3
  138. package/dist/adapters/database/domains/scope/subscriber.mjs.map +1 -1
  139. package/dist/adapters/database/domains/session/entity.d.ts +14 -17
  140. package/dist/adapters/database/domains/session/entity.d.ts.map +1 -1
  141. package/dist/adapters/database/domains/session/entity.mjs +44 -44
  142. package/dist/adapters/database/domains/session/entity.mjs.map +1 -1
  143. package/dist/adapters/database/domains/session-token/entity.d.ts +9 -9
  144. package/dist/adapters/database/domains/session-token/entity.d.ts.map +1 -1
  145. package/dist/adapters/database/domains/session-token/entity.mjs +34 -21
  146. package/dist/adapters/database/domains/session-token/entity.mjs.map +1 -1
  147. package/dist/adapters/database/domains/trust-anchor/entity.d.ts +3 -3
  148. package/dist/adapters/database/domains/trust-anchor/entity.d.ts.map +1 -1
  149. package/dist/adapters/database/domains/trust-anchor/entity.mjs +16 -10
  150. package/dist/adapters/database/domains/trust-anchor/entity.mjs.map +1 -1
  151. package/dist/adapters/database/domains/user/entity.d.ts +12 -12
  152. package/dist/adapters/database/domains/user/entity.d.ts.map +1 -1
  153. package/dist/adapters/database/domains/user/entity.mjs +44 -29
  154. package/dist/adapters/database/domains/user/entity.mjs.map +1 -1
  155. package/dist/adapters/database/domains/user/repository.mjs +3 -3
  156. package/dist/adapters/database/domains/user/repository.mjs.map +1 -1
  157. package/dist/adapters/database/domains/user/subscriber.mjs +3 -3
  158. package/dist/adapters/database/domains/user/subscriber.mjs.map +1 -1
  159. package/dist/adapters/database/domains/user-attribute/entity.d.ts +4 -4
  160. package/dist/adapters/database/domains/user-attribute/entity.d.ts.map +1 -1
  161. package/dist/adapters/database/domains/user-attribute/entity.mjs +17 -11
  162. package/dist/adapters/database/domains/user-attribute/entity.mjs.map +1 -1
  163. package/dist/adapters/database/domains/user-attribute/subscriber.mjs +4 -4
  164. package/dist/adapters/database/domains/user-attribute/subscriber.mjs.map +1 -1
  165. package/dist/adapters/database/domains/user-authenticator/entity.d.ts +5 -5
  166. package/dist/adapters/database/domains/user-authenticator/entity.d.ts.map +1 -1
  167. package/dist/adapters/database/domains/user-authenticator/entity.mjs +26 -13
  168. package/dist/adapters/database/domains/user-authenticator/entity.mjs.map +1 -1
  169. package/dist/adapters/database/domains/user-permission/entity.d.ts +10 -10
  170. package/dist/adapters/database/domains/user-permission/entity.d.ts.map +1 -1
  171. package/dist/adapters/database/domains/user-permission/entity.mjs +39 -23
  172. package/dist/adapters/database/domains/user-permission/entity.mjs.map +1 -1
  173. package/dist/adapters/database/domains/user-permission/subscriber.mjs +4 -4
  174. package/dist/adapters/database/domains/user-permission/subscriber.mjs.map +1 -1
  175. package/dist/adapters/database/domains/user-role/entity.d.ts +8 -8
  176. package/dist/adapters/database/domains/user-role/entity.d.ts.map +1 -1
  177. package/dist/adapters/database/domains/user-role/entity.mjs +31 -19
  178. package/dist/adapters/database/domains/user-role/entity.mjs.map +1 -1
  179. package/dist/adapters/database/domains/user-role/subscriber.mjs +4 -4
  180. package/dist/adapters/database/domains/user-role/subscriber.mjs.map +1 -1
  181. package/dist/adapters/database/errors/driver.mjs.map +1 -1
  182. package/dist/adapters/database/extra-attribute-repository/adapter.mjs.map +1 -1
  183. package/dist/adapters/database/extra-attribute-repository/tree/adapter.mjs.map +1 -1
  184. package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs.map +1 -1
  185. package/dist/adapters/database/helpers/is-supported.mjs +1 -1
  186. package/dist/adapters/database/helpers/is-supported.mjs.map +1 -1
  187. package/dist/adapters/database/index.mjs +1 -7
  188. package/dist/adapters/database/migrations/mysql/1779267068441-Default.mjs.map +1 -1
  189. package/dist/adapters/database/migrations/mysql/1779300000000-Default.mjs.map +1 -1
  190. package/dist/adapters/database/migrations/mysql/1784289540000-CamelCaseAttributes.d.ts +12 -0
  191. package/dist/adapters/database/migrations/mysql/1784289540000-CamelCaseAttributes.d.ts.map +1 -0
  192. package/dist/adapters/database/migrations/mysql/1784289540000-CamelCaseAttributes.mjs +42 -0
  193. package/dist/adapters/database/migrations/mysql/1784289540000-CamelCaseAttributes.mjs.map +1 -0
  194. package/dist/adapters/database/migrations/mysql/1784460916000-RemoveRobots.d.ts +18 -0
  195. package/dist/adapters/database/migrations/mysql/1784460916000-RemoveRobots.d.ts.map +1 -0
  196. package/dist/adapters/database/migrations/mysql/1784460916000-RemoveRobots.mjs +161 -0
  197. package/dist/adapters/database/migrations/mysql/1784460916000-RemoveRobots.mjs.map +1 -0
  198. package/dist/adapters/database/migrations/postgres/1779267068441-Default.mjs.map +1 -1
  199. package/dist/adapters/database/migrations/postgres/1779300000000-Default.mjs.map +1 -1
  200. package/dist/adapters/database/migrations/postgres/1784289540000-CamelCaseAttributes.d.ts +12 -0
  201. package/dist/adapters/database/migrations/postgres/1784289540000-CamelCaseAttributes.d.ts.map +1 -0
  202. package/dist/adapters/database/migrations/postgres/1784289540000-CamelCaseAttributes.mjs +42 -0
  203. package/dist/adapters/database/migrations/postgres/1784289540000-CamelCaseAttributes.mjs.map +1 -0
  204. package/dist/adapters/database/migrations/postgres/1784460916000-RemoveRobots.d.ts +18 -0
  205. package/dist/adapters/database/migrations/postgres/1784460916000-RemoveRobots.d.ts.map +1 -0
  206. package/dist/adapters/database/migrations/postgres/1784460916000-RemoveRobots.mjs +167 -0
  207. package/dist/adapters/database/migrations/postgres/1784460916000-RemoveRobots.mjs.map +1 -0
  208. package/dist/adapters/database/subscriber/module.mjs.map +1 -1
  209. package/dist/adapters/http/adapters/index.mjs +1 -2
  210. package/dist/adapters/http/adapters/oauth2/authorization/module.mjs +2 -2
  211. package/dist/adapters/http/adapters/oauth2/authorization/module.mjs.map +1 -1
  212. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs +3 -3
  213. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs.map +1 -1
  214. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs +1 -1
  215. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs.map +1 -1
  216. package/dist/adapters/http/adapters/oauth2/grant-types/index.d.ts +0 -1
  217. package/dist/adapters/http/adapters/oauth2/grant-types/index.d.ts.map +1 -1
  218. package/dist/adapters/http/adapters/oauth2/grant-types/index.mjs +1 -2
  219. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +1 -1
  220. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
  221. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs +1 -1
  222. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs.map +1 -1
  223. package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts +1 -4
  224. package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts.map +1 -1
  225. package/dist/adapters/http/adapters/oauth2/grant-types/utils/guess.d.ts.map +1 -1
  226. package/dist/adapters/http/adapters/oauth2/grant-types/utils/guess.mjs +0 -3
  227. package/dist/adapters/http/adapters/oauth2/grant-types/utils/guess.mjs.map +1 -1
  228. package/dist/adapters/http/adapters/oauth2/grant-types/utils/realm.mjs.map +1 -1
  229. package/dist/adapters/http/adapters/oauth2/index.mjs +1 -2
  230. package/dist/adapters/http/controllers/entities/client/module.mjs +2 -2
  231. package/dist/adapters/http/controllers/entities/client/module.mjs.map +1 -1
  232. package/dist/adapters/http/controllers/entities/client-permission/module.mjs +2 -2
  233. package/dist/adapters/http/controllers/entities/client-permission/module.mjs.map +1 -1
  234. package/dist/adapters/http/controllers/entities/client-permission/utils/validation.mjs +3 -3
  235. package/dist/adapters/http/controllers/entities/client-permission/utils/validation.mjs.map +1 -1
  236. package/dist/adapters/http/controllers/entities/client-role/module.mjs +2 -2
  237. package/dist/adapters/http/controllers/entities/client-role/module.mjs.map +1 -1
  238. package/dist/adapters/http/controllers/entities/client-role/utils/validation.mjs +2 -2
  239. package/dist/adapters/http/controllers/entities/client-role/utils/validation.mjs.map +1 -1
  240. package/dist/adapters/http/controllers/entities/client-scope/module.mjs +2 -2
  241. package/dist/adapters/http/controllers/entities/client-scope/module.mjs.map +1 -1
  242. package/dist/adapters/http/controllers/entities/client-scope/utils/validator.mjs +2 -2
  243. package/dist/adapters/http/controllers/entities/client-scope/utils/validator.mjs.map +1 -1
  244. package/dist/adapters/http/controllers/entities/consent/module.mjs +2 -2
  245. package/dist/adapters/http/controllers/entities/consent/module.mjs.map +1 -1
  246. package/dist/adapters/http/controllers/entities/event/module.mjs +2 -2
  247. package/dist/adapters/http/controllers/entities/event/module.mjs.map +1 -1
  248. package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs +2 -2
  249. package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs.map +1 -1
  250. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
  251. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +21 -15
  252. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
  253. package/dist/adapters/http/controllers/entities/index.d.ts +0 -3
  254. package/dist/adapters/http/controllers/entities/index.d.ts.map +1 -1
  255. package/dist/adapters/http/controllers/entities/index.mjs +1 -9
  256. package/dist/adapters/http/controllers/entities/key/module.d.ts.map +1 -1
  257. package/dist/adapters/http/controllers/entities/key/module.mjs +3 -9
  258. package/dist/adapters/http/controllers/entities/key/module.mjs.map +1 -1
  259. package/dist/adapters/http/controllers/entities/permission/module.mjs +2 -2
  260. package/dist/adapters/http/controllers/entities/permission/module.mjs.map +1 -1
  261. package/dist/adapters/http/controllers/entities/permission-policy/module.mjs +2 -2
  262. package/dist/adapters/http/controllers/entities/permission-policy/module.mjs.map +1 -1
  263. package/dist/adapters/http/controllers/entities/policy/module.mjs +2 -2
  264. package/dist/adapters/http/controllers/entities/policy/module.mjs.map +1 -1
  265. package/dist/adapters/http/controllers/entities/policy/utils/validation.d.ts +1 -1
  266. package/dist/adapters/http/controllers/entities/policy/utils/validation.d.ts.map +1 -1
  267. package/dist/adapters/http/controllers/entities/policy/utils/validation.mjs +3 -3
  268. package/dist/adapters/http/controllers/entities/policy/utils/validation.mjs.map +1 -1
  269. package/dist/adapters/http/controllers/entities/realm/module.mjs +2 -2
  270. package/dist/adapters/http/controllers/entities/realm/module.mjs.map +1 -1
  271. package/dist/adapters/http/controllers/entities/role/module.mjs +2 -2
  272. package/dist/adapters/http/controllers/entities/role/module.mjs.map +1 -1
  273. package/dist/adapters/http/controllers/entities/role-attribute/module.mjs +2 -2
  274. package/dist/adapters/http/controllers/entities/role-attribute/module.mjs.map +1 -1
  275. package/dist/adapters/http/controllers/entities/role-attribute/utils/validation.mjs +1 -1
  276. package/dist/adapters/http/controllers/entities/role-attribute/utils/validation.mjs.map +1 -1
  277. package/dist/adapters/http/controllers/entities/role-permission/module.mjs +2 -2
  278. package/dist/adapters/http/controllers/entities/role-permission/module.mjs.map +1 -1
  279. package/dist/adapters/http/controllers/entities/role-permission/utils/validation.mjs +3 -3
  280. package/dist/adapters/http/controllers/entities/role-permission/utils/validation.mjs.map +1 -1
  281. package/dist/adapters/http/controllers/entities/scope/module.mjs +2 -2
  282. package/dist/adapters/http/controllers/entities/scope/module.mjs.map +1 -1
  283. package/dist/adapters/http/controllers/entities/session/module.mjs +2 -2
  284. package/dist/adapters/http/controllers/entities/session/module.mjs.map +1 -1
  285. package/dist/adapters/http/controllers/entities/trust-anchor/module.d.ts.map +1 -1
  286. package/dist/adapters/http/controllers/entities/trust-anchor/module.mjs +3 -9
  287. package/dist/adapters/http/controllers/entities/trust-anchor/module.mjs.map +1 -1
  288. package/dist/adapters/http/controllers/entities/user/module.mjs +2 -2
  289. package/dist/adapters/http/controllers/entities/user/module.mjs.map +1 -1
  290. package/dist/adapters/http/controllers/entities/user-attribute/module.mjs +2 -2
  291. package/dist/adapters/http/controllers/entities/user-attribute/module.mjs.map +1 -1
  292. package/dist/adapters/http/controllers/entities/user-attribute/utils/validation.mjs +1 -1
  293. package/dist/adapters/http/controllers/entities/user-attribute/utils/validation.mjs.map +1 -1
  294. package/dist/adapters/http/controllers/entities/user-authenticator/module.mjs +3 -3
  295. package/dist/adapters/http/controllers/entities/user-authenticator/module.mjs.map +1 -1
  296. package/dist/adapters/http/controllers/entities/user-permission/module.mjs +2 -2
  297. package/dist/adapters/http/controllers/entities/user-permission/module.mjs.map +1 -1
  298. package/dist/adapters/http/controllers/entities/user-permission/utils/validation.mjs +3 -3
  299. package/dist/adapters/http/controllers/entities/user-permission/utils/validation.mjs.map +1 -1
  300. package/dist/adapters/http/controllers/entities/user-role/module.mjs +2 -2
  301. package/dist/adapters/http/controllers/entities/user-role/module.mjs.map +1 -1
  302. package/dist/adapters/http/controllers/entities/user-role/utils/validation.mjs +2 -2
  303. package/dist/adapters/http/controllers/entities/user-role/utils/validation.mjs.map +1 -1
  304. package/dist/adapters/http/controllers/index.mjs +1 -6
  305. package/dist/adapters/http/controllers/workflows/activate/module.mjs +2 -2
  306. package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs +2 -2
  307. package/dist/adapters/http/controllers/workflows/authorize/module.mjs +6 -6
  308. package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
  309. package/dist/adapters/http/controllers/workflows/jwks/handlers/read.mjs +10 -10
  310. package/dist/adapters/http/controllers/workflows/jwks/handlers/read.mjs.map +1 -1
  311. package/dist/adapters/http/controllers/workflows/jwks/module.mjs +11 -11
  312. package/dist/adapters/http/controllers/workflows/jwks/module.mjs.map +1 -1
  313. package/dist/adapters/http/controllers/workflows/logout/module.mjs +2 -2
  314. package/dist/adapters/http/controllers/workflows/logout/module.mjs.map +1 -1
  315. package/dist/adapters/http/controllers/workflows/openid/module.mjs +2 -2
  316. package/dist/adapters/http/controllers/workflows/password-forgot/module.mjs +2 -2
  317. package/dist/adapters/http/controllers/workflows/password-reset/module.mjs +2 -2
  318. package/dist/adapters/http/controllers/workflows/register/module.mjs +2 -2
  319. package/dist/adapters/http/controllers/workflows/status/module.mjs +4 -4
  320. package/dist/adapters/http/controllers/workflows/status/module.mjs.map +1 -1
  321. package/dist/adapters/http/controllers/workflows/token/module.d.ts.map +1 -1
  322. package/dist/adapters/http/controllers/workflows/token/module.mjs +4 -10
  323. package/dist/adapters/http/controllers/workflows/token/module.mjs.map +1 -1
  324. package/dist/adapters/http/controllers/workflows/token/types.d.ts +1 -2
  325. package/dist/adapters/http/controllers/workflows/token/types.d.ts.map +1 -1
  326. package/dist/adapters/http/controllers/workflows/token/utils/extract.mjs.map +1 -1
  327. package/dist/adapters/http/index.mjs +1 -7
  328. package/dist/adapters/http/middleware/built-in/assets.mjs +2 -2
  329. package/dist/adapters/http/middleware/built-in/assets.mjs.map +1 -1
  330. package/dist/adapters/http/middleware/built-in/authorization/module.d.ts +1 -2
  331. package/dist/adapters/http/middleware/built-in/authorization/module.d.ts.map +1 -1
  332. package/dist/adapters/http/middleware/built-in/authorization/module.mjs +1 -15
  333. package/dist/adapters/http/middleware/built-in/authorization/module.mjs.map +1 -1
  334. package/dist/adapters/http/middleware/built-in/authorization/types.d.ts +0 -1
  335. package/dist/adapters/http/middleware/built-in/authorization/types.d.ts.map +1 -1
  336. package/dist/adapters/http/middleware/built-in/cors.mjs.map +1 -1
  337. package/dist/adapters/http/middleware/built-in/logger.mjs.map +1 -1
  338. package/dist/adapters/http/middleware/built-in/rate-limit.d.ts.map +1 -1
  339. package/dist/adapters/http/middleware/built-in/rate-limit.mjs +0 -1
  340. package/dist/adapters/http/middleware/built-in/rate-limit.mjs.map +1 -1
  341. package/dist/adapters/http/request/client-certificate.d.ts +1 -0
  342. package/dist/adapters/http/request/client-certificate.d.ts.map +1 -1
  343. package/dist/adapters/http/request/client-certificate.mjs +1 -0
  344. package/dist/adapters/http/request/client-certificate.mjs.map +1 -1
  345. package/dist/adapters/http/request/constants.mjs.map +1 -1
  346. package/dist/adapters/http/request/helpers/body-realm-id.mjs +1 -1
  347. package/dist/adapters/http/request/helpers/body-realm-id.mjs.map +1 -1
  348. package/dist/adapters/http/request/helpers/identity.d.ts +2 -2
  349. package/dist/adapters/http/request/helpers/identity.d.ts.map +1 -1
  350. package/dist/adapters/http/request/helpers/identity.mjs +2 -2
  351. package/dist/adapters/http/request/helpers/identity.mjs.map +1 -1
  352. package/dist/adapters/http/request/helpers/param-id.mjs.map +1 -1
  353. package/dist/adapters/http/request/helpers/realm-id.mjs +1 -1
  354. package/dist/adapters/http/request/helpers/realm-id.mjs.map +1 -1
  355. package/dist/adapters/http/request/helpers/redirect.mjs.map +1 -1
  356. package/dist/adapters/http/request/permission/module.d.ts +3 -2
  357. package/dist/adapters/http/request/permission/module.d.ts.map +1 -1
  358. package/dist/adapters/http/request/permission/module.mjs +3 -0
  359. package/dist/adapters/http/request/permission/module.mjs.map +1 -1
  360. package/dist/adapters/http/ui/render.mjs +2 -2
  361. package/dist/adapters/http/ui/render.mjs.map +1 -1
  362. package/dist/adapters/http/ui/serve.d.ts.map +1 -1
  363. package/dist/adapters/http/ui/serve.mjs +4 -1
  364. package/dist/adapters/http/ui/serve.mjs.map +1 -1
  365. package/dist/app/factory.mjs.map +1 -1
  366. package/dist/app/index.mjs +1 -5
  367. package/dist/app/modules/authentication/module.mjs.map +1 -1
  368. package/dist/app/modules/authentication/repositories/constants.mjs.map +1 -1
  369. package/dist/app/modules/authentication/repositories/session.d.ts +3 -2
  370. package/dist/app/modules/authentication/repositories/session.d.ts.map +1 -1
  371. package/dist/app/modules/authentication/repositories/session.mjs +8 -40
  372. package/dist/app/modules/authentication/repositories/session.mjs.map +1 -1
  373. package/dist/app/modules/cache/module.mjs.map +1 -1
  374. package/dist/app/modules/components/module.mjs.map +1 -1
  375. package/dist/app/modules/config/constants.d.ts +0 -4
  376. package/dist/app/modules/config/constants.d.ts.map +1 -1
  377. package/dist/app/modules/config/constants.mjs +0 -4
  378. package/dist/app/modules/config/constants.mjs.map +1 -1
  379. package/dist/app/modules/config/normalize.d.ts.map +1 -1
  380. package/dist/app/modules/config/normalize.mjs +0 -4
  381. package/dist/app/modules/config/normalize.mjs.map +1 -1
  382. package/dist/app/modules/config/origins.mjs.map +1 -1
  383. package/dist/app/modules/config/read/env.d.ts.map +1 -1
  384. package/dist/app/modules/config/read/env.mjs +0 -8
  385. package/dist/app/modules/config/read/env.mjs.map +1 -1
  386. package/dist/app/modules/config/read/fs.mjs.map +1 -1
  387. package/dist/app/modules/config/types.d.ts +0 -19
  388. package/dist/app/modules/config/types.d.ts.map +1 -1
  389. package/dist/app/modules/config/validator.d.ts.map +1 -1
  390. package/dist/app/modules/config/validator.mjs +0 -4
  391. package/dist/app/modules/config/validator.mjs.map +1 -1
  392. package/dist/app/modules/database/index.mjs +1 -4
  393. package/dist/app/modules/database/module.d.ts.map +1 -1
  394. package/dist/app/modules/database/module.mjs +2 -0
  395. package/dist/app/modules/database/module.mjs.map +1 -1
  396. package/dist/app/modules/database/repositories/bindings.d.ts +2 -2
  397. package/dist/app/modules/database/repositories/bindings.d.ts.map +1 -1
  398. package/dist/app/modules/database/repositories/bindings.mjs +3 -3
  399. package/dist/app/modules/database/repositories/bindings.mjs.map +1 -1
  400. package/dist/app/modules/database/repositories/client/repository.d.ts +3 -2
  401. package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
  402. package/dist/app/modules/database/repositories/client/repository.mjs +10 -82
  403. package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
  404. package/dist/app/modules/database/repositories/client-permission/repository.d.ts +2 -1
  405. package/dist/app/modules/database/repositories/client-permission/repository.d.ts.map +1 -1
  406. package/dist/app/modules/database/repositories/client-permission/repository.mjs +3 -17
  407. package/dist/app/modules/database/repositories/client-permission/repository.mjs.map +1 -1
  408. package/dist/app/modules/database/repositories/client-role/repository.d.ts +2 -1
  409. package/dist/app/modules/database/repositories/client-role/repository.d.ts.map +1 -1
  410. package/dist/app/modules/database/repositories/client-role/repository.mjs +3 -17
  411. package/dist/app/modules/database/repositories/client-role/repository.mjs.map +1 -1
  412. package/dist/app/modules/database/repositories/client-scope/repository.d.ts +2 -1
  413. package/dist/app/modules/database/repositories/client-scope/repository.d.ts.map +1 -1
  414. package/dist/app/modules/database/repositories/client-scope/repository.mjs +3 -17
  415. package/dist/app/modules/database/repositories/client-scope/repository.mjs.map +1 -1
  416. package/dist/app/modules/database/repositories/event/repository.d.ts +2 -1
  417. package/dist/app/modules/database/repositories/event/repository.d.ts.map +1 -1
  418. package/dist/app/modules/database/repositories/event/repository.mjs +14 -53
  419. package/dist/app/modules/database/repositories/event/repository.mjs.map +1 -1
  420. package/dist/app/modules/database/repositories/helpers.d.ts +17 -3
  421. package/dist/app/modules/database/repositories/helpers.d.ts.map +1 -1
  422. package/dist/app/modules/database/repositories/helpers.mjs +40 -5
  423. package/dist/app/modules/database/repositories/helpers.mjs.map +1 -1
  424. package/dist/app/modules/database/repositories/identity-provider/repository.d.ts +2 -1
  425. package/dist/app/modules/database/repositories/identity-provider/repository.d.ts.map +1 -1
  426. package/dist/app/modules/database/repositories/identity-provider/repository.mjs +6 -37
  427. package/dist/app/modules/database/repositories/identity-provider/repository.mjs.map +1 -1
  428. package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.d.ts +2 -1
  429. package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.d.ts.map +1 -1
  430. package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.mjs +3 -17
  431. package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.mjs.map +1 -1
  432. package/dist/app/modules/database/repositories/index.d.ts +0 -3
  433. package/dist/app/modules/database/repositories/index.d.ts.map +1 -1
  434. package/dist/app/modules/database/repositories/index.mjs +1 -7
  435. package/dist/app/modules/database/repositories/key/repository.d.ts +3 -2
  436. package/dist/app/modules/database/repositories/key/repository.d.ts.map +1 -1
  437. package/dist/app/modules/database/repositories/key/repository.mjs +38 -72
  438. package/dist/app/modules/database/repositories/key/repository.mjs.map +1 -1
  439. package/dist/app/modules/database/repositories/permission/repository.d.ts +2 -1
  440. package/dist/app/modules/database/repositories/permission/repository.d.ts.map +1 -1
  441. package/dist/app/modules/database/repositories/permission/repository.mjs +5 -20
  442. package/dist/app/modules/database/repositories/permission/repository.mjs.map +1 -1
  443. package/dist/app/modules/database/repositories/permission-policy/repository.d.ts +2 -1
  444. package/dist/app/modules/database/repositories/permission-policy/repository.d.ts.map +1 -1
  445. package/dist/app/modules/database/repositories/permission-policy/repository.mjs +3 -17
  446. package/dist/app/modules/database/repositories/permission-policy/repository.mjs.map +1 -1
  447. package/dist/app/modules/database/repositories/permission-provider/module.mjs +6 -6
  448. package/dist/app/modules/database/repositories/permission-provider/module.mjs.map +1 -1
  449. package/dist/app/modules/database/repositories/policy/repository.d.ts +2 -1
  450. package/dist/app/modules/database/repositories/policy/repository.d.ts.map +1 -1
  451. package/dist/app/modules/database/repositories/policy/repository.mjs +5 -39
  452. package/dist/app/modules/database/repositories/policy/repository.mjs.map +1 -1
  453. package/dist/app/modules/database/repositories/query.d.ts +18 -0
  454. package/dist/app/modules/database/repositories/query.d.ts.map +1 -0
  455. package/dist/app/modules/database/repositories/query.mjs +29 -0
  456. package/dist/app/modules/database/repositories/query.mjs.map +1 -0
  457. package/dist/app/modules/database/repositories/realm/repository.d.ts +2 -1
  458. package/dist/app/modules/database/repositories/realm/repository.d.ts.map +1 -1
  459. package/dist/app/modules/database/repositories/realm/repository.mjs +3 -25
  460. package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
  461. package/dist/app/modules/database/repositories/role/repository.d.ts +2 -1
  462. package/dist/app/modules/database/repositories/role/repository.d.ts.map +1 -1
  463. package/dist/app/modules/database/repositories/role/repository.mjs +6 -30
  464. package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
  465. package/dist/app/modules/database/repositories/role-attribute/repository.d.ts +2 -1
  466. package/dist/app/modules/database/repositories/role-attribute/repository.d.ts.map +1 -1
  467. package/dist/app/modules/database/repositories/role-attribute/repository.mjs +3 -19
  468. package/dist/app/modules/database/repositories/role-attribute/repository.mjs.map +1 -1
  469. package/dist/app/modules/database/repositories/role-permission/repository.d.ts +2 -1
  470. package/dist/app/modules/database/repositories/role-permission/repository.d.ts.map +1 -1
  471. package/dist/app/modules/database/repositories/role-permission/repository.mjs +3 -17
  472. package/dist/app/modules/database/repositories/role-permission/repository.mjs.map +1 -1
  473. package/dist/app/modules/database/repositories/schema-validation.d.ts +11 -0
  474. package/dist/app/modules/database/repositories/schema-validation.d.ts.map +1 -0
  475. package/dist/app/modules/database/repositories/schema-validation.mjs +77 -0
  476. package/dist/app/modules/database/repositories/schema-validation.mjs.map +1 -0
  477. package/dist/app/modules/database/repositories/scope/repository.d.ts +2 -1
  478. package/dist/app/modules/database/repositories/scope/repository.d.ts.map +1 -1
  479. package/dist/app/modules/database/repositories/scope/repository.mjs +5 -29
  480. package/dist/app/modules/database/repositories/scope/repository.mjs.map +1 -1
  481. package/dist/app/modules/database/repositories/trust-anchor/repository.d.ts +2 -1
  482. package/dist/app/modules/database/repositories/trust-anchor/repository.d.ts.map +1 -1
  483. package/dist/app/modules/database/repositories/trust-anchor/repository.mjs +5 -29
  484. package/dist/app/modules/database/repositories/trust-anchor/repository.mjs.map +1 -1
  485. package/dist/app/modules/database/repositories/user/repository.d.ts +3 -2
  486. package/dist/app/modules/database/repositories/user/repository.d.ts.map +1 -1
  487. package/dist/app/modules/database/repositories/user/repository.mjs +9 -66
  488. package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
  489. package/dist/app/modules/database/repositories/user-attribute/repository.d.ts +2 -1
  490. package/dist/app/modules/database/repositories/user-attribute/repository.d.ts.map +1 -1
  491. package/dist/app/modules/database/repositories/user-attribute/repository.mjs +4 -20
  492. package/dist/app/modules/database/repositories/user-attribute/repository.mjs.map +1 -1
  493. package/dist/app/modules/database/repositories/user-authenticator/repository.d.ts +2 -1
  494. package/dist/app/modules/database/repositories/user-authenticator/repository.d.ts.map +1 -1
  495. package/dist/app/modules/database/repositories/user-authenticator/repository.mjs +8 -34
  496. package/dist/app/modules/database/repositories/user-authenticator/repository.mjs.map +1 -1
  497. package/dist/app/modules/database/repositories/user-permission/repository.d.ts +2 -1
  498. package/dist/app/modules/database/repositories/user-permission/repository.d.ts.map +1 -1
  499. package/dist/app/modules/database/repositories/user-permission/repository.mjs +3 -17
  500. package/dist/app/modules/database/repositories/user-permission/repository.mjs.map +1 -1
  501. package/dist/app/modules/database/repositories/user-role/repository.d.ts +2 -1
  502. package/dist/app/modules/database/repositories/user-role/repository.d.ts.map +1 -1
  503. package/dist/app/modules/database/repositories/user-role/repository.mjs +3 -17
  504. package/dist/app/modules/database/repositories/user-role/repository.mjs.map +1 -1
  505. package/dist/app/modules/http/module.mjs.map +1 -1
  506. package/dist/app/modules/http/modules/controller.d.ts +1 -4
  507. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  508. package/dist/app/modules/http/modules/controller.mjs +0 -52
  509. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  510. package/dist/app/modules/http/modules/middleware.d.ts.map +1 -1
  511. package/dist/app/modules/http/modules/middleware.mjs +0 -1
  512. package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
  513. package/dist/app/modules/identity/index.mjs +1 -2
  514. package/dist/app/modules/identity/module.d.ts.map +1 -1
  515. package/dist/app/modules/identity/module.mjs +1 -12
  516. package/dist/app/modules/identity/module.mjs.map +1 -1
  517. package/dist/app/modules/identity/repositories/client.mjs +2 -2
  518. package/dist/app/modules/identity/repositories/client.mjs.map +1 -1
  519. package/dist/app/modules/identity/repositories/index.d.ts +0 -1
  520. package/dist/app/modules/identity/repositories/index.d.ts.map +1 -1
  521. package/dist/app/modules/identity/repositories/index.mjs +1 -2
  522. package/dist/app/modules/identity/repositories/provider/account/module.mjs +3 -3
  523. package/dist/app/modules/identity/repositories/provider/account/module.mjs.map +1 -1
  524. package/dist/app/modules/identity/repositories/provider/mapper/attribute.mjs +1 -1
  525. package/dist/app/modules/identity/repositories/provider/mapper/attribute.mjs.map +1 -1
  526. package/dist/app/modules/identity/repositories/provider/mapper/permission.mjs +1 -1
  527. package/dist/app/modules/identity/repositories/provider/mapper/permission.mjs.map +1 -1
  528. package/dist/app/modules/identity/repositories/provider/mapper/role.mjs +1 -1
  529. package/dist/app/modules/identity/repositories/provider/mapper/role.mjs.map +1 -1
  530. package/dist/app/modules/identity/repositories/user.mjs +18 -18
  531. package/dist/app/modules/identity/repositories/user.mjs.map +1 -1
  532. package/dist/app/modules/index.mjs +1 -5
  533. package/dist/app/modules/logger/module.mjs.map +1 -1
  534. package/dist/app/modules/mail/module.mjs.map +1 -1
  535. package/dist/app/modules/metrics/prom.mjs.map +1 -1
  536. package/dist/app/modules/oauth2/module.mjs.map +1 -1
  537. package/dist/app/modules/oauth2/repositories/client/repository.mjs +1 -1
  538. package/dist/app/modules/oauth2/repositories/client/repository.mjs.map +1 -1
  539. package/dist/app/modules/oauth2/repositories/consent/repository.d.ts +2 -1
  540. package/dist/app/modules/oauth2/repositories/consent/repository.d.ts.map +1 -1
  541. package/dist/app/modules/oauth2/repositories/consent/repository.mjs +14 -38
  542. package/dist/app/modules/oauth2/repositories/consent/repository.mjs.map +1 -1
  543. package/dist/app/modules/oauth2/repositories/constants.mjs.map +1 -1
  544. package/dist/app/modules/oauth2/repositories/scope/repository.mjs +1 -1
  545. package/dist/app/modules/oauth2/repositories/scope/repository.mjs.map +1 -1
  546. package/dist/app/modules/oauth2/repositories/session-token/repository.mjs +21 -18
  547. package/dist/app/modules/oauth2/repositories/session-token/repository.mjs.map +1 -1
  548. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  549. package/dist/app/modules/provisioning/module.mjs +9 -24
  550. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  551. package/dist/app/modules/provisioning/sources/composite/module.d.ts +17 -0
  552. package/dist/app/modules/provisioning/sources/composite/module.d.ts.map +1 -1
  553. package/dist/app/modules/provisioning/sources/composite/module.mjs +54 -2
  554. package/dist/app/modules/provisioning/sources/composite/module.mjs.map +1 -1
  555. package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
  556. package/dist/app/modules/provisioning/sources/default/module.mjs +43 -78
  557. package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
  558. package/dist/app/modules/provisioning/sources/file/module.d.ts.map +1 -1
  559. package/dist/app/modules/provisioning/sources/file/module.mjs +4 -3
  560. package/dist/app/modules/provisioning/sources/file/module.mjs.map +1 -1
  561. package/dist/app/modules/provisioning/sources/file/types.d.ts +2 -0
  562. package/dist/app/modules/provisioning/sources/file/types.d.ts.map +1 -1
  563. package/dist/app/modules/provisioning/sources/index.mjs +1 -0
  564. package/dist/app/modules/runtime/module.mjs.map +1 -1
  565. package/dist/cli/commands/migration.mjs.map +1 -1
  566. package/dist/components/database/unique-entries/module.mjs +6 -6
  567. package/dist/components/database/unique-entries/module.mjs.map +1 -1
  568. package/dist/components/oauth2-cleaner/module.mjs +2 -2
  569. package/dist/components/oauth2-cleaner/module.mjs.map +1 -1
  570. package/dist/core/authentication/credential/entities/client/module.d.ts +1 -1
  571. package/dist/core/authentication/credential/entities/client/module.d.ts.map +1 -1
  572. package/dist/core/authentication/credential/entities/client/module.mjs +3 -3
  573. package/dist/core/authentication/credential/entities/client/module.mjs.map +1 -1
  574. package/dist/core/authentication/credential/entities/index.d.ts +0 -1
  575. package/dist/core/authentication/credential/entities/index.d.ts.map +1 -1
  576. package/dist/core/authentication/credential/entities/index.mjs +1 -3
  577. package/dist/core/authentication/credential/index.mjs +1 -2
  578. package/dist/core/authentication/entities/client/module.mjs +1 -1
  579. package/dist/core/authentication/entities/client/module.mjs.map +1 -1
  580. package/dist/core/authentication/entities/index.d.ts +0 -1
  581. package/dist/core/authentication/entities/index.d.ts.map +1 -1
  582. package/dist/core/authentication/entities/index.mjs +1 -3
  583. package/dist/core/authentication/index.mjs +1 -3
  584. package/dist/core/authentication/session/module.d.ts.map +1 -1
  585. package/dist/core/authentication/session/module.mjs +14 -17
  586. package/dist/core/authentication/session/module.mjs.map +1 -1
  587. package/dist/core/authentication/session/types.d.ts +7 -6
  588. package/dist/core/authentication/session/types.d.ts.map +1 -1
  589. package/dist/core/authentication/session/types.mjs +4 -5
  590. package/dist/core/authentication/session/types.mjs.map +1 -1
  591. package/dist/core/client-certificate/module.d.ts +2 -1
  592. package/dist/core/client-certificate/module.d.ts.map +1 -1
  593. package/dist/core/client-certificate/module.mjs +2 -1
  594. package/dist/core/client-certificate/module.mjs.map +1 -1
  595. package/dist/core/client-certificate/reflect.d.ts +2 -0
  596. package/dist/core/client-certificate/reflect.d.ts.map +1 -0
  597. package/dist/core/{identity/entities/robot/index.mjs → client-certificate/reflect.mjs} +1 -0
  598. package/dist/core/client-certificate/types.d.ts +1 -1
  599. package/dist/core/client-certificate/types.d.ts.map +1 -1
  600. package/dist/core/entities/client/index.d.ts +1 -0
  601. package/dist/core/entities/client/index.d.ts.map +1 -1
  602. package/dist/core/entities/client/index.mjs +2 -1
  603. package/dist/core/entities/client/schema.d.ts +3 -0
  604. package/dist/core/entities/client/schema.d.ts.map +1 -0
  605. package/dist/core/entities/client/schema.mjs +59 -0
  606. package/dist/core/entities/client/schema.mjs.map +1 -0
  607. package/dist/core/entities/client/service.d.ts.map +1 -1
  608. package/dist/core/entities/client/service.mjs +42 -19
  609. package/dist/core/entities/client/service.mjs.map +1 -1
  610. package/dist/core/entities/client/types.d.ts +2 -1
  611. package/dist/core/entities/client/types.d.ts.map +1 -1
  612. package/dist/core/entities/client/web-client.d.ts +4 -4
  613. package/dist/core/entities/client/web-client.mjs +13 -13
  614. package/dist/core/entities/client/web-client.mjs.map +1 -1
  615. package/dist/core/entities/client-permission/index.d.ts +1 -0
  616. package/dist/core/entities/client-permission/index.d.ts.map +1 -1
  617. package/dist/core/entities/client-permission/index.mjs +2 -1
  618. package/dist/core/entities/client-permission/schema.d.ts +3 -0
  619. package/dist/core/entities/client-permission/schema.d.ts.map +1 -0
  620. package/dist/core/entities/client-permission/schema.mjs +41 -0
  621. package/dist/core/entities/client-permission/schema.mjs.map +1 -0
  622. package/dist/core/entities/client-permission/service.d.ts +1 -1
  623. package/dist/core/entities/client-permission/service.d.ts.map +1 -1
  624. package/dist/core/entities/client-permission/service.mjs +24 -18
  625. package/dist/core/entities/client-permission/service.mjs.map +1 -1
  626. package/dist/core/entities/client-role/index.d.ts +1 -0
  627. package/dist/core/entities/client-role/index.d.ts.map +1 -1
  628. package/dist/core/entities/client-role/index.mjs +2 -1
  629. package/dist/core/entities/client-role/schema.d.ts +3 -0
  630. package/dist/core/entities/client-role/schema.d.ts.map +1 -0
  631. package/dist/core/entities/client-role/schema.mjs +39 -0
  632. package/dist/core/entities/client-role/schema.mjs.map +1 -0
  633. package/dist/core/entities/client-role/service.d.ts +1 -1
  634. package/dist/core/entities/client-role/service.d.ts.map +1 -1
  635. package/dist/core/entities/client-role/service.mjs +14 -8
  636. package/dist/core/entities/client-role/service.mjs.map +1 -1
  637. package/dist/core/entities/client-scope/index.d.ts +1 -0
  638. package/dist/core/entities/client-scope/index.d.ts.map +1 -1
  639. package/dist/core/entities/client-scope/index.mjs +2 -1
  640. package/dist/core/entities/client-scope/schema.d.ts +3 -0
  641. package/dist/core/entities/client-scope/schema.d.ts.map +1 -0
  642. package/dist/core/entities/client-scope/schema.mjs +37 -0
  643. package/dist/core/entities/client-scope/schema.mjs.map +1 -0
  644. package/dist/core/entities/client-scope/service.d.ts +1 -1
  645. package/dist/core/entities/client-scope/service.d.ts.map +1 -1
  646. package/dist/core/entities/client-scope/service.mjs +12 -6
  647. package/dist/core/entities/client-scope/service.mjs.map +1 -1
  648. package/dist/core/entities/consent/index.d.ts +1 -0
  649. package/dist/core/entities/consent/index.d.ts.map +1 -1
  650. package/dist/core/entities/consent/index.mjs +2 -1
  651. package/dist/core/entities/consent/schema.d.ts +3 -0
  652. package/dist/core/entities/consent/schema.d.ts.map +1 -0
  653. package/dist/core/entities/consent/schema.mjs +40 -0
  654. package/dist/core/entities/consent/schema.mjs.map +1 -0
  655. package/dist/core/entities/consent/service.d.ts.map +1 -1
  656. package/dist/core/entities/consent/service.mjs +22 -6
  657. package/dist/core/entities/consent/service.mjs.map +1 -1
  658. package/dist/core/entities/consent/types.d.ts +3 -2
  659. package/dist/core/entities/consent/types.d.ts.map +1 -1
  660. package/dist/core/entities/consent/types.mjs +3 -3
  661. package/dist/core/entities/consent/types.mjs.map +1 -1
  662. package/dist/core/entities/event/diff.d.ts +4 -4
  663. package/dist/core/entities/event/diff.mjs +5 -5
  664. package/dist/core/entities/event/diff.mjs.map +1 -1
  665. package/dist/core/entities/event/entity-event-handler.d.ts.map +1 -1
  666. package/dist/core/entities/event/entity-event-handler.mjs +29 -31
  667. package/dist/core/entities/event/entity-event-handler.mjs.map +1 -1
  668. package/dist/core/entities/event/index.d.ts +1 -0
  669. package/dist/core/entities/event/index.d.ts.map +1 -1
  670. package/dist/core/entities/event/index.mjs +2 -1
  671. package/dist/core/entities/event/sanitize.mjs +8 -8
  672. package/dist/core/entities/event/sanitize.mjs.map +1 -1
  673. package/dist/core/entities/event/schema.d.ts +3 -0
  674. package/dist/core/entities/event/schema.d.ts.map +1 -0
  675. package/dist/core/entities/event/schema.mjs +51 -0
  676. package/dist/core/entities/event/schema.mjs.map +1 -0
  677. package/dist/core/entities/event/service.d.ts.map +1 -1
  678. package/dist/core/entities/event/service.mjs +38 -22
  679. package/dist/core/entities/event/service.mjs.map +1 -1
  680. package/dist/core/entities/event/types.d.ts +6 -5
  681. package/dist/core/entities/event/types.d.ts.map +1 -1
  682. package/dist/core/entities/identity-provider/index.d.ts +1 -0
  683. package/dist/core/entities/identity-provider/index.d.ts.map +1 -1
  684. package/dist/core/entities/identity-provider/index.mjs +2 -1
  685. package/dist/core/entities/identity-provider/schema.d.ts +3 -0
  686. package/dist/core/entities/identity-provider/schema.d.ts.map +1 -0
  687. package/dist/core/entities/identity-provider/schema.mjs +43 -0
  688. package/dist/core/entities/identity-provider/schema.mjs.map +1 -0
  689. package/dist/core/entities/identity-provider-role-mapping/index.d.ts +1 -0
  690. package/dist/core/entities/identity-provider-role-mapping/index.d.ts.map +1 -1
  691. package/dist/core/entities/identity-provider-role-mapping/index.mjs +2 -1
  692. package/dist/core/entities/identity-provider-role-mapping/schema.d.ts +3 -0
  693. package/dist/core/entities/identity-provider-role-mapping/schema.d.ts.map +1 -0
  694. package/dist/core/entities/identity-provider-role-mapping/schema.mjs +43 -0
  695. package/dist/core/entities/identity-provider-role-mapping/schema.mjs.map +1 -0
  696. package/dist/core/entities/identity-provider-role-mapping/service.d.ts +1 -1
  697. package/dist/core/entities/identity-provider-role-mapping/service.d.ts.map +1 -1
  698. package/dist/core/entities/identity-provider-role-mapping/service.mjs +17 -11
  699. package/dist/core/entities/identity-provider-role-mapping/service.mjs.map +1 -1
  700. package/dist/core/entities/index.d.ts +0 -3
  701. package/dist/core/entities/index.d.ts.map +1 -1
  702. package/dist/core/entities/index.mjs +26 -7
  703. package/dist/core/entities/key/index.d.ts +1 -0
  704. package/dist/core/entities/key/index.d.ts.map +1 -1
  705. package/dist/core/entities/key/index.mjs +2 -1
  706. package/dist/core/entities/key/schema.d.ts +3 -0
  707. package/dist/core/entities/key/schema.d.ts.map +1 -0
  708. package/dist/core/entities/key/schema.mjs +53 -0
  709. package/dist/core/entities/key/schema.mjs.map +1 -0
  710. package/dist/core/entities/key/service.d.ts +2 -2
  711. package/dist/core/entities/key/service.d.ts.map +1 -1
  712. package/dist/core/entities/key/service.mjs +47 -28
  713. package/dist/core/entities/key/service.mjs.map +1 -1
  714. package/dist/core/entities/key/types.d.ts +9 -1
  715. package/dist/core/entities/key/types.d.ts.map +1 -1
  716. package/dist/core/entities/permission/index.d.ts +1 -0
  717. package/dist/core/entities/permission/index.d.ts.map +1 -1
  718. package/dist/core/entities/permission/index.mjs +2 -1
  719. package/dist/core/entities/permission/schema.d.ts +3 -0
  720. package/dist/core/entities/permission/schema.d.ts.map +1 -0
  721. package/dist/core/entities/permission/schema.mjs +40 -0
  722. package/dist/core/entities/permission/schema.mjs.map +1 -0
  723. package/dist/core/entities/permission/service.d.ts +7 -2
  724. package/dist/core/entities/permission/service.d.ts.map +1 -1
  725. package/dist/core/entities/permission/service.mjs +53 -40
  726. package/dist/core/entities/permission/service.mjs.map +1 -1
  727. package/dist/core/entities/permission-policy/index.d.ts +1 -0
  728. package/dist/core/entities/permission-policy/index.d.ts.map +1 -1
  729. package/dist/core/entities/permission-policy/index.mjs +2 -1
  730. package/dist/core/entities/permission-policy/schema.d.ts +3 -0
  731. package/dist/core/entities/permission-policy/schema.d.ts.map +1 -0
  732. package/dist/core/entities/permission-policy/schema.mjs +39 -0
  733. package/dist/core/entities/permission-policy/schema.mjs.map +1 -0
  734. package/dist/core/entities/permission-policy/service.d.ts +1 -1
  735. package/dist/core/entities/permission-policy/service.d.ts.map +1 -1
  736. package/dist/core/entities/permission-policy/service.mjs +12 -6
  737. package/dist/core/entities/permission-policy/service.mjs.map +1 -1
  738. package/dist/core/entities/policy/index.d.ts +1 -0
  739. package/dist/core/entities/policy/index.d.ts.map +1 -1
  740. package/dist/core/entities/policy/index.mjs +2 -1
  741. package/dist/core/entities/policy/schema.d.ts +3 -0
  742. package/dist/core/entities/policy/schema.d.ts.map +1 -0
  743. package/dist/core/entities/policy/schema.mjs +49 -0
  744. package/dist/core/entities/policy/schema.mjs.map +1 -0
  745. package/dist/core/entities/policy/service.d.ts.map +1 -1
  746. package/dist/core/entities/policy/service.mjs +13 -7
  747. package/dist/core/entities/policy/service.mjs.map +1 -1
  748. package/dist/core/entities/realm/index.d.ts +1 -0
  749. package/dist/core/entities/realm/index.d.ts.map +1 -1
  750. package/dist/core/entities/realm/index.mjs +2 -1
  751. package/dist/core/entities/realm/schema.d.ts +3 -0
  752. package/dist/core/entities/realm/schema.d.ts.map +1 -0
  753. package/dist/core/entities/realm/schema.mjs +36 -0
  754. package/dist/core/entities/realm/schema.mjs.map +1 -0
  755. package/dist/core/entities/realm/service.d.ts.map +1 -1
  756. package/dist/core/entities/realm/service.mjs +5 -2
  757. package/dist/core/entities/realm/service.mjs.map +1 -1
  758. package/dist/core/entities/realm/types.d.ts +1 -1
  759. package/dist/core/entities/role/index.d.ts +1 -0
  760. package/dist/core/entities/role/index.d.ts.map +1 -1
  761. package/dist/core/entities/role/index.mjs +2 -1
  762. package/dist/core/entities/role/schema.d.ts +3 -0
  763. package/dist/core/entities/role/schema.d.ts.map +1 -0
  764. package/dist/core/entities/role/schema.mjs +43 -0
  765. package/dist/core/entities/role/schema.mjs.map +1 -0
  766. package/dist/core/entities/role/service.d.ts.map +1 -1
  767. package/dist/core/entities/role/service.mjs +11 -5
  768. package/dist/core/entities/role/service.mjs.map +1 -1
  769. package/dist/core/entities/role-attribute/index.d.ts +1 -0
  770. package/dist/core/entities/role-attribute/index.d.ts.map +1 -1
  771. package/dist/core/entities/role-attribute/index.mjs +2 -1
  772. package/dist/core/entities/role-attribute/schema.d.ts +3 -0
  773. package/dist/core/entities/role-attribute/schema.d.ts.map +1 -0
  774. package/dist/core/entities/role-attribute/schema.mjs +47 -0
  775. package/dist/core/entities/role-attribute/schema.mjs.map +1 -0
  776. package/dist/core/entities/role-attribute/service.d.ts.map +1 -1
  777. package/dist/core/entities/role-attribute/service.mjs +19 -6
  778. package/dist/core/entities/role-attribute/service.mjs.map +1 -1
  779. package/dist/core/entities/role-permission/index.d.ts +1 -0
  780. package/dist/core/entities/role-permission/index.d.ts.map +1 -1
  781. package/dist/core/entities/role-permission/index.mjs +2 -1
  782. package/dist/core/entities/role-permission/schema.d.ts +3 -0
  783. package/dist/core/entities/role-permission/schema.d.ts.map +1 -0
  784. package/dist/core/entities/role-permission/schema.mjs +41 -0
  785. package/dist/core/entities/role-permission/schema.mjs.map +1 -0
  786. package/dist/core/entities/role-permission/service.d.ts +1 -1
  787. package/dist/core/entities/role-permission/service.d.ts.map +1 -1
  788. package/dist/core/entities/role-permission/service.mjs +24 -18
  789. package/dist/core/entities/role-permission/service.mjs.map +1 -1
  790. package/dist/core/entities/scope/index.d.ts +1 -0
  791. package/dist/core/entities/scope/index.d.ts.map +1 -1
  792. package/dist/core/entities/scope/index.mjs +2 -1
  793. package/dist/core/entities/scope/schema.d.ts +3 -0
  794. package/dist/core/entities/scope/schema.d.ts.map +1 -0
  795. package/dist/core/entities/scope/schema.mjs +43 -0
  796. package/dist/core/entities/scope/schema.mjs.map +1 -0
  797. package/dist/core/entities/scope/service.d.ts.map +1 -1
  798. package/dist/core/entities/scope/service.mjs +11 -5
  799. package/dist/core/entities/scope/service.mjs.map +1 -1
  800. package/dist/core/entities/session/index.d.ts +1 -0
  801. package/dist/core/entities/session/index.d.ts.map +1 -1
  802. package/dist/core/entities/session/index.mjs +2 -1
  803. package/dist/core/entities/session/schema.d.ts +3 -0
  804. package/dist/core/entities/session/schema.d.ts.map +1 -0
  805. package/dist/core/entities/session/schema.mjs +44 -0
  806. package/dist/core/entities/session/schema.mjs.map +1 -0
  807. package/dist/core/entities/session/service.d.ts +11 -0
  808. package/dist/core/entities/session/service.d.ts.map +1 -1
  809. package/dist/core/entities/session/service.mjs +48 -11
  810. package/dist/core/entities/session/service.mjs.map +1 -1
  811. package/dist/core/entities/session/types.d.ts +2 -2
  812. package/dist/core/entities/trust-anchor/index.d.ts +1 -0
  813. package/dist/core/entities/trust-anchor/index.d.ts.map +1 -1
  814. package/dist/core/entities/trust-anchor/index.mjs +2 -1
  815. package/dist/core/entities/trust-anchor/schema.d.ts +3 -0
  816. package/dist/core/entities/trust-anchor/schema.d.ts.map +1 -0
  817. package/dist/core/entities/trust-anchor/schema.mjs +43 -0
  818. package/dist/core/entities/trust-anchor/schema.mjs.map +1 -0
  819. package/dist/core/entities/trust-anchor/service.d.ts +2 -2
  820. package/dist/core/entities/trust-anchor/service.d.ts.map +1 -1
  821. package/dist/core/entities/trust-anchor/service.mjs +23 -7
  822. package/dist/core/entities/trust-anchor/service.mjs.map +1 -1
  823. package/dist/core/entities/trust-anchor/types.d.ts +9 -1
  824. package/dist/core/entities/trust-anchor/types.d.ts.map +1 -1
  825. package/dist/core/entities/user/index.d.ts +1 -0
  826. package/dist/core/entities/user/index.d.ts.map +1 -1
  827. package/dist/core/entities/user/index.mjs +2 -1
  828. package/dist/core/entities/user/schema.d.ts +3 -0
  829. package/dist/core/entities/user/schema.d.ts.map +1 -0
  830. package/dist/core/entities/user/schema.mjs +50 -0
  831. package/dist/core/entities/user/schema.mjs.map +1 -0
  832. package/dist/core/entities/user/service.d.ts.map +1 -1
  833. package/dist/core/entities/user/service.mjs +33 -12
  834. package/dist/core/entities/user/service.mjs.map +1 -1
  835. package/dist/core/entities/user/types.d.ts +2 -1
  836. package/dist/core/entities/user/types.d.ts.map +1 -1
  837. package/dist/core/entities/user-attribute/index.d.ts +1 -0
  838. package/dist/core/entities/user-attribute/index.d.ts.map +1 -1
  839. package/dist/core/entities/user-attribute/index.mjs +2 -1
  840. package/dist/core/entities/user-attribute/schema.d.ts +3 -0
  841. package/dist/core/entities/user-attribute/schema.d.ts.map +1 -0
  842. package/dist/core/entities/user-attribute/schema.mjs +47 -0
  843. package/dist/core/entities/user-attribute/schema.mjs.map +1 -0
  844. package/dist/core/entities/user-attribute/service.d.ts.map +1 -1
  845. package/dist/core/entities/user-attribute/service.mjs +26 -10
  846. package/dist/core/entities/user-attribute/service.mjs.map +1 -1
  847. package/dist/core/entities/user-authenticator/index.d.ts +1 -0
  848. package/dist/core/entities/user-authenticator/index.d.ts.map +1 -1
  849. package/dist/core/entities/user-authenticator/index.mjs +2 -1
  850. package/dist/core/entities/user-authenticator/schema.d.ts +3 -0
  851. package/dist/core/entities/user-authenticator/schema.d.ts.map +1 -0
  852. package/dist/core/entities/user-authenticator/schema.mjs +47 -0
  853. package/dist/core/entities/user-authenticator/schema.mjs.map +1 -0
  854. package/dist/core/entities/user-authenticator/service.d.ts.map +1 -1
  855. package/dist/core/entities/user-authenticator/service.mjs +49 -27
  856. package/dist/core/entities/user-authenticator/service.mjs.map +1 -1
  857. package/dist/core/entities/user-authenticator/types.d.ts +4 -3
  858. package/dist/core/entities/user-authenticator/types.d.ts.map +1 -1
  859. package/dist/core/entities/user-authenticator/types.mjs +2 -2
  860. package/dist/core/entities/user-authenticator/types.mjs.map +1 -1
  861. package/dist/core/entities/user-permission/index.d.ts +1 -0
  862. package/dist/core/entities/user-permission/index.d.ts.map +1 -1
  863. package/dist/core/entities/user-permission/index.mjs +2 -1
  864. package/dist/core/entities/user-permission/schema.d.ts +3 -0
  865. package/dist/core/entities/user-permission/schema.d.ts.map +1 -0
  866. package/dist/core/entities/user-permission/schema.mjs +41 -0
  867. package/dist/core/entities/user-permission/schema.mjs.map +1 -0
  868. package/dist/core/entities/user-permission/service.d.ts +1 -1
  869. package/dist/core/entities/user-permission/service.d.ts.map +1 -1
  870. package/dist/core/entities/user-permission/service.mjs +24 -18
  871. package/dist/core/entities/user-permission/service.mjs.map +1 -1
  872. package/dist/core/entities/user-role/index.d.ts +1 -0
  873. package/dist/core/entities/user-role/index.d.ts.map +1 -1
  874. package/dist/core/entities/user-role/index.mjs +2 -1
  875. package/dist/core/entities/user-role/schema.d.ts +3 -0
  876. package/dist/core/entities/user-role/schema.d.ts.map +1 -0
  877. package/dist/core/entities/user-role/schema.mjs +39 -0
  878. package/dist/core/entities/user-role/schema.mjs.map +1 -0
  879. package/dist/core/entities/user-role/service.d.ts +1 -1
  880. package/dist/core/entities/user-role/service.d.ts.map +1 -1
  881. package/dist/core/entities/user-role/service.mjs +14 -8
  882. package/dist/core/entities/user-role/service.mjs.map +1 -1
  883. package/dist/core/identity/entities/index.d.ts +0 -1
  884. package/dist/core/identity/entities/index.d.ts.map +1 -1
  885. package/dist/core/identity/password-recovery/service.mjs +21 -21
  886. package/dist/core/identity/password-recovery/service.mjs.map +1 -1
  887. package/dist/core/identity/password-recovery/types.d.ts +2 -2
  888. package/dist/core/identity/password-recovery/types.d.ts.map +1 -1
  889. package/dist/core/identity/permission/checker/service.mjs +2 -2
  890. package/dist/core/identity/permission/checker/service.mjs.map +1 -1
  891. package/dist/core/identity/permission/identity-policy-data.mjs +2 -2
  892. package/dist/core/identity/permission/identity-policy-data.mjs.map +1 -1
  893. package/dist/core/identity/permission/junction-grant.d.ts +6 -6
  894. package/dist/core/identity/permission/junction-grant.mjs +14 -14
  895. package/dist/core/identity/permission/junction-grant.mjs.map +1 -1
  896. package/dist/core/identity/permission/module.d.ts +0 -3
  897. package/dist/core/identity/permission/module.d.ts.map +1 -1
  898. package/dist/core/identity/permission/module.mjs +9 -15
  899. package/dist/core/identity/permission/module.mjs.map +1 -1
  900. package/dist/core/identity/permission/types.d.ts +0 -2
  901. package/dist/core/identity/permission/types.d.ts.map +1 -1
  902. package/dist/core/identity/policy/checker/service.mjs +1 -1
  903. package/dist/core/identity/policy/checker/service.mjs.map +1 -1
  904. package/dist/core/identity/provider/account/module.mjs +9 -9
  905. package/dist/core/identity/provider/account/module.mjs.map +1 -1
  906. package/dist/core/identity/provider/authentication/presets/facebook.mjs +5 -5
  907. package/dist/core/identity/provider/authentication/presets/facebook.mjs.map +1 -1
  908. package/dist/core/identity/provider/authentication/presets/github.mjs +3 -3
  909. package/dist/core/identity/provider/authentication/presets/github.mjs.map +1 -1
  910. package/dist/core/identity/provider/authentication/presets/google.mjs +5 -5
  911. package/dist/core/identity/provider/authentication/presets/google.mjs.map +1 -1
  912. package/dist/core/identity/provider/authentication/presets/instagram.mjs +3 -3
  913. package/dist/core/identity/provider/authentication/presets/instagram.mjs.map +1 -1
  914. package/dist/core/identity/provider/authentication/presets/paypal.mjs +3 -3
  915. package/dist/core/identity/provider/authentication/presets/paypal.mjs.map +1 -1
  916. package/dist/core/identity/provider/authentication/protocols/ldap/module.mjs +20 -20
  917. package/dist/core/identity/provider/authentication/protocols/ldap/module.mjs.map +1 -1
  918. package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs +5 -5
  919. package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs.map +1 -1
  920. package/dist/core/identity/provider/authentication/protocols/open-id/module.mjs.map +1 -1
  921. package/dist/core/identity/provider/constants.mjs.map +1 -1
  922. package/dist/core/identity/provider/mapper/attributes/module.mjs +3 -3
  923. package/dist/core/identity/provider/mapper/attributes/module.mjs.map +1 -1
  924. package/dist/core/identity/provider/mapper/base.mjs +2 -2
  925. package/dist/core/identity/provider/mapper/base.mjs.map +1 -1
  926. package/dist/core/identity/provider/mapper/constants.mjs.map +1 -1
  927. package/dist/core/identity/provider/mapper/permission/module.mjs +2 -2
  928. package/dist/core/identity/provider/mapper/permission/module.mjs.map +1 -1
  929. package/dist/core/identity/provider/mapper/role/module.mjs +2 -2
  930. package/dist/core/identity/provider/mapper/role/module.mjs.map +1 -1
  931. package/dist/core/identity/registration/service.mjs +9 -9
  932. package/dist/core/identity/registration/service.mjs.map +1 -1
  933. package/dist/core/identity/resolver/module.d.ts +1 -3
  934. package/dist/core/identity/resolver/module.d.ts.map +1 -1
  935. package/dist/core/identity/resolver/module.mjs +0 -13
  936. package/dist/core/identity/resolver/module.mjs.map +1 -1
  937. package/dist/core/identity/resolver/types.d.ts +1 -2
  938. package/dist/core/identity/resolver/types.d.ts.map +1 -1
  939. package/dist/core/identity/role/module.d.ts +0 -2
  940. package/dist/core/identity/role/module.d.ts.map +1 -1
  941. package/dist/core/identity/role/module.mjs +1 -4
  942. package/dist/core/identity/role/module.mjs.map +1 -1
  943. package/dist/core/identity/role/types.d.ts +0 -2
  944. package/dist/core/identity/role/types.d.ts.map +1 -1
  945. package/dist/core/index.d.ts +1 -0
  946. package/dist/core/index.d.ts.map +1 -1
  947. package/dist/core/index.mjs +28 -9
  948. package/dist/core/key/provisioner.mjs.map +1 -1
  949. package/dist/core/key/realm-cipher.mjs +5 -5
  950. package/dist/core/key/realm-cipher.mjs.map +1 -1
  951. package/dist/core/mail/template/templates/mfa-email-otp.mjs.map +1 -1
  952. package/dist/core/mail/template/templates/password-reset.mjs.map +1 -1
  953. package/dist/core/mail/template/templates/registration-activation.mjs.map +1 -1
  954. package/dist/core/mail/template/types.mjs.map +1 -1
  955. package/dist/core/oauth2/authorization/code/verifier/module.mjs.map +1 -1
  956. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +3 -3
  957. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
  958. package/dist/core/oauth2/authorization/helpers.d.ts +2 -2
  959. package/dist/core/oauth2/authorization/helpers.d.ts.map +1 -1
  960. package/dist/core/oauth2/authorization/helpers.mjs +5 -5
  961. package/dist/core/oauth2/authorization/helpers.mjs.map +1 -1
  962. package/dist/core/oauth2/authorization/module.mjs +8 -8
  963. package/dist/core/oauth2/authorization/module.mjs.map +1 -1
  964. package/dist/core/oauth2/client/authenticator.d.ts +1 -1
  965. package/dist/core/oauth2/client/authenticator.d.ts.map +1 -1
  966. package/dist/core/oauth2/client/authenticator.mjs +3 -3
  967. package/dist/core/oauth2/client/authenticator.mjs.map +1 -1
  968. package/dist/core/oauth2/client/grant-type.d.ts +1 -1
  969. package/dist/core/oauth2/client/grant-type.d.ts.map +1 -1
  970. package/dist/core/oauth2/client/grant-type.mjs +2 -2
  971. package/dist/core/oauth2/client/grant-type.mjs.map +1 -1
  972. package/dist/core/oauth2/end-session/service.mjs +5 -5
  973. package/dist/core/oauth2/end-session/service.mjs.map +1 -1
  974. package/dist/core/oauth2/grant-types/authorize.mjs +9 -9
  975. package/dist/core/oauth2/grant-types/authorize.mjs.map +1 -1
  976. package/dist/core/oauth2/grant-types/client-credentials.mjs +7 -7
  977. package/dist/core/oauth2/grant-types/client-credentials.mjs.map +1 -1
  978. package/dist/core/oauth2/grant-types/identity.mjs +10 -10
  979. package/dist/core/oauth2/grant-types/identity.mjs.map +1 -1
  980. package/dist/core/oauth2/grant-types/index.d.ts +0 -1
  981. package/dist/core/oauth2/grant-types/index.d.ts.map +1 -1
  982. package/dist/core/oauth2/grant-types/index.mjs +1 -2
  983. package/dist/core/oauth2/grant-types/password.d.ts +1 -1
  984. package/dist/core/oauth2/grant-types/password.mjs +13 -13
  985. package/dist/core/oauth2/grant-types/password.mjs.map +1 -1
  986. package/dist/core/oauth2/grant-types/refresh-token.mjs +12 -12
  987. package/dist/core/oauth2/grant-types/refresh-token.mjs.map +1 -1
  988. package/dist/core/oauth2/index.mjs +1 -2
  989. package/dist/core/oauth2/mfa-login/module.mjs +21 -21
  990. package/dist/core/oauth2/mfa-login/module.mjs.map +1 -1
  991. package/dist/core/oauth2/mfa-login/types.d.ts +1 -1
  992. package/dist/core/oauth2/openid/claims.d.ts +1 -3
  993. package/dist/core/oauth2/openid/claims.d.ts.map +1 -1
  994. package/dist/core/oauth2/openid/claims.mjs +6 -19
  995. package/dist/core/oauth2/openid/claims.mjs.map +1 -1
  996. package/dist/core/oauth2/scope/resolver.d.ts +1 -3
  997. package/dist/core/oauth2/scope/resolver.d.ts.map +1 -1
  998. package/dist/core/oauth2/scope/resolver.mjs +9 -31
  999. package/dist/core/oauth2/scope/resolver.mjs.map +1 -1
  1000. package/dist/core/oauth2/session-token/types.d.ts +8 -8
  1001. package/dist/core/oauth2/session-token/types.d.ts.map +1 -1
  1002. package/dist/core/oauth2/token/issuer/access/module.mjs +7 -7
  1003. package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
  1004. package/dist/core/oauth2/token/issuer/mfa/module.mjs.map +1 -1
  1005. package/dist/core/oauth2/token/issuer/open-id/module.mjs.map +1 -1
  1006. package/dist/core/oauth2/token/issuer/refresh/module.mjs +5 -5
  1007. package/dist/core/oauth2/token/issuer/refresh/module.mjs.map +1 -1
  1008. package/dist/core/oauth2/token/signer/module.mjs +6 -6
  1009. package/dist/core/oauth2/token/signer/module.mjs.map +1 -1
  1010. package/dist/core/oauth2/token/verifier/module.mjs +8 -8
  1011. package/dist/core/oauth2/token/verifier/module.mjs.map +1 -1
  1012. package/dist/core/provisioning/entities/index.d.ts +0 -1
  1013. package/dist/core/provisioning/entities/index.d.ts.map +1 -1
  1014. package/dist/core/provisioning/entities/index.mjs +1 -3
  1015. package/dist/core/provisioning/entities/policy/validator.d.ts +2 -0
  1016. package/dist/core/provisioning/entities/policy/validator.d.ts.map +1 -1
  1017. package/dist/core/provisioning/entities/policy/validator.mjs +10 -1
  1018. package/dist/core/provisioning/entities/policy/validator.mjs.map +1 -1
  1019. package/dist/core/provisioning/entities/realm/relations-validator.d.ts.map +1 -1
  1020. package/dist/core/provisioning/entities/realm/relations-validator.mjs +0 -4
  1021. package/dist/core/provisioning/entities/realm/relations-validator.mjs.map +1 -1
  1022. package/dist/core/provisioning/entities/realm/types.d.ts +0 -2
  1023. package/dist/core/provisioning/entities/realm/types.d.ts.map +1 -1
  1024. package/dist/core/provisioning/entities/role/types.d.ts +2 -2
  1025. package/dist/core/provisioning/entities/utils.mjs.map +1 -1
  1026. package/dist/core/provisioning/index.mjs +1 -3
  1027. package/dist/core/provisioning/strategy/constants.mjs.map +1 -1
  1028. package/dist/core/provisioning/strategy/validator.mjs.map +1 -1
  1029. package/dist/core/provisioning/synchronizer/client/module.mjs +11 -11
  1030. package/dist/core/provisioning/synchronizer/client/module.mjs.map +1 -1
  1031. package/dist/core/provisioning/synchronizer/entity-resolver.mjs +12 -12
  1032. package/dist/core/provisioning/synchronizer/entity-resolver.mjs.map +1 -1
  1033. package/dist/core/provisioning/synchronizer/index.d.ts +0 -1
  1034. package/dist/core/provisioning/synchronizer/index.d.ts.map +1 -1
  1035. package/dist/core/provisioning/synchronizer/index.mjs +1 -3
  1036. package/dist/core/provisioning/synchronizer/junction-synchronizer.d.ts +2 -2
  1037. package/dist/core/provisioning/synchronizer/junction-synchronizer.d.ts.map +1 -1
  1038. package/dist/core/provisioning/synchronizer/junction-synchronizer.mjs +2 -2
  1039. package/dist/core/provisioning/synchronizer/junction-synchronizer.mjs.map +1 -1
  1040. package/dist/core/provisioning/synchronizer/permission/module.mjs +8 -8
  1041. package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
  1042. package/dist/core/provisioning/synchronizer/policy/module.mjs +11 -11
  1043. package/dist/core/provisioning/synchronizer/policy/module.mjs.map +1 -1
  1044. package/dist/core/provisioning/synchronizer/realm/module.d.ts +0 -2
  1045. package/dist/core/provisioning/synchronizer/realm/module.d.ts.map +1 -1
  1046. package/dist/core/provisioning/synchronizer/realm/module.mjs +5 -15
  1047. package/dist/core/provisioning/synchronizer/realm/module.mjs.map +1 -1
  1048. package/dist/core/provisioning/synchronizer/realm/types.d.ts +0 -2
  1049. package/dist/core/provisioning/synchronizer/realm/types.d.ts.map +1 -1
  1050. package/dist/core/provisioning/synchronizer/role/module.mjs +7 -7
  1051. package/dist/core/provisioning/synchronizer/role/module.mjs.map +1 -1
  1052. package/dist/core/provisioning/synchronizer/scope/module.mjs +1 -1
  1053. package/dist/core/provisioning/synchronizer/scope/module.mjs.map +1 -1
  1054. package/dist/core/provisioning/synchronizer/user/module.mjs +13 -13
  1055. package/dist/core/provisioning/synchronizer/user/module.mjs.map +1 -1
  1056. package/dist/core/query/index.d.ts +4 -0
  1057. package/dist/core/query/index.d.ts.map +1 -0
  1058. package/dist/core/query/index.mjs +6 -0
  1059. package/dist/core/query/module.d.ts +60 -0
  1060. package/dist/core/query/module.d.ts.map +1 -0
  1061. package/dist/core/query/module.mjs +128 -0
  1062. package/dist/core/query/module.mjs.map +1 -0
  1063. package/dist/core/query/relations.d.ts +39 -0
  1064. package/dist/core/query/relations.d.ts.map +1 -0
  1065. package/dist/core/query/relations.mjs +103 -0
  1066. package/dist/core/query/relations.mjs.map +1 -0
  1067. package/dist/core/query/types.d.ts +39 -0
  1068. package/dist/core/query/types.d.ts.map +1 -0
  1069. package/dist/core/security/policy/evaluator.d.ts +1 -0
  1070. package/dist/core/security/policy/evaluator.d.ts.map +1 -1
  1071. package/dist/core/security/policy/evaluator.mjs +52 -5
  1072. package/dist/core/security/policy/evaluator.mjs.map +1 -1
  1073. package/dist/index.mjs +1 -17
  1074. package/dist/swagger.json +2552 -3798
  1075. package/dist/ui/client/.vite/ssr-manifest.json +1542 -894
  1076. package/dist/ui/client/assets/index-CiHrf73J.css +2 -0
  1077. package/dist/ui/client/assets/{index-CT0Nq5pA.js → index-mtJngmng.js} +21 -18
  1078. package/dist/ui/client/index.html +2 -2
  1079. package/dist/ui/server/server.js +10344 -3440
  1080. package/package.json +35 -30
  1081. package/dist/adapters/database/domains/robot/entity.d.ts +0 -19
  1082. package/dist/adapters/database/domains/robot/entity.d.ts.map +0 -1
  1083. package/dist/adapters/database/domains/robot/entity.mjs +0 -112
  1084. package/dist/adapters/database/domains/robot/entity.mjs.map +0 -1
  1085. package/dist/adapters/database/domains/robot/index.d.ts +0 -3
  1086. package/dist/adapters/database/domains/robot/index.d.ts.map +0 -1
  1087. package/dist/adapters/database/domains/robot/index.mjs +0 -6
  1088. package/dist/adapters/database/domains/robot/subscriber.d.ts +0 -6
  1089. package/dist/adapters/database/domains/robot/subscriber.d.ts.map +0 -1
  1090. package/dist/adapters/database/domains/robot/subscriber.mjs +0 -42
  1091. package/dist/adapters/database/domains/robot/subscriber.mjs.map +0 -1
  1092. package/dist/adapters/database/domains/robot-permission/entity.d.ts +0 -18
  1093. package/dist/adapters/database/domains/robot-permission/entity.d.ts.map +0 -1
  1094. package/dist/adapters/database/domains/robot-permission/entity.mjs +0 -91
  1095. package/dist/adapters/database/domains/robot-permission/entity.mjs.map +0 -1
  1096. package/dist/adapters/database/domains/robot-permission/index.d.ts +0 -3
  1097. package/dist/adapters/database/domains/robot-permission/index.d.ts.map +0 -1
  1098. package/dist/adapters/database/domains/robot-permission/index.mjs +0 -6
  1099. package/dist/adapters/database/domains/robot-permission/subscriber.d.ts +0 -6
  1100. package/dist/adapters/database/domains/robot-permission/subscriber.d.ts.map +0 -1
  1101. package/dist/adapters/database/domains/robot-permission/subscriber.mjs +0 -45
  1102. package/dist/adapters/database/domains/robot-permission/subscriber.mjs.map +0 -1
  1103. package/dist/adapters/database/domains/robot-role/entity.d.ts +0 -15
  1104. package/dist/adapters/database/domains/robot-role/entity.d.ts.map +0 -1
  1105. package/dist/adapters/database/domains/robot-role/entity.mjs +0 -72
  1106. package/dist/adapters/database/domains/robot-role/entity.mjs.map +0 -1
  1107. package/dist/adapters/database/domains/robot-role/index.d.ts +0 -3
  1108. package/dist/adapters/database/domains/robot-role/index.d.ts.map +0 -1
  1109. package/dist/adapters/database/domains/robot-role/index.mjs +0 -6
  1110. package/dist/adapters/database/domains/robot-role/subscriber.d.ts +0 -6
  1111. package/dist/adapters/database/domains/robot-role/subscriber.d.ts.map +0 -1
  1112. package/dist/adapters/database/domains/robot-role/subscriber.mjs +0 -45
  1113. package/dist/adapters/database/domains/robot-role/subscriber.mjs.map +0 -1
  1114. package/dist/adapters/http/adapters/oauth2/grant-types/robot-credentials.d.ts +0 -12
  1115. package/dist/adapters/http/adapters/oauth2/grant-types/robot-credentials.d.ts.map +0 -1
  1116. package/dist/adapters/http/adapters/oauth2/grant-types/robot-credentials.mjs +0 -27
  1117. package/dist/adapters/http/adapters/oauth2/grant-types/robot-credentials.mjs.map +0 -1
  1118. package/dist/adapters/http/controllers/entities/robot/index.d.ts +0 -2
  1119. package/dist/adapters/http/controllers/entities/robot/index.d.ts.map +0 -1
  1120. package/dist/adapters/http/controllers/entities/robot/index.mjs +0 -5
  1121. package/dist/adapters/http/controllers/entities/robot/module.d.ts +0 -25
  1122. package/dist/adapters/http/controllers/entities/robot/module.d.ts.map +0 -1
  1123. package/dist/adapters/http/controllers/entities/robot/module.mjs +0 -180
  1124. package/dist/adapters/http/controllers/entities/robot/module.mjs.map +0 -1
  1125. package/dist/adapters/http/controllers/entities/robot-permission/index.d.ts +0 -3
  1126. package/dist/adapters/http/controllers/entities/robot-permission/index.d.ts.map +0 -1
  1127. package/dist/adapters/http/controllers/entities/robot-permission/index.mjs +0 -7
  1128. package/dist/adapters/http/controllers/entities/robot-permission/module.d.ts +0 -17
  1129. package/dist/adapters/http/controllers/entities/robot-permission/module.d.ts.map +0 -1
  1130. package/dist/adapters/http/controllers/entities/robot-permission/module.mjs +0 -114
  1131. package/dist/adapters/http/controllers/entities/robot-permission/module.mjs.map +0 -1
  1132. package/dist/adapters/http/controllers/entities/robot-permission/utils/index.d.ts +0 -2
  1133. package/dist/adapters/http/controllers/entities/robot-permission/utils/index.d.ts.map +0 -1
  1134. package/dist/adapters/http/controllers/entities/robot-permission/utils/index.mjs +0 -5
  1135. package/dist/adapters/http/controllers/entities/robot-permission/utils/validation.d.ts +0 -6
  1136. package/dist/adapters/http/controllers/entities/robot-permission/utils/validation.d.ts.map +0 -1
  1137. package/dist/adapters/http/controllers/entities/robot-permission/utils/validation.mjs +0 -21
  1138. package/dist/adapters/http/controllers/entities/robot-permission/utils/validation.mjs.map +0 -1
  1139. package/dist/adapters/http/controllers/entities/robot-role/index.d.ts +0 -3
  1140. package/dist/adapters/http/controllers/entities/robot-role/index.d.ts.map +0 -1
  1141. package/dist/adapters/http/controllers/entities/robot-role/index.mjs +0 -7
  1142. package/dist/adapters/http/controllers/entities/robot-role/module.d.ts +0 -16
  1143. package/dist/adapters/http/controllers/entities/robot-role/module.d.ts.map +0 -1
  1144. package/dist/adapters/http/controllers/entities/robot-role/module.mjs +0 -95
  1145. package/dist/adapters/http/controllers/entities/robot-role/module.mjs.map +0 -1
  1146. package/dist/adapters/http/controllers/entities/robot-role/utils/index.d.ts +0 -2
  1147. package/dist/adapters/http/controllers/entities/robot-role/utils/index.d.ts.map +0 -1
  1148. package/dist/adapters/http/controllers/entities/robot-role/utils/index.mjs +0 -5
  1149. package/dist/adapters/http/controllers/entities/robot-role/utils/validation.d.ts +0 -6
  1150. package/dist/adapters/http/controllers/entities/robot-role/utils/validation.d.ts.map +0 -1
  1151. package/dist/adapters/http/controllers/entities/robot-role/utils/validation.mjs +0 -20
  1152. package/dist/adapters/http/controllers/entities/robot-role/utils/validation.mjs.map +0 -1
  1153. package/dist/app/modules/database/repositories/robot/index.d.ts +0 -2
  1154. package/dist/app/modules/database/repositories/robot/index.d.ts.map +0 -1
  1155. package/dist/app/modules/database/repositories/robot/index.mjs +0 -5
  1156. package/dist/app/modules/database/repositories/robot/repository.d.ts +0 -31
  1157. package/dist/app/modules/database/repositories/robot/repository.d.ts.map +0 -1
  1158. package/dist/app/modules/database/repositories/robot/repository.mjs +0 -190
  1159. package/dist/app/modules/database/repositories/robot/repository.mjs.map +0 -1
  1160. package/dist/app/modules/database/repositories/robot-permission/index.d.ts +0 -2
  1161. package/dist/app/modules/database/repositories/robot-permission/index.d.ts.map +0 -1
  1162. package/dist/app/modules/database/repositories/robot-permission/index.mjs +0 -5
  1163. package/dist/app/modules/database/repositories/robot-permission/repository.d.ts +0 -20
  1164. package/dist/app/modules/database/repositories/robot-permission/repository.d.ts.map +0 -1
  1165. package/dist/app/modules/database/repositories/robot-permission/repository.mjs +0 -79
  1166. package/dist/app/modules/database/repositories/robot-permission/repository.mjs.map +0 -1
  1167. package/dist/app/modules/database/repositories/robot-role/index.d.ts +0 -2
  1168. package/dist/app/modules/database/repositories/robot-role/index.d.ts.map +0 -1
  1169. package/dist/app/modules/database/repositories/robot-role/index.mjs +0 -5
  1170. package/dist/app/modules/database/repositories/robot-role/repository.d.ts +0 -20
  1171. package/dist/app/modules/database/repositories/robot-role/repository.d.ts.map +0 -1
  1172. package/dist/app/modules/database/repositories/robot-role/repository.mjs +0 -79
  1173. package/dist/app/modules/database/repositories/robot-role/repository.mjs.map +0 -1
  1174. package/dist/app/modules/identity/repositories/robot.d.ts +0 -13
  1175. package/dist/app/modules/identity/repositories/robot.d.ts.map +0 -1
  1176. package/dist/app/modules/identity/repositories/robot.mjs +0 -47
  1177. package/dist/app/modules/identity/repositories/robot.mjs.map +0 -1
  1178. package/dist/core/authentication/credential/entities/robot/index.d.ts +0 -2
  1179. package/dist/core/authentication/credential/entities/robot/index.d.ts.map +0 -1
  1180. package/dist/core/authentication/credential/entities/robot/index.mjs +0 -5
  1181. package/dist/core/authentication/credential/entities/robot/module.d.ts +0 -8
  1182. package/dist/core/authentication/credential/entities/robot/module.d.ts.map +0 -1
  1183. package/dist/core/authentication/credential/entities/robot/module.mjs +0 -22
  1184. package/dist/core/authentication/credential/entities/robot/module.mjs.map +0 -1
  1185. package/dist/core/authentication/entities/robot/index.d.ts +0 -2
  1186. package/dist/core/authentication/entities/robot/index.d.ts.map +0 -1
  1187. package/dist/core/authentication/entities/robot/index.mjs +0 -5
  1188. package/dist/core/authentication/entities/robot/module.d.ts +0 -11
  1189. package/dist/core/authentication/entities/robot/module.d.ts.map +0 -1
  1190. package/dist/core/authentication/entities/robot/module.mjs +0 -29
  1191. package/dist/core/authentication/entities/robot/module.mjs.map +0 -1
  1192. package/dist/core/entities/robot/index.d.ts +0 -3
  1193. package/dist/core/entities/robot/index.d.ts.map +0 -1
  1194. package/dist/core/entities/robot/index.mjs +0 -5
  1195. package/dist/core/entities/robot/service.d.ts +0 -28
  1196. package/dist/core/entities/robot/service.d.ts.map +0 -1
  1197. package/dist/core/entities/robot/service.mjs +0 -201
  1198. package/dist/core/entities/robot/service.mjs.map +0 -1
  1199. package/dist/core/entities/robot/types.d.ts +0 -24
  1200. package/dist/core/entities/robot/types.d.ts.map +0 -1
  1201. package/dist/core/entities/robot/types.mjs +0 -4
  1202. package/dist/core/entities/robot-permission/index.d.ts +0 -3
  1203. package/dist/core/entities/robot-permission/index.d.ts.map +0 -1
  1204. package/dist/core/entities/robot-permission/index.mjs +0 -5
  1205. package/dist/core/entities/robot-permission/service.d.ts +0 -25
  1206. package/dist/core/entities/robot-permission/service.d.ts.map +0 -1
  1207. package/dist/core/entities/robot-permission/service.mjs +0 -137
  1208. package/dist/core/entities/robot-permission/service.mjs.map +0 -1
  1209. package/dist/core/entities/robot-permission/types.d.ts +0 -12
  1210. package/dist/core/entities/robot-permission/types.d.ts.map +0 -1
  1211. package/dist/core/entities/robot-role/index.d.ts +0 -3
  1212. package/dist/core/entities/robot-role/index.d.ts.map +0 -1
  1213. package/dist/core/entities/robot-role/index.mjs +0 -5
  1214. package/dist/core/entities/robot-role/service.d.ts +0 -22
  1215. package/dist/core/entities/robot-role/service.d.ts.map +0 -1
  1216. package/dist/core/entities/robot-role/service.mjs +0 -90
  1217. package/dist/core/entities/robot-role/service.mjs.map +0 -1
  1218. package/dist/core/entities/robot-role/types.d.ts +0 -11
  1219. package/dist/core/entities/robot-role/types.d.ts.map +0 -1
  1220. package/dist/core/entities/robot-role/types.mjs +0 -4
  1221. package/dist/core/identity/entities/robot/index.d.ts +0 -2
  1222. package/dist/core/identity/entities/robot/index.d.ts.map +0 -1
  1223. package/dist/core/identity/entities/robot/types.d.ts +0 -8
  1224. package/dist/core/identity/entities/robot/types.d.ts.map +0 -1
  1225. package/dist/core/identity/entities/robot/types.mjs +0 -4
  1226. package/dist/core/oauth2/grant-types/robot-credentials.d.ts +0 -8
  1227. package/dist/core/oauth2/grant-types/robot-credentials.d.ts.map +0 -1
  1228. package/dist/core/oauth2/grant-types/robot-credentials.mjs +0 -39
  1229. package/dist/core/oauth2/grant-types/robot-credentials.mjs.map +0 -1
  1230. package/dist/core/provisioning/entities/robot/index.d.ts +0 -3
  1231. package/dist/core/provisioning/entities/robot/index.d.ts.map +0 -1
  1232. package/dist/core/provisioning/entities/robot/index.mjs +0 -5
  1233. package/dist/core/provisioning/entities/robot/relations-validator.d.ts +0 -6
  1234. package/dist/core/provisioning/entities/robot/relations-validator.d.ts.map +0 -1
  1235. package/dist/core/provisioning/entities/robot/relations-validator.mjs +0 -20
  1236. package/dist/core/provisioning/entities/robot/relations-validator.mjs.map +0 -1
  1237. package/dist/core/provisioning/entities/robot/types.d.ts +0 -25
  1238. package/dist/core/provisioning/entities/robot/types.d.ts.map +0 -1
  1239. package/dist/core/provisioning/entities/robot/types.mjs +0 -4
  1240. package/dist/core/provisioning/entities/robot/validator.d.ts +0 -6
  1241. package/dist/core/provisioning/entities/robot/validator.d.ts.map +0 -1
  1242. package/dist/core/provisioning/entities/robot/validator.mjs +0 -24
  1243. package/dist/core/provisioning/entities/robot/validator.mjs.map +0 -1
  1244. package/dist/core/provisioning/synchronizer/robot/index.d.ts +0 -3
  1245. package/dist/core/provisioning/synchronizer/robot/index.d.ts.map +0 -1
  1246. package/dist/core/provisioning/synchronizer/robot/index.mjs +0 -5
  1247. package/dist/core/provisioning/synchronizer/robot/module.d.ts +0 -17
  1248. package/dist/core/provisioning/synchronizer/robot/module.d.ts.map +0 -1
  1249. package/dist/core/provisioning/synchronizer/robot/module.mjs +0 -72
  1250. package/dist/core/provisioning/synchronizer/robot/module.mjs.map +0 -1
  1251. package/dist/core/provisioning/synchronizer/robot/types.d.ts +0 -9
  1252. package/dist/core/provisioning/synchronizer/robot/types.d.ts.map +0 -1
  1253. package/dist/core/provisioning/synchronizer/robot/types.mjs +0 -4
  1254. package/dist/ui/client/assets/index-BmWsoQro.css +0 -2
  1255. /package/dist/core/{entities/robot-permission → query}/types.mjs +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["OAuth2AuthorizationCodeChallengeMethod","OAuth2GrantError","buildOAuth2CodeChallenge","OAuth2AuthorizationCodeVerifier","repository","verify","code","options","entity","popOneById","invalid","client_id","clientId","realmId","realm_id","redirect_uri","redirectUri","redirectUriMismatch","clientIsPublic","code_challenge","codeVerifier","code_challenge_method","SHA_256","codeVerifierHash"],"sources":["../../../../../../src/core/oauth2/authorization/code/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 { OAuth2AuthorizationCode } from '@authup/core-kit';\nimport { OAuth2AuthorizationCodeChallengeMethod, OAuth2GrantError } from '@authup/specs';\nimport { buildOAuth2CodeChallenge } from '../../helpers.ts';\n\nimport type { IOAuth2AuthorizationCodeRepository } from '../repository/index.ts';\nimport type { IOAuth2AuthorizationCodeVerifier, IOAuth2AuthorizationCodeVerifyOptions } from './types.ts';\n\nexport class OAuth2AuthorizationCodeVerifier implements IOAuth2AuthorizationCodeVerifier {\n protected repository : IOAuth2AuthorizationCodeRepository;\n\n constructor(repository: IOAuth2AuthorizationCodeRepository) {\n this.repository = repository;\n }\n\n async verify(code: string, options: IOAuth2AuthorizationCodeVerifyOptions) : Promise<OAuth2AuthorizationCode> {\n const entity = await this.repository.popOneById(code);\n if (!entity) {\n throw OAuth2GrantError.invalid();\n }\n\n // RFC 6749 §4.1.3: if the client was issued a client_id, verify the\n // authorization code was issued to the authenticated client. Always\n // require a clientId to be supplied so a malformed token request can't\n // bypass the binding by omitting it.\n if (entity.client_id) {\n if (!options.clientId || options.clientId !== entity.client_id) {\n throw OAuth2GrantError.invalid();\n }\n }\n\n // Realm binding (defense in depth): the code's realm (the authorizing\n // identity's realm) must match the authenticated client's realm. Blocks\n // redeeming a realm-A identity's code against a realm-B client — covers\n // codes minted outside OAuth2Authorization.authorize() (identity-provider\n // callback) and any in-flight codes issued before the authorize-side gate.\n if (options.realmId && entity.realm_id && entity.realm_id !== options.realmId) {\n throw OAuth2GrantError.invalid();\n }\n\n if (entity.redirect_uri) {\n if (!options.redirectUri || entity.redirect_uri !== options.redirectUri) {\n throw OAuth2GrantError.redirectUriMismatch();\n }\n }\n\n // Public clients MUST use PKCE (RFC 7636). Defense in depth in case\n // the authorize-side check was bypassed or the client's\n // auth_method changed between authorize and token.\n if (options.clientIsPublic && !entity.code_challenge) {\n throw OAuth2GrantError.invalid('PKCE is required for public clients.');\n }\n\n if (entity.code_challenge) {\n if (!options.codeVerifier) {\n throw OAuth2GrantError.invalid('Code verifier invalid.');\n }\n\n // RFC 7636 §4.3: code_challenge_method defaults to \"plain\" when\n // absent. Only treat the challenge as S256 when the client\n // explicitly sent code_challenge_method=S256.\n if (entity.code_challenge_method === OAuth2AuthorizationCodeChallengeMethod.SHA_256) {\n const codeVerifierHash = await buildOAuth2CodeChallenge(options.codeVerifier);\n if (codeVerifierHash !== entity.code_challenge) {\n throw OAuth2GrantError.invalid('PKCE code_verifier mismatch.');\n }\n } else if (options.codeVerifier !== entity.code_challenge) {\n throw OAuth2GrantError.invalid('PKCE code_verifier mismatch.');\n }\n }\n\n return entity;\n }\n}\n"],"mappings":";;;;;;AAcA,IAAaG,kCAAb,MAAaA;CACCC;CAEV,YAAYA,YAAgD;EACxD,KAAKA,aAAaA;CACtB;CAEA,MAAMC,OAAOC,MAAcC,SAAmF;EAC1G,MAAMC,SAAS,MAAM,KAAKJ,WAAWK,WAAWH,IAAAA;EAChD,IAAI,CAACE,QACD,MAAMP,iBAAiBS,QAAO;EAOlC,IAAIF,OAAOG;OACH,CAACJ,QAAQK,YAAYL,QAAQK,aAAaJ,OAAOG,WACjD,MAAMV,iBAAiBS,QAAO;EAAA;EAStC,IAAIH,QAAQM,WAAWL,OAAOM,YAAYN,OAAOM,aAAaP,QAAQM,SAClE,MAAMZ,iBAAiBS,QAAO;EAGlC,IAAIF,OAAOO;OACH,CAACR,QAAQS,eAAeR,OAAOO,iBAAiBR,QAAQS,aACxD,MAAMf,iBAAiBgB,oBAAmB;EAAA;EAOlD,IAAIV,QAAQW,kBAAkB,CAACV,OAAOW,gBAClC,MAAMlB,iBAAiBS,QAAQ,sCAAA;EAGnC,IAAIF,OAAOW,gBAAgB;GACvB,IAAI,CAACZ,QAAQa,cACT,MAAMnB,iBAAiBS,QAAQ,wBAAA;GAMnC,IAAIF,OAAOa,0BAA0BrB,uCAAuCsB;QAEpEC,MAD2BrB,yBAAyBK,QAAQa,YAAY,MACnDZ,OAAOW,gBAC5B,MAAMlB,iBAAiBS,QAAQ,8BAAA;GAAA,OAEhC,IAAIH,QAAQa,iBAAiBZ,OAAOW,gBACvC,MAAMlB,iBAAiBS,QAAQ,8BAAA;EAEvC;EAEA,OAAOF;CACX;AACJ"}
1
+ {"version":3,"file":"module.mjs","names":["OAuth2AuthorizationCodeChallengeMethod","OAuth2GrantError","buildOAuth2CodeChallenge","OAuth2AuthorizationCodeVerifier","repository","verify","code","options","entity","popOneById","invalid","client_id","clientId","realmId","realm_id","redirect_uri","redirectUri","redirectUriMismatch","clientIsPublic","code_challenge","codeVerifier","code_challenge_method","SHA_256","codeVerifierHash"],"sources":["../../../../../../src/core/oauth2/authorization/code/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 { OAuth2AuthorizationCode } from '@authup/core-kit';\nimport { OAuth2AuthorizationCodeChallengeMethod, OAuth2GrantError } from '@authup/specs';\nimport { buildOAuth2CodeChallenge } from '../../helpers.ts';\n\nimport type { IOAuth2AuthorizationCodeRepository } from '../repository/index.ts';\nimport type { IOAuth2AuthorizationCodeVerifier, IOAuth2AuthorizationCodeVerifyOptions } from './types.ts';\n\nexport class OAuth2AuthorizationCodeVerifier implements IOAuth2AuthorizationCodeVerifier {\n protected repository : IOAuth2AuthorizationCodeRepository;\n\n constructor(repository: IOAuth2AuthorizationCodeRepository) {\n this.repository = repository;\n }\n\n async verify(code: string, options: IOAuth2AuthorizationCodeVerifyOptions) : Promise<OAuth2AuthorizationCode> {\n const entity = await this.repository.popOneById(code);\n if (!entity) {\n throw OAuth2GrantError.invalid();\n }\n\n // RFC 6749 §4.1.3: if the client was issued a client_id, verify the\n // authorization code was issued to the authenticated client. Always\n // require a clientId to be supplied so a malformed token request can't\n // bypass the binding by omitting it.\n if (entity.client_id) {\n if (!options.clientId || options.clientId !== entity.client_id) {\n throw OAuth2GrantError.invalid();\n }\n }\n\n // Realm binding (defense in depth): the code's realm (the authorizing\n // identity's realm) must match the authenticated client's realm. Blocks\n // redeeming a realm-A identity's code against a realm-B client — covers\n // codes minted outside OAuth2Authorization.authorize() (identity-provider\n // callback) and any in-flight codes issued before the authorize-side gate.\n if (options.realmId && entity.realm_id && entity.realm_id !== options.realmId) {\n throw OAuth2GrantError.invalid();\n }\n\n if (entity.redirect_uri) {\n if (!options.redirectUri || entity.redirect_uri !== options.redirectUri) {\n throw OAuth2GrantError.redirectUriMismatch();\n }\n }\n\n // Public clients MUST use PKCE (RFC 7636). Defense in depth in case\n // the authorize-side check was bypassed or the client's\n // auth_method changed between authorize and token.\n if (options.clientIsPublic && !entity.code_challenge) {\n throw OAuth2GrantError.invalid('PKCE is required for public clients.');\n }\n\n if (entity.code_challenge) {\n if (!options.codeVerifier) {\n throw OAuth2GrantError.invalid('Code verifier invalid.');\n }\n\n // RFC 7636 §4.3: code_challenge_method defaults to \"plain\" when\n // absent. Only treat the challenge as S256 when the client\n // explicitly sent code_challenge_method=S256.\n if (entity.code_challenge_method === OAuth2AuthorizationCodeChallengeMethod.SHA_256) {\n const codeVerifierHash = await buildOAuth2CodeChallenge(options.codeVerifier);\n if (codeVerifierHash !== entity.code_challenge) {\n throw OAuth2GrantError.invalid('PKCE code_verifier mismatch.');\n }\n } else if (options.codeVerifier !== entity.code_challenge) {\n throw OAuth2GrantError.invalid('PKCE code_verifier mismatch.');\n }\n }\n\n return entity;\n }\n}\n"],"mappings":";;;;;;AAcA,IAAaG,kCAAb,MAAaA;CACCC;CAEV,YAAYA,YAAgD;EACxD,KAAKA,aAAaA;CACtB;CAEA,MAAMC,OAAOC,MAAcC,SAAmF;EAC1G,MAAMC,SAAS,MAAM,KAAKJ,WAAWK,WAAWH,IAAAA;EAChD,IAAI,CAACE,QACD,MAAMP,iBAAiBS,QAAO;EAOlC,IAAIF,OAAOG,WACH;OAAA,CAACJ,QAAQK,YAAYL,QAAQK,aAAaJ,OAAOG,WACjD,MAAMV,iBAAiBS,QAAO;EAAA;EAStC,IAAIH,QAAQM,WAAWL,OAAOM,YAAYN,OAAOM,aAAaP,QAAQM,SAClE,MAAMZ,iBAAiBS,QAAO;EAGlC,IAAIF,OAAOO,cACH;OAAA,CAACR,QAAQS,eAAeR,OAAOO,iBAAiBR,QAAQS,aACxD,MAAMf,iBAAiBgB,oBAAmB;EAAA;EAOlD,IAAIV,QAAQW,kBAAkB,CAACV,OAAOW,gBAClC,MAAMlB,iBAAiBS,QAAQ,sCAAA;EAGnC,IAAIF,OAAOW,gBAAgB;GACvB,IAAI,CAACZ,QAAQa,cACT,MAAMnB,iBAAiBS,QAAQ,wBAAA;GAMnC,IAAIF,OAAOa,0BAA0BrB,uCAAuCsB,SAEpEC;QAAAA,MAD2BrB,yBAAyBK,QAAQa,YAAY,MACnDZ,OAAOW,gBAC5B,MAAMlB,iBAAiBS,QAAQ,8BAAA;GAAA,OAEhC,IAAIH,QAAQa,iBAAiBZ,OAAOW,gBACvC,MAAMlB,iBAAiBS,QAAQ,8BAAA;EAEvC;EAEA,OAAOF;CACX;AACJ"}
@@ -24,11 +24,11 @@ var OAuth2AuthorizationCodeRequestVerifier = class {
24
24
  if (!client) throw OAuth2ClientError.invalid();
25
25
  if (!client.active) throw OAuth2ClientError.inactive();
26
26
  assertClientGrantAllowed(client, OAuth2TokenGrant.AUTHORIZATION_CODE);
27
- if (!client.redirect_uri) throw OAuth2GrantError.redirectUriMismatch();
27
+ if (!client.redirectUri) throw OAuth2GrantError.redirectUriMismatch();
28
28
  if (isClientPublic(client) && !data.code_challenge) throw OAuth2RequestError.malformed("PKCE code_challenge is required for public clients.");
29
29
  if (isClientPublic(client) && !data.state) throw OAuth2RequestError.malformed("state is required for public clients in the code flow.");
30
30
  data.client_id = client.id;
31
- data.realm_id = client.realm_id;
31
+ data.realm_id = client.realmId;
32
32
  const scopes = await this.scopeRepository.findByClientId(client.id);
33
33
  const scopeNames = scopes.map((scope) => scope.name);
34
34
  if (data.scope) {
@@ -36,7 +36,7 @@ var OAuth2AuthorizationCodeRequestVerifier = class {
36
36
  } else data.scope = scopeNames.join(" ");
37
37
  const redirectUriVerified = !!data.redirect_uri;
38
38
  if (data.redirect_uri) {
39
- const redirectUris = client.redirect_uri.split(",");
39
+ const redirectUris = client.redirectUri.split(",");
40
40
  if (!isSimpleMatch(data.redirect_uri, redirectUris)) throw OAuth2GrantError.redirectUriMismatch();
41
41
  }
42
42
  return {
@@ -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","redirect_uri","redirectUriMismatch","code_challenge","state","id","scopes","findByClientId","scopeNames","map","scope","name","GLOBAL","insufficient","join","redirectUriVerified","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.redirect_uri) {\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.realm_id;\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.redirect_uri.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,cACR,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,OAAOF;EAEvB,MAAMY,SAAS,MAAM,KAAKlB,gBAAgBmB,eAAeX,OAAOS,EAAE;EAClE,MAAMG,aAAaF,OAAOG,KAAKC,UAAUA,MAAMC,IAAI;EACnD,IAAIpB,KAAKmB;OAED,CAAC1B,gBAAgBwB,YAAYjB,KAAKmB,KAAK,KACvC,CAAC1B,gBAAgBO,KAAKmB,OAAOnC,UAAUqC,MAAM,GAE7C,MAAM9B,iBAAiB+B,aAAY;EAAA,OAGvCtB,KAAKmB,QAAQF,WAAWM,KAAK,GAAA;EAOjC,MAAMC,sBAAsB,CAAC,CAACxB,KAAKU;EACnC,IAAIV,KAAKU,cAAc;GACnB,MAAMe,eAAepB,OAAOK,aAAagB,MAAM,GAAA;GAE/C,IAAI,CAACxC,cAAcc,KAAKU,cAAce,YAAAA,GAClC,MAAMpC,iBAAiBsB,oBAAmB;EAElD;EAEA,OAAO;GACHX;GACAK;GACAU;GACAS;EACJ;CACJ;AACJ"}
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"}
@@ -2,12 +2,12 @@ import type { JWTAlgorithm, OAuth2TokenPayload } from '@authup/specs';
2
2
  import type { Session } from '@authup/core-kit';
3
3
  /**
4
4
  * Derive the OIDC `amr` / `acr` claims from the backing session's
5
- * auth_method + mfa_at (plan 050). Pre-column sessions (null auth_method)
5
+ * authMethod + mfaAt (plan 050). Pre-column sessions (null authMethod)
6
6
  * yield no claims — authup cannot retroactively know how an old session
7
7
  * authenticated. M2M methods yield none either (amr/acr are user-flow
8
8
  * claims; those grants mint no id_token).
9
9
  */
10
- export declare function deriveAmrAcr(session: Pick<Session, 'auth_method' | 'mfa_at'> | null): Pick<OAuth2TokenPayload, 'amr' | 'acr'>;
10
+ export declare function deriveAmrAcr(session: Pick<Session, 'authMethod' | 'mfaAt'> | null): Pick<OAuth2TokenPayload, 'amr' | 'acr'>;
11
11
  export declare function generateOAuth2CodeVerifier(): string;
12
12
  export declare function base64URLEncode(arrayBuffer: ArrayBuffer): string;
13
13
  export declare function buildOAuth2TokenHash(value: string, alg?: `${JWTAlgorithm}` | null): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/authorization/helpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAMtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,GAAG,IAAI,GACxD,IAAI,CAAC,kBAAkB,EAAE,KAAK,GAAG,KAAK,CAAC,CAiCzC;AAED,wBAAgB,0BAA0B,WAazC;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,WAAW,UAWvD;AAWD,wBAAsB,oBAAoB,CACtC,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,GAC9B,OAAO,CAAC,MAAM,CAAC,CAkBlB;AAED,wBAAsB,wBAAwB,CAAC,YAAY,EAAE,MAAM,mBAMlE"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/authorization/helpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAMtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,IAAI,GACtD,IAAI,CAAC,kBAAkB,EAAE,KAAK,GAAG,KAAK,CAAC,CAiCzC;AAED,wBAAgB,0BAA0B,WAazC;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,WAAW,UAWvD;AAWD,wBAAsB,oBAAoB,CACtC,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,GAC9B,OAAO,CAAC,MAAM,CAAC,CAkBlB;AAED,wBAAsB,wBAAwB,CAAC,YAAY,EAAE,MAAM,mBAMlE"}
@@ -7,14 +7,14 @@ import { subtle } from "uncrypto";
7
7
  //#region src/core/oauth2/authorization/helpers.ts
8
8
  /**
9
9
  * Derive the OIDC `amr` / `acr` claims from the backing session's
10
- * auth_method + mfa_at (plan 050). Pre-column sessions (null auth_method)
10
+ * authMethod + mfaAt (plan 050). Pre-column sessions (null authMethod)
11
11
  * yield no claims — authup cannot retroactively know how an old session
12
12
  * authenticated. M2M methods yield none either (amr/acr are user-flow
13
13
  * claims; those grants mint no id_token).
14
14
  */ function deriveAmrAcr(session) {
15
- if (!session || !session.auth_method) return {};
15
+ if (!session || !session.authMethod) return {};
16
16
  const amr = [];
17
- switch (session.auth_method) {
17
+ switch (session.authMethod) {
18
18
  case SessionAuthMethod.PASSWORD:
19
19
  case SessionAuthMethod.LDAP:
20
20
  amr.push(OAuth2AuthenticationMethodReference.PASSWORD);
@@ -24,10 +24,10 @@ import { subtle } from "uncrypto";
24
24
  break;
25
25
  default: return {};
26
26
  }
27
- if (session.mfa_at) amr.push(OAuth2AuthenticationMethodReference.OTP);
27
+ if (session.mfaAt) amr.push(OAuth2AuthenticationMethodReference.OTP);
28
28
  return {
29
29
  amr,
30
- acr: session.mfa_at ? OAuth2AuthenticationContextClass.MFA : OAuth2AuthenticationContextClass.PASSWORD
30
+ acr: session.mfaAt ? OAuth2AuthenticationContextClass.MFA : OAuth2AuthenticationContextClass.PASSWORD
31
31
  };
32
32
  }
33
33
  function generateOAuth2CodeVerifier() {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.mjs","names":["JWTError","OAuth2AuthenticationContextClass","OAuth2AuthenticationMethodReference","SessionAuthMethod","subtle","deriveAmrAcr","session","auth_method","amr","PASSWORD","LDAP","push","EXTERNAL","mfa_at","OTP","acr","MFA","generateOAuth2CodeVerifier","length","charset","codeVerifier","randomValues","Uint8Array","crypto","getRandomValues","i","base64URLEncode","arrayBuffer","charCode","Array","from","btoa","String","fromCharCode","apply","replace","TOKEN_HASH_DIGESTS","name","halfLength","buildOAuth2TokenHash","value","alg","digest","slice","headerPropertyInvalid","encoder","TextEncoder","data","encode","hashBuffer","halfHash","buildOAuth2CodeChallenge"],"sources":["../../../../src/core/oauth2/authorization/helpers.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\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 { JWTAlgorithm, OAuth2TokenPayload } from '@authup/specs';\nimport {\n JWTError,\n OAuth2AuthenticationContextClass,\n OAuth2AuthenticationMethodReference,\n} from '@authup/specs';\nimport type { Session } from '@authup/core-kit';\nimport { SessionAuthMethod } from '@authup/core-kit';\nimport { subtle } from 'uncrypto';\n\n/**\n * Derive the OIDC `amr` / `acr` claims from the backing session's\n * auth_method + mfa_at (plan 050). Pre-column sessions (null auth_method)\n * yield no claims — authup cannot retroactively know how an old session\n * authenticated. M2M methods yield none either (amr/acr are user-flow\n * claims; those grants mint no id_token).\n */\nexport function deriveAmrAcr(\n session: Pick<Session, 'auth_method' | 'mfa_at'> | null,\n): Pick<OAuth2TokenPayload, 'amr' | 'acr'> {\n if (!session || !session.auth_method) {\n return {};\n }\n\n const amr : string[] = [];\n switch (session.auth_method) {\n case SessionAuthMethod.PASSWORD:\n case SessionAuthMethod.LDAP: {\n // LDAP is still a password factor for amr — the finer\n // distinction lives in the authup-local auth_method.\n amr.push(OAuth2AuthenticationMethodReference.PASSWORD);\n break;\n }\n case SessionAuthMethod.EXTERNAL: {\n amr.push(OAuth2AuthenticationMethodReference.EXTERNAL);\n break;\n }\n default: {\n return {};\n }\n }\n\n if (session.mfa_at) {\n amr.push(OAuth2AuthenticationMethodReference.OTP);\n }\n\n return {\n amr,\n acr: session.mfa_at ?\n OAuth2AuthenticationContextClass.MFA :\n OAuth2AuthenticationContextClass.PASSWORD,\n };\n}\n\nexport function generateOAuth2CodeVerifier() {\n const length = 64;\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n\n let codeVerifier = '';\n const randomValues = new Uint8Array(length);\n crypto.getRandomValues(randomValues);\n\n for (let i = 0; i < length; i++) {\n codeVerifier += charset[randomValues[i] % charset.length];\n }\n\n return codeVerifier;\n}\n\nexport function base64URLEncode(arrayBuffer: ArrayBuffer) {\n // Convert the ArrayBuffer to string using Uint8 array.\n // btoa takes chars from 0-255 and base64 encodes.\n // Then convert the base64 encoded to base64url encoded.\n // (replace + with -, replace / with _, trim trailing =)\n const charCode = Array.from(new Uint8Array(arrayBuffer));\n\n return btoa(String.fromCharCode.apply(null, charCode))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n// OIDC Core §3.1.3.6: at_hash / c_hash use the hash algorithm of the id_token's\n// JWS alg (…S256 → SHA-256, …S384 → SHA-384, …S512 → SHA-512) and keep the LEFT\n// HALF of the digest — so the half-length follows the digest (16/24/32 bytes).\nconst TOKEN_HASH_DIGESTS : Record<string, { name: string, halfLength: number }> = {\n 256: { name: 'SHA-256', halfLength: 16 },\n 384: { name: 'SHA-384', halfLength: 24 },\n 512: { name: 'SHA-512', halfLength: 32 },\n};\n\nexport async function buildOAuth2TokenHash(\n value: string,\n alg?: `${JWTAlgorithm}` | null,\n) : Promise<string> {\n // A key row without a persisted alg (nullable legacy column) signs with\n // the signer's *256 default (RS256/ES256/HS256) — derive the matching\n // SHA-256 digest. An unrecognized alg still fails loud — silently\n // defaulting there would mint a hash no conforming verifier accepts.\n const digest = alg ?\n TOKEN_HASH_DIGESTS[alg.slice(-3)] :\n TOKEN_HASH_DIGESTS['256'];\n if (!digest) {\n throw JWTError.headerPropertyInvalid('alg');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n const hashBuffer = await subtle.digest(digest.name, data);\n const halfHash = hashBuffer.slice(0, digest.halfLength);\n\n return base64URLEncode(halfHash);\n}\n\nexport async function buildOAuth2CodeChallenge(codeVerifier: string) {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const arrayBuffer = await subtle.digest('SHA-256', data);\n\n return base64URLEncode(arrayBuffer);\n}\n"],"mappings":";;;;;;;;;;;;;GAwBA,SAAgBK,aACZC,SAAuD;CAEvD,IAAI,CAACA,WAAW,CAACA,QAAQC,aACrB,OAAO,CAAC;CAGZ,MAAMC,MAAiB,CAAA;CACvB,QAAQF,QAAQC,aAAhB;EACI,KAAKJ,kBAAkBM;EACvB,KAAKN,kBAAkBO;GAGnBF,IAAIG,KAAKT,oCAAoCO,QAAQ;GACrD;EAEJ,KAAKN,kBAAkBS;GACnBJ,IAAIG,KAAKT,oCAAoCU,QAAQ;GACrD;EAEJ,SACI,OAAO,CAAC;CAEhB;CAEA,IAAIN,QAAQO,QACRL,IAAIG,KAAKT,oCAAoCY,GAAG;CAGpD,OAAO;EACHN;EACAO,KAAKT,QAAQO,SACTZ,iCAAiCe,MACjCf,iCAAiCQ;CACzC;AACJ;AAEA,SAAgBQ,6BAAAA;CACZ,MAAMC,SAAS;CACf,MAAMC,UAAU;CAEhB,IAAIC,eAAe;CACnB,MAAMC,eAAe,IAAIC,WAAWJ,MAAAA;CACpCK,OAAOC,gBAAgBH,YAAAA;CAEvB,KAAK,IAAII,IAAI,GAAGA,IAAIP,QAAQO,KACxBL,gBAAgBD,QAAQE,aAAaI,KAAKN;CAG9C,OAAOC;AACX;AAEA,SAAgBM,gBAAgBC,aAAwB;CAKpD,MAAMC,WAAWC,MAAMC,KAAK,IAAIR,WAAWK,WAAAA,CAAAA;CAE3C,OAAOI,KAAKC,OAAOC,aAAaC,MAAM,MAAMN,QAAAA,CAAAA,CAAAA,CACvCO,QAAQ,OAAO,GAAA,CAAA,CACfA,QAAQ,OAAO,GAAA,CAAA,CACfA,QAAQ,OAAO,EAAA;AACxB;AAKA,MAAMC,qBAA4E;CAC9E,KAAK;EAAEC,MAAM;EAAWC,YAAY;CAAG;CACvC,KAAK;EAAED,MAAM;EAAWC,YAAY;CAAG;CACvC,KAAK;EAAED,MAAM;EAAWC,YAAY;CAAG;AAC3C;AAEA,eAAsBC,qBAClBC,OACAC,KAA8B;CAM9B,MAAMC,SAASD,MACXL,mBAAmBK,IAAIE,MAAM,EAAC,KAC9BP,mBAAmB;CACvB,IAAI,CAACM,QACD,MAAM1C,SAAS4C,sBAAsB,KAAA;CAIzC,MAAMG,OAAOF,IADOC,YACPD,CAAAA,CAAQG,OAAOR,KAAAA;CAI5B,OAAOd,iBAFUuB,MADQ7C,OAAOsC,OAAOA,OAAOL,MAAMU,IAAAA,EAAAA,CACxBJ,MAAM,GAAGD,OAAOJ,UAErBY,CAAAA;AAC3B;AAEA,eAAsBC,yBAAyB/B,cAAoB;CAE/D,MAAM2B,OAAOF,IADOC,YACPD,CAAAA,CAAQG,OAAO5B,YAAAA;CAG5B,OAAOM,gBAAgBC,MAFGvB,OAAOsC,OAAO,WAAWK,IAAAA,CAE5BpB;AAC3B"}
1
+ {"version":3,"file":"helpers.mjs","names":["JWTError","OAuth2AuthenticationContextClass","OAuth2AuthenticationMethodReference","SessionAuthMethod","subtle","deriveAmrAcr","session","authMethod","amr","PASSWORD","LDAP","push","EXTERNAL","mfaAt","OTP","acr","MFA","generateOAuth2CodeVerifier","length","charset","codeVerifier","randomValues","Uint8Array","crypto","getRandomValues","i","base64URLEncode","arrayBuffer","charCode","Array","from","btoa","String","fromCharCode","apply","replace","TOKEN_HASH_DIGESTS","name","halfLength","buildOAuth2TokenHash","value","alg","digest","slice","headerPropertyInvalid","encoder","TextEncoder","data","encode","hashBuffer","halfHash","buildOAuth2CodeChallenge"],"sources":["../../../../src/core/oauth2/authorization/helpers.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\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 { JWTAlgorithm, OAuth2TokenPayload } from '@authup/specs';\nimport {\n JWTError,\n OAuth2AuthenticationContextClass,\n OAuth2AuthenticationMethodReference,\n} from '@authup/specs';\nimport type { Session } from '@authup/core-kit';\nimport { SessionAuthMethod } from '@authup/core-kit';\nimport { subtle } from 'uncrypto';\n\n/**\n * Derive the OIDC `amr` / `acr` claims from the backing session's\n * authMethod + mfaAt (plan 050). Pre-column sessions (null authMethod)\n * yield no claims — authup cannot retroactively know how an old session\n * authenticated. M2M methods yield none either (amr/acr are user-flow\n * claims; those grants mint no id_token).\n */\nexport function deriveAmrAcr(\n session: Pick<Session, 'authMethod' | 'mfaAt'> | null,\n): Pick<OAuth2TokenPayload, 'amr' | 'acr'> {\n if (!session || !session.authMethod) {\n return {};\n }\n\n const amr : string[] = [];\n switch (session.authMethod) {\n case SessionAuthMethod.PASSWORD:\n case SessionAuthMethod.LDAP: {\n // LDAP is still a password factor for amr — the finer\n // distinction lives in the authup-local authMethod.\n amr.push(OAuth2AuthenticationMethodReference.PASSWORD);\n break;\n }\n case SessionAuthMethod.EXTERNAL: {\n amr.push(OAuth2AuthenticationMethodReference.EXTERNAL);\n break;\n }\n default: {\n return {};\n }\n }\n\n if (session.mfaAt) {\n amr.push(OAuth2AuthenticationMethodReference.OTP);\n }\n\n return {\n amr,\n acr: session.mfaAt ?\n OAuth2AuthenticationContextClass.MFA :\n OAuth2AuthenticationContextClass.PASSWORD,\n };\n}\n\nexport function generateOAuth2CodeVerifier() {\n const length = 64;\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n\n let codeVerifier = '';\n const randomValues = new Uint8Array(length);\n crypto.getRandomValues(randomValues);\n\n for (let i = 0; i < length; i++) {\n codeVerifier += charset[randomValues[i] % charset.length];\n }\n\n return codeVerifier;\n}\n\nexport function base64URLEncode(arrayBuffer: ArrayBuffer) {\n // Convert the ArrayBuffer to string using Uint8 array.\n // btoa takes chars from 0-255 and base64 encodes.\n // Then convert the base64 encoded to base64url encoded.\n // (replace + with -, replace / with _, trim trailing =)\n const charCode = Array.from(new Uint8Array(arrayBuffer));\n\n return btoa(String.fromCharCode.apply(null, charCode))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n// OIDC Core §3.1.3.6: at_hash / c_hash use the hash algorithm of the id_token's\n// JWS alg (…S256 → SHA-256, …S384 → SHA-384, …S512 → SHA-512) and keep the LEFT\n// HALF of the digest — so the half-length follows the digest (16/24/32 bytes).\nconst TOKEN_HASH_DIGESTS : Record<string, { name: string, halfLength: number }> = {\n 256: { name: 'SHA-256', halfLength: 16 },\n 384: { name: 'SHA-384', halfLength: 24 },\n 512: { name: 'SHA-512', halfLength: 32 },\n};\n\nexport async function buildOAuth2TokenHash(\n value: string,\n alg?: `${JWTAlgorithm}` | null,\n) : Promise<string> {\n // A key row without a persisted alg (nullable legacy column) signs with\n // the signer's *256 default (RS256/ES256/HS256) — derive the matching\n // SHA-256 digest. An unrecognized alg still fails loud — silently\n // defaulting there would mint a hash no conforming verifier accepts.\n const digest = alg ?\n TOKEN_HASH_DIGESTS[alg.slice(-3)] :\n TOKEN_HASH_DIGESTS['256'];\n if (!digest) {\n throw JWTError.headerPropertyInvalid('alg');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n const hashBuffer = await subtle.digest(digest.name, data);\n const halfHash = hashBuffer.slice(0, digest.halfLength);\n\n return base64URLEncode(halfHash);\n}\n\nexport async function buildOAuth2CodeChallenge(codeVerifier: string) {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const arrayBuffer = await subtle.digest('SHA-256', data);\n\n return base64URLEncode(arrayBuffer);\n}\n"],"mappings":";;;;;;;;;;;;;GAwBA,SAAgBK,aACZC,SAAqD;CAErD,IAAI,CAACA,WAAW,CAACA,QAAQC,YACrB,OAAO,CAAC;CAGZ,MAAMC,MAAiB,CAAA;CACvB,QAAQF,QAAQC,YAAhB;EACI,KAAKJ,kBAAkBM;EACvB,KAAKN,kBAAkBO;GAGnBF,IAAIG,KAAKT,oCAAoCO,QAAQ;GACrD;EAEJ,KAAKN,kBAAkBS;GACnBJ,IAAIG,KAAKT,oCAAoCU,QAAQ;GACrD;EAEJ,SACI,OAAO,CAAC;CAEhB;CAEA,IAAIN,QAAQO,OACRL,IAAIG,KAAKT,oCAAoCY,GAAG;CAGpD,OAAO;EACHN;EACAO,KAAKT,QAAQO,QACTZ,iCAAiCe,MACjCf,iCAAiCQ;CACzC;AACJ;AAEA,SAAgBQ,6BAAAA;CACZ,MAAMC,SAAS;CACf,MAAMC,UAAU;CAEhB,IAAIC,eAAe;CACnB,MAAMC,eAAe,IAAIC,WAAWJ,MAAAA;CACpCK,OAAOC,gBAAgBH,YAAAA;CAEvB,KAAK,IAAII,IAAI,GAAGA,IAAIP,QAAQO,KACxBL,gBAAgBD,QAAQE,aAAaI,KAAKN;CAG9C,OAAOC;AACX;AAEA,SAAgBM,gBAAgBC,aAAwB;CAKpD,MAAMC,WAAWC,MAAMC,KAAK,IAAIR,WAAWK,WAAAA,CAAAA;CAE3C,OAAOI,KAAKC,OAAOC,aAAaC,MAAM,MAAMN,QAAAA,CAAAA,CAAAA,CACvCO,QAAQ,OAAO,GAAA,CAAA,CACfA,QAAQ,OAAO,GAAA,CAAA,CACfA,QAAQ,OAAO,EAAA;AACxB;AAKA,MAAMC,qBAA4E;CAC9E,KAAK;EAAEC,MAAM;EAAWC,YAAY;CAAG;CACvC,KAAK;EAAED,MAAM;EAAWC,YAAY;CAAG;CACvC,KAAK;EAAED,MAAM;EAAWC,YAAY;CAAG;AAC3C;AAEA,eAAsBC,qBAClBC,OACAC,KAA8B;CAM9B,MAAMC,SAASD,MACXL,mBAAmBK,IAAIE,MAAM,EAAC,KAC9BP,mBAAmB;CACvB,IAAI,CAACM,QACD,MAAM1C,SAAS4C,sBAAsB,KAAA;CAIzC,MAAMG,OAAOF,IADOC,YACPD,CAAAA,CAAQG,OAAOR,KAAAA;CAI5B,OAAOd,iBAFUuB,MADQ7C,OAAOsC,OAAOA,OAAOL,MAAMU,IAAAA,EAAAA,CACxBJ,MAAM,GAAGD,OAAOJ,UAErBY,CAAAA;AAC3B;AAEA,eAAsBC,yBAAyB/B,cAAoB;CAE/D,MAAM2B,OAAOF,IADOC,YACPD,CAAAA,CAAQG,OAAO5B,YAAAA;CAG5B,OAAOM,gBAAgBC,MAFGvB,OAAOsC,OAAO,WAAWK,IAAAA,CAE5BpB;AAC3B"}
@@ -47,7 +47,7 @@ var OAuth2Authorization = class {
47
47
  actorName: identity.data.name,
48
48
  realmId: data.realm_id ?? null,
49
49
  data: {
50
- reason: options.client?.built_in ? "autoConsent" : "consent",
50
+ reason: options.client?.builtIn ? "autoConsent" : "consent",
51
51
  ...data.scope ? { scope: data.scope } : {}
52
52
  }
53
53
  });
@@ -85,21 +85,21 @@ var OAuth2Authorization = class {
85
85
  ...data.state ? { state: data.state } : {}
86
86
  };
87
87
  if (!identity) throw OAuth2RequestError.identityInvalid();
88
- if (data.realm_id && identity.data.realm_id !== data.realm_id) throw OAuth2LoginRequiredError.realmMismatch();
88
+ if (data.realm_id && identity.data.realmId !== data.realm_id) throw OAuth2LoginRequiredError.realmMismatch();
89
89
  const nowSeconds = Math.floor(Date.now() / 1e3);
90
90
  let authTime = nowSeconds;
91
91
  let session = null;
92
92
  if (options.sessionId) {
93
93
  session = await this.sessionManager.findOneById(options.sessionId);
94
- if (session && session.created_at) authTime = Math.floor(new Date(session.created_at).getTime() / 1e3);
94
+ if (session && session.createdAt) authTime = Math.floor(new Date(session.createdAt).getTime() / 1e3);
95
95
  }
96
96
  if (this.mfaChallengeProvider && identity.type === IdentityType.USER) {
97
97
  const challenge = await this.mfaChallengeProvider.challenge(identity.data.id, { issueMaterial: false });
98
- if (challenge.required && !session?.mfa_at) throw OAuth2MfaRequiredError.challengeRequired();
98
+ if (challenge.required && !session?.mfaAt) throw OAuth2MfaRequiredError.challengeRequired();
99
99
  if (challenge.enrollmentRequired) throw OAuth2MfaRequiredError.enrollmentRequired();
100
100
  if (challenge.required && data.acr_values) {
101
101
  if (data.acr_values.split(" ").includes(OAuth2AuthenticationContextClass.MFA)) {
102
- const mfaAtSeconds = session?.mfa_at ? Math.floor(new Date(session.mfa_at).getTime() / 1e3) : null;
102
+ const mfaAtSeconds = session?.mfaAt ? Math.floor(new Date(session.mfaAt).getTime() / 1e3) : null;
103
103
  if (mfaAtSeconds === null || nowSeconds - mfaAtSeconds > this.mfaFreshnessMaxAge) throw OAuth2MfaRequiredError.stepUpRequired();
104
104
  }
105
105
  }
@@ -109,10 +109,10 @@ var OAuth2Authorization = class {
109
109
  const maxAge = Number(data.max_age);
110
110
  if (Number.isFinite(maxAge) && nowSeconds - authTime > maxAge) throw OAuth2LoginRequiredError.reauthenticationRequired();
111
111
  }
112
- if (options.client?.access_policy_id) {
112
+ if (options.client?.accessPolicyId) {
113
113
  let allowed = false;
114
114
  const subject = toIdentityPolicyData(identity);
115
- if (this.accessPolicyEvaluator && subject) allowed = await this.accessPolicyEvaluator.evaluate(options.client.access_policy_id, subject);
115
+ if (this.accessPolicyEvaluator && subject) allowed = await this.accessPolicyEvaluator.evaluate(options.client.accessPolicyId, subject);
116
116
  if (!allowed) throw OAuth2AccessDeniedError.forClient(options.redirectUriVerified && data.redirect_uri ? {
117
117
  redirectUri: data.redirect_uri,
118
118
  state: data.state ?? null
@@ -121,7 +121,7 @@ var OAuth2Authorization = class {
121
121
  output.authorizationCode = (await this.codeIssuer.issue(data, identity, {
122
122
  sessionId: options.sessionId,
123
123
  authTime,
124
- authMethod: session?.auth_method ?? null
124
+ authMethod: session?.authMethod ?? null
125
125
  })).id;
126
126
  return output;
127
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["EventName","EventRefType","EventScope","IdentityType","hasInstanceof","OAUTH2_ACCESS_DENIED_ERROR_INSTANCE","OAUTH2_LOGIN_REQUIRED_ERROR_INSTANCE","OAUTH2_MFA_REQUIRED_ERROR_INSTANCE","OAuth2AccessDeniedError","OAuth2AuthenticationContextClass","OAuth2AuthorizationPrompt","OAuth2AuthorizationResponseType","OAuth2GrantError","OAuth2LoginRequiredError","OAuth2MfaRequiredError","OAuth2RequestError","OAuth2ResponseTypeError","toIdentityPolicyData","DEFAULT_PROMPT_LOGIN_MAX_AGE","DEFAULT_MFA_FRESHNESS_MAX_AGE","OAuth2Authorization","codeIssuer","sessionManager","eventService","metrics","promptLoginMaxAge","mfaFreshnessMaxAge","mfaChallengeProvider","accessPolicyEvaluator","ctx","authorize","data","identity","options","result","authorizeInner","record","scope","OAUTH2","name","AUTHORIZE","refType","CLIENT","refId","client","id","client_id","clientId","actorType","type","actorId","actorName","realmId","realm_id","reason","built_in","recordAuthorize","e","AUTHORIZE_FAILED","responseTypes","response_type","Array","isArray","split","responseType","CODE","unsupported","includes","redirect_uri","redirectUriMismatch","output","redirectUri","state","identityInvalid","realmMismatch","nowSeconds","Math","floor","Date","now","authTime","session","sessionId","findOneById","created_at","getTime","USER","challenge","issueMaterial","required","mfa_at","challengeRequired","enrollmentRequired","acr_values","acrValues","MFA","mfaAtSeconds","stepUpRequired","prompts","prompt","LOGIN","reauthenticationRequired","max_age","maxAge","Number","isFinite","access_policy_id","allowed","subject","evaluate","forClient","redirectUriVerified","undefined","codeEntity","issue","authMethod","auth_method","authorizationCode"],"sources":["../../../../src/core/oauth2/authorization/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\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 {\n Identity, \n OAuth2AuthorizationCode, \n OAuth2AuthorizationCodeRequest, \n Session,\n} from '@authup/core-kit';\nimport {\n EventName, \n EventRefType, \n EventScope, \n IdentityType,\n} from '@authup/core-kit';\nimport { hasInstanceof } from '@authup/errors';\nimport {\n OAUTH2_ACCESS_DENIED_ERROR_INSTANCE,\n OAUTH2_LOGIN_REQUIRED_ERROR_INSTANCE,\n OAUTH2_MFA_REQUIRED_ERROR_INSTANCE,\n OAuth2AccessDeniedError,\n OAuth2AuthenticationContextClass,\n OAuth2AuthorizationPrompt,\n OAuth2AuthorizationResponseType,\n OAuth2GrantError,\n OAuth2LoginRequiredError,\n OAuth2MfaRequiredError,\n OAuth2RequestError,\n OAuth2ResponseTypeError,\n} from '@authup/specs';\nimport type { IOAuth2AuthorizationCodeIssuer } from './code/index.ts';\nimport type { IOAuth2AccessPolicyEvaluator } from '../access-policy/index.ts';\nimport { toIdentityPolicyData } from '../../identity/permission/identity-policy-data.ts';\nimport type {\n OAuth2AuthorizationManagerContext,\n OAuth2AuthorizationOptions,\n OAuth2AuthorizationResult,\n} from './types.ts';\nimport type { ISessionManager } from '../../authentication/index.ts';\nimport type { IEventService, IUserAuthenticatorChallengeProvider } from '../../entities/index.ts';\nimport type { IAuthFlowMetrics } from '../../metrics/index.ts';\n\nconst DEFAULT_PROMPT_LOGIN_MAX_AGE = 60;\n\n// Deliberately 60 (not 0, deviating from the plan-050 sketch): the hosted\n// challenge round-trip (stamp mfa_at → retry POST /authorize) takes seconds,\n// so a 0-window step-up could never be satisfied and would loop the ladder.\nconst DEFAULT_MFA_FRESHNESS_MAX_AGE = 60;\n\nexport class OAuth2Authorization {\n protected codeIssuer : IOAuth2AuthorizationCodeIssuer;\n\n protected sessionManager : ISessionManager;\n\n protected eventService? : IEventService;\n\n protected metrics? : IAuthFlowMetrics;\n\n protected promptLoginMaxAge : number;\n\n protected mfaFreshnessMaxAge : number;\n\n protected mfaChallengeProvider? : IUserAuthenticatorChallengeProvider;\n\n protected accessPolicyEvaluator? : IOAuth2AccessPolicyEvaluator;\n\n constructor(ctx: OAuth2AuthorizationManagerContext) {\n this.codeIssuer = ctx.codeIssuer;\n this.sessionManager = ctx.sessionManager;\n this.eventService = ctx.eventService;\n this.metrics = ctx.metrics;\n this.accessPolicyEvaluator = ctx.accessPolicyEvaluator;\n this.promptLoginMaxAge = ctx.promptLoginMaxAge ?? DEFAULT_PROMPT_LOGIN_MAX_AGE;\n this.mfaFreshnessMaxAge = ctx.mfaFreshnessMaxAge ?? DEFAULT_MFA_FRESHNESS_MAX_AGE;\n this.mfaChallengeProvider = ctx.mfaChallengeProvider;\n }\n\n /**\n * Authorize with validated codeRequest.\n *\n * @param data\n * @param identity\n * @param options\n */\n async authorize(\n data: OAuth2AuthorizationCodeRequest,\n identity: Identity,\n options: OAuth2AuthorizationOptions = {},\n ) : Promise<OAuth2AuthorizationResult> {\n try {\n const result = await this.authorizeInner(data, identity, options);\n\n await this.eventService?.record({\n scope: EventScope.OAUTH2,\n name: EventName.AUTHORIZE,\n refType: EventRefType.CLIENT,\n refId: options.client?.id ?? data.client_id ?? null,\n clientId: options.client?.id ?? data.client_id ?? null,\n actorType: identity.type,\n actorId: identity.data.id,\n actorName: identity.data.name,\n realmId: data.realm_id ?? null,\n data: {\n reason: options.client?.built_in ? 'autoConsent' : 'consent',\n ...(data.scope ? { scope: data.scope } : {}),\n },\n });\n this.metrics?.recordAuthorize('issued');\n\n return result;\n } catch (e) {\n if (hasInstanceof(e, OAUTH2_ACCESS_DENIED_ERROR_INSTANCE)) {\n await this.eventService?.record({\n scope: EventScope.OAUTH2,\n name: EventName.AUTHORIZE_FAILED,\n refType: EventRefType.CLIENT,\n refId: options.client?.id ?? data.client_id ?? null,\n clientId: options.client?.id ?? data.client_id ?? null,\n actorType: identity.type,\n actorId: identity.data.id,\n actorName: identity.data.name,\n realmId: data.realm_id ?? null,\n data: { reason: 'accessPolicy' },\n });\n this.metrics?.recordAuthorize('denied');\n } else if (hasInstanceof(e, OAUTH2_LOGIN_REQUIRED_ERROR_INSTANCE)) {\n this.metrics?.recordAuthorize('login_required');\n } else if (hasInstanceof(e, OAUTH2_MFA_REQUIRED_ERROR_INSTANCE)) {\n this.metrics?.recordAuthorize('mfa_required');\n } else {\n this.metrics?.recordAuthorize('error');\n }\n\n throw e;\n }\n }\n\n protected async authorizeInner(\n data: OAuth2AuthorizationCodeRequest,\n identity: Identity,\n options: OAuth2AuthorizationOptions = {},\n ) : Promise<OAuth2AuthorizationResult> {\n // OAuth 2.1 posture: only the authorization-code response type is\n // supported — implicit/hybrid (token, id_token, none) were dropped\n // (plan 042 item 3). Defense in depth behind the request validator.\n let responseTypes : string[] = [];\n if (data.response_type) {\n responseTypes = Array.isArray(data.response_type) ?\n data.response_type :\n data.response_type.split(' ');\n }\n\n for (const responseType of responseTypes) {\n if (responseType !== OAuth2AuthorizationResponseType.CODE) {\n throw OAuth2ResponseTypeError.unsupported();\n }\n }\n\n if (!responseTypes.includes(OAuth2AuthorizationResponseType.CODE)) {\n throw OAuth2ResponseTypeError.unsupported();\n }\n\n if (!data.redirect_uri) {\n throw OAuth2GrantError.redirectUriMismatch();\n }\n\n const output : OAuth2AuthorizationResult = {\n redirectUri: data.redirect_uri,\n ...(data.state ? { state: data.state } : {}),\n };\n\n if (!identity) {\n throw OAuth2RequestError.identityInvalid();\n }\n\n // Realm binding: the code-request verifier stamped data.realm_id with the\n // resolved client's realm. The authenticated identity must belong to that\n // same realm — otherwise a lingering session for realm A could silently\n // mint a code/token for realm B's client (confused deputy). The error body\n // deliberately carries no identity data (no realm-enumeration oracle).\n // The comparison reads the scalar realm_id column, NOT the realm\n // relation — the relation may simply not be loaded on the resolved\n // identity. An identity without a realm_id fails closed the same way —\n // clean login_required, never a TypeError.\n if (\n data.realm_id &&\n identity.data.realm_id !== data.realm_id\n ) {\n throw OAuth2LoginRequiredError.realmMismatch();\n }\n\n // Authentication time = the backing session's creation instant (NOT\n // refreshed_at — a token refresh must not reset it). Session-less flows\n // (e.g. HTTP Basic authorize) present live credentials on this request,\n // so the authentication time is \"now\".\n const nowSeconds = Math.floor(Date.now() / 1000);\n let authTime = nowSeconds;\n let session : Session | null = null;\n if (options.sessionId) {\n session = await this.sessionManager.findOneById(options.sessionId);\n if (session && session.created_at) {\n authTime = Math.floor(new Date(session.created_at).getTime() / 1000);\n }\n }\n\n // MFA backstop (plan 049) — the authoritative server-side gate; the\n // hosted UI's challenge step is convenience. The proof is session-bound\n // (mfa_at — stamped by the challenge endpoint or the password grant's\n // otp param), so a session-less flow (HTTP Basic) cannot carry one and\n // fails closed while the user holds a confirmed device. A user without\n // a device under mfaRequired is routed to inline enrollment.\n if (this.mfaChallengeProvider && identity.type === IdentityType.USER) {\n // requirement flags only — the interactive challenge material (the\n // webauthn nonce) is issued by the status endpoint, not this backstop.\n const challenge = await this.mfaChallengeProvider.challenge(\n identity.data.id,\n { issueMaterial: false },\n );\n if (challenge.required && !session?.mfa_at) {\n throw OAuth2MfaRequiredError.challengeRequired();\n }\n\n if (challenge.enrollmentRequired) {\n throw OAuth2MfaRequiredError.enrollmentRequired();\n }\n\n // Step-up (plan 050 stage 3): a requested `acr_values` containing\n // urn:authup:mfa is a TRIGGER (Auth0/Keycloak stance) — the proof\n // must additionally be FRESH (mfaFreshnessMaxAge window, mirroring\n // promptLoginMaxAge's absorb-the-round-trip semantics). Enforced\n // only while the user actually holds a factor — per OIDC Core\n // §5.5.1.1 acr is voluntary, so an unsatisfiable request degrades\n // to the achieved acr instead of bricking the RP.\n if (challenge.required && data.acr_values) {\n const acrValues = data.acr_values.split(' ');\n if (acrValues.includes(OAuth2AuthenticationContextClass.MFA)) {\n const mfaAtSeconds = session?.mfa_at ?\n Math.floor(new Date(session.mfa_at).getTime() / 1000) :\n null;\n if (mfaAtSeconds === null || nowSeconds - mfaAtSeconds > this.mfaFreshnessMaxAge) {\n throw OAuth2MfaRequiredError.stepUpRequired();\n }\n }\n }\n }\n\n // OIDC §3.1.2.1 prompt=login / max_age freshness (enforced only when\n // requested — a plain authorize never throws here). The hosted page\n // renders the login form for prompt=login; this is the server backstop.\n const prompts = data.prompt ? data.prompt.split(' ') : [];\n if (\n prompts.includes(OAuth2AuthorizationPrompt.LOGIN) &&\n nowSeconds - authTime > this.promptLoginMaxAge\n ) {\n throw OAuth2LoginRequiredError.reauthenticationRequired();\n }\n\n if (\n typeof data.max_age !== 'undefined' &&\n data.max_age !== null\n ) {\n const maxAge = Number(data.max_age);\n if (\n Number.isFinite(maxAge) &&\n nowSeconds - authTime > maxAge\n ) {\n throw OAuth2LoginRequiredError.reauthenticationRequired();\n }\n }\n\n // Application access policy (plan 052) — the last gate before\n // issuance: a denial is only revealed to a fully-authenticated\n // (incl. second-factor) identity. A client carrying a policy id with\n // no wired evaluator denies too (never silently allow a configured\n // gate). The redirect target rides the error only when the\n // redirect_uri was pattern-verified (RFC 6749 §4.1.2.1).\n if (options.client?.access_policy_id) {\n let allowed = false;\n\n const subject = toIdentityPolicyData(identity);\n if (this.accessPolicyEvaluator && subject) {\n allowed = await this.accessPolicyEvaluator.evaluate(\n options.client.access_policy_id,\n subject,\n );\n }\n\n if (!allowed) {\n throw OAuth2AccessDeniedError.forClient(\n options.redirectUriVerified && data.redirect_uri ?\n { redirectUri: data.redirect_uri, state: data.state ?? null } :\n undefined,\n );\n }\n }\n\n // The id_token is NOT minted here — the /token exchange mints it after\n // resolving the real backing session, so its `sid` is authoritative\n // (plan 042 item 6). The code carries the authentication instant.\n const codeEntity : OAuth2AuthorizationCode = await this.codeIssuer.issue(\n data,\n identity,\n {\n sessionId: options.sessionId,\n authTime,\n authMethod: session?.auth_method ?? null,\n },\n );\n\n output.authorizationCode = codeEntity.id;\n\n return output;\n }\n}\n"],"mappings":";;;;;;;;AA8CA,MAAMkB,+BAA+B;AAKrC,MAAMC,gCAAgC;AAEtC,IAAaC,sBAAb,MAAaA;CACCC;CAEAC;CAEAC;CAEAC;CAEAC;CAEAC;CAEAC;CAEAC;CAEV,YAAYC,KAAwC;EAChD,KAAKR,aAAaQ,IAAIR;EACtB,KAAKC,iBAAiBO,IAAIP;EAC1B,KAAKC,eAAeM,IAAIN;EACxB,KAAKC,UAAUK,IAAIL;EACnB,KAAKI,wBAAwBC,IAAID;EACjC,KAAKH,oBAAoBI,IAAIJ,qBAAqBP;EAClD,KAAKQ,qBAAqBG,IAAIH,sBAAsBP;EACpD,KAAKQ,uBAAuBE,IAAIF;CACpC;;;;;;;IASA,MAAMG,UACFC,MACAC,UACAC,UAAsC,CAAC,GACJ;EACnC,IAAI;GACA,MAAMC,SAAS,MAAM,KAAKC,eAAeJ,MAAMC,UAAUC,OAAAA;GAEzD,MAAM,KAAKV,cAAca,OAAO;IAC5BC,OAAOnC,WAAWoC;IAClBC,MAAMvC,UAAUwC;IAChBC,SAASxC,aAAayC;IACtBC,OAAOV,QAAQW,QAAQC,MAAMd,KAAKe,aAAa;IAC/CC,UAAUd,QAAQW,QAAQC,MAAMd,KAAKe,aAAa;IAClDE,WAAWhB,SAASiB;IACpBC,SAASlB,SAASD,KAAKc;IACvBM,WAAWnB,SAASD,KAAKQ;IACzBa,SAASrB,KAAKsB,YAAY;IAC1BtB,MAAM;KACFuB,QAAQrB,QAAQW,QAAQW,WAAW,gBAAgB;KACnD,GAAIxB,KAAKM,QAAQ,EAAEA,OAAON,KAAKM,MAAM,IAAI,CAAC;IAC9C;GACJ,CAAA;GACA,KAAKb,SAASgC,gBAAgB,QAAA;GAE9B,OAAOtB;EACX,SAASuB,GAAG;GACR,IAAIrD,cAAcqD,GAAGpD,mCAAAA,GAAsC;IACvD,MAAM,KAAKkB,cAAca,OAAO;KAC5BC,OAAOnC,WAAWoC;KAClBC,MAAMvC,UAAU0D;KAChBjB,SAASxC,aAAayC;KACtBC,OAAOV,QAAQW,QAAQC,MAAMd,KAAKe,aAAa;KAC/CC,UAAUd,QAAQW,QAAQC,MAAMd,KAAKe,aAAa;KAClDE,WAAWhB,SAASiB;KACpBC,SAASlB,SAASD,KAAKc;KACvBM,WAAWnB,SAASD,KAAKQ;KACzBa,SAASrB,KAAKsB,YAAY;KAC1BtB,MAAM,EAAEuB,QAAQ,eAAe;IACnC,CAAA;IACA,KAAK9B,SAASgC,gBAAgB,QAAA;GAClC,OAAO,IAAIpD,cAAcqD,GAAGnD,oCAAAA,GACxB,KAAKkB,SAASgC,gBAAgB,gBAAA;QAC3B,IAAIpD,cAAcqD,GAAGlD,kCAAAA,GACxB,KAAKiB,SAASgC,gBAAgB,cAAA;QAE9B,KAAKhC,SAASgC,gBAAgB,OAAA;GAGlC,MAAMC;EACV;CACJ;CAEA,MAAgBtB,eACZJ,MACAC,UACAC,UAAsC,CAAC,GACJ;EAInC,IAAI0B,gBAA2B,CAAA;EAC/B,IAAI5B,KAAK6B,eACLD,gBAAgBE,MAAMC,QAAQ/B,KAAK6B,aAAa,IAC5C7B,KAAK6B,gBACL7B,KAAK6B,cAAcG,MAAM,GAAA;EAGjC,KAAK,MAAMC,gBAAgBL,eACvB,IAAIK,iBAAiBrD,gCAAgCsD,MACjD,MAAMjD,wBAAwBkD,YAAW;EAIjD,IAAI,CAACP,cAAcQ,SAASxD,gCAAgCsD,IAAI,GAC5D,MAAMjD,wBAAwBkD,YAAW;EAG7C,IAAI,CAACnC,KAAKqC,cACN,MAAMxD,iBAAiByD,oBAAmB;EAG9C,MAAMC,SAAqC;GACvCC,aAAaxC,KAAKqC;GAClB,GAAIrC,KAAKyC,QAAQ,EAAEA,OAAOzC,KAAKyC,MAAM,IAAI,CAAC;EAC9C;EAEA,IAAI,CAACxC,UACD,MAAMjB,mBAAmB0D,gBAAe;EAY5C,IACI1C,KAAKsB,YACLrB,SAASD,KAAKsB,aAAatB,KAAKsB,UAEhC,MAAMxC,yBAAyB6D,cAAa;EAOhD,MAAMC,aAAaC,KAAKC,MAAMC,KAAKC,IAAG,IAAK,GAAA;EAC3C,IAAIC,WAAWL;EACf,IAAIM,UAA2B;EAC/B,IAAIhD,QAAQiD,WAAW;GACnBD,UAAU,MAAM,KAAK3D,eAAe6D,YAAYlD,QAAQiD,SAAS;GACjE,IAAID,WAAWA,QAAQG,YACnBJ,WAAWJ,KAAKC,MAAM,IAAIC,KAAKG,QAAQG,UAAU,CAAA,CAAEC,QAAO,IAAK,GAAA;EAEvE;EAQA,IAAI,KAAK1D,wBAAwBK,SAASiB,SAAS9C,aAAamF,MAAM;GAGlE,MAAMC,YAAY,MAAM,KAAK5D,qBAAqB4D,UAC9CvD,SAASD,KAAKc,IACd,EAAE2C,eAAe,MAAM,CAAA;GAE3B,IAAID,UAAUE,YAAY,CAACR,SAASS,QAChC,MAAM5E,uBAAuB6E,kBAAiB;GAGlD,IAAIJ,UAAUK,oBACV,MAAM9E,uBAAuB8E,mBAAkB;GAUnD,IAAIL,UAAUE,YAAY1D,KAAK8D;QACT9D,KAAK8D,WAAW9B,MAAM,GACpC+B,CAAAA,CAAU3B,SAAS1D,iCAAiCsF,GAAG,GAAG;KAC1D,MAAMC,eAAef,SAASS,SAC1Bd,KAAKC,MAAM,IAAIC,KAAKG,QAAQS,MAAM,CAAA,CAAEL,QAAO,IAAK,GAAA,IAChD;KACJ,IAAIW,iBAAiB,QAAQrB,aAAaqB,eAAe,KAAKtE,oBAC1D,MAAMZ,uBAAuBmF,eAAc;IAEnD;;EAER;EAMA,KADgBlE,KAAKoE,SAASpE,KAAKoE,OAAOpC,MAAM,GAAA,IAAO,CAAA,EAAA,CAE3CI,SAASzD,0BAA0B0F,KAAK,KAChDzB,aAAaK,WAAW,KAAKvD,mBAE7B,MAAMZ,yBAAyBwF,yBAAwB;EAG3D,IACI,OAAOtE,KAAKuE,YAAY,eACxBvE,KAAKuE,YAAY,MACnB;GACE,MAAMC,SAASC,OAAOzE,KAAKuE,OAAO;GAClC,IACIE,OAAOC,SAASF,MAAAA,KAChB5B,aAAaK,WAAWuB,QAExB,MAAM1F,yBAAyBwF,yBAAwB;EAE/D;EAQA,IAAIpE,QAAQW,QAAQ8D,kBAAkB;GAClC,IAAIC,UAAU;GAEd,MAAMC,UAAU3F,qBAAqBe,QAAAA;GACrC,IAAI,KAAKJ,yBAAyBgF,SAC9BD,UAAU,MAAM,KAAK/E,sBAAsBiF,SACvC5E,QAAQW,OAAO8D,kBACfE,OAAAA;GAIR,IAAI,CAACD,SACD,MAAMnG,wBAAwBsG,UAC1B7E,QAAQ8E,uBAAuBhF,KAAKqC,eAChC;IAAEG,aAAaxC,KAAKqC;IAAcI,OAAOzC,KAAKyC,SAAS;GAAK,IAC5DwC,KAAAA,CAAAA;EAGhB;EAeA1C,OAAO+C,qBAAoBJ,MAVwB,KAAK5F,WAAW6F,MAC/DnF,MACAC,UACA;GACIkD,WAAWjD,QAAQiD;GACnBF;GACAmC,YAAYlC,SAASmC,eAAe;EACxC,CAAA,EAAA,CAGkCvE;EAEtC,OAAOyB;CACX;AACJ"}
1
+ {"version":3,"file":"module.mjs","names":["EventName","EventRefType","EventScope","IdentityType","hasInstanceof","OAUTH2_ACCESS_DENIED_ERROR_INSTANCE","OAUTH2_LOGIN_REQUIRED_ERROR_INSTANCE","OAUTH2_MFA_REQUIRED_ERROR_INSTANCE","OAuth2AccessDeniedError","OAuth2AuthenticationContextClass","OAuth2AuthorizationPrompt","OAuth2AuthorizationResponseType","OAuth2GrantError","OAuth2LoginRequiredError","OAuth2MfaRequiredError","OAuth2RequestError","OAuth2ResponseTypeError","toIdentityPolicyData","DEFAULT_PROMPT_LOGIN_MAX_AGE","DEFAULT_MFA_FRESHNESS_MAX_AGE","OAuth2Authorization","codeIssuer","sessionManager","eventService","metrics","promptLoginMaxAge","mfaFreshnessMaxAge","mfaChallengeProvider","accessPolicyEvaluator","ctx","authorize","data","identity","options","result","authorizeInner","record","scope","OAUTH2","name","AUTHORIZE","refType","CLIENT","refId","client","id","client_id","clientId","actorType","type","actorId","actorName","realmId","realm_id","reason","builtIn","recordAuthorize","e","AUTHORIZE_FAILED","responseTypes","response_type","Array","isArray","split","responseType","CODE","unsupported","includes","redirect_uri","redirectUriMismatch","output","redirectUri","state","identityInvalid","realmMismatch","nowSeconds","Math","floor","Date","now","authTime","session","sessionId","findOneById","createdAt","getTime","USER","challenge","issueMaterial","required","mfaAt","challengeRequired","enrollmentRequired","acr_values","acrValues","MFA","mfaAtSeconds","stepUpRequired","prompts","prompt","LOGIN","reauthenticationRequired","max_age","maxAge","Number","isFinite","accessPolicyId","allowed","subject","evaluate","forClient","redirectUriVerified","undefined","codeEntity","issue","authMethod","authorizationCode"],"sources":["../../../../src/core/oauth2/authorization/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\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 {\n Identity, \n OAuth2AuthorizationCode, \n OAuth2AuthorizationCodeRequest, \n Session,\n} from '@authup/core-kit';\nimport {\n EventName, \n EventRefType, \n EventScope, \n IdentityType,\n} from '@authup/core-kit';\nimport { hasInstanceof } from '@authup/errors';\nimport {\n OAUTH2_ACCESS_DENIED_ERROR_INSTANCE,\n OAUTH2_LOGIN_REQUIRED_ERROR_INSTANCE,\n OAUTH2_MFA_REQUIRED_ERROR_INSTANCE,\n OAuth2AccessDeniedError,\n OAuth2AuthenticationContextClass,\n OAuth2AuthorizationPrompt,\n OAuth2AuthorizationResponseType,\n OAuth2GrantError,\n OAuth2LoginRequiredError,\n OAuth2MfaRequiredError,\n OAuth2RequestError,\n OAuth2ResponseTypeError,\n} from '@authup/specs';\nimport type { IOAuth2AuthorizationCodeIssuer } from './code/index.ts';\nimport type { IOAuth2AccessPolicyEvaluator } from '../access-policy/index.ts';\nimport { toIdentityPolicyData } from '../../identity/permission/identity-policy-data.ts';\nimport type {\n OAuth2AuthorizationManagerContext,\n OAuth2AuthorizationOptions,\n OAuth2AuthorizationResult,\n} from './types.ts';\nimport type { ISessionManager } from '../../authentication/index.ts';\nimport type { IEventService, IUserAuthenticatorChallengeProvider } from '../../entities/index.ts';\nimport type { IAuthFlowMetrics } from '../../metrics/index.ts';\n\nconst DEFAULT_PROMPT_LOGIN_MAX_AGE = 60;\n\n// Deliberately 60 (not 0, deviating from the plan-050 sketch): the hosted\n// challenge round-trip (stamp mfa_at → retry POST /authorize) takes seconds,\n// so a 0-window step-up could never be satisfied and would loop the ladder.\nconst DEFAULT_MFA_FRESHNESS_MAX_AGE = 60;\n\nexport class OAuth2Authorization {\n protected codeIssuer : IOAuth2AuthorizationCodeIssuer;\n\n protected sessionManager : ISessionManager;\n\n protected eventService? : IEventService;\n\n protected metrics? : IAuthFlowMetrics;\n\n protected promptLoginMaxAge : number;\n\n protected mfaFreshnessMaxAge : number;\n\n protected mfaChallengeProvider? : IUserAuthenticatorChallengeProvider;\n\n protected accessPolicyEvaluator? : IOAuth2AccessPolicyEvaluator;\n\n constructor(ctx: OAuth2AuthorizationManagerContext) {\n this.codeIssuer = ctx.codeIssuer;\n this.sessionManager = ctx.sessionManager;\n this.eventService = ctx.eventService;\n this.metrics = ctx.metrics;\n this.accessPolicyEvaluator = ctx.accessPolicyEvaluator;\n this.promptLoginMaxAge = ctx.promptLoginMaxAge ?? DEFAULT_PROMPT_LOGIN_MAX_AGE;\n this.mfaFreshnessMaxAge = ctx.mfaFreshnessMaxAge ?? DEFAULT_MFA_FRESHNESS_MAX_AGE;\n this.mfaChallengeProvider = ctx.mfaChallengeProvider;\n }\n\n /**\n * Authorize with validated codeRequest.\n *\n * @param data\n * @param identity\n * @param options\n */\n async authorize(\n data: OAuth2AuthorizationCodeRequest,\n identity: Identity,\n options: OAuth2AuthorizationOptions = {},\n ) : Promise<OAuth2AuthorizationResult> {\n try {\n const result = await this.authorizeInner(data, identity, options);\n\n await this.eventService?.record({\n scope: EventScope.OAUTH2,\n name: EventName.AUTHORIZE,\n refType: EventRefType.CLIENT,\n refId: options.client?.id ?? data.client_id ?? null,\n clientId: options.client?.id ?? data.client_id ?? null,\n actorType: identity.type,\n actorId: identity.data.id,\n actorName: identity.data.name,\n realmId: data.realm_id ?? null,\n data: {\n reason: options.client?.builtIn ? 'autoConsent' : 'consent',\n ...(data.scope ? { scope: data.scope } : {}),\n },\n });\n this.metrics?.recordAuthorize('issued');\n\n return result;\n } catch (e) {\n if (hasInstanceof(e, OAUTH2_ACCESS_DENIED_ERROR_INSTANCE)) {\n await this.eventService?.record({\n scope: EventScope.OAUTH2,\n name: EventName.AUTHORIZE_FAILED,\n refType: EventRefType.CLIENT,\n refId: options.client?.id ?? data.client_id ?? null,\n clientId: options.client?.id ?? data.client_id ?? null,\n actorType: identity.type,\n actorId: identity.data.id,\n actorName: identity.data.name,\n realmId: data.realm_id ?? null,\n data: { reason: 'accessPolicy' },\n });\n this.metrics?.recordAuthorize('denied');\n } else if (hasInstanceof(e, OAUTH2_LOGIN_REQUIRED_ERROR_INSTANCE)) {\n this.metrics?.recordAuthorize('login_required');\n } else if (hasInstanceof(e, OAUTH2_MFA_REQUIRED_ERROR_INSTANCE)) {\n this.metrics?.recordAuthorize('mfa_required');\n } else {\n this.metrics?.recordAuthorize('error');\n }\n\n throw e;\n }\n }\n\n protected async authorizeInner(\n data: OAuth2AuthorizationCodeRequest,\n identity: Identity,\n options: OAuth2AuthorizationOptions = {},\n ) : Promise<OAuth2AuthorizationResult> {\n // OAuth 2.1 posture: only the authorization-code response type is\n // supported — implicit/hybrid (token, id_token, none) were dropped\n // (plan 042 item 3). Defense in depth behind the request validator.\n let responseTypes : string[] = [];\n if (data.response_type) {\n responseTypes = Array.isArray(data.response_type) ?\n data.response_type :\n data.response_type.split(' ');\n }\n\n for (const responseType of responseTypes) {\n if (responseType !== OAuth2AuthorizationResponseType.CODE) {\n throw OAuth2ResponseTypeError.unsupported();\n }\n }\n\n if (!responseTypes.includes(OAuth2AuthorizationResponseType.CODE)) {\n throw OAuth2ResponseTypeError.unsupported();\n }\n\n if (!data.redirect_uri) {\n throw OAuth2GrantError.redirectUriMismatch();\n }\n\n const output : OAuth2AuthorizationResult = {\n redirectUri: data.redirect_uri,\n ...(data.state ? { state: data.state } : {}),\n };\n\n if (!identity) {\n throw OAuth2RequestError.identityInvalid();\n }\n\n // Realm binding: the code-request verifier stamped data.realm_id with the\n // resolved client's realm. The authenticated identity must belong to that\n // same realm — otherwise a lingering session for realm A could silently\n // mint a code/token for realm B's client (confused deputy). The error body\n // deliberately carries no identity data (no realm-enumeration oracle).\n // The comparison reads the scalar realmId column, NOT the realm\n // relation — the relation may simply not be loaded on the resolved\n // identity. An identity without a realmId fails closed the same way —\n // clean login_required, never a TypeError.\n if (\n data.realm_id &&\n identity.data.realmId !== data.realm_id\n ) {\n throw OAuth2LoginRequiredError.realmMismatch();\n }\n\n // Authentication time = the backing session's creation instant (NOT\n // refreshed_at — a token refresh must not reset it). Session-less flows\n // (e.g. HTTP Basic authorize) present live credentials on this request,\n // so the authentication time is \"now\".\n const nowSeconds = Math.floor(Date.now() / 1000);\n let authTime = nowSeconds;\n let session : Session | null = null;\n if (options.sessionId) {\n session = await this.sessionManager.findOneById(options.sessionId);\n if (session && session.createdAt) {\n authTime = Math.floor(new Date(session.createdAt).getTime() / 1000);\n }\n }\n\n // MFA backstop (plan 049) — the authoritative server-side gate; the\n // hosted UI's challenge step is convenience. The proof is session-bound\n // (mfa_at — stamped by the challenge endpoint or the password grant's\n // otp param), so a session-less flow (HTTP Basic) cannot carry one and\n // fails closed while the user holds a confirmed device. A user without\n // a device under mfaRequired is routed to inline enrollment.\n if (this.mfaChallengeProvider && identity.type === IdentityType.USER) {\n // requirement flags only — the interactive challenge material (the\n // webauthn nonce) is issued by the status endpoint, not this backstop.\n const challenge = await this.mfaChallengeProvider.challenge(\n identity.data.id,\n { issueMaterial: false },\n );\n if (challenge.required && !session?.mfaAt) {\n throw OAuth2MfaRequiredError.challengeRequired();\n }\n\n if (challenge.enrollmentRequired) {\n throw OAuth2MfaRequiredError.enrollmentRequired();\n }\n\n // Step-up (plan 050 stage 3): a requested `acr_values` containing\n // urn:authup:mfa is a TRIGGER (Auth0/Keycloak stance) — the proof\n // must additionally be FRESH (mfaFreshnessMaxAge window, mirroring\n // promptLoginMaxAge's absorb-the-round-trip semantics). Enforced\n // only while the user actually holds a factor — per OIDC Core\n // §5.5.1.1 acr is voluntary, so an unsatisfiable request degrades\n // to the achieved acr instead of bricking the RP.\n if (challenge.required && data.acr_values) {\n const acrValues = data.acr_values.split(' ');\n if (acrValues.includes(OAuth2AuthenticationContextClass.MFA)) {\n const mfaAtSeconds = session?.mfaAt ?\n Math.floor(new Date(session.mfaAt).getTime() / 1000) :\n null;\n if (mfaAtSeconds === null || nowSeconds - mfaAtSeconds > this.mfaFreshnessMaxAge) {\n throw OAuth2MfaRequiredError.stepUpRequired();\n }\n }\n }\n }\n\n // OIDC §3.1.2.1 prompt=login / max_age freshness (enforced only when\n // requested — a plain authorize never throws here). The hosted page\n // renders the login form for prompt=login; this is the server backstop.\n const prompts = data.prompt ? data.prompt.split(' ') : [];\n if (\n prompts.includes(OAuth2AuthorizationPrompt.LOGIN) &&\n nowSeconds - authTime > this.promptLoginMaxAge\n ) {\n throw OAuth2LoginRequiredError.reauthenticationRequired();\n }\n\n if (\n typeof data.max_age !== 'undefined' &&\n data.max_age !== null\n ) {\n const maxAge = Number(data.max_age);\n if (\n Number.isFinite(maxAge) &&\n nowSeconds - authTime > maxAge\n ) {\n throw OAuth2LoginRequiredError.reauthenticationRequired();\n }\n }\n\n // Application access policy (plan 052) — the last gate before\n // issuance: a denial is only revealed to a fully-authenticated\n // (incl. second-factor) identity. A client carrying a policy id with\n // no wired evaluator denies too (never silently allow a configured\n // gate). The redirect target rides the error only when the\n // redirect_uri was pattern-verified (RFC 6749 §4.1.2.1).\n if (options.client?.accessPolicyId) {\n let allowed = false;\n\n const subject = toIdentityPolicyData(identity);\n if (this.accessPolicyEvaluator && subject) {\n allowed = await this.accessPolicyEvaluator.evaluate(\n options.client.accessPolicyId,\n subject,\n );\n }\n\n if (!allowed) {\n throw OAuth2AccessDeniedError.forClient(\n options.redirectUriVerified && data.redirect_uri ?\n { redirectUri: data.redirect_uri, state: data.state ?? null } :\n undefined,\n );\n }\n }\n\n // The id_token is NOT minted here — the /token exchange mints it after\n // resolving the real backing session, so its `sid` is authoritative\n // (plan 042 item 6). The code carries the authentication instant.\n const codeEntity : OAuth2AuthorizationCode = await this.codeIssuer.issue(\n data,\n identity,\n {\n sessionId: options.sessionId,\n authTime,\n authMethod: session?.authMethod ?? null,\n },\n );\n\n output.authorizationCode = codeEntity.id;\n\n return output;\n }\n}\n"],"mappings":"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"}
@@ -20,7 +20,7 @@ export declare class OAuth2ClientAuthenticator {
20
20
  constructor(ctx: IIdentityResolver | OAuth2ClientAuthenticatorContext);
21
21
  authenticate(clientId: string | undefined, clientSecret?: string, realmId?: string, certificateEvidence?: ClientCertificateEvidence): Promise<Client>;
22
22
  resolve(clientId: string, realmId?: string): Promise<Client>;
23
- resolveTokenBinding(client: Pick<Client, 'token_binding_method'>, certificateEvidence?: ClientCertificateEvidence): OAuth2TokenConfirmation | undefined;
23
+ resolveTokenBinding(client: Pick<Client, 'tokenBindingMethod'>, certificateEvidence?: ClientCertificateEvidence): OAuth2TokenConfirmation | undefined;
24
24
  validateCertificateEvidenceForBinding(certificateEvidence?: ClientCertificateEvidence): OAuth2TokenConfirmation;
25
25
  }
26
26
  //# sourceMappingURL=authenticator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/client/authenticator.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,KAAK,MAAM,EAId,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EACR,yBAAyB,EACzB,2BAA2B,EAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,MAAM,gCAAgC,GAAG;IAC3C,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,oBAAoB,EAAE,2BAA2B,CAAC;CACrD,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,yBAAyB;IAClC,SAAS,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IAE9C,SAAS,CAAC,kBAAkB,EAAE,wBAAwB,CAAC;IAEvD,SAAS,CAAC,oBAAoB,CAAC,EAAE,2BAA2B,CAAC;gBAEjD,GAAG,EAAE,iBAAiB,GAAG,gCAAgC;IAY/D,YAAY,CACd,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,MAAM,EAChB,mBAAmB,CAAC,EAAE,yBAAyB,GAChD,OAAO,CAAC,MAAM,CAAC;IAsDZ,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAalE,mBAAmB,CACf,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAC5C,mBAAmB,CAAC,EAAE,yBAAyB,GAChD,uBAAuB,GAAG,SAAS;IAYtC,qCAAqC,CACjC,mBAAmB,CAAC,EAAE,yBAAyB,GAChD,uBAAuB;CAa7B"}
1
+ {"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/client/authenticator.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,KAAK,MAAM,EAId,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EACR,yBAAyB,EACzB,2BAA2B,EAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,MAAM,gCAAgC,GAAG;IAC3C,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,oBAAoB,EAAE,2BAA2B,CAAC;CACrD,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,yBAAyB;IAClC,SAAS,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IAE9C,SAAS,CAAC,kBAAkB,EAAE,wBAAwB,CAAC;IAEvD,SAAS,CAAC,oBAAoB,CAAC,EAAE,2BAA2B,CAAC;gBAEjD,GAAG,EAAE,iBAAiB,GAAG,gCAAgC;IAY/D,YAAY,CACd,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,MAAM,EAChB,mBAAmB,CAAC,EAAE,yBAAyB,GAChD,OAAO,CAAC,MAAM,CAAC;IAsDZ,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAalE,mBAAmB,CACf,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC1C,mBAAmB,CAAC,EAAE,yBAAyB,GAChD,uBAAuB,GAAG,SAAS;IAYtC,qCAAqC,CACjC,mBAAmB,CAAC,EAAE,yBAAyB,GAChD,uBAAuB;CAa7B"}
@@ -26,7 +26,7 @@ import { OAuth2ClientError } from "@authup/specs";
26
26
  async authenticate(clientId, clientSecret, realmId, certificateEvidence) {
27
27
  if (!clientId) throw OAuth2ClientError.invalid();
28
28
  const client = await this.resolve(clientId, realmId);
29
- switch (client.auth_method) {
29
+ switch (client.authMethod) {
30
30
  case ClientAuthMethod.NONE:
31
31
  if (typeof clientSecret === "string") throw OAuth2ClientError.invalid();
32
32
  break;
@@ -54,8 +54,8 @@ import { OAuth2ClientError } from "@authup/specs";
54
54
  return identity.data;
55
55
  }
56
56
  resolveTokenBinding(client, certificateEvidence) {
57
- if (client.token_binding_method === ClientTokenBindingMethod.NONE) return;
58
- if (client.token_binding_method !== ClientTokenBindingMethod.TLS) throw OAuth2ClientError.invalid();
57
+ if (client.tokenBindingMethod === ClientTokenBindingMethod.NONE) return;
58
+ if (client.tokenBindingMethod !== ClientTokenBindingMethod.TLS) throw OAuth2ClientError.invalid();
59
59
  return this.validateCertificateEvidenceForBinding(certificateEvidence);
60
60
  }
61
61
  validateCertificateEvidenceForBinding(certificateEvidence) {
@@ -1 +1 @@
1
- {"version":3,"file":"authenticator.mjs","names":["ClientAuthMethod","ClientTokenBindingMethod","IdentityType","OAuth2ClientError","isValidationError","ClientCredentialsService","OAuth2ClientAuthenticator","identityResolver","credentialsService","certificateValidator","ctx","authenticate","clientId","clientSecret","realmId","certificateEvidence","invalid","client","resolve","auth_method","NONE","SECRET","verified","verify","TLS","validateForAuthentication","e","identity","CLIENT","type","data","active","inactive","resolveTokenBinding","token_binding_method","undefined","validateCertificateEvidenceForBinding","validateForBinding","thumbprint"],"sources":["../../../../src/core/oauth2/client/authenticator.ts"],"sourcesContent":["/*\n * Copyright (c) 2025-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 {\n type Client,\n ClientAuthMethod,\n ClientTokenBindingMethod,\n IdentityType,\n} from '@authup/core-kit';\nimport type { OAuth2TokenConfirmation } from '@authup/specs';\nimport { OAuth2ClientError } from '@authup/specs';\nimport { isValidationError } from '@authup/errors';\nimport { ClientCredentialsService } from '../../authentication/credential/index.ts';\nimport type {\n ClientCertificateEvidence,\n IClientCertificateValidator,\n} from '../../client-certificate/index.ts';\nimport type { IIdentityResolver } from '../../identity/index.ts';\n\nexport type OAuth2ClientAuthenticatorContext = {\n identityResolver: IIdentityResolver,\n certificateValidator: IClientCertificateValidator,\n};\n\n/**\n * Authenticates a client at the OAuth2 token endpoint according to its\n * exclusive method: public id only, shared secret, or trusted TLS evidence.\n *\n * Used by every standard client-resolving grant.\n */\nexport class OAuth2ClientAuthenticator {\n protected identityResolver: IIdentityResolver;\n\n protected credentialsService: ClientCredentialsService;\n\n protected certificateValidator?: IClientCertificateValidator;\n\n constructor(ctx: IIdentityResolver | OAuth2ClientAuthenticatorContext) {\n if ('identityResolver' in ctx) {\n this.identityResolver = ctx.identityResolver;\n this.certificateValidator = ctx.certificateValidator;\n } else {\n // Kept as a compatibility seam for focused secret/public-client\n // unit tests. Production wiring always supplies the validator.\n this.identityResolver = ctx;\n }\n this.credentialsService = new ClientCredentialsService();\n }\n\n async authenticate(\n clientId: string | undefined,\n clientSecret?: string,\n realmId?: string,\n certificateEvidence?: ClientCertificateEvidence,\n ): Promise<Client> {\n if (!clientId) {\n throw OAuth2ClientError.invalid();\n }\n\n const client = await this.resolve(clientId, realmId);\n\n switch (client.auth_method) {\n case ClientAuthMethod.NONE:\n if (typeof clientSecret === 'string') {\n throw OAuth2ClientError.invalid();\n }\n break;\n case ClientAuthMethod.SECRET: {\n if (!clientSecret) {\n throw OAuth2ClientError.invalid();\n }\n\n const verified = await this.credentialsService.verify(clientSecret, client);\n if (!verified) {\n throw OAuth2ClientError.invalid();\n }\n break;\n }\n case ClientAuthMethod.TLS:\n if (\n typeof clientSecret === 'string' ||\n !certificateEvidence ||\n !this.certificateValidator\n ) {\n throw OAuth2ClientError.invalid();\n }\n\n try {\n await this.certificateValidator.validateForAuthentication(client, certificateEvidence);\n } catch (e) {\n // A validation failure deliberately reveals neither the\n // certificate identity nor which realm anchor failed. An\n // infrastructure fault (e.g. the trust-anchor store being\n // unreachable) must NOT masquerade as a bad certificate —\n // let it surface as a server error instead.\n if (isValidationError(e)) {\n throw OAuth2ClientError.invalid();\n }\n throw e;\n }\n break;\n default:\n throw OAuth2ClientError.invalid();\n }\n\n return client;\n }\n\n async resolve(clientId: string, realmId?: string): Promise<Client> {\n const identity = await this.identityResolver.resolve(IdentityType.CLIENT, clientId, realmId);\n if (!identity || identity.type !== IdentityType.CLIENT) {\n throw OAuth2ClientError.invalid();\n }\n\n if (!identity.data.active) {\n throw OAuth2ClientError.inactive();\n }\n\n return identity.data;\n }\n\n resolveTokenBinding(\n client: Pick<Client, 'token_binding_method'>,\n certificateEvidence?: ClientCertificateEvidence,\n ): OAuth2TokenConfirmation | undefined {\n if (client.token_binding_method === ClientTokenBindingMethod.NONE) {\n return undefined;\n }\n\n if (client.token_binding_method !== ClientTokenBindingMethod.TLS) {\n throw OAuth2ClientError.invalid();\n }\n\n return this.validateCertificateEvidenceForBinding(certificateEvidence);\n }\n\n validateCertificateEvidenceForBinding(\n certificateEvidence?: ClientCertificateEvidence,\n ): OAuth2TokenConfirmation {\n if (!certificateEvidence || !this.certificateValidator) {\n throw OAuth2ClientError.invalid();\n }\n\n try {\n this.certificateValidator.validateForBinding(certificateEvidence);\n } catch {\n throw OAuth2ClientError.invalid();\n }\n\n return { 'x5t#S256': certificateEvidence.thumbprint };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;GAkCA,IAAaM,4BAAb,MAAaA;CACCC;CAEAC;CAEAC;CAEV,YAAYC,KAA2D;EACnE,IAAI,sBAAsBA,KAAK;GAC3B,KAAKH,mBAAmBG,IAAIH;GAC5B,KAAKE,uBAAuBC,IAAID;EACpC,OAGI,KAAKF,mBAAmBG;EAE5B,KAAKF,qBAAqB,IAAIH,yBAAAA;CAClC;CAEA,MAAMM,aACFC,UACAC,cACAC,SACAC,qBACe;EACf,IAAI,CAACH,UACD,MAAMT,kBAAkBa,QAAO;EAGnC,MAAMC,SAAS,MAAM,KAAKC,QAAQN,UAAUE,OAAAA;EAE5C,QAAQG,OAAOE,aAAf;GACI,KAAKnB,iBAAiBoB;IAClB,IAAI,OAAOP,iBAAiB,UACxB,MAAMV,kBAAkBa,QAAO;IAEnC;GACJ,KAAKhB,iBAAiBqB;IAClB,IAAI,CAACR,cACD,MAAMV,kBAAkBa,QAAO;IAInC,IAAI,CAACM,MADkB,KAAKd,mBAAmBe,OAAOV,cAAcI,MAAAA,GAEhE,MAAMd,kBAAkBa,QAAO;IAEnC;GAEJ,KAAKhB,iBAAiBwB;IAClB,IACI,OAAOX,iBAAiB,YACxB,CAACE,uBACD,CAAC,KAAKN,sBAEN,MAAMN,kBAAkBa,QAAO;IAGnC,IAAI;KACA,MAAM,KAAKP,qBAAqBgB,0BAA0BR,QAAQF,mBAAAA;IACtE,SAASW,GAAG;KAMR,IAAItB,kBAAkBsB,CAAAA,GAClB,MAAMvB,kBAAkBa,QAAO;KAEnC,MAAMU;IACV;IACA;GACJ,SACI,MAAMvB,kBAAkBa,QAAO;EACvC;EAEA,OAAOC;CACX;CAEA,MAAMC,QAAQN,UAAkBE,SAAmC;EAC/D,MAAMa,WAAW,MAAM,KAAKpB,iBAAiBW,QAAQhB,aAAa0B,QAAQhB,UAAUE,OAAAA;EACpF,IAAI,CAACa,YAAYA,SAASE,SAAS3B,aAAa0B,QAC5C,MAAMzB,kBAAkBa,QAAO;EAGnC,IAAI,CAACW,SAASG,KAAKC,QACf,MAAM5B,kBAAkB6B,SAAQ;EAGpC,OAAOL,SAASG;CACpB;CAEAG,oBACIhB,QACAF,qBACmC;EACnC,IAAIE,OAAOiB,yBAAyBjC,yBAAyBmB,MACzD;EAGJ,IAAIH,OAAOiB,yBAAyBjC,yBAAyBuB,KACzD,MAAMrB,kBAAkBa,QAAO;EAGnC,OAAO,KAAKoB,sCAAsCrB,mBAAAA;CACtD;CAEAqB,sCACIrB,qBACuB;EACvB,IAAI,CAACA,uBAAuB,CAAC,KAAKN,sBAC9B,MAAMN,kBAAkBa,QAAO;EAGnC,IAAI;GACA,KAAKP,qBAAqB4B,mBAAmBtB,mBAAAA;EACjD,QAAQ;GACJ,MAAMZ,kBAAkBa,QAAO;EACnC;EAEA,OAAO,EAAE,YAAYD,oBAAoBuB,WAAW;CACxD;AACJ"}
1
+ {"version":3,"file":"authenticator.mjs","names":["ClientAuthMethod","ClientTokenBindingMethod","IdentityType","OAuth2ClientError","isValidationError","ClientCredentialsService","OAuth2ClientAuthenticator","identityResolver","credentialsService","certificateValidator","ctx","authenticate","clientId","clientSecret","realmId","certificateEvidence","invalid","client","resolve","authMethod","NONE","SECRET","verified","verify","TLS","validateForAuthentication","e","identity","CLIENT","type","data","active","inactive","resolveTokenBinding","tokenBindingMethod","undefined","validateCertificateEvidenceForBinding","validateForBinding","thumbprint"],"sources":["../../../../src/core/oauth2/client/authenticator.ts"],"sourcesContent":["/*\n * Copyright (c) 2025-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 {\n type Client,\n ClientAuthMethod,\n ClientTokenBindingMethod,\n IdentityType,\n} from '@authup/core-kit';\nimport type { OAuth2TokenConfirmation } from '@authup/specs';\nimport { OAuth2ClientError } from '@authup/specs';\nimport { isValidationError } from '@authup/errors';\nimport { ClientCredentialsService } from '../../authentication/credential/index.ts';\nimport type {\n ClientCertificateEvidence,\n IClientCertificateValidator,\n} from '../../client-certificate/index.ts';\nimport type { IIdentityResolver } from '../../identity/index.ts';\n\nexport type OAuth2ClientAuthenticatorContext = {\n identityResolver: IIdentityResolver,\n certificateValidator: IClientCertificateValidator,\n};\n\n/**\n * Authenticates a client at the OAuth2 token endpoint according to its\n * exclusive method: public id only, shared secret, or trusted TLS evidence.\n *\n * Used by every standard client-resolving grant.\n */\nexport class OAuth2ClientAuthenticator {\n protected identityResolver: IIdentityResolver;\n\n protected credentialsService: ClientCredentialsService;\n\n protected certificateValidator?: IClientCertificateValidator;\n\n constructor(ctx: IIdentityResolver | OAuth2ClientAuthenticatorContext) {\n if ('identityResolver' in ctx) {\n this.identityResolver = ctx.identityResolver;\n this.certificateValidator = ctx.certificateValidator;\n } else {\n // Kept as a compatibility seam for focused secret/public-client\n // unit tests. Production wiring always supplies the validator.\n this.identityResolver = ctx;\n }\n this.credentialsService = new ClientCredentialsService();\n }\n\n async authenticate(\n clientId: string | undefined,\n clientSecret?: string,\n realmId?: string,\n certificateEvidence?: ClientCertificateEvidence,\n ): Promise<Client> {\n if (!clientId) {\n throw OAuth2ClientError.invalid();\n }\n\n const client = await this.resolve(clientId, realmId);\n\n switch (client.authMethod) {\n case ClientAuthMethod.NONE:\n if (typeof clientSecret === 'string') {\n throw OAuth2ClientError.invalid();\n }\n break;\n case ClientAuthMethod.SECRET: {\n if (!clientSecret) {\n throw OAuth2ClientError.invalid();\n }\n\n const verified = await this.credentialsService.verify(clientSecret, client);\n if (!verified) {\n throw OAuth2ClientError.invalid();\n }\n break;\n }\n case ClientAuthMethod.TLS:\n if (\n typeof clientSecret === 'string' ||\n !certificateEvidence ||\n !this.certificateValidator\n ) {\n throw OAuth2ClientError.invalid();\n }\n\n try {\n await this.certificateValidator.validateForAuthentication(client, certificateEvidence);\n } catch (e) {\n // A validation failure deliberately reveals neither the\n // certificate identity nor which realm anchor failed. An\n // infrastructure fault (e.g. the trust-anchor store being\n // unreachable) must NOT masquerade as a bad certificate —\n // let it surface as a server error instead.\n if (isValidationError(e)) {\n throw OAuth2ClientError.invalid();\n }\n throw e;\n }\n break;\n default:\n throw OAuth2ClientError.invalid();\n }\n\n return client;\n }\n\n async resolve(clientId: string, realmId?: string): Promise<Client> {\n const identity = await this.identityResolver.resolve(IdentityType.CLIENT, clientId, realmId);\n if (!identity || identity.type !== IdentityType.CLIENT) {\n throw OAuth2ClientError.invalid();\n }\n\n if (!identity.data.active) {\n throw OAuth2ClientError.inactive();\n }\n\n return identity.data;\n }\n\n resolveTokenBinding(\n client: Pick<Client, 'tokenBindingMethod'>,\n certificateEvidence?: ClientCertificateEvidence,\n ): OAuth2TokenConfirmation | undefined {\n if (client.tokenBindingMethod === ClientTokenBindingMethod.NONE) {\n return undefined;\n }\n\n if (client.tokenBindingMethod !== ClientTokenBindingMethod.TLS) {\n throw OAuth2ClientError.invalid();\n }\n\n return this.validateCertificateEvidenceForBinding(certificateEvidence);\n }\n\n validateCertificateEvidenceForBinding(\n certificateEvidence?: ClientCertificateEvidence,\n ): OAuth2TokenConfirmation {\n if (!certificateEvidence || !this.certificateValidator) {\n throw OAuth2ClientError.invalid();\n }\n\n try {\n this.certificateValidator.validateForBinding(certificateEvidence);\n } catch {\n throw OAuth2ClientError.invalid();\n }\n\n return { 'x5t#S256': certificateEvidence.thumbprint };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;GAkCA,IAAaM,4BAAb,MAAaA;CACCC;CAEAC;CAEAC;CAEV,YAAYC,KAA2D;EACnE,IAAI,sBAAsBA,KAAK;GAC3B,KAAKH,mBAAmBG,IAAIH;GAC5B,KAAKE,uBAAuBC,IAAID;EACpC,OAGI,KAAKF,mBAAmBG;EAE5B,KAAKF,qBAAqB,IAAIH,yBAAAA;CAClC;CAEA,MAAMM,aACFC,UACAC,cACAC,SACAC,qBACe;EACf,IAAI,CAACH,UACD,MAAMT,kBAAkBa,QAAO;EAGnC,MAAMC,SAAS,MAAM,KAAKC,QAAQN,UAAUE,OAAAA;EAE5C,QAAQG,OAAOE,YAAf;GACI,KAAKnB,iBAAiBoB;IAClB,IAAI,OAAOP,iBAAiB,UACxB,MAAMV,kBAAkBa,QAAO;IAEnC;GACJ,KAAKhB,iBAAiBqB;IAClB,IAAI,CAACR,cACD,MAAMV,kBAAkBa,QAAO;IAInC,IAAI,CAACM,MADkB,KAAKd,mBAAmBe,OAAOV,cAAcI,MAAAA,GAEhE,MAAMd,kBAAkBa,QAAO;IAEnC;GAEJ,KAAKhB,iBAAiBwB;IAClB,IACI,OAAOX,iBAAiB,YACxB,CAACE,uBACD,CAAC,KAAKN,sBAEN,MAAMN,kBAAkBa,QAAO;IAGnC,IAAI;KACA,MAAM,KAAKP,qBAAqBgB,0BAA0BR,QAAQF,mBAAAA;IACtE,SAASW,GAAG;KAMR,IAAItB,kBAAkBsB,CAAAA,GAClB,MAAMvB,kBAAkBa,QAAO;KAEnC,MAAMU;IACV;IACA;GACJ,SACI,MAAMvB,kBAAkBa,QAAO;EACvC;EAEA,OAAOC;CACX;CAEA,MAAMC,QAAQN,UAAkBE,SAAmC;EAC/D,MAAMa,WAAW,MAAM,KAAKpB,iBAAiBW,QAAQhB,aAAa0B,QAAQhB,UAAUE,OAAAA;EACpF,IAAI,CAACa,YAAYA,SAASE,SAAS3B,aAAa0B,QAC5C,MAAMzB,kBAAkBa,QAAO;EAGnC,IAAI,CAACW,SAASG,KAAKC,QACf,MAAM5B,kBAAkB6B,SAAQ;EAGpC,OAAOL,SAASG;CACpB;CAEAG,oBACIhB,QACAF,qBACmC;EACnC,IAAIE,OAAOiB,uBAAuBjC,yBAAyBmB,MACvD;EAGJ,IAAIH,OAAOiB,uBAAuBjC,yBAAyBuB,KACvD,MAAMrB,kBAAkBa,QAAO;EAGnC,OAAO,KAAKoB,sCAAsCrB,mBAAAA;CACtD;CAEAqB,sCACIrB,qBACuB;EACvB,IAAI,CAACA,uBAAuB,CAAC,KAAKN,sBAC9B,MAAMN,kBAAkBa,QAAO;EAGnC,IAAI;GACA,KAAKP,qBAAqB4B,mBAAmBtB,mBAAAA;EACjD,QAAQ;GACJ,MAAMZ,kBAAkBa,QAAO;EACnC;EAEA,OAAO,EAAE,YAAYD,oBAAoBuB,WAAW;CACxD;AACJ"}
@@ -5,5 +5,5 @@ import type { Client } from '@authup/core-kit';
5
5
  * enforcement is opt-in per client; unknown values in the list are
6
6
  * inert — they can only narrow, never widen.
7
7
  */
8
- export declare function assertClientGrantAllowed(client: Pick<Client, 'grant_types'>, grantType: string): void;
8
+ export declare function assertClientGrantAllowed(client: Pick<Client, 'grantTypes'>, grantType: string): void;
9
9
  //# sourceMappingURL=grant-type.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grant-type.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/client/grant-type.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG/C;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CASrG"}
1
+ {"version":3,"file":"grant-type.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/client/grant-type.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG/C;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CASpG"}
@@ -9,8 +9,8 @@ import { OAuth2ClientUnauthorizedError } from "@authup/specs";
9
9
  * enforcement is opt-in per client; unknown values in the list are
10
10
  * inert — they can only narrow, never widen.
11
11
  */ function assertClientGrantAllowed(client, grantType) {
12
- if (!client.grant_types) return;
13
- if (!client.grant_types.split(/[\s,]+/).includes(grantType)) throw OAuth2ClientUnauthorizedError.grantType(grantType);
12
+ if (!client.grantTypes) return;
13
+ if (!client.grantTypes.split(/[\s,]+/).includes(grantType)) throw OAuth2ClientUnauthorizedError.grantType(grantType);
14
14
  }
15
15
  //#endregion
16
16
  export { assertClientGrantAllowed };
@@ -1 +1 @@
1
- {"version":3,"file":"grant-type.mjs","names":["OAuth2ClientUnauthorizedError","assertClientGrantAllowed","client","grantType","grant_types","allowed","split","includes"],"sources":["../../../../src/core/oauth2/client/grant-type.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 type { Client } from '@authup/core-kit';\nimport { OAuth2ClientUnauthorizedError } from '@authup/specs';\n\n/**\n * Enforce the client's grant_types allowlist (RFC 6749 §5.2\n * unauthorized_client). A null/empty column means allow-all, so\n * enforcement is opt-in per client; unknown values in the list are\n * inert — they can only narrow, never widen.\n */\nexport function assertClientGrantAllowed(client: Pick<Client, 'grant_types'>, grantType: string): void {\n if (!client.grant_types) {\n return;\n }\n\n const allowed = client.grant_types.split(/[\\s,]+/);\n if (!allowed.includes(grantType)) {\n throw OAuth2ClientUnauthorizedError.grantType(grantType);\n }\n}\n"],"mappings":";;;;;;;;;;GAgBA,SAAgBC,yBAAyBC,QAAqCC,WAAiB;CAC3F,IAAI,CAACD,OAAOE,aACR;CAIJ,IAAI,CADYF,OAAOE,YAAYE,MAAM,QACpCD,CAAAA,CAAQE,SAASJ,SAAAA,GAClB,MAAMH,8BAA8BG,UAAUA,SAAAA;AAEtD"}
1
+ {"version":3,"file":"grant-type.mjs","names":["OAuth2ClientUnauthorizedError","assertClientGrantAllowed","client","grantType","grantTypes","allowed","split","includes"],"sources":["../../../../src/core/oauth2/client/grant-type.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 type { Client } from '@authup/core-kit';\nimport { OAuth2ClientUnauthorizedError } from '@authup/specs';\n\n/**\n * Enforce the client's grant_types allowlist (RFC 6749 §5.2\n * unauthorized_client). A null/empty column means allow-all, so\n * enforcement is opt-in per client; unknown values in the list are\n * inert — they can only narrow, never widen.\n */\nexport function assertClientGrantAllowed(client: Pick<Client, 'grantTypes'>, grantType: string): void {\n if (!client.grantTypes) {\n return;\n }\n\n const allowed = client.grantTypes.split(/[\\s,]+/);\n if (!allowed.includes(grantType)) {\n throw OAuth2ClientUnauthorizedError.grantType(grantType);\n }\n}\n"],"mappings":";;;;;;;;;;GAgBA,SAAgBC,yBAAyBC,QAAoCC,WAAiB;CAC1F,IAAI,CAACD,OAAOE,YACR;CAIJ,IAAI,CADYF,OAAOE,WAAWE,MAAM,QACnCD,CAAAA,CAAQE,SAASJ,SAAAA,GAClB,MAAMH,8BAA8BG,UAAUA,SAAAA;AAEtD"}
@@ -64,7 +64,7 @@ var OAuth2EndSessionService = class {
64
64
  let redirectUri;
65
65
  if (client) {
66
66
  clientName = client.name;
67
- if (data.post_logout_redirect_uri && this.isValidPostLogoutRedirect(client.post_logout_redirect_uri, data.post_logout_redirect_uri)) redirectUri = data.post_logout_redirect_uri;
67
+ if (data.post_logout_redirect_uri && this.isValidPostLogoutRedirect(client.postLogoutRedirectUri, data.post_logout_redirect_uri)) redirectUri = data.post_logout_redirect_uri;
68
68
  }
69
69
  return {
70
70
  hintVerified,
@@ -84,17 +84,17 @@ var OAuth2EndSessionService = class {
84
84
  async revoke(sessionId, sub, subKind) {
85
85
  const session = await this.sessionManager.findOneById(sessionId);
86
86
  if (!session) return false;
87
- if (session.sub !== sub || session.sub_kind !== subKind) return false;
87
+ if (session.sub !== sub || session.subKind !== subKind) return false;
88
88
  await this.sessionManager.revoke(sessionId);
89
89
  await this.eventService?.record({
90
90
  scope: EventScope.OAUTH2,
91
91
  name: EventName.LOGOUT,
92
92
  refType: EventRefType.SESSION,
93
93
  refId: sessionId,
94
- actorType: session.sub_kind,
94
+ actorType: session.subKind,
95
95
  actorId: session.sub,
96
- realmId: session.realm_id,
97
- data: { revoked_session_id: sessionId }
96
+ realmId: session.realmId,
97
+ data: { revokedSessionId: sessionId }
98
98
  });
99
99
  return true;
100
100
  }
@@ -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","state","revoke","session","findOneById","record","scope","OAUTH2","LOGOUT","refType","SESSION","refId","actorType","actorId","realmId","revoked_session_id","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.post_logout_redirect_uri, 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.sub_kind !== 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.sub_kind as `${IdentityType}`,\n actorId: session.sub,\n realmId: session.realm_id,\n data: { revoked_session_id: 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":["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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"}