@portaidentity/server 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (742) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +33 -0
  4. package/dist/applications/cache.d.ts +64 -0
  5. package/dist/applications/cache.d.ts.map +1 -0
  6. package/dist/applications/cache.js +161 -0
  7. package/dist/applications/cache.js.map +1 -0
  8. package/dist/applications/errors.d.ts +25 -0
  9. package/dist/applications/errors.d.ts.map +1 -0
  10. package/dist/applications/errors.js +31 -0
  11. package/dist/applications/errors.js.map +1 -0
  12. package/dist/applications/index.d.ts +17 -0
  13. package/dist/applications/index.d.ts.map +1 -0
  14. package/dist/applications/index.js +19 -0
  15. package/dist/applications/index.js.map +1 -0
  16. package/dist/applications/repository.d.ts +184 -0
  17. package/dist/applications/repository.d.ts.map +1 -0
  18. package/dist/applications/repository.js +367 -0
  19. package/dist/applications/repository.js.map +1 -0
  20. package/dist/applications/service.d.ts +160 -0
  21. package/dist/applications/service.d.ts.map +1 -0
  22. package/dist/applications/service.js +388 -0
  23. package/dist/applications/service.js.map +1 -0
  24. package/dist/applications/slugs.d.ts +61 -0
  25. package/dist/applications/slugs.d.ts.map +1 -0
  26. package/dist/applications/slugs.js +115 -0
  27. package/dist/applications/slugs.js.map +1 -0
  28. package/dist/applications/types.d.ts +129 -0
  29. package/dist/applications/types.d.ts.map +1 -0
  30. package/dist/applications/types.js +62 -0
  31. package/dist/applications/types.js.map +1 -0
  32. package/dist/auth/csrf.d.ts +71 -0
  33. package/dist/auth/csrf.d.ts.map +1 -0
  34. package/dist/auth/csrf.js +112 -0
  35. package/dist/auth/csrf.js.map +1 -0
  36. package/dist/auth/email-renderer.d.ts +37 -0
  37. package/dist/auth/email-renderer.d.ts.map +1 -0
  38. package/dist/auth/email-renderer.js +116 -0
  39. package/dist/auth/email-renderer.js.map +1 -0
  40. package/dist/auth/email-service.d.ts +154 -0
  41. package/dist/auth/email-service.d.ts.map +1 -0
  42. package/dist/auth/email-service.js +415 -0
  43. package/dist/auth/email-service.js.map +1 -0
  44. package/dist/auth/email-transport.d.ts +65 -0
  45. package/dist/auth/email-transport.d.ts.map +1 -0
  46. package/dist/auth/email-transport.js +82 -0
  47. package/dist/auth/email-transport.js.map +1 -0
  48. package/dist/auth/i18n.d.ts +81 -0
  49. package/dist/auth/i18n.d.ts.map +1 -0
  50. package/dist/auth/i18n.js +395 -0
  51. package/dist/auth/i18n.js.map +1 -0
  52. package/dist/auth/index.d.ts +28 -0
  53. package/dist/auth/index.d.ts.map +1 -0
  54. package/dist/auth/index.js +31 -0
  55. package/dist/auth/index.js.map +1 -0
  56. package/dist/auth/interaction-authority.d.ts +39 -0
  57. package/dist/auth/interaction-authority.d.ts.map +1 -0
  58. package/dist/auth/interaction-authority.js +30 -0
  59. package/dist/auth/interaction-authority.js.map +1 -0
  60. package/dist/auth/magic-link-session.d.ts +81 -0
  61. package/dist/auth/magic-link-session.d.ts.map +1 -0
  62. package/dist/auth/magic-link-session.js +183 -0
  63. package/dist/auth/magic-link-session.js.map +1 -0
  64. package/dist/auth/rate-limiter.d.ts +143 -0
  65. package/dist/auth/rate-limiter.d.ts.map +1 -0
  66. package/dist/auth/rate-limiter.js +220 -0
  67. package/dist/auth/rate-limiter.js.map +1 -0
  68. package/dist/auth/recovery-crypto.d.ts +34 -0
  69. package/dist/auth/recovery-crypto.d.ts.map +1 -0
  70. package/dist/auth/recovery-crypto.js +103 -0
  71. package/dist/auth/recovery-crypto.js.map +1 -0
  72. package/dist/auth/recovery-job-processor.d.ts +24 -0
  73. package/dist/auth/recovery-job-processor.d.ts.map +1 -0
  74. package/dist/auth/recovery-job-processor.js +123 -0
  75. package/dist/auth/recovery-job-processor.js.map +1 -0
  76. package/dist/auth/recovery-job-repository.d.ts +219 -0
  77. package/dist/auth/recovery-job-repository.d.ts.map +1 -0
  78. package/dist/auth/recovery-job-repository.js +340 -0
  79. package/dist/auth/recovery-job-repository.js.map +1 -0
  80. package/dist/auth/recovery-service.d.ts +27 -0
  81. package/dist/auth/recovery-service.d.ts.map +1 -0
  82. package/dist/auth/recovery-service.js +53 -0
  83. package/dist/auth/recovery-service.js.map +1 -0
  84. package/dist/auth/recovery-worker.d.ts +158 -0
  85. package/dist/auth/recovery-worker.d.ts.map +1 -0
  86. package/dist/auth/recovery-worker.js +306 -0
  87. package/dist/auth/recovery-worker.js.map +1 -0
  88. package/dist/auth/template-engine.d.ts +134 -0
  89. package/dist/auth/template-engine.d.ts.map +1 -0
  90. package/dist/auth/template-engine.js +225 -0
  91. package/dist/auth/template-engine.js.map +1 -0
  92. package/dist/auth/token-repository.d.ts +238 -0
  93. package/dist/auth/token-repository.d.ts.map +1 -0
  94. package/dist/auth/token-repository.js +475 -0
  95. package/dist/auth/token-repository.js.map +1 -0
  96. package/dist/auth/tokens.d.ts +45 -0
  97. package/dist/auth/tokens.d.ts.map +1 -0
  98. package/dist/auth/tokens.js +51 -0
  99. package/dist/auth/tokens.js.map +1 -0
  100. package/dist/cli/bootstrap.d.ts +55 -0
  101. package/dist/cli/bootstrap.d.ts.map +1 -0
  102. package/dist/cli/bootstrap.js +90 -0
  103. package/dist/cli/bootstrap.js.map +1 -0
  104. package/dist/cli/commands/health.d.ts +20 -0
  105. package/dist/cli/commands/health.d.ts.map +1 -0
  106. package/dist/cli/commands/health.js +80 -0
  107. package/dist/cli/commands/health.js.map +1 -0
  108. package/dist/cli/commands/init.d.ts +48 -0
  109. package/dist/cli/commands/init.d.ts.map +1 -0
  110. package/dist/cli/commands/init.js +349 -0
  111. package/dist/cli/commands/init.js.map +1 -0
  112. package/dist/cli/commands/migrate.d.ts +19 -0
  113. package/dist/cli/commands/migrate.d.ts.map +1 -0
  114. package/dist/cli/commands/migrate.js +88 -0
  115. package/dist/cli/commands/migrate.js.map +1 -0
  116. package/dist/cli/commands/seed.d.ts +19 -0
  117. package/dist/cli/commands/seed.d.ts.map +1 -0
  118. package/dist/cli/commands/seed.js +71 -0
  119. package/dist/cli/commands/seed.js.map +1 -0
  120. package/dist/cli/commands/user-2fa.d.ts +29 -0
  121. package/dist/cli/commands/user-2fa.d.ts.map +1 -0
  122. package/dist/cli/commands/user-2fa.js +113 -0
  123. package/dist/cli/commands/user-2fa.js.map +1 -0
  124. package/dist/cli/error-handler.d.ts +31 -0
  125. package/dist/cli/error-handler.d.ts.map +1 -0
  126. package/dist/cli/error-handler.js +65 -0
  127. package/dist/cli/error-handler.js.map +1 -0
  128. package/dist/cli/index.d.ts +48 -0
  129. package/dist/cli/index.d.ts.map +1 -0
  130. package/dist/cli/index.js +99 -0
  131. package/dist/cli/index.js.map +1 -0
  132. package/dist/cli/output.d.ts +94 -0
  133. package/dist/cli/output.d.ts.map +1 -0
  134. package/dist/cli/output.js +124 -0
  135. package/dist/cli/output.js.map +1 -0
  136. package/dist/cli/prompt.d.ts +48 -0
  137. package/dist/cli/prompt.d.ts.map +1 -0
  138. package/dist/cli/prompt.js +96 -0
  139. package/dist/cli/prompt.js.map +1 -0
  140. package/dist/clients/cache.d.ts +63 -0
  141. package/dist/clients/cache.d.ts.map +1 -0
  142. package/dist/clients/cache.js +160 -0
  143. package/dist/clients/cache.js.map +1 -0
  144. package/dist/clients/crypto.d.ts +69 -0
  145. package/dist/clients/crypto.d.ts.map +1 -0
  146. package/dist/clients/crypto.js +83 -0
  147. package/dist/clients/crypto.js.map +1 -0
  148. package/dist/clients/errors.d.ts +27 -0
  149. package/dist/clients/errors.d.ts.map +1 -0
  150. package/dist/clients/errors.js +33 -0
  151. package/dist/clients/errors.js.map +1 -0
  152. package/dist/clients/index.d.ts +19 -0
  153. package/dist/clients/index.d.ts.map +1 -0
  154. package/dist/clients/index.js +23 -0
  155. package/dist/clients/index.js.map +1 -0
  156. package/dist/clients/repository.d.ts +161 -0
  157. package/dist/clients/repository.d.ts.map +1 -0
  158. package/dist/clients/repository.js +318 -0
  159. package/dist/clients/repository.js.map +1 -0
  160. package/dist/clients/resolve-login-methods.d.ts +74 -0
  161. package/dist/clients/resolve-login-methods.d.ts.map +1 -0
  162. package/dist/clients/resolve-login-methods.js +68 -0
  163. package/dist/clients/resolve-login-methods.js.map +1 -0
  164. package/dist/clients/secret-repository.d.ts +109 -0
  165. package/dist/clients/secret-repository.d.ts.map +1 -0
  166. package/dist/clients/secret-repository.js +166 -0
  167. package/dist/clients/secret-repository.js.map +1 -0
  168. package/dist/clients/secret-service.d.ts +87 -0
  169. package/dist/clients/secret-service.d.ts.map +1 -0
  170. package/dist/clients/secret-service.js +204 -0
  171. package/dist/clients/secret-service.js.map +1 -0
  172. package/dist/clients/service.d.ts +158 -0
  173. package/dist/clients/service.d.ts.map +1 -0
  174. package/dist/clients/service.js +523 -0
  175. package/dist/clients/service.js.map +1 -0
  176. package/dist/clients/types.d.ts +214 -0
  177. package/dist/clients/types.d.ts.map +1 -0
  178. package/dist/clients/types.js +77 -0
  179. package/dist/clients/types.js.map +1 -0
  180. package/dist/clients/validators.d.ts +87 -0
  181. package/dist/clients/validators.d.ts.map +1 -0
  182. package/dist/clients/validators.js +164 -0
  183. package/dist/clients/validators.js.map +1 -0
  184. package/dist/config/index.d.ts +23 -0
  185. package/dist/config/index.d.ts.map +1 -0
  186. package/dist/config/index.js +52 -0
  187. package/dist/config/index.js.map +1 -0
  188. package/dist/config/schema.d.ts +35 -0
  189. package/dist/config/schema.d.ts.map +1 -0
  190. package/dist/config/schema.js +167 -0
  191. package/dist/config/schema.js.map +1 -0
  192. package/dist/custom-claims/cache.d.ts +48 -0
  193. package/dist/custom-claims/cache.d.ts.map +1 -0
  194. package/dist/custom-claims/cache.js +122 -0
  195. package/dist/custom-claims/cache.js.map +1 -0
  196. package/dist/custom-claims/errors.d.ts +25 -0
  197. package/dist/custom-claims/errors.d.ts.map +1 -0
  198. package/dist/custom-claims/errors.js +31 -0
  199. package/dist/custom-claims/errors.js.map +1 -0
  200. package/dist/custom-claims/index.d.ts +14 -0
  201. package/dist/custom-claims/index.d.ts.map +1 -0
  202. package/dist/custom-claims/index.js +17 -0
  203. package/dist/custom-claims/index.js.map +1 -0
  204. package/dist/custom-claims/repository.d.ts +147 -0
  205. package/dist/custom-claims/repository.d.ts.map +1 -0
  206. package/dist/custom-claims/repository.js +338 -0
  207. package/dist/custom-claims/repository.js.map +1 -0
  208. package/dist/custom-claims/service.d.ts +129 -0
  209. package/dist/custom-claims/service.d.ts.map +1 -0
  210. package/dist/custom-claims/service.js +296 -0
  211. package/dist/custom-claims/service.js.map +1 -0
  212. package/dist/custom-claims/types.d.ts +132 -0
  213. package/dist/custom-claims/types.d.ts.map +1 -0
  214. package/dist/custom-claims/types.js +61 -0
  215. package/dist/custom-claims/types.js.map +1 -0
  216. package/dist/custom-claims/validators.d.ts +61 -0
  217. package/dist/custom-claims/validators.d.ts.map +1 -0
  218. package/dist/custom-claims/validators.js +136 -0
  219. package/dist/custom-claims/validators.js.map +1 -0
  220. package/dist/index.d.ts +14 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +91 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/lib/admin-permissions.d.ts +147 -0
  225. package/dist/lib/admin-permissions.d.ts.map +1 -0
  226. package/dist/lib/admin-permissions.js +261 -0
  227. package/dist/lib/admin-permissions.js.map +1 -0
  228. package/dist/lib/audit-log.d.ts +45 -0
  229. package/dist/lib/audit-log.d.ts.map +1 -0
  230. package/dist/lib/audit-log.js +79 -0
  231. package/dist/lib/audit-log.js.map +1 -0
  232. package/dist/lib/branding-assets.d.ts +47 -0
  233. package/dist/lib/branding-assets.d.ts.map +1 -0
  234. package/dist/lib/branding-assets.js +93 -0
  235. package/dist/lib/branding-assets.js.map +1 -0
  236. package/dist/lib/bulk-operations.d.ts +54 -0
  237. package/dist/lib/bulk-operations.d.ts.map +1 -0
  238. package/dist/lib/bulk-operations.js +201 -0
  239. package/dist/lib/bulk-operations.js.map +1 -0
  240. package/dist/lib/cursor.d.ts +110 -0
  241. package/dist/lib/cursor.d.ts.map +1 -0
  242. package/dist/lib/cursor.js +115 -0
  243. package/dist/lib/cursor.js.map +1 -0
  244. package/dist/lib/data-export.d.ts +67 -0
  245. package/dist/lib/data-export.d.ts.map +1 -0
  246. package/dist/lib/data-export.js +272 -0
  247. package/dist/lib/data-export.js.map +1 -0
  248. package/dist/lib/data-import-plan.d.ts +50 -0
  249. package/dist/lib/data-import-plan.d.ts.map +1 -0
  250. package/dist/lib/data-import-plan.js +235 -0
  251. package/dist/lib/data-import-plan.js.map +1 -0
  252. package/dist/lib/data-import.d.ts +276 -0
  253. package/dist/lib/data-import.d.ts.map +1 -0
  254. package/dist/lib/data-import.js +1694 -0
  255. package/dist/lib/data-import.js.map +1 -0
  256. package/dist/lib/database.d.ts +22 -0
  257. package/dist/lib/database.d.ts.map +1 -0
  258. package/dist/lib/database.js +103 -0
  259. package/dist/lib/database.js.map +1 -0
  260. package/dist/lib/entity-history.d.ts +52 -0
  261. package/dist/lib/entity-history.d.ts.map +1 -0
  262. package/dist/lib/entity-history.js +121 -0
  263. package/dist/lib/entity-history.js.map +1 -0
  264. package/dist/lib/etag.d.ts +92 -0
  265. package/dist/lib/etag.d.ts.map +1 -0
  266. package/dist/lib/etag.js +155 -0
  267. package/dist/lib/etag.js.map +1 -0
  268. package/dist/lib/image-validator.d.ts +44 -0
  269. package/dist/lib/image-validator.d.ts.map +1 -0
  270. package/dist/lib/image-validator.js +204 -0
  271. package/dist/lib/image-validator.js.map +1 -0
  272. package/dist/lib/logger.d.ts +15 -0
  273. package/dist/lib/logger.d.ts.map +1 -0
  274. package/dist/lib/logger.js +84 -0
  275. package/dist/lib/logger.js.map +1 -0
  276. package/dist/lib/migrator.d.ts +14 -0
  277. package/dist/lib/migrator.d.ts.map +1 -0
  278. package/dist/lib/migrator.js +34 -0
  279. package/dist/lib/migrator.js.map +1 -0
  280. package/dist/lib/redis.d.ts +5 -0
  281. package/dist/lib/redis.d.ts.map +1 -0
  282. package/dist/lib/redis.js +29 -0
  283. package/dist/lib/redis.js.map +1 -0
  284. package/dist/lib/runtime-paths.d.ts +38 -0
  285. package/dist/lib/runtime-paths.d.ts.map +1 -0
  286. package/dist/lib/runtime-paths.js +50 -0
  287. package/dist/lib/runtime-paths.js.map +1 -0
  288. package/dist/lib/session-tracking.d.ts +81 -0
  289. package/dist/lib/session-tracking.d.ts.map +1 -0
  290. package/dist/lib/session-tracking.js +145 -0
  291. package/dist/lib/session-tracking.js.map +1 -0
  292. package/dist/lib/signing-key-crypto.d.ts +53 -0
  293. package/dist/lib/signing-key-crypto.d.ts.map +1 -0
  294. package/dist/lib/signing-key-crypto.js +108 -0
  295. package/dist/lib/signing-key-crypto.js.map +1 -0
  296. package/dist/lib/signing-keys.d.ts +141 -0
  297. package/dist/lib/signing-keys.d.ts.map +1 -0
  298. package/dist/lib/signing-keys.js +206 -0
  299. package/dist/lib/signing-keys.js.map +1 -0
  300. package/dist/lib/stats.d.ts +83 -0
  301. package/dist/lib/stats.d.ts.map +1 -0
  302. package/dist/lib/stats.js +187 -0
  303. package/dist/lib/stats.js.map +1 -0
  304. package/dist/lib/super-admin-protection.d.ts +69 -0
  305. package/dist/lib/super-admin-protection.d.ts.map +1 -0
  306. package/dist/lib/super-admin-protection.js +102 -0
  307. package/dist/lib/super-admin-protection.js.map +1 -0
  308. package/dist/lib/system-config.d.ts +79 -0
  309. package/dist/lib/system-config.d.ts.map +1 -0
  310. package/dist/lib/system-config.js +159 -0
  311. package/dist/lib/system-config.js.map +1 -0
  312. package/dist/middleware/admin-auth.d.ts +100 -0
  313. package/dist/middleware/admin-auth.d.ts.map +1 -0
  314. package/dist/middleware/admin-auth.js +241 -0
  315. package/dist/middleware/admin-auth.js.map +1 -0
  316. package/dist/middleware/admin-cors.d.ts +41 -0
  317. package/dist/middleware/admin-cors.d.ts.map +1 -0
  318. package/dist/middleware/admin-cors.js +83 -0
  319. package/dist/middleware/admin-cors.js.map +1 -0
  320. package/dist/middleware/admin-mutation-audit.d.ts +9 -0
  321. package/dist/middleware/admin-mutation-audit.d.ts.map +1 -0
  322. package/dist/middleware/admin-mutation-audit.js +76 -0
  323. package/dist/middleware/admin-mutation-audit.js.map +1 -0
  324. package/dist/middleware/admin-rate-limiter.d.ts +56 -0
  325. package/dist/middleware/admin-rate-limiter.d.ts.map +1 -0
  326. package/dist/middleware/admin-rate-limiter.js +97 -0
  327. package/dist/middleware/admin-rate-limiter.js.map +1 -0
  328. package/dist/middleware/client-secret-hash.d.ts +34 -0
  329. package/dist/middleware/client-secret-hash.d.ts.map +1 -0
  330. package/dist/middleware/client-secret-hash.js +74 -0
  331. package/dist/middleware/client-secret-hash.js.map +1 -0
  332. package/dist/middleware/error-handler.d.ts +3 -0
  333. package/dist/middleware/error-handler.d.ts.map +1 -0
  334. package/dist/middleware/error-handler.js +93 -0
  335. package/dist/middleware/error-handler.js.map +1 -0
  336. package/dist/middleware/health.d.ts +3 -0
  337. package/dist/middleware/health.d.ts.map +1 -0
  338. package/dist/middleware/health.js +35 -0
  339. package/dist/middleware/health.js.map +1 -0
  340. package/dist/middleware/metrics.d.ts +40 -0
  341. package/dist/middleware/metrics.d.ts.map +1 -0
  342. package/dist/middleware/metrics.js +75 -0
  343. package/dist/middleware/metrics.js.map +1 -0
  344. package/dist/middleware/oidc-client-tenant.d.ts +37 -0
  345. package/dist/middleware/oidc-client-tenant.d.ts.map +1 -0
  346. package/dist/middleware/oidc-client-tenant.js +156 -0
  347. package/dist/middleware/oidc-client-tenant.js.map +1 -0
  348. package/dist/middleware/oidc-cors.d.ts +33 -0
  349. package/dist/middleware/oidc-cors.d.ts.map +1 -0
  350. package/dist/middleware/oidc-cors.js +68 -0
  351. package/dist/middleware/oidc-cors.js.map +1 -0
  352. package/dist/middleware/oidc-preflight-cors.d.ts +54 -0
  353. package/dist/middleware/oidc-preflight-cors.d.ts.map +1 -0
  354. package/dist/middleware/oidc-preflight-cors.js +267 -0
  355. package/dist/middleware/oidc-preflight-cors.js.map +1 -0
  356. package/dist/middleware/prompt-login-reset.d.ts +103 -0
  357. package/dist/middleware/prompt-login-reset.d.ts.map +1 -0
  358. package/dist/middleware/prompt-login-reset.js +204 -0
  359. package/dist/middleware/prompt-login-reset.js.map +1 -0
  360. package/dist/middleware/ready.d.ts +23 -0
  361. package/dist/middleware/ready.d.ts.map +1 -0
  362. package/dist/middleware/ready.js +60 -0
  363. package/dist/middleware/ready.js.map +1 -0
  364. package/dist/middleware/request-logger.d.ts +27 -0
  365. package/dist/middleware/request-logger.d.ts.map +1 -0
  366. package/dist/middleware/request-logger.js +46 -0
  367. package/dist/middleware/request-logger.js.map +1 -0
  368. package/dist/middleware/require-permission.d.ts +28 -0
  369. package/dist/middleware/require-permission.d.ts.map +1 -0
  370. package/dist/middleware/require-permission.js +63 -0
  371. package/dist/middleware/require-permission.js.map +1 -0
  372. package/dist/middleware/require-user-organization.d.ts +18 -0
  373. package/dist/middleware/require-user-organization.d.ts.map +1 -0
  374. package/dist/middleware/require-user-organization.js +53 -0
  375. package/dist/middleware/require-user-organization.js.map +1 -0
  376. package/dist/middleware/root-page.d.ts +62 -0
  377. package/dist/middleware/root-page.d.ts.map +1 -0
  378. package/dist/middleware/root-page.js +134 -0
  379. package/dist/middleware/root-page.js.map +1 -0
  380. package/dist/middleware/security-headers.d.ts +98 -0
  381. package/dist/middleware/security-headers.d.ts.map +1 -0
  382. package/dist/middleware/security-headers.js +159 -0
  383. package/dist/middleware/security-headers.js.map +1 -0
  384. package/dist/middleware/tenant-resolver.d.ts +37 -0
  385. package/dist/middleware/tenant-resolver.d.ts.map +1 -0
  386. package/dist/middleware/tenant-resolver.js +71 -0
  387. package/dist/middleware/tenant-resolver.js.map +1 -0
  388. package/dist/middleware/token-rate-limiter.d.ts +89 -0
  389. package/dist/middleware/token-rate-limiter.d.ts.map +1 -0
  390. package/dist/middleware/token-rate-limiter.js +189 -0
  391. package/dist/middleware/token-rate-limiter.js.map +1 -0
  392. package/dist/oidc/account-finder.d.ts +52 -0
  393. package/dist/oidc/account-finder.d.ts.map +1 -0
  394. package/dist/oidc/account-finder.js +134 -0
  395. package/dist/oidc/account-finder.js.map +1 -0
  396. package/dist/oidc/adapter-factory.d.ts +90 -0
  397. package/dist/oidc/adapter-factory.d.ts.map +1 -0
  398. package/dist/oidc/adapter-factory.js +165 -0
  399. package/dist/oidc/adapter-factory.js.map +1 -0
  400. package/dist/oidc/configuration.d.ts +155 -0
  401. package/dist/oidc/configuration.d.ts.map +1 -0
  402. package/dist/oidc/configuration.js +531 -0
  403. package/dist/oidc/configuration.js.map +1 -0
  404. package/dist/oidc/postgres-adapter.d.ts +159 -0
  405. package/dist/oidc/postgres-adapter.d.ts.map +1 -0
  406. package/dist/oidc/postgres-adapter.js +222 -0
  407. package/dist/oidc/postgres-adapter.js.map +1 -0
  408. package/dist/oidc/protocol-security-observer.d.ts +38 -0
  409. package/dist/oidc/protocol-security-observer.d.ts.map +1 -0
  410. package/dist/oidc/protocol-security-observer.js +93 -0
  411. package/dist/oidc/protocol-security-observer.js.map +1 -0
  412. package/dist/oidc/provider.d.ts +37 -0
  413. package/dist/oidc/provider.d.ts.map +1 -0
  414. package/dist/oidc/provider.js +71 -0
  415. package/dist/oidc/provider.js.map +1 -0
  416. package/dist/oidc/redis-adapter.d.ts +140 -0
  417. package/dist/oidc/redis-adapter.d.ts.map +1 -0
  418. package/dist/oidc/redis-adapter.js +344 -0
  419. package/dist/oidc/redis-adapter.js.map +1 -0
  420. package/dist/organizations/cache.d.ts +60 -0
  421. package/dist/organizations/cache.d.ts.map +1 -0
  422. package/dist/organizations/cache.js +157 -0
  423. package/dist/organizations/cache.js.map +1 -0
  424. package/dist/organizations/errors.d.ts +25 -0
  425. package/dist/organizations/errors.d.ts.map +1 -0
  426. package/dist/organizations/errors.js +31 -0
  427. package/dist/organizations/errors.js.map +1 -0
  428. package/dist/organizations/index.d.ts +15 -0
  429. package/dist/organizations/index.d.ts.map +1 -0
  430. package/dist/organizations/index.js +15 -0
  431. package/dist/organizations/index.js.map +1 -0
  432. package/dist/organizations/repository.d.ts +183 -0
  433. package/dist/organizations/repository.d.ts.map +1 -0
  434. package/dist/organizations/repository.js +354 -0
  435. package/dist/organizations/repository.js.map +1 -0
  436. package/dist/organizations/service.d.ts +168 -0
  437. package/dist/organizations/service.d.ts.map +1 -0
  438. package/dist/organizations/service.js +511 -0
  439. package/dist/organizations/service.js.map +1 -0
  440. package/dist/organizations/slugs.d.ts +57 -0
  441. package/dist/organizations/slugs.d.ts.map +1 -0
  442. package/dist/organizations/slugs.js +130 -0
  443. package/dist/organizations/slugs.js.map +1 -0
  444. package/dist/organizations/types.d.ts +146 -0
  445. package/dist/organizations/types.d.ts.map +1 -0
  446. package/dist/organizations/types.js +49 -0
  447. package/dist/organizations/types.js.map +1 -0
  448. package/dist/rbac/cache.d.ts +110 -0
  449. package/dist/rbac/cache.d.ts.map +1 -0
  450. package/dist/rbac/cache.js +271 -0
  451. package/dist/rbac/cache.js.map +1 -0
  452. package/dist/rbac/errors.d.ts +34 -0
  453. package/dist/rbac/errors.d.ts.map +1 -0
  454. package/dist/rbac/errors.js +43 -0
  455. package/dist/rbac/errors.js.map +1 -0
  456. package/dist/rbac/index.d.ts +17 -0
  457. package/dist/rbac/index.d.ts.map +1 -0
  458. package/dist/rbac/index.js +21 -0
  459. package/dist/rbac/index.js.map +1 -0
  460. package/dist/rbac/mapping-repository.d.ts +121 -0
  461. package/dist/rbac/mapping-repository.d.ts.map +1 -0
  462. package/dist/rbac/mapping-repository.js +224 -0
  463. package/dist/rbac/mapping-repository.js.map +1 -0
  464. package/dist/rbac/permission-repository.d.ts +100 -0
  465. package/dist/rbac/permission-repository.d.ts.map +1 -0
  466. package/dist/rbac/permission-repository.js +190 -0
  467. package/dist/rbac/permission-repository.js.map +1 -0
  468. package/dist/rbac/permission-service.d.ts +85 -0
  469. package/dist/rbac/permission-service.d.ts.map +1 -0
  470. package/dist/rbac/permission-service.js +179 -0
  471. package/dist/rbac/permission-service.js.map +1 -0
  472. package/dist/rbac/role-repository.d.ts +104 -0
  473. package/dist/rbac/role-repository.d.ts.map +1 -0
  474. package/dist/rbac/role-repository.js +202 -0
  475. package/dist/rbac/role-repository.js.map +1 -0
  476. package/dist/rbac/role-service.d.ts +111 -0
  477. package/dist/rbac/role-service.d.ts.map +1 -0
  478. package/dist/rbac/role-service.js +256 -0
  479. package/dist/rbac/role-service.js.map +1 -0
  480. package/dist/rbac/slugs.d.ts +116 -0
  481. package/dist/rbac/slugs.d.ts.map +1 -0
  482. package/dist/rbac/slugs.js +178 -0
  483. package/dist/rbac/slugs.js.map +1 -0
  484. package/dist/rbac/types.d.ts +187 -0
  485. package/dist/rbac/types.d.ts.map +1 -0
  486. package/dist/rbac/types.js +75 -0
  487. package/dist/rbac/types.js.map +1 -0
  488. package/dist/rbac/user-role-service.d.ts +101 -0
  489. package/dist/rbac/user-role-service.d.ts.map +1 -0
  490. package/dist/rbac/user-role-service.js +166 -0
  491. package/dist/rbac/user-role-service.js.map +1 -0
  492. package/dist/routes/applications.d.ts +40 -0
  493. package/dist/routes/applications.d.ts.map +1 -0
  494. package/dist/routes/applications.js +284 -0
  495. package/dist/routes/applications.js.map +1 -0
  496. package/dist/routes/audit.d.ts +31 -0
  497. package/dist/routes/audit.d.ts.map +1 -0
  498. package/dist/routes/audit.js +140 -0
  499. package/dist/routes/audit.js.map +1 -0
  500. package/dist/routes/branding.d.ts +17 -0
  501. package/dist/routes/branding.d.ts.map +1 -0
  502. package/dist/routes/branding.js +104 -0
  503. package/dist/routes/branding.js.map +1 -0
  504. package/dist/routes/bulk.d.ts +37 -0
  505. package/dist/routes/bulk.d.ts.map +1 -0
  506. package/dist/routes/bulk.js +94 -0
  507. package/dist/routes/bulk.js.map +1 -0
  508. package/dist/routes/clients.d.ts +44 -0
  509. package/dist/routes/clients.d.ts.map +1 -0
  510. package/dist/routes/clients.js +353 -0
  511. package/dist/routes/clients.js.map +1 -0
  512. package/dist/routes/config.d.ts +35 -0
  513. package/dist/routes/config.d.ts.map +1 -0
  514. package/dist/routes/config.js +115 -0
  515. package/dist/routes/config.js.map +1 -0
  516. package/dist/routes/custom-claims.d.ts +38 -0
  517. package/dist/routes/custom-claims.d.ts.map +1 -0
  518. package/dist/routes/custom-claims.js +208 -0
  519. package/dist/routes/custom-claims.js.map +1 -0
  520. package/dist/routes/exports.d.ts +21 -0
  521. package/dist/routes/exports.d.ts.map +1 -0
  522. package/dist/routes/exports.js +98 -0
  523. package/dist/routes/exports.js.map +1 -0
  524. package/dist/routes/imports.d.ts +18 -0
  525. package/dist/routes/imports.d.ts.map +1 -0
  526. package/dist/routes/imports.js +72 -0
  527. package/dist/routes/imports.js.map +1 -0
  528. package/dist/routes/interactions.d.ts +111 -0
  529. package/dist/routes/interactions.d.ts.map +1 -0
  530. package/dist/routes/interactions.js +1074 -0
  531. package/dist/routes/interactions.js.map +1 -0
  532. package/dist/routes/invitation.d.ts +31 -0
  533. package/dist/routes/invitation.d.ts.map +1 -0
  534. package/dist/routes/invitation.js +342 -0
  535. package/dist/routes/invitation.js.map +1 -0
  536. package/dist/routes/keys.d.ts +28 -0
  537. package/dist/routes/keys.d.ts.map +1 -0
  538. package/dist/routes/keys.js +91 -0
  539. package/dist/routes/keys.js.map +1 -0
  540. package/dist/routes/magic-link.d.ts +43 -0
  541. package/dist/routes/magic-link.d.ts.map +1 -0
  542. package/dist/routes/magic-link.js +264 -0
  543. package/dist/routes/magic-link.js.map +1 -0
  544. package/dist/routes/organizations.d.ts +38 -0
  545. package/dist/routes/organizations.d.ts.map +1 -0
  546. package/dist/routes/organizations.js +347 -0
  547. package/dist/routes/organizations.js.map +1 -0
  548. package/dist/routes/password-reset.d.ts +65 -0
  549. package/dist/routes/password-reset.d.ts.map +1 -0
  550. package/dist/routes/password-reset.js +493 -0
  551. package/dist/routes/password-reset.js.map +1 -0
  552. package/dist/routes/permissions.d.ts +33 -0
  553. package/dist/routes/permissions.d.ts.map +1 -0
  554. package/dist/routes/permissions.js +166 -0
  555. package/dist/routes/permissions.js.map +1 -0
  556. package/dist/routes/roles.d.ts +37 -0
  557. package/dist/routes/roles.d.ts.map +1 -0
  558. package/dist/routes/roles.js +222 -0
  559. package/dist/routes/roles.js.map +1 -0
  560. package/dist/routes/sessions.d.ts +37 -0
  561. package/dist/routes/sessions.d.ts.map +1 -0
  562. package/dist/routes/sessions.js +121 -0
  563. package/dist/routes/sessions.js.map +1 -0
  564. package/dist/routes/stats.d.ts +28 -0
  565. package/dist/routes/stats.d.ts.map +1 -0
  566. package/dist/routes/stats.js +65 -0
  567. package/dist/routes/stats.js.map +1 -0
  568. package/dist/routes/two-factor-admin.d.ts +54 -0
  569. package/dist/routes/two-factor-admin.d.ts.map +1 -0
  570. package/dist/routes/two-factor-admin.js +344 -0
  571. package/dist/routes/two-factor-admin.js.map +1 -0
  572. package/dist/routes/two-factor.d.ts +31 -0
  573. package/dist/routes/two-factor.d.ts.map +1 -0
  574. package/dist/routes/two-factor.js +595 -0
  575. package/dist/routes/two-factor.js.map +1 -0
  576. package/dist/routes/user-roles.d.ts +33 -0
  577. package/dist/routes/user-roles.d.ts.map +1 -0
  578. package/dist/routes/user-roles.js +129 -0
  579. package/dist/routes/user-roles.js.map +1 -0
  580. package/dist/routes/users.d.ts +61 -0
  581. package/dist/routes/users.d.ts.map +1 -0
  582. package/dist/routes/users.js +868 -0
  583. package/dist/routes/users.js.map +1 -0
  584. package/dist/security/decision-context.d.ts +52 -0
  585. package/dist/security/decision-context.d.ts.map +1 -0
  586. package/dist/security/decision-context.js +150 -0
  587. package/dist/security/decision-context.js.map +1 -0
  588. package/dist/security/decision-event.d.ts +128 -0
  589. package/dist/security/decision-event.d.ts.map +1 -0
  590. package/dist/security/decision-event.js +225 -0
  591. package/dist/security/decision-event.js.map +1 -0
  592. package/dist/security/transport-decision.d.ts +6 -0
  593. package/dist/security/transport-decision.d.ts.map +1 -0
  594. package/dist/security/transport-decision.js +37 -0
  595. package/dist/security/transport-decision.js.map +1 -0
  596. package/dist/server.d.ts +50 -0
  597. package/dist/server.d.ts.map +1 -0
  598. package/dist/server.js +491 -0
  599. package/dist/server.js.map +1 -0
  600. package/dist/two-factor/cache.d.ts +47 -0
  601. package/dist/two-factor/cache.d.ts.map +1 -0
  602. package/dist/two-factor/cache.js +122 -0
  603. package/dist/two-factor/cache.js.map +1 -0
  604. package/dist/two-factor/crypto.d.ts +41 -0
  605. package/dist/two-factor/crypto.d.ts.map +1 -0
  606. package/dist/two-factor/crypto.js +94 -0
  607. package/dist/two-factor/crypto.js.map +1 -0
  608. package/dist/two-factor/errors.d.ts +82 -0
  609. package/dist/two-factor/errors.d.ts.map +1 -0
  610. package/dist/two-factor/errors.js +112 -0
  611. package/dist/two-factor/errors.js.map +1 -0
  612. package/dist/two-factor/index.d.ts +18 -0
  613. package/dist/two-factor/index.d.ts.map +1 -0
  614. package/dist/two-factor/index.js +25 -0
  615. package/dist/two-factor/index.js.map +1 -0
  616. package/dist/two-factor/otp.d.ts +43 -0
  617. package/dist/two-factor/otp.d.ts.map +1 -0
  618. package/dist/two-factor/otp.js +57 -0
  619. package/dist/two-factor/otp.js.map +1 -0
  620. package/dist/two-factor/recovery.d.ts +45 -0
  621. package/dist/two-factor/recovery.d.ts.map +1 -0
  622. package/dist/two-factor/recovery.js +104 -0
  623. package/dist/two-factor/recovery.js.map +1 -0
  624. package/dist/two-factor/repository.d.ts +156 -0
  625. package/dist/two-factor/repository.d.ts.map +1 -0
  626. package/dist/two-factor/repository.js +251 -0
  627. package/dist/two-factor/repository.js.map +1 -0
  628. package/dist/two-factor/service.d.ts +232 -0
  629. package/dist/two-factor/service.d.ts.map +1 -0
  630. package/dist/two-factor/service.js +599 -0
  631. package/dist/two-factor/service.js.map +1 -0
  632. package/dist/two-factor/totp.d.ts +57 -0
  633. package/dist/two-factor/totp.d.ts.map +1 -0
  634. package/dist/two-factor/totp.js +96 -0
  635. package/dist/two-factor/totp.js.map +1 -0
  636. package/dist/two-factor/types.d.ts +152 -0
  637. package/dist/two-factor/types.d.ts.map +1 -0
  638. package/dist/two-factor/types.js +64 -0
  639. package/dist/two-factor/types.js.map +1 -0
  640. package/dist/users/cache.d.ts +49 -0
  641. package/dist/users/cache.d.ts.map +1 -0
  642. package/dist/users/cache.js +140 -0
  643. package/dist/users/cache.js.map +1 -0
  644. package/dist/users/claims.d.ts +67 -0
  645. package/dist/users/claims.d.ts.map +1 -0
  646. package/dist/users/claims.js +104 -0
  647. package/dist/users/claims.js.map +1 -0
  648. package/dist/users/errors.d.ts +25 -0
  649. package/dist/users/errors.d.ts.map +1 -0
  650. package/dist/users/errors.js +31 -0
  651. package/dist/users/errors.js.map +1 -0
  652. package/dist/users/gdpr.d.ts +110 -0
  653. package/dist/users/gdpr.d.ts.map +1 -0
  654. package/dist/users/gdpr.js +211 -0
  655. package/dist/users/gdpr.js.map +1 -0
  656. package/dist/users/index.d.ts +20 -0
  657. package/dist/users/index.d.ts.map +1 -0
  658. package/dist/users/index.js +19 -0
  659. package/dist/users/index.js.map +1 -0
  660. package/dist/users/password.d.ts +85 -0
  661. package/dist/users/password.d.ts.map +1 -0
  662. package/dist/users/password.js +138 -0
  663. package/dist/users/password.js.map +1 -0
  664. package/dist/users/repository.d.ts +263 -0
  665. package/dist/users/repository.d.ts.map +1 -0
  666. package/dist/users/repository.js +499 -0
  667. package/dist/users/repository.js.map +1 -0
  668. package/dist/users/service.d.ts +299 -0
  669. package/dist/users/service.d.ts.map +1 -0
  670. package/dist/users/service.js +698 -0
  671. package/dist/users/service.js.map +1 -0
  672. package/dist/users/types.d.ts +220 -0
  673. package/dist/users/types.d.ts.map +1 -0
  674. package/dist/users/types.js +77 -0
  675. package/dist/users/types.js.map +1 -0
  676. package/locales/default/en/common.json +10 -0
  677. package/locales/default/en/consent.json +13 -0
  678. package/locales/default/en/emails.json +17 -0
  679. package/locales/default/en/errors.json +21 -0
  680. package/locales/default/en/forgot-password.json +11 -0
  681. package/locales/default/en/invitation.json +18 -0
  682. package/locales/default/en/login.json +17 -0
  683. package/locales/default/en/logout.json +9 -0
  684. package/locales/default/en/magic-link.json +12 -0
  685. package/locales/default/en/reset-password.json +16 -0
  686. package/locales/default/en/two-factor.json +29 -0
  687. package/migrations/.gitkeep +0 -0
  688. package/migrations/001_extensions.sql +22 -0
  689. package/migrations/002_organizations.sql +43 -0
  690. package/migrations/003_applications.sql +50 -0
  691. package/migrations/004_clients.sql +74 -0
  692. package/migrations/005_users.sql +119 -0
  693. package/migrations/006_roles_permissions.sql +80 -0
  694. package/migrations/007_custom_claims.sql +55 -0
  695. package/migrations/008_config.sql +51 -0
  696. package/migrations/009_audit_log.sql +31 -0
  697. package/migrations/010_oidc_adapter.sql +34 -0
  698. package/migrations/011_seed.sql +53 -0
  699. package/migrations/012_two_factor.sql +88 -0
  700. package/migrations/013_client_secret_sha256.sql +22 -0
  701. package/migrations/014_login_methods.sql +34 -0
  702. package/migrations/015_signing_key_encryption.sql +20 -0
  703. package/migrations/016_failed_login_count.sql +27 -0
  704. package/migrations/017_audit_retention.sql +11 -0
  705. package/migrations/018_admin_api_enhancements.sql +78 -0
  706. package/migrations/019_invitation_details.sql +27 -0
  707. package/migrations/020_two_factor_admin_permission.sql +108 -0
  708. package/migrations/021_auth_recovery_jobs.sql +74 -0
  709. package/migrations/022_recovery_artifact_ownership.sql +25 -0
  710. package/migrations/023_magic_link_authority.sql +39 -0
  711. package/package.json +106 -0
  712. package/templates/default/emails/invitation.hbs +39 -0
  713. package/templates/default/emails/invitation.txt.hbs +18 -0
  714. package/templates/default/emails/magic-link.hbs +30 -0
  715. package/templates/default/emails/magic-link.txt.hbs +11 -0
  716. package/templates/default/emails/otp-code.hbs +31 -0
  717. package/templates/default/emails/otp-code.txt.hbs +15 -0
  718. package/templates/default/emails/password-changed.hbs +24 -0
  719. package/templates/default/emails/password-changed.txt.hbs +7 -0
  720. package/templates/default/emails/password-reset.hbs +30 -0
  721. package/templates/default/emails/password-reset.txt.hbs +11 -0
  722. package/templates/default/emails/welcome.hbs +25 -0
  723. package/templates/default/emails/welcome.txt.hbs +9 -0
  724. package/templates/default/layouts/main.hbs +49 -0
  725. package/templates/default/pages/accept-invite.hbs +25 -0
  726. package/templates/default/pages/consent.hbs +27 -0
  727. package/templates/default/pages/error.hbs +15 -0
  728. package/templates/default/pages/forgot-password.hbs +21 -0
  729. package/templates/default/pages/invite-expired.hbs +6 -0
  730. package/templates/default/pages/invite-success.hbs +9 -0
  731. package/templates/default/pages/login.hbs +108 -0
  732. package/templates/default/pages/logout-success.hbs +5 -0
  733. package/templates/default/pages/logout.hbs +24 -0
  734. package/templates/default/pages/magic-link-sent.hbs +10 -0
  735. package/templates/default/pages/magic-link-success.hbs +17 -0
  736. package/templates/default/pages/reset-password.hbs +20 -0
  737. package/templates/default/pages/reset-success.hbs +9 -0
  738. package/templates/default/pages/two-factor-setup.hbs +65 -0
  739. package/templates/default/pages/two-factor-verify.hbs +77 -0
  740. package/templates/default/partials/flash-messages.hbs +10 -0
  741. package/templates/default/partials/footer.hbs +4 -0
  742. package/templates/default/partials/header.hbs +8 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Account finder for node-oidc-provider.
