@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 @@
1
+ {"version":3,"file":"decision-event.js","sourceRoot":"","sources":["../../src/security/decision-event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Privacy-safe handling for HTTP parser failures which occur before Koa middleware. */
2
+ import type { Server } from 'node:http';
3
+ import { type SecurityDecisionSink } from './decision-context.js';
4
+ /** Attach one owner for HTTP parser failures and return a removal callback. */
5
+ export declare function attachTransportDecisionHandler(server: Server, sink?: SecurityDecisionSink): () => void;
6
+ //# sourceMappingURL=transport-decision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-decision.d.ts","sourceRoot":"","sources":["../../src/security/transport-decision.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAGxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAK/B,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,oBAA0C,GAC/C,MAAM,IAAI,CA4BZ"}
@@ -0,0 +1,37 @@
1
+ /** Privacy-safe handling for HTTP parser failures which occur before Koa middleware. */
2
+ import { randomUUID } from 'node:crypto';
3
+ import { createSecurityDecisionEvent } from './decision-event.js';
4
+ import { logSecurityDecision, recordSecurityDecisionSinkFailure, } from './decision-context.js';
5
+ const MINIMAL_BAD_REQUEST = 'HTTP/1.1 400 Bad Request\r\nConnection: close\r\nContent-Length: 0\r\n\r\n';
6
+ /** Attach one owner for HTTP parser failures and return a removal callback. */
7
+ export function attachTransportDecisionHandler(server, sink = logSecurityDecision) {
8
+ const handledSockets = new WeakSet();
9
+ const onClientError = (_error, socket) => {
10
+ if (handledSockets.has(socket))
11
+ return;
12
+ handledSockets.add(socket);
13
+ const event = createSecurityDecisionEvent({
14
+ requestId: randomUUID(),
15
+ surface: 'transport',
16
+ method: 'UNKNOWN',
17
+ routeTemplate: '/transport',
18
+ statusCode: 400,
19
+ outcome: 'deny',
20
+ decisionPoint: 'transport',
21
+ reasonCode: 'transport-parse-failed',
22
+ });
23
+ try {
24
+ void Promise.resolve(sink(event)).catch(recordSecurityDecisionSinkFailure);
25
+ }
26
+ catch {
27
+ recordSecurityDecisionSinkFailure();
28
+ }
29
+ if (socket.writable && !socket.destroyed)
30
+ socket.end(MINIMAL_BAD_REQUEST);
31
+ else
32
+ socket.destroy();
33
+ };
34
+ server.on('clientError', onClientError);
35
+ return () => server.off('clientError', onClientError);
36
+ }
37
+ //# sourceMappingURL=transport-decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-decision.js","sourceRoot":"","sources":["../../src/security/transport-decision.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,iCAAiC,GAElC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,mBAAmB,GACvB,4EAA4E,CAAC;AAE/E,+EAA+E;AAC/E,MAAM,UAAU,8BAA8B,CAC5C,MAAc,EACd,IAAI,GAAyB,mBAAmB;IAEhD,MAAM,cAAc,GAAG,IAAI,OAAO,EAAU,CAAC;IAC7C,MAAM,aAAa,GAAG,CAAC,MAAa,EAAE,MAAc,EAAQ,EAAE;QAC5D,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QACvC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,2BAA2B,CAAC;YACxC,SAAS,EAAE,UAAU,EAAE;YACvB,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,WAAW;YAC1B,UAAU,EAAE,wBAAwB;SACrC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC7E,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC,EAAE,CAAC;QACtC,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;;YACrE,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Koa application factory.
3
+ *
4
+ * Creates the Koa app with all middleware and routes. Optionally accepts
5
+ * an OIDC provider instance to mount under /:orgSlug/* for multi-tenant
6
+ * OIDC functionality.
7
+ *
8
+ * Route structure:
9
+ * /health — Health check (DB + Redis status)
10
+ * /api/admin/organizations/* — Organization management (admin auth)
11
+ * /api/admin/applications/* — Application management (admin auth)
12
+ * /api/admin/clients/* — Client & secret management (admin auth)
13
+ * /api/admin/organizations/:orgId/users/* — User management (admin auth)
14
+ * /api/admin/applications/:appId/roles/* — Role management (admin auth)
15
+ * /api/admin/applications/:appId/permissions/* — Permission management (admin auth)
16
+ * /api/admin/organizations/:orgId/users/:userId/roles/* — User-role assignments (admin auth)
17
+ * /api/admin/applications/:appId/claims/* — Custom claims management (admin auth)
18
+ * /api/admin/config/* — System configuration management (admin auth)
19
+ * /api/admin/keys/* — Signing key management (admin auth)
20
+ * /api/admin/audit/* — Audit log viewer (admin auth)
21
+ * /interaction/:uid/* — OIDC interaction routes (login, consent, abort)
22
+ * /:orgSlug/auth/* — Auth routes (magic link, password reset, invitation)
23
+ * /:orgSlug/* — OIDC provider endpoints (auth, token, jwks, etc.)
24
+ */
25
+ import { AsyncLocalStorage } from 'node:async_hooks';
26
+ import Koa from 'koa';
27
+ import type Provider from 'oidc-provider';
28
+ /**
29
+ * Per-request OIDC issuer store.
30
+ *
31
+ * node-oidc-provider is initialized with a single base issuer URL, but
32
+ * Porta uses path-based multi-tenancy (/:orgSlug/*) where each org needs
33
+ * its own issuer (e.g., https://porta.local:3443/acme-corp).
34
+ *
35
+ * This AsyncLocalStorage holds the org-scoped issuer for the current
36
+ * request. The provider's `issuer` property is overridden with a getter
37
+ * that reads from this store, so all JWT `iss` claims, discovery responses,
38
+ * and redirect `iss` parameters automatically use the correct org issuer.
39
+ */
40
+ export declare const issuerStore: AsyncLocalStorage<string>;
41
+ /**
42
+ * Create the Koa application with all middleware and routes.
43
+ *
44
+ * @param oidcProvider - Optional OIDC provider instance. If provided,
45
+ * OIDC endpoints are mounted under /:orgSlug/* with tenant resolution.
46
+ * Pass undefined for testing scenarios that don't need OIDC.
47
+ * @returns Configured Koa application
48
+ */
49
+ export declare function createApp(oidcProvider?: Provider): Koa;
50
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAiD1C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,2BAAkC,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,YAAY,CAAC,EAAE,QAAQ,GAAG,GAAG,CAuctD"}
package/dist/server.js ADDED
@@ -0,0 +1,491 @@
1
+ /**
2
+ * Koa application factory.
3
+ *
4
+ * Creates the Koa app with all middleware and routes. Optionally accepts
5
+ * an OIDC provider instance to mount under /:orgSlug/* for multi-tenant
6
+ * OIDC functionality.
7
+ *
8
+ * Route structure:
9
+ * /health — Health check (DB + Redis status)
10
+ * /api/admin/organizations/* — Organization management (admin auth)
11
+ * /api/admin/applications/* — Application management (admin auth)
12
+ * /api/admin/clients/* — Client & secret management (admin auth)
13
+ * /api/admin/organizations/:orgId/users/* — User management (admin auth)
14
+ * /api/admin/applications/:appId/roles/* — Role management (admin auth)
15
+ * /api/admin/applications/:appId/permissions/* — Permission management (admin auth)
16
+ * /api/admin/organizations/:orgId/users/:userId/roles/* — User-role assignments (admin auth)
17
+ * /api/admin/applications/:appId/claims/* — Custom claims management (admin auth)
18
+ * /api/admin/config/* — System configuration management (admin auth)
19
+ * /api/admin/keys/* — Signing key management (admin auth)
20
+ * /api/admin/audit/* — Audit log viewer (admin auth)
21
+ * /interaction/:uid/* — OIDC interaction routes (login, consent, abort)
22
+ * /:orgSlug/auth/* — Auth routes (magic link, password reset, invitation)
23
+ * /:orgSlug/* — OIDC provider endpoints (auth, token, jwks, etc.)
24
+ */
25
+ import { AsyncLocalStorage } from 'node:async_hooks';
26
+ import Koa from 'koa';
27
+ import bodyParser from 'koa-bodyparser';
28
+ import Router from '@koa/router';
29
+ import { requestLogger } from './middleware/request-logger.js';
30
+ import { errorHandler } from './middleware/error-handler.js';
31
+ import { securityHeaders, HTML_CSP } from './middleware/security-headers.js';
32
+ import { healthCheck } from './middleware/health.js';
33
+ import { readyHandler } from './middleware/ready.js';
34
+ import { createRootPageRouter } from './middleware/root-page.js';
35
+ import { tenantResolver } from './middleware/tenant-resolver.js';
36
+ import { oidcClientTenantBinding } from './middleware/oidc-client-tenant.js';
37
+ import { clientSecretHash } from './middleware/client-secret-hash.js';
38
+ import { promptLoginReset } from './middleware/prompt-login-reset.js';
39
+ import { createOrganizationRouter } from './routes/organizations.js';
40
+ import { createApplicationRouter } from './routes/applications.js';
41
+ import { createClientRouter } from './routes/clients.js';
42
+ import { createUserRouter, createStandaloneUserRouter } from './routes/users.js';
43
+ import { createInteractionRouter } from './routes/interactions.js';
44
+ import { createMagicLinkRouter } from './routes/magic-link.js';
45
+ import { createPasswordResetRouter } from './routes/password-reset.js';
46
+ import { createInvitationRouter } from './routes/invitation.js';
47
+ import { createRoleRouter } from './routes/roles.js';
48
+ import { createPermissionRouter } from './routes/permissions.js';
49
+ import { createUserRoleRouter } from './routes/user-roles.js';
50
+ import { createCustomClaimRouter } from './routes/custom-claims.js';
51
+ import { createTwoFactorRouter } from './routes/two-factor.js';
52
+ import { createConfigRouter } from './routes/config.js';
53
+ import { createKeysRouter } from './routes/keys.js';
54
+ import { createAuditRouter } from './routes/audit.js';
55
+ import { createStatsRouter } from './routes/stats.js';
56
+ import { createSessionRouter, createUserSessionRouter } from './routes/sessions.js';
57
+ import { createBulkRouter } from './routes/bulk.js';
58
+ import { createExportRouter } from './routes/exports.js';
59
+ import { createImportRouter } from './routes/imports.js';
60
+ import { createBrandingRouter } from './routes/branding.js';
61
+ import { createTwoFactorUserAdminRouter, createTwoFactorOrgAdminRouter, } from './routes/two-factor-admin.js';
62
+ import { adminCors } from './middleware/admin-cors.js';
63
+ import { oidcPreflightCors } from './middleware/oidc-preflight-cors.js';
64
+ import { metricsCounter, metricsHandler } from './middleware/metrics.js';
65
+ import { tokenRateLimiter, introspectionRateLimiter } from './middleware/token-rate-limiter.js';
66
+ import { adminRateLimiter } from './middleware/admin-rate-limiter.js';
67
+ import { adminMutationAudit } from './middleware/admin-mutation-audit.js';
68
+ import { setAdminAuthProvider } from './middleware/admin-auth.js';
69
+ import { findSuperAdminOrganization } from './organizations/repository.js';
70
+ import { getApplicationBySlug } from './applications/index.js';
71
+ import { listClientsByApplication } from './clients/index.js';
72
+ import { config } from './config/index.js';
73
+ /**
74
+ * Per-request OIDC issuer store.
75
+ *
76
+ * node-oidc-provider is initialized with a single base issuer URL, but
77
+ * Porta uses path-based multi-tenancy (/:orgSlug/*) where each org needs
78
+ * its own issuer (e.g., https://porta.local:3443/acme-corp).
79
+ *
80
+ * This AsyncLocalStorage holds the org-scoped issuer for the current
81
+ * request. The provider's `issuer` property is overridden with a getter
82
+ * that reads from this store, so all JWT `iss` claims, discovery responses,
83
+ * and redirect `iss` parameters automatically use the correct org issuer.
84
+ */
85
+ export const issuerStore = new AsyncLocalStorage();
86
+ /**
87
+ * Create the Koa application with all middleware and routes.
88
+ *
89
+ * @param oidcProvider - Optional OIDC provider instance. If provided,
90
+ * OIDC endpoints are mounted under /:orgSlug/* with tenant resolution.
91
+ * Pass undefined for testing scenarios that don't need OIDC.
92
+ * @returns Configured Koa application
93
+ */
94
+ export function createApp(oidcProvider) {
95
+ const app = new Koa();
96
+ // Trust proxy headers (X-Forwarded-Proto, X-Forwarded-For, etc.) when
97
+ // running behind a TLS-terminating reverse proxy. This makes ctx.secure,
98
+ // ctx.ip, and ctx.protocol reflect the client's real connection, which is
99
+ // required for secure cookie flags and correct IP-based rate limiting.
100
+ if (config.trustProxy) {
101
+ app.proxy = true;
102
+ }
103
+ // Global middleware stack (order matters):
104
+ // 1. Request correlation and terminal finalization wrap every Koa request
105
+ // 2. Error handler converts downstream failures into minimal public responses
106
+ // 3. Security headers (CSP, HSTS, X-Frame-Options, etc.)
107
+ // 4. Selective body parser — only routes that need it (NOT OIDC routes)
108
+ app.use(requestLogger());
109
+ app.use(errorHandler());
110
+ app.use(securityHeaders());
111
+ // Prometheus metrics counter — increments porta_http_requests_total per response.
112
+ // Only active when METRICS_ENABLED=true; otherwise no overhead.
113
+ if (config.metricsEnabled) {
114
+ app.use(metricsCounter());
115
+ }
116
+ // Selective body parser: apply only to admin API, interaction, and auth routes.
117
+ // OIDC provider routes (/:orgSlug/*) must NOT have pre-parsed bodies because
118
+ // oidc-provider uses its own internal body parser (selective_body.js).
119
+ // Pre-parsing the body consumes the request stream, which causes
120
+ // client_secret_post authentication to fail at the token endpoint with
121
+ // "no client authentication mechanism provided".
122
+ //
123
+ // Routes that NEED body parsing:
124
+ // /api/* — Admin API routes (JSON request bodies)
125
+ // /interaction/* — OIDC interaction routes (login/consent form submissions)
126
+ // /:orgSlug/auth/* — Auth workflow routes (magic-link, password-reset, invitation)
127
+ // /health — GET-only, no body needed, but harmless to parse
128
+ //
129
+ // Routes that must NOT be body-parsed:
130
+ // /:orgSlug/* — OIDC provider endpoints (token, revocation, introspection, etc.)
131
+ const bp = bodyParser({
132
+ jsonLimit: '100kb', // Defence-in-depth: limit JSON body size (default was 1mb)
133
+ formLimit: '100kb', // Limit form body size
134
+ textLimit: '100kb', // Limit text body size
135
+ });
136
+ app.use(async (ctx, next) => {
137
+ if (ctx.path.startsWith('/api/') ||
138
+ ctx.path.startsWith('/interaction/') ||
139
+ ctx.path.startsWith('/health') ||
140
+ ctx.path.includes('/auth/')) {
141
+ return bp(ctx, next);
142
+ }
143
+ return next();
144
+ });
145
+ // Health check (liveness) and readiness probe — root level, no tenant context.
146
+ // Kubernetes / container orchestrators map:
147
+ // livenessProbe → GET /health
148
+ // readinessProbe → GET /ready
149
+ const router = new Router();
150
+ router.get('/health', healthCheck());
151
+ router.get('/ready', readyHandler());
152
+ // Prometheus metrics endpoint — only registered when METRICS_ENABLED=true.
153
+ // When disabled, GET /metrics falls through to 404 (no route match).
154
+ if (config.metricsEnabled) {
155
+ router.get('/metrics', metricsHandler());
156
+ }
157
+ app.use(router.routes());
158
+ app.use(router.allowedMethods());
159
+ // Public-surface handlers — neutral response at GET /, robots.txt, favicon.
160
+ // Prevents the default Koa "Not Found" page at the public root without
161
+ // disclosing any product information to unauthenticated visitors. See
162
+ // src/middleware/root-page.ts for the security posture.
163
+ const rootPageRouter = createRootPageRouter();
164
+ app.use(rootPageRouter.routes());
165
+ app.use(rootPageRouter.allowedMethods());
166
+ // Admin metadata endpoint — unauthenticated, provides OIDC discovery
167
+ // info needed by the CLI to initiate the login flow. Returns the issuer
168
+ // URL, client_id, and org slug for the admin CLI PKCE client.
169
+ // The client_id is looked up from the database (created by `porta init`)
170
+ // rather than hardcoded, since client IDs are randomly generated.
171
+ const metadataRouter = new Router();
172
+ metadataRouter.get('/api/admin/metadata', async (ctx) => {
173
+ const superAdminOrg = await findSuperAdminOrganization();
174
+ if (!superAdminOrg) {
175
+ ctx.status = 503;
176
+ ctx.body = {
177
+ error: 'Not initialized',
178
+ message: 'Run porta init to set up the admin system',
179
+ };
180
+ return;
181
+ }
182
+ // Look up the admin application and its CLI client
183
+ const adminApp = await getApplicationBySlug('porta-admin');
184
+ if (!adminApp) {
185
+ ctx.status = 503;
186
+ ctx.body = {
187
+ error: 'Not initialized',
188
+ message: 'Run porta init to set up the admin system',
189
+ };
190
+ return;
191
+ }
192
+ // Find the CLI client (native, public PKCE client) in the admin app.
193
+ // Only need the first page — porta init creates exactly one client.
194
+ const clients = await listClientsByApplication(adminApp.id, {
195
+ page: 1,
196
+ pageSize: 10,
197
+ });
198
+ const cliClient = clients.data.find((c) => c.applicationType === 'native');
199
+ ctx.body = {
200
+ issuer: `${config.issuerBaseUrl}/${superAdminOrg.slug}`,
201
+ orgSlug: superAdminOrg.slug,
202
+ clientId: cliClient?.clientId ?? null,
203
+ };
204
+ });
205
+ app.use(metadataRouter.routes());
206
+ app.use(metadataRouter.allowedMethods());
207
+ // Admin CORS allow-list — emits CORS headers for /api/admin/* only when
208
+ // ADMIN_CORS_ORIGINS is configured. Mounted before admin-auth because
209
+ // preflight OPTIONS requests don't carry Authorization headers.
210
+ // Default (empty config) = deny all cross-origin requests.
211
+ app.use(adminCors(config));
212
+ // Admin API rate limiter — protects state-changing admin endpoints
213
+ // (POST/PUT/PATCH/DELETE /api/admin/*) against brute-force and abuse.
214
+ // Per-IP key, 60 req / 60s. GET requests pass through unmetered.
215
+ // Mounted before admin routes so it fires before route handlers.
216
+ app.use(adminRateLimiter());
217
+ app.use(adminMutationAudit());
218
+ // Set the OIDC provider for admin auth middleware — enables opaque access
219
+ // token validation via provider.AccessToken.find() for all /api/admin/* routes.
220
+ if (oidcProvider) {
221
+ setAdminAuthProvider(oidcProvider);
222
+ // Override the provider's static issuer with a dynamic per-request getter.
223
+ // node-oidc-provider sets `this.issuer` once at construction (the base URL).
224
+ // For path-based multi-tenancy, each org needs its own issuer URL. The getter
225
+ // reads from issuerStore (AsyncLocalStorage) which is populated per-request
226
+ // in the /:orgSlug route handler via issuerStore.run(). Outside a request
227
+ // context (e.g., startup, admin API), it falls back to the base issuer.
228
+ const baseIssuer = config.issuerBaseUrl;
229
+ Object.defineProperty(oidcProvider, 'issuer', {
230
+ get: () => issuerStore.getStore() ?? baseIssuer,
231
+ configurable: true,
232
+ });
233
+ }
234
+ // Organization management API — requires admin authentication
235
+ // Mounted at /api/admin/organizations (see routes/organizations.ts)
236
+ const orgRouter = createOrganizationRouter();
237
+ app.use(orgRouter.routes());
238
+ app.use(orgRouter.allowedMethods());
239
+ // Application management API — requires admin authentication
240
+ // Mounted at /api/admin/applications (see routes/applications.ts)
241
+ const appRouter = createApplicationRouter();
242
+ app.use(appRouter.routes());
243
+ app.use(appRouter.allowedMethods());
244
+ // Client & secret management API — requires admin authentication
245
+ // Mounted at /api/admin/clients (see routes/clients.ts)
246
+ const clientRouter = createClientRouter();
247
+ app.use(clientRouter.routes());
248
+ app.use(clientRouter.allowedMethods());
249
+ // User management API — requires admin authentication
250
+ // Mounted at /api/admin/organizations/:orgId/users (see routes/users.ts)
251
+ const userRouter = createUserRouter();
252
+ app.use(userRouter.routes());
253
+ app.use(userRouter.allowedMethods());
254
+ // Standalone user admin API — non-org-scoped user access by userId
255
+ // Mounted at /api/admin/users/:userId (see routes/users.ts)
256
+ // Used by the Admin GUI SPA for user detail/mutation operations
257
+ const standaloneUserRouter = createStandaloneUserRouter();
258
+ app.use(standaloneUserRouter.routes());
259
+ app.use(standaloneUserRouter.allowedMethods());
260
+ // RBAC and custom-claims admin APIs require admin authentication.
261
+ // Role management at /api/admin/applications/:appId/roles
262
+ const roleRouter = createRoleRouter();
263
+ app.use(roleRouter.routes());
264
+ app.use(roleRouter.allowedMethods());
265
+ // Permission management at /api/admin/applications/:appId/permissions
266
+ const permissionRouter = createPermissionRouter();
267
+ app.use(permissionRouter.routes());
268
+ app.use(permissionRouter.allowedMethods());
269
+ // User-role assignments at /api/admin/organizations/:orgId/users/:userId/roles
270
+ const userRoleRouter = createUserRoleRouter();
271
+ app.use(userRoleRouter.routes());
272
+ app.use(userRoleRouter.allowedMethods());
273
+ // 2FA admin — user-level management (status, disable, reset, regenerate)
274
+ // Mounted at /api/admin/organizations/:orgId/users/:userId/two-factor
275
+ const twoFactorUserAdminRouter = createTwoFactorUserAdminRouter();
276
+ app.use(twoFactorUserAdminRouter.routes());
277
+ app.use(twoFactorUserAdminRouter.allowedMethods());
278
+ // Custom claims at /api/admin/applications/:appId/claims
279
+ const customClaimRouter = createCustomClaimRouter();
280
+ app.use(customClaimRouter.routes());
281
+ app.use(customClaimRouter.allowedMethods());
282
+ // System config management API — requires admin authentication
283
+ // Mounted at /api/admin/config (see routes/config.ts)
284
+ const configRouter = createConfigRouter();
285
+ app.use(configRouter.routes());
286
+ app.use(configRouter.allowedMethods());
287
+ // Signing key management API — requires admin authentication
288
+ // Mounted at /api/admin/keys (see routes/keys.ts)
289
+ const keysRouter = createKeysRouter();
290
+ app.use(keysRouter.routes());
291
+ app.use(keysRouter.allowedMethods());
292
+ // Audit log API — requires admin authentication
293
+ // Mounted at /api/admin/audit (see routes/audit.ts)
294
+ const auditRouter = createAuditRouter();
295
+ app.use(auditRouter.routes());
296
+ app.use(auditRouter.allowedMethods());
297
+ // Dashboard statistics API — requires admin authentication
298
+ // Mounted at /api/admin/stats (see routes/stats.ts)
299
+ const statsRouter = createStatsRouter();
300
+ app.use(statsRouter.routes());
301
+ app.use(statsRouter.allowedMethods());
302
+ // Session management API — requires admin authentication
303
+ // Mounted at /api/admin/sessions (see routes/sessions.ts)
304
+ const sessionRouter = createSessionRouter();
305
+ app.use(sessionRouter.routes());
306
+ app.use(sessionRouter.allowedMethods());
307
+ // User session revocation — requires admin authentication
308
+ // Mounted at /api/admin/users/:userId/sessions (see routes/sessions.ts)
309
+ const userSessionRouter = createUserSessionRouter();
310
+ app.use(userSessionRouter.routes());
311
+ app.use(userSessionRouter.allowedMethods());
312
+ // Bulk operations API — requires admin authentication
313
+ // Mounted at /api/admin/bulk (see routes/bulk.ts)
314
+ const bulkRouter = createBulkRouter();
315
+ app.use(bulkRouter.routes());
316
+ app.use(bulkRouter.allowedMethods());
317
+ // Branding assets API — requires admin authentication
318
+ // Mounted at /api/admin/organizations/:orgId/branding (see routes/branding.ts)
319
+ const brandingRouter = createBrandingRouter();
320
+ app.use(brandingRouter.routes());
321
+ app.use(brandingRouter.allowedMethods());
322
+ // 2FA admin — org-level management (policy, summary)
323
+ // Mounted at /api/admin/organizations/:orgId/two-factor
324
+ const twoFactorOrgAdminRouter = createTwoFactorOrgAdminRouter();
325
+ app.use(twoFactorOrgAdminRouter.routes());
326
+ app.use(twoFactorOrgAdminRouter.allowedMethods());
327
+ // Data export API — requires admin authentication
328
+ // Mounted at /api/admin/export (see routes/exports.ts)
329
+ const exportRouter = createExportRouter();
330
+ app.use(exportRouter.routes());
331
+ app.use(exportRouter.allowedMethods());
332
+ // Data import API — requires admin authentication
333
+ // Mounted at /api/admin/import (see routes/imports.ts)
334
+ const importRouter = createImportRouter();
335
+ app.use(importRouter.routes());
336
+ app.use(importRouter.allowedMethods());
337
+ // OIDC interaction routes — mounted at /interaction/:uid/* (root level).
338
+ // These must be at the root (not under /:orgSlug) because the provider sets
339
+ // interaction cookie paths relative to /interaction/{uid}, and the browser
340
+ // must send those cookies when navigating to the interaction URL.
341
+ // Organization context is resolved from the interaction's client_id.
342
+ if (oidcProvider) {
343
+ const interactionRouter = createInteractionRouter(oidcProvider);
344
+ app.use(interactionRouter.routes());
345
+ app.use(interactionRouter.allowedMethods());
346
+ // Two-factor authentication routes — mounted at /interaction/:uid/two-factor/*
347
+ // Must be after the main interaction router for proper routing precedence.
348
+ const twoFactorRouter = createTwoFactorRouter(oidcProvider);
349
+ app.use(twoFactorRouter.routes());
350
+ app.use(twoFactorRouter.allowedMethods());
351
+ }
352
+ // Auth routes — magic link, password reset, invitation
353
+ // These are org-scoped via /:orgSlug/auth/* and use tenant resolution.
354
+ // Mounted before the OIDC catch-all to prevent it from swallowing auth paths.
355
+ // Magic link no longer needs the provider — authentication is completed via
356
+ // the _ml_session cookie and the interaction login handler.
357
+ const magicLinkRouter = createMagicLinkRouter(oidcProvider);
358
+ app.use(magicLinkRouter.routes());
359
+ app.use(magicLinkRouter.allowedMethods());
360
+ // Password reset and invitation routes don't need the provider
361
+ const passwordResetRouter = createPasswordResetRouter();
362
+ app.use(passwordResetRouter.routes());
363
+ app.use(passwordResetRouter.allowedMethods());
364
+ const invitationRouter = createInvitationRouter();
365
+ app.use(invitationRouter.routes());
366
+ app.use(invitationRouter.allowedMethods());
367
+ // Token endpoint rate limiter — protects POST /:orgSlug/oidc/token against
368
+ // flooding and brute-force. Uses per-IP + per-client_id composite key,
369
+ // 30 req / 5 min. Returns 429 with Retry-After when exceeded.
370
+ // Mounted before the OIDC provider so it fires before token processing.
371
+ app.use(tokenRateLimiter());
372
+ // Introspection endpoint rate limiter — protects POST
373
+ // /:orgSlug/oidc/token/introspection against token enumeration.
374
+ // Per-IP + per-client_id key, 100 req / 60s (higher than token endpoint
375
+ // since resource servers introspect on every API call).
376
+ app.use(introspectionRateLimiter());
377
+ // OIDC provider routes — mounted under /:orgSlug prefix
378
+ // This is the catch-all for OIDC protocol endpoints (auth, token, jwks, etc.)
379
+ // MUST be last because /:orgSlug/* matches everything.
380
+ if (oidcProvider) {
381
+ // prompt=login session reset (Bug #1) — mounted on the outer app BEFORE the
382
+ // OIDC router so it runs on a GET /{orgSlug}/auth request (with prompt=login)
383
+ // before node-oidc-provider processes it. Clears the stale `_session` cookie
384
+ // pair so the provider mints a fresh session and resume cannot hit a uid
385
+ // mismatch. No-op for any non-prompt=login request (normal SSO preserved).
386
+ app.use(promptLoginReset(oidcProvider));
387
+ const oidcRouter = new Router({ prefix: '/:orgSlug' });
388
+ // Tenant resolver validates the org slug and sets ctx.state.organization
389
+ oidcRouter.use(tenantResolver());
390
+ // Body parser for OIDC routes — parses application/x-www-form-urlencoded
391
+ // and JSON bodies before they reach our middleware.
392
+ //
393
+ // When the body is already parsed, oidc-provider's selective_body.js detects
394
+ // ctx.req.readable === false and falls back to reading ctx.req.body.
395
+ //
396
+ // IMPORTANT: We must copy the parsed body to ctx.req.body (Node's IncomingMessage)
397
+ // because oidcProvider.callback() receives ctx.req/ctx.res (raw Node objects),
398
+ // and oidc-provider creates its own internal Koa context — so it can NOT access
399
+ // our Koa app's ctx.request.body. Setting ctx.req.body makes the parsed body
400
+ // available via the fallback path in selective_body.js.
401
+ const oidcBodyParser = bodyParser();
402
+ oidcRouter.use(async (ctx, next) => {
403
+ await oidcBodyParser(ctx, next);
404
+ });
405
+ oidcRouter.use(async (ctx, next) => {
406
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
407
+ const body = ctx.request.body;
408
+ if (body && typeof body === 'object' && Object.keys(body).length > 0) {
409
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
410
+ ctx.req.body = body;
411
+ }
412
+ await next();
413
+ });
414
+ // A client is valid only beneath the issuer owned by its organization. This check runs before
415
+ // CORS, secret transformation, and oidc-provider so a foreign client cannot create an
416
+ // interaction or authenticate under another tenant's issuer.
417
+ oidcRouter.use(oidcClientTenantBinding(oidcProvider));
418
+ // OIDC CORS — pre-sets Access-Control-Allow-Origin and related headers
419
+ // BEFORE the request enters oidc-provider's internal Koa context.
420
+ //
421
+ // node-oidc-provider uses @koa/cors with keepHeadersOnError: false,
422
+ // which strips CORS headers from error responses (e.g., 400 from the
423
+ // token endpoint). This middleware fixes that by setting CORS headers
424
+ // at the outer Koa level. The provider's cors.js detects existing
425
+ // access-control-* headers and skips its own handling, so our headers
426
+ // survive both success and error responses.
427
+ //
428
+ // Mounted after body parser so client_id is available for production
429
+ // origin checks. OPTIONS preflights are short-circuited here with 204.
430
+ oidcRouter.use(oidcPreflightCors());
431
+ // Pre-hash client secrets with SHA-256 before oidc-provider processes them.
432
+ // This enables secure secret storage: we store SHA-256 hashes in the DB,
433
+ // the middleware hashes the presented secret, and oidc-provider compares them.
434
+ // Requires body parser above so ctx.request.body.client_secret is available.
435
+ oidcRouter.use(clientSecretHash());
436
+ // Delegate all OIDC requests to node-oidc-provider's callback handler.
437
+ // URL rewriting strips the /:orgSlug prefix so the provider sees
438
+ // standard OIDC paths (/auth, /token, /jwks, etc.).
439
+ oidcRouter.all('/{*path}', async (ctx) => {
440
+ // Preserve the original URL so the provider can detect the mount path
441
+ // and generate correct endpoint URLs (e.g., /playground/auth instead of /auth).
442
+ // node-oidc-provider compares originalUrl vs url to extract the mount prefix.
443
+ const originalUrl = ctx.req.url;
444
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
445
+ ctx.req.originalUrl = originalUrl;
446
+ // Strip the org slug prefix from the URL before passing to the provider.
447
+ // e.g., /acme-corp/token → /token
448
+ ctx.req.url = originalUrl.replace(`/${ctx.params.orgSlug}`, '');
449
+ // Pass the tenant-resolved org to the provider's internal context.
450
+ // The interactionUrl callback (provider.ts) stores it so interaction
451
+ // handlers can recover the issuer organization after the slug is stripped.
452
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
453
+ ctx.req._portaOrganization = ctx.state.organization;
454
+ // Override CSP for OIDC provider responses.
455
+ //
456
+ // The security-headers middleware (Phase 1) set the strict default CSP
457
+ // (`default-src 'none'`) on ctx.res. That CSP lacks a `script-src`
458
+ // directive. node-oidc-provider's `pushScriptSrcSha()` helper only
459
+ // adds inline-script hashes when `script-src` already exists in the
460
+ // CSP — so with our strict default, it silently does nothing.
461
+ //
462
+ // Additionally, `oidcProvider.callback()` creates its own internal Koa
463
+ // context and calls `ctx.res.end()` directly, which means our Phase 3
464
+ // (post-response CSP upgrade for HTML) never runs for provider responses.
465
+ //
466
+ // Setting the HTML-safe CSP here fixes both issues:
467
+ // - form_post / web_message response modes render HTML with inline
468
+ // <script> tags that need `script-src 'unsafe-inline'`
469
+ // - Logout, error, and device-flow pages rendered by provider hooks
470
+ // use inline styles needing `style-src 'unsafe-inline'`
471
+ // - Non-HTML provider responses (token, jwks, introspection JSON)
472
+ // are unaffected — browsers don't execute scripts in JSON responses
473
+ ctx.set('Content-Security-Policy', HTML_CSP);
474
+ // --- Dynamic per-request issuer (RFC 8414 §2 compliance) ---
475
+ // node-oidc-provider uses `this.issuer` for everything: discovery
476
+ // JSON, JWT `iss` claims, and redirect `iss` query parameters.
477
+ // We override the provider's issuer property with a getter that
478
+ // reads from AsyncLocalStorage (see issuerStore above), so all
479
+ // outputs automatically include the org slug. Running the provider
480
+ // callback inside issuerStore.run() scopes the issuer to this
481
+ // request without affecting concurrent requests for other orgs.
482
+ const orgIssuer = `${config.issuerBaseUrl}/${ctx.params.orgSlug}`;
483
+ // Delegate to node-oidc-provider inside the per-request issuer context
484
+ await issuerStore.run(orgIssuer, () => oidcProvider.callback()(ctx.req, ctx.res));
485
+ });
486
+ app.use(oidcRouter.routes());
487
+ app.use(oidcRouter.allowedMethods());
488
+ }
489
+ return app;
490
+ }
491
+ //# sourceMappingURL=server.js.map