3
+ *
4
+ * Maps user records from the database to OIDC account objects with a
5
+ * claims() method. The provider calls findAccount when it needs user
6
+ * information for ID tokens, userinfo endpoint responses, etc.
7
+ *
8
+ * This implementation delegates to the user service for lookup and
9
+ * the claims builder for scope-based claims mapping. The user must
10
+ * be active to be returned — non-active users get undefined (no account).
11
+ *
12
+ * Claims flow:
13
+ * 1. buildUserClaims(user, scopes) → standard OIDC claims (sub, name, email...)
14
+ * 2. buildRoleClaims(userId) → role slugs array (cache-first)
15
+ * 3. buildPermissionClaims(userId) → permission slugs array (cache-first)
16
+ * 4. buildCustomClaims(userId, appId, tokenType) → custom per-app claims
17
+ *
18
+ * The applicationId for custom claims is resolved from the OIDC client
19
+ * context. If unavailable (e.g., no client context), custom claims are
20
+ * skipped gracefully.
21
+ *
22
+ * @see users/service.ts — User lookup for OIDC
23
+ * @see users/claims.ts — Standard OIDC claims builder
24
+ * @see rbac/user-role-service.ts — RBAC claims builders
25
+ * @see custom-claims/service.ts — Custom claims builder
26
+ */
27
+ import { findUserForOidc } from '../users/service.js';
28
+ import { buildUserClaims } from '../users/claims.js';
29
+ import { buildRoleClaims, buildPermissionClaims } from '../rbac/user-role-service.js';
30
+ import { buildCustomClaims } from '../custom-claims/service.js';
31
+ import { logger } from '../lib/logger.js';
32
+ /**
33
+ * Find an OIDC account by subject identifier (user ID).
34
+ *
35
+ * Delegates to the user service's findUserForOidc which returns
36
+ * active users only. Returns an account object with a claims() method
37
+ * that builds scope-filtered OIDC Standard Claims merged with RBAC
38
+ * role/permission claims and per-application custom claims.
39
+ *
40
+ * @param ctx - Koa context with OIDC extensions (used to resolve client/app context)
41
+ * @param sub - The subject identifier (user UUID)
42
+ * @returns Account object with claims() method, or undefined if not found
43
+ */
44
+ export async function findAccount(ctx, sub) {
45
+ try {
46
+ const user = await findUserForOidc(sub);
47
+ if (!user)
48
+ return undefined;
49
+ return {
50
+ accountId: user.id,
51
+ /**
52
+ * Return claims for the user including standard OIDC claims,
53
+ * RBAC roles/permissions, and per-application custom claims.
54
+ *
55
+ * Standard claims are filtered by scopes (OpenID Connect Core §5.4).
56
+ * RBAC claims (roles, permissions) are always included as arrays.
57
+ * Custom claims are filtered by token type inclusion flags.
58
+ */
59
+ async claims(use, scope) {
60
+ // Parse space-separated scope string into array
61
+ const scopes = scope ? scope.split(' ') : [];
62
+ // 1. Standard OIDC claims (scope-filtered)
63
+ const standardClaims = buildUserClaims(user, scopes);
64
+ // 2. RBAC claims (always included — cache-first resolution)
65
+ const [roles, permissions] = await Promise.all([
66
+ buildRoleClaims(user.id),
67
+ buildPermissionClaims(user.id),
68
+ ]);
69
+ // 3. Custom claims (per-application, filtered by token type)
70
+ // Resolve applicationId from the OIDC client context if available
71
+ const applicationId = resolveApplicationId(ctx);
72
+ let customClaims = {};
73
+ if (applicationId) {
74
+ // Map OIDC 'use' parameter to our TokenType
75
+ const tokenType = mapUseToTokenType(use);
76
+ customClaims = await buildCustomClaims(user.id, applicationId, tokenType);
77
+ }
78
+ // Merge all claims — standard first, then RBAC arrays, then custom
79
+ return {
80
+ ...standardClaims,
81
+ roles,
82
+ permissions,
83
+ ...customClaims,
84
+ };
85
+ },
86
+ };
87
+ }
88
+ catch (error) {
89
+ logger.error({ sub, error }, 'Failed to look up OIDC account');
90
+ return undefined;
91
+ }
92
+ }
93
+ /**
94
+ * Resolve the applicationId from the OIDC context.
95
+ *
96
+ * The OIDC provider passes the Koa context which includes the client
97
+ * object at ctx.oidc.client. The client has an applicationId stored
98
+ * in its metadata. Returns null if the context doesn't have the
99
+ * expected structure (graceful fallback).
100
+ *
101
+ * @param ctx - Koa context with OIDC extensions
102
+ * @returns Application UUID or null if not resolvable
103
+ */
104
+ function resolveApplicationId(ctx) {
105
+ try {
106
+ // Navigate the OIDC context structure: ctx.oidc.client.applicationId
107
+ const oidcCtx = ctx;
108
+ return oidcCtx?.oidc?.client?.applicationId ?? null;
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
114
+ /**
115
+ * Map the OIDC 'use' parameter to our TokenType enum.
116
+ *
117
+ * The OIDC provider passes 'id_token', 'userinfo', or occasionally
118
+ * other values. We map them to our TokenType for custom claims filtering.
119
+ *
120
+ * @param use - Token type from OIDC provider
121
+ * @returns Mapped TokenType
122
+ */
123
+ function mapUseToTokenType(use) {
124
+ switch (use) {
125
+ case 'id_token':
126
+ return 'id_token';
127
+ case 'userinfo':
128
+ return 'userinfo';
129
+ default:
130
+ // Default to access_token for introspection and other uses
131
+ return 'access_token';
132
+ }
133
+ }
134
+ //# sourceMappingURL=account-finder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-finder.js","sourceRoot":"","sources":["../../src/oidc/account-finder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAgB1C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAY,EACZ,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAE5B,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB;;;;;;;eAOG;YACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,KAAa;gBACrC,gDAAgD;gBAChD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAE7C,2CAA2C;gBAC3C,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAErD,4DAA4D;gBAC5D,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC7C,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC/B,CAAC,CAAC;gBAEH,6DAA6D;gBAC7D,kEAAkE;gBAClE,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;gBAChD,IAAI,YAAY,GAA4B,EAAE,CAAC;gBAC/C,IAAI,aAAa,EAAE,CAAC;oBAClB,4CAA4C;oBAC5C,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;oBACzC,YAAY,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;gBAC5E,CAAC;gBAED,mEAAmE;gBACnE,OAAO;oBACL,GAAG,cAAc;oBACjB,KAAK;oBACL,WAAW;oBACX,GAAG,YAAY;iBAChB,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,oBAAoB,CAAC,GAAY;IACxC,IAAI,CAAC;QACH,qEAAqE;QACrE,MAAM,OAAO,GAAG,GAAyD,CAAC;QAC1E,OAAO,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,IAAI,IAAI,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB;YACE,2DAA2D;YAC3D,OAAO,cAAc,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Hybrid adapter factory for node-oidc-provider.
3
+ *
4
+ * Routes short-lived, high-throughput models to RedisAdapter and
5
+ * long-lived models to PostgresAdapter. This maximizes performance
6
+ * for frequently accessed artifacts (sessions, interactions, auth codes)
7
+ * while ensuring persistence for long-lived ones (access tokens,
8
+ * refresh tokens, grants).
9
+ *
10
+ * Usage:
11
+ * const provider = new Provider(issuer, {
12
+ * adapter: createAdapterFactory(),
13
+ * });
14
+ *
15
+ * The factory returns a CLASS (not an instance) — node-oidc-provider
16
+ * instantiates it with `new AdapterClass(modelName)`.
17
+ */
18
+ import { PostgresAdapter } from './postgres-adapter.js';
19
+ import { RedisAdapter } from './redis-adapter.js';
20
+ import type { AdapterPayload } from './postgres-adapter.js';
21
+ /**
22
+ * Models routed to Redis for performance.
23
+ *
24
+ * These are short-lived, high-throughput artifacts where Redis's
25
+ * in-memory speed and automatic TTL expiry are ideal:
26
+ * - Session: frequently accessed per-request, 24h TTL
27
+ * - Interaction: very short-lived login flow state, 1h TTL
28
+ * - AuthorizationCode: short-lived, high throughput, 10min TTL
29
+ * - ReplayDetection: performance-critical duplicate detection
30
+ * - ClientCredentials: short-lived M2M tokens, 1h TTL
31
+ * - PushedAuthorizationRequest: short-lived PAR requests, 1h TTL
32
+ */
33
+ export declare const REDIS_MODELS: Set<string>;
34
+ /**
35
+ * Check if a model name should be stored in Redis.
36
+ *
37
+ * @param name - OIDC model name (e.g., 'Session', 'AccessToken')
38
+ * @returns true if the model should use Redis, false for PostgreSQL
39
+ */
40
+ export declare function isRedisModel(name: string): boolean;
41
+ /**
42
+ * Create the hybrid adapter factory for node-oidc-provider.
43
+ *
44
+ * Returns a class constructor that node-oidc-provider calls with
45
+ * `new AdapterClass(modelName)`. The constructor internally creates
46
+ * either a RedisAdapter or PostgresAdapter based on the model name.
47
+ *
48
+ * @returns A class constructor compatible with node-oidc-provider's adapter option
49
+ */
50
+ export declare function createAdapterFactory(): {
51
+ new (name: string): {
52
+ /** The underlying adapter (Redis or PostgreSQL) */
53
+ delegate: PostgresAdapter | RedisAdapter;
54
+ /** The OIDC model name this adapter instance handles */
55
+ name: string;
56
+ /** Create or update an OIDC artifact */
57
+ upsert(id: string, payload: AdapterPayload, expiresIn: number): Promise<void>;
58
+ /**
59
+ * Find an artifact by its primary ID.
60
+ *
61
+ * For the 'Client' model, routes to findForOidc() which resolves
62
+ * clients from the clients table (not oidc_payloads). This is the
63
+ * bridge between Porta's client management and oidc-provider.
64
+ */
65
+ find(id: string): Promise<AdapterPayload | undefined>;
66
+ /** Find an artifact by user code (device flow) */
67
+ findByUserCode(userCode: string): Promise<AdapterPayload | undefined>;
68
+ /** Find an artifact by UID (sessions) */
69
+ findByUid(uid: string): Promise<AdapterPayload | undefined>;
70
+ /** Mark an artifact as consumed */
71
+ consume(id: string): Promise<void>;
72
+ /**
73
+ * Delete an artifact by ID.
74
+ *
75
+ * For Session models, this performs a cascade delete: before destroying the
76
+ * session itself, it reads the session's authorizations to extract grant IDs,
77
+ * then deletes all associated grants and tokens from PostgreSQL and cleans up
78
+ * Redis grant sets. This ensures "explicit logout = total cleanup."
79
+ *
80
+ * For all other models, delegates directly to the underlying adapter.
81
+ *
82
+ * Error handling: cascade failures are logged but do NOT prevent the session
83
+ * from being destroyed — the user must always be able to log out.
84
+ */
85
+ destroy(id: string): Promise<void>;
86
+ /** Revoke all artifacts for a given grant */
87
+ revokeByGrantId(grantId: string): Promise<void>;
88
+ };
89
+ };
90
+ //# sourceMappingURL=adapter-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-factory.d.ts","sourceRoot":"","sources":["../../src/oidc/adapter-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAqB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,aAOvB,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB;eAad,MAAM;QANxB,mDAAmD;kBAClC,eAAe,GAAG,YAAY;QAE/C,wDAAwD;cAC3C,MAAM;QAanB,wCAAwC;mBACvB,MAAM,WAAW,cAAc,aAAa,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAInF;;;;;;WAMG;iBACY,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;QAO3D,kDAAkD;iCACnB,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;QAI3E,yCAAyC;uBACpB,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;QAIjE,mCAAmC;oBACjB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAIxC;;;;;;;;;;;;WAYG;oBACe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAgDxC,6CAA6C;iCACd,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;;EAIxD"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Hybrid adapter factory for node-oidc-provider.
3
+ *
4
+ * Routes short-lived, high-throughput models to RedisAdapter and
5
+ * long-lived models to PostgresAdapter. This maximizes performance
6
+ * for frequently accessed artifacts (sessions, interactions, auth codes)
7
+ * while ensuring persistence for long-lived ones (access tokens,
8
+ * refresh tokens, grants).
9
+ *
10
+ * Usage:
11
+ * const provider = new Provider(issuer, {
12
+ * adapter: createAdapterFactory(),
13
+ * });
14
+ *
15
+ * The factory returns a CLASS (not an instance) — node-oidc-provider
16
+ * instantiates it with `new AdapterClass(modelName)`.
17
+ */
18
+ import { PostgresAdapter, revokeGrantsByIds } from './postgres-adapter.js';
19
+ import { RedisAdapter, cleanupRedisGrants } from './redis-adapter.js';
20
+ import { findForOidc } from '../clients/service.js';
21
+ import { logger } from '../lib/logger.js';
22
+ /**
23
+ * Models routed to Redis for performance.
24
+ *
25
+ * These are short-lived, high-throughput artifacts where Redis's
26
+ * in-memory speed and automatic TTL expiry are ideal:
27
+ * - Session: frequently accessed per-request, 24h TTL
28
+ * - Interaction: very short-lived login flow state, 1h TTL
29
+ * - AuthorizationCode: short-lived, high throughput, 10min TTL
30
+ * - ReplayDetection: performance-critical duplicate detection
31
+ * - ClientCredentials: short-lived M2M tokens, 1h TTL
32
+ * - PushedAuthorizationRequest: short-lived PAR requests, 1h TTL
33
+ */
34
+ export const REDIS_MODELS = new Set([
35
+ 'Session',
36
+ 'Interaction',
37
+ 'AuthorizationCode',
38
+ 'ReplayDetection',
39
+ 'ClientCredentials',
40
+ 'PushedAuthorizationRequest',
41
+ ]);
42
+ /**
43
+ * Check if a model name should be stored in Redis.
44
+ *
45
+ * @param name - OIDC model name (e.g., 'Session', 'AccessToken')
46
+ * @returns true if the model should use Redis, false for PostgreSQL
47
+ */
48
+ export function isRedisModel(name) {
49
+ return REDIS_MODELS.has(name);
50
+ }
51
+ /**
52
+ * Create the hybrid adapter factory for node-oidc-provider.
53
+ *
54
+ * Returns a class constructor that node-oidc-provider calls with
55
+ * `new AdapterClass(modelName)`. The constructor internally creates
56
+ * either a RedisAdapter or PostgresAdapter based on the model name.
57
+ *
58
+ * @returns A class constructor compatible with node-oidc-provider's adapter option
59
+ */
60
+ export function createAdapterFactory() {
61
+ /**
62
+ * HybridAdapter delegates all operations to either RedisAdapter or
63
+ * PostgresAdapter based on the model name. This is transparent to
64
+ * node-oidc-provider — it just sees a standard adapter interface.
65
+ */
66
+ return class HybridAdapter {
67
+ /** The underlying adapter (Redis or PostgreSQL) */
68
+ delegate;
69
+ /** The OIDC model name this adapter instance handles */
70
+ name;
71
+ constructor(name) {
72
+ this.name = name;
73
+ // Route to the appropriate adapter based on the model name
74
+ if (REDIS_MODELS.has(name)) {
75
+ this.delegate = new RedisAdapter(name);
76
+ }
77
+ else {
78
+ this.delegate = new PostgresAdapter(name);
79
+ }
80
+ }
81
+ /** Create or update an OIDC artifact */
82
+ async upsert(id, payload, expiresIn) {
83
+ return this.delegate.upsert(id, payload, expiresIn);
84
+ }
85
+ /**
86
+ * Find an artifact by its primary ID.
87
+ *
88
+ * For the 'Client' model, routes to findForOidc() which resolves
89
+ * clients from the clients table (not oidc_payloads). This is the
90
+ * bridge between Porta's client management and oidc-provider.
91
+ */
92
+ async find(id) {
93
+ if (this.name === 'Client') {
94
+ return findForOidc(id);
95
+ }
96
+ return this.delegate.find(id);
97
+ }
98
+ /** Find an artifact by user code (device flow) */
99
+ async findByUserCode(userCode) {
100
+ return this.delegate.findByUserCode(userCode);
101
+ }
102
+ /** Find an artifact by UID (sessions) */
103
+ async findByUid(uid) {
104
+ return this.delegate.findByUid(uid);
105
+ }
106
+ /** Mark an artifact as consumed */
107
+ async consume(id) {
108
+ return this.delegate.consume(id);
109
+ }
110
+ /**
111
+ * Delete an artifact by ID.
112
+ *
113
+ * For Session models, this performs a cascade delete: before destroying the
114
+ * session itself, it reads the session's authorizations to extract grant IDs,
115
+ * then deletes all associated grants and tokens from PostgreSQL and cleans up
116
+ * Redis grant sets. This ensures "explicit logout = total cleanup."
117
+ *
118
+ * For all other models, delegates directly to the underlying adapter.
119
+ *
120
+ * Error handling: cascade failures are logged but do NOT prevent the session
121
+ * from being destroyed — the user must always be able to log out.
122
+ */
123
+ async destroy(id) {
124
+ if (this.name === 'Session') {
125
+ try {
126
+ // Step 1: Read session to extract grant IDs before destroying it.
127
+ // The session payload has an `authorizations` map:
128
+ // { [clientId]: { grantId, sid } }
129
+ const session = await this.delegate.find(id);
130
+ if (session?.authorizations) {
131
+ const grantIds = [];
132
+ const authorizations = session.authorizations;
133
+ for (const auth of Object.values(authorizations)) {
134
+ if (auth.grantId)
135
+ grantIds.push(auth.grantId);
136
+ }
137
+ if (grantIds.length > 0) {
138
+ // Step 2a: Cascade delete all grant-related records from PostgreSQL.
139
+ // This is the critical cleanup — removes AccessTokens, RefreshTokens,
140
+ // Grants, and any other artifacts sharing these grant IDs.
141
+ await revokeGrantsByIds(grantIds);
142
+ // Step 2b: Best-effort cleanup of Redis grant sets and member keys.
143
+ // Not critical — Redis keys have TTLs — but removes stale keys immediately.
144
+ await cleanupRedisGrants(grantIds);
145
+ logger.info({ sessionId: id, grantIds }, 'Session destroy: cascade-deleted grants and tokens');
146
+ }
147
+ }
148
+ }
149
+ catch (err) {
150
+ // Cascade failed — log but proceed with session destruction.
151
+ // The user must always be able to log out; orphaned tokens will
152
+ // expire naturally via their TTLs.
153
+ logger.error({ err, sessionId: id }, 'Session destroy: cascade cleanup failed (proceeding with session deletion)');
154
+ }
155
+ }
156
+ // Step 3: Delete the session/artifact itself via the delegate
157
+ return this.delegate.destroy(id);
158
+ }
159
+ /** Revoke all artifacts for a given grant */
160
+ async revokeByGrantId(grantId) {
161
+ return this.delegate.revokeByGrantId(grantId);
162
+ }
163
+ };
164
+ }
165
+ //# sourceMappingURL=adapter-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-factory.js","sourceRoot":"","sources":["../../src/oidc/adapter-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAClC,SAAS;IACT,aAAa;IACb,mBAAmB;IACnB,iBAAiB;IACjB,mBAAmB;IACnB,4BAA4B;CAC7B,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC;;;;OAIG;IACH,OAAO,MAAM,aAAa;QACxB,mDAAmD;QAC5C,QAAQ,CAAiC;QAEhD,wDAAwD;QACjD,IAAI,CAAS;QAEpB,YAAY,IAAY;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YAEjB,2DAA2D;YAC3D,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,OAAuB,EAAE,SAAiB;YACjE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,CAAC;QAED;;;;;;WAMG;QACH,KAAK,CAAC,IAAI,CAAC,EAAU;YACnB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO,WAAW,CAAC,EAAE,CAAwC,CAAC;YAChE,CAAC;YACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,kDAAkD;QAClD,KAAK,CAAC,cAAc,CAAC,QAAgB;YACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;QAED,yCAAyC;QACzC,KAAK,CAAC,SAAS,CAAC,GAAW;YACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,mCAAmC;QACnC,KAAK,CAAC,OAAO,CAAC,EAAU;YACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAED;;;;;;;;;;;;WAYG;QACH,KAAK,CAAC,OAAO,CAAC,EAAU;YACtB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,kEAAkE;oBAClE,mDAAmD;oBACnD,qCAAqC;oBACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7C,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;wBAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;wBAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,cAG9B,CAAC;wBACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;4BACjD,IAAI,IAAI,CAAC,OAAO;gCAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAChD,CAAC;wBAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACxB,qEAAqE;4BACrE,sEAAsE;4BACtE,2DAA2D;4BAC3D,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;4BAElC,oEAAoE;4BACpE,4EAA4E;4BAC5E,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;4BAEnC,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAC3B,oDAAoD,CACrD,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,6DAA6D;oBAC7D,gEAAgE;oBAChE,mCAAmC;oBACnC,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,EACtB,4EAA4E,CAC7E,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,8DAA8D;YAC9D,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,6CAA6C;QAC7C,KAAK,CAAC,eAAe,CAAC,OAAe;YACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * OIDC provider configuration builder.
3
+ *
4
+ * Builds the complete node-oidc-provider configuration object from external
5
+ * dependencies (TTLs, keys, adapter factory, finders). This is a pure function
6
+ * with no side effects — all dependencies are injected as parameters.
7
+ *
8
+ * The configuration enables:
9
+ * - Hybrid adapter (Postgres/Redis) for OIDC artifact storage
10
+ * - ES256 signing keys loaded from the database
11
+ * - Client lookup via adapter pattern (adapter.find('Client', id) → findForOidc())
12
+ * - PKCE required for all authorization code flows (S256 only)
13
+ * - Token introspection, revocation, and client credentials
14
+ * - Standard OIDC scopes and claims mapping
15
+ * - Refresh token rotation
16
+ * - Cookie signing with rotation support
17
+ */
18
+ import type { OidcTtlConfig } from '../lib/system-config.js';
19
+ import type { JwkKeyPair } from '../lib/signing-keys.js';
20
+ import type { Organization } from '../organizations/types.js';
21
+ /** Parameters required to build the provider configuration */
22
+ export interface BuildProviderConfigParams {
23
+ /** Token TTL configuration loaded from system_config table */
24
+ ttl: OidcTtlConfig;
25
+ /** JWK key set loaded from signing_keys table */
26
+ jwks: {
27
+ keys: JwkKeyPair[];
28
+ };
29
+ /** Cookie signing keys from application config (supports rotation) */
30
+ cookieKeys: string[];
31
+ /** Account finder function — looks up users by subject ID */
32
+ findAccount: (ctx: unknown, sub: string) => Promise<{
33
+ accountId: string;
34
+ claims: (use: string, scope: string) => Promise<Record<string, unknown>>;
35
+ } | undefined>;
36
+ /** Adapter class factory — node-oidc-provider instantiates with `new` */
37
+ adapterFactory: unknown;
38
+ /** Interaction URL builder — returns the login/consent URL for a given interaction */
39
+ interactionUrl: (ctx: unknown, interaction: {
40
+ uid: string;
41
+ }) => string;
42
+ /** CORS handler — determines if an origin is allowed for a client */
43
+ clientBasedCORS?: (ctx: unknown, origin: string, client: unknown) => boolean;
44
+ }
45
+ /**
46
+ * Build default branding when org resolution is not possible.
47
+ * Used by rendering hooks when the session is destroyed or org lookup fails.
48
+ *
49
+ * @returns Default branding with Porta's standard blue primary color
50
+ */
51
+ export declare function buildDefaultBranding(): {
52
+ logoUrl: string | null;
53
+ faviconUrl: string | null;
54
+ primaryColor: string;
55
+ companyName: string;
56
+ customCss: string | null;
57
+ };
58
+ /**
59
+ * Best-effort organization resolution for oidc-provider rendering hooks.
60
+ *
61
+ * Tries multiple strategies in order:
62
+ * 1. Session accountId → user lookup → org lookup
63
+ * 2. Client metadata → organizationId → org lookup
64
+ * 3. Returns undefined (caller uses default branding)
65
+ *
66
+ * All errors are caught and logged — never throws.
67
+ *
68
+ * @param ctx - oidc-provider's enhanced Koa context (KoaContextWithOIDC)
69
+ * @returns The resolved Organization, or undefined if resolution fails
70
+ */
71
+ export declare function resolveOrgForProviderHook(ctx: unknown): Promise<Organization | undefined>;
72
+ /**
73
+ * Custom logoutSource hook for node-oidc-provider.
74
+ *
75
+ * Replaces the provider's default bare HTML logout confirmation page with
76
+ * Porta's styled Handlebars template. Injects a styled submit button into
77
+ * the provider's pre-built form (which contains the correct action URL and
78
+ * xsrf hidden field).
79
+ *
80
+ * Falls back to minimal inline HTML if the template engine fails, ensuring
81
+ * the user can still sign out even if templating breaks.
82
+ *
83
+ * @param ctx - oidc-provider's enhanced Koa context
84
+ * @param form - Pre-built HTML form from the provider (contains action + xsrf)
85
+ */
86
+ export declare function logoutSourceHook(ctx: any, form: string): Promise<void>;
87
+ /**
88
+ * Custom postLogoutSuccessSource hook for node-oidc-provider.
89
+ *
90
+ * Replaces the provider's default bare HTML post-logout page with
91
+ * Porta's styled Handlebars template. At this point the session is
92
+ * already destroyed, so org resolution is not possible — default
93
+ * branding is always used.
94
+ *
95
+ * Falls back to minimal inline HTML if the template engine fails.
96
+ *
97
+ * @param ctx - oidc-provider's enhanced Koa context
98
+ */
99
+ export declare function postLogoutSuccessSourceHook(ctx: any): Promise<void>;
100
+ /**
101
+ * Custom renderError hook for node-oidc-provider.
102
+ *
103
+ * Replaces the provider's default bare HTML error page with Porta's styled
104
+ * Handlebars template. The OIDC error code (e.g., 'invalid_client') is shown
105
+ * to the user, but the raw error_description is intentionally suppressed to
106
+ * prevent information leakage — a generic i18n error message is shown instead.
107
+ *
108
+ * SECURITY: error_description may contain internal details like "client not
109
+ * found", "grant not found", etc. Only the standardized OIDC error code is
110
+ * safe to display.
111
+ *
112
+ * @param ctx - oidc-provider's enhanced Koa context
113
+ * @param out - OIDC error details (error code + optional description)
114
+ * @param _error - Original Error object (used to detect SessionNotFound)
115
+ */
116
+ export declare function renderErrorHook(ctx: any, out: {
117
+ error: string;
118
+ error_description?: string;
119
+ }, _error: Error): Promise<void>;
120
+ /**
121
+ * Custom `loadExistingGrant` for node-oidc-provider.
122
+ *
123
+ * Mirrors the provider default (resolve the grant from the consent result or
124
+ * the session's grant id), then conditionally **upgrades** an existing grant to
125
+ * include `offline_access`.
126
+ *
127
+ * Why this exists (Bug #2): with `prompt=login` and a pre-existing Grant that
128
+ * lacks `offline_access`, the provider does not route through the consent
129
+ * interaction, so the consent handlers' `offline_access`-adding code never runs.
130
+ * The authorization code is then issued WITHOUT `offline_access` in its granted
131
+ * scopes, and `issueRefreshToken` returns false — so no refresh token is minted.
132
+ * This is exactly the CLI failure ("no refresh_token available" ~1h later).
133
+ *
134
+ * The upgrade is strictly gated (AR-6 / AR-7): only when the request asked for
135
+ * `offline_access`, the client allows the `refresh_token` grant, AND the grant
136
+ * does not already include `offline_access`. In every other case the grant is
137
+ * returned unchanged — identical to the provider default — so no other client
138
+ * or flow is affected.
139
+ *
140
+ * @param ctx - node-oidc-provider's enhanced Koa context
141
+ * @returns the existing Grant (possibly upgraded) or undefined
142
+ */
143
+ export declare function loadExistingGrant(ctx: any): Promise<unknown | undefined>;
144
+ /**
145
+ * Build the complete node-oidc-provider configuration object.
146
+ *
147
+ * Takes all external dependencies as parameters to keep this function
148
+ * pure and testable. The resulting configuration covers all OIDC features
149
+ * needed by Porta.
150
+ *
151
+ * @param params - All dependencies for the provider configuration
152
+ * @returns Complete Configuration object for node-oidc-provider
153
+ */
154
+ export declare function buildProviderConfiguration(params: BuildProviderConfigParams): Record<string, unknown>;
155
+ //# sourceMappingURL=configuration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../../src/oidc/configuration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAQzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,8DAA8D;AAC9D,MAAM,WAAW,yBAAyB;IACxC,8DAA8D;IAC9D,GAAG,EAAE,aAAa,CAAC;IACnB,iDAAiD;IACjD,IAAI,EAAE;QAAE,IAAI,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAC7B,sEAAsE;IACtE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IACjK,yEAAyE;IACzE,cAAc,EAAE,OAAO,CAAC;IACxB,sFAAsF;IACtF,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACvE,qEAAqE;IACrE,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;CAC9E;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB;IAEhC,OAAO,EAAU,MAAM,GAAG,IAAI;IAC9B,UAAU,EAAU,MAAM,GAAG,IAAI;IACjC,YAAY;IACZ,WAAW;IACX,SAAS,EAAU,MAAM,GAAG,IAAI;EAEnC;AAmBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CA8B/F;AAMD;;;;;;;;;;;;;GAaG;AAEH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD5E;AAED;;;;;;;;;;;GAWG;AAEH,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBzE;AAkDD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CAEnC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,EAClD,MAAM,EAAE,KAAK,GACZ,OAAO,CAAC,IAAI,CAAC,CA0Df;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,iBAAiB,CAErC,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CA8B9B;AAMD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyKrG"}