@portaidentity/server 1.7.3 → 1.8.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 (487) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/applications/index.d.ts +2 -2
  3. package/dist/applications/index.d.ts.map +1 -1
  4. package/dist/applications/index.js +2 -2
  5. package/dist/applications/index.js.map +1 -1
  6. package/dist/applications/repository.d.ts +49 -4
  7. package/dist/applications/repository.d.ts.map +1 -1
  8. package/dist/applications/repository.js +148 -10
  9. package/dist/applications/repository.js.map +1 -1
  10. package/dist/applications/service.d.ts +35 -17
  11. package/dist/applications/service.d.ts.map +1 -1
  12. package/dist/applications/service.js +144 -35
  13. package/dist/applications/service.js.map +1 -1
  14. package/dist/applications/types.d.ts +1 -1
  15. package/dist/applications/types.d.ts.map +1 -1
  16. package/dist/applications/validators.d.ts +14 -0
  17. package/dist/applications/validators.d.ts.map +1 -0
  18. package/dist/applications/validators.js +14 -0
  19. package/dist/applications/validators.js.map +1 -0
  20. package/dist/auth/effective-branding.d.ts +35 -0
  21. package/dist/auth/effective-branding.d.ts.map +1 -0
  22. package/dist/auth/effective-branding.js +81 -0
  23. package/dist/auth/effective-branding.js.map +1 -0
  24. package/dist/auth/email-service.d.ts +3 -8
  25. package/dist/auth/email-service.d.ts.map +1 -1
  26. package/dist/auth/email-service.js +22 -30
  27. package/dist/auth/email-service.js.map +1 -1
  28. package/dist/auth/i18n.d.ts +5 -0
  29. package/dist/auth/i18n.d.ts.map +1 -1
  30. package/dist/auth/i18n.js +6 -5
  31. package/dist/auth/i18n.js.map +1 -1
  32. package/dist/auth/rate-limiter.d.ts +6 -10
  33. package/dist/auth/rate-limiter.d.ts.map +1 -1
  34. package/dist/auth/rate-limiter.js +12 -16
  35. package/dist/auth/rate-limiter.js.map +1 -1
  36. package/dist/auth/recovery-job-processor.d.ts.map +1 -1
  37. package/dist/auth/recovery-job-processor.js +1 -1
  38. package/dist/auth/recovery-job-processor.js.map +1 -1
  39. package/dist/auth/template-engine.d.ts +3 -1
  40. package/dist/auth/template-engine.d.ts.map +1 -1
  41. package/dist/auth/template-engine.js +1 -1
  42. package/dist/auth/template-engine.js.map +1 -1
  43. package/dist/cli/commands/init.d.ts +1 -1
  44. package/dist/cli/commands/init.d.ts.map +1 -1
  45. package/dist/cli/commands/init.js +12 -12
  46. package/dist/cli/commands/init.js.map +1 -1
  47. package/dist/cli/error-handler.d.ts +3 -2
  48. package/dist/cli/error-handler.d.ts.map +1 -1
  49. package/dist/cli/error-handler.js +9 -2
  50. package/dist/cli/error-handler.js.map +1 -1
  51. package/dist/cli/index.d.ts +1 -1
  52. package/dist/cli/index.d.ts.map +1 -1
  53. package/dist/cli/index.js +1 -1
  54. package/dist/cli/index.js.map +1 -1
  55. package/dist/clients/index.d.ts +1 -1
  56. package/dist/clients/index.js +1 -1
  57. package/dist/clients/repository.d.ts +18 -0
  58. package/dist/clients/repository.d.ts.map +1 -1
  59. package/dist/clients/repository.js +36 -0
  60. package/dist/clients/repository.js.map +1 -1
  61. package/dist/clients/secret-repository.d.ts +35 -8
  62. package/dist/clients/secret-repository.d.ts.map +1 -1
  63. package/dist/clients/secret-repository.js +69 -16
  64. package/dist/clients/secret-repository.js.map +1 -1
  65. package/dist/clients/secret-service.d.ts +5 -9
  66. package/dist/clients/secret-service.d.ts.map +1 -1
  67. package/dist/clients/secret-service.js +13 -22
  68. package/dist/clients/secret-service.js.map +1 -1
  69. package/dist/clients/service.d.ts +10 -13
  70. package/dist/clients/service.d.ts.map +1 -1
  71. package/dist/clients/service.js +112 -40
  72. package/dist/clients/service.js.map +1 -1
  73. package/dist/clients/types.d.ts +1 -1
  74. package/dist/clients/types.d.ts.map +1 -1
  75. package/dist/clients/validators.d.ts +83 -1
  76. package/dist/clients/validators.d.ts.map +1 -1
  77. package/dist/clients/validators.js +110 -0
  78. package/dist/clients/validators.js.map +1 -1
  79. package/dist/config/index.d.ts +1 -0
  80. package/dist/config/index.d.ts.map +1 -1
  81. package/dist/config/index.js +1 -0
  82. package/dist/config/index.js.map +1 -1
  83. package/dist/config/schema.d.ts +1 -0
  84. package/dist/config/schema.d.ts.map +1 -1
  85. package/dist/config/schema.js +23 -1
  86. package/dist/config/schema.js.map +1 -1
  87. package/dist/custom-claims/repository.d.ts +14 -9
  88. package/dist/custom-claims/repository.d.ts.map +1 -1
  89. package/dist/custom-claims/repository.js +38 -11
  90. package/dist/custom-claims/repository.js.map +1 -1
  91. package/dist/custom-claims/service.d.ts +11 -6
  92. package/dist/custom-claims/service.d.ts.map +1 -1
  93. package/dist/custom-claims/service.js +43 -20
  94. package/dist/custom-claims/service.js.map +1 -1
  95. package/dist/index.js +8 -2
  96. package/dist/index.js.map +1 -1
  97. package/dist/lib/admin-permissions.d.ts +12 -7
  98. package/dist/lib/admin-permissions.d.ts.map +1 -1
  99. package/dist/lib/admin-permissions.js +26 -16
  100. package/dist/lib/admin-permissions.js.map +1 -1
  101. package/dist/lib/audit-log.d.ts +2 -2
  102. package/dist/lib/audit-log.d.ts.map +1 -1
  103. package/dist/lib/audit-log.js +1 -1
  104. package/dist/lib/audit-log.js.map +1 -1
  105. package/dist/lib/authority-revocation.d.ts +18 -0
  106. package/dist/lib/authority-revocation.d.ts.map +1 -0
  107. package/dist/lib/authority-revocation.js +37 -0
  108. package/dist/lib/authority-revocation.js.map +1 -0
  109. package/dist/lib/branding-assets.d.ts +35 -5
  110. package/dist/lib/branding-assets.d.ts.map +1 -1
  111. package/dist/lib/branding-assets.js +33 -26
  112. package/dist/lib/branding-assets.js.map +1 -1
  113. package/dist/lib/bulk-operations.d.ts +1 -1
  114. package/dist/lib/bulk-operations.d.ts.map +1 -1
  115. package/dist/lib/bulk-operations.js +1 -13
  116. package/dist/lib/bulk-operations.js.map +1 -1
  117. package/dist/lib/cursor.d.ts +2 -0
  118. package/dist/lib/cursor.d.ts.map +1 -1
  119. package/dist/lib/cursor.js +2 -7
  120. package/dist/lib/cursor.js.map +1 -1
  121. package/dist/lib/database.d.ts.map +1 -1
  122. package/dist/lib/database.js +5 -0
  123. package/dist/lib/database.js.map +1 -1
  124. package/dist/lib/deletion-cleanup.d.ts +43 -0
  125. package/dist/lib/deletion-cleanup.d.ts.map +1 -0
  126. package/dist/lib/deletion-cleanup.js +207 -0
  127. package/dist/lib/deletion-cleanup.js.map +1 -0
  128. package/dist/lib/image-validator.d.ts +3 -1
  129. package/dist/lib/image-validator.d.ts.map +1 -1
  130. package/dist/lib/image-validator.js +32 -19
  131. package/dist/lib/image-validator.js.map +1 -1
  132. package/dist/lib/log-format.d.ts +20 -0
  133. package/dist/lib/log-format.d.ts.map +1 -0
  134. package/dist/lib/log-format.js +22 -0
  135. package/dist/lib/log-format.js.map +1 -0
  136. package/dist/lib/logger.d.ts +3 -1
  137. package/dist/lib/logger.d.ts.map +1 -1
  138. package/dist/lib/logger.js +21 -4
  139. package/dist/lib/logger.js.map +1 -1
  140. package/dist/lib/redis.d.ts.map +1 -1
  141. package/dist/lib/redis.js +3 -0
  142. package/dist/lib/redis.js.map +1 -1
  143. package/dist/lib/session-tracking.d.ts +73 -11
  144. package/dist/lib/session-tracking.d.ts.map +1 -1
  145. package/dist/lib/session-tracking.js +76 -32
  146. package/dist/lib/session-tracking.js.map +1 -1
  147. package/dist/lib/signing-key-crypto.d.ts.map +1 -1
  148. package/dist/lib/signing-key-crypto.js +4 -5
  149. package/dist/lib/signing-key-crypto.js.map +1 -1
  150. package/dist/lib/signing-keys.d.ts +3 -4
  151. package/dist/lib/signing-keys.d.ts.map +1 -1
  152. package/dist/lib/signing-keys.js +66 -41
  153. package/dist/lib/signing-keys.js.map +1 -1
  154. package/dist/lib/super-admin-protection.d.ts +5 -5
  155. package/dist/lib/super-admin-protection.d.ts.map +1 -1
  156. package/dist/lib/super-admin-protection.js +6 -9
  157. package/dist/lib/super-admin-protection.js.map +1 -1
  158. package/dist/lib/system-config-catalog.d.ts +268 -0
  159. package/dist/lib/system-config-catalog.d.ts.map +1 -0
  160. package/dist/lib/system-config-catalog.js +90 -0
  161. package/dist/lib/system-config-catalog.js.map +1 -0
  162. package/dist/lib/system-config.d.ts +30 -33
  163. package/dist/lib/system-config.d.ts.map +1 -1
  164. package/dist/lib/system-config.js +78 -93
  165. package/dist/lib/system-config.js.map +1 -1
  166. package/dist/lib/with-timeout.d.ts +32 -0
  167. package/dist/lib/with-timeout.d.ts.map +1 -0
  168. package/dist/lib/with-timeout.js +45 -0
  169. package/dist/lib/with-timeout.js.map +1 -0
  170. package/dist/middleware/admin-auth.d.ts +6 -5
  171. package/dist/middleware/admin-auth.d.ts.map +1 -1
  172. package/dist/middleware/admin-auth.js +30 -20
  173. package/dist/middleware/admin-auth.js.map +1 -1
  174. package/dist/middleware/admin-cors.d.ts +3 -3
  175. package/dist/middleware/admin-cors.js +3 -3
  176. package/dist/middleware/admin-mutation-audit.d.ts +3 -2
  177. package/dist/middleware/admin-mutation-audit.d.ts.map +1 -1
  178. package/dist/middleware/admin-mutation-audit.js +12 -5
  179. package/dist/middleware/admin-mutation-audit.js.map +1 -1
  180. package/dist/middleware/admin-rate-limiter.d.ts +7 -8
  181. package/dist/middleware/admin-rate-limiter.d.ts.map +1 -1
  182. package/dist/middleware/admin-rate-limiter.js +7 -8
  183. package/dist/middleware/admin-rate-limiter.js.map +1 -1
  184. package/dist/middleware/client-secret-hash.d.ts +10 -29
  185. package/dist/middleware/client-secret-hash.d.ts.map +1 -1
  186. package/dist/middleware/client-secret-hash.js +161 -59
  187. package/dist/middleware/client-secret-hash.js.map +1 -1
  188. package/dist/middleware/health.d.ts +17 -0
  189. package/dist/middleware/health.d.ts.map +1 -1
  190. package/dist/middleware/health.js +25 -21
  191. package/dist/middleware/health.js.map +1 -1
  192. package/dist/middleware/ready.d.ts.map +1 -1
  193. package/dist/middleware/ready.js +1 -12
  194. package/dist/middleware/ready.js.map +1 -1
  195. package/dist/middleware/require-existing-organization.d.ts +18 -0
  196. package/dist/middleware/require-existing-organization.d.ts.map +1 -0
  197. package/dist/middleware/require-existing-organization.js +38 -0
  198. package/dist/middleware/require-existing-organization.js.map +1 -0
  199. package/dist/middleware/require-permission.d.ts.map +1 -1
  200. package/dist/middleware/require-permission.js +35 -1
  201. package/dist/middleware/require-permission.js.map +1 -1
  202. package/dist/middleware/require-user-organization.d.ts.map +1 -1
  203. package/dist/middleware/require-user-organization.js +4 -2
  204. package/dist/middleware/require-user-organization.js.map +1 -1
  205. package/dist/middleware/security-headers.d.ts +18 -0
  206. package/dist/middleware/security-headers.d.ts.map +1 -1
  207. package/dist/middleware/security-headers.js +32 -1
  208. package/dist/middleware/security-headers.js.map +1 -1
  209. package/dist/middleware/tenant-resolver.d.ts +1 -2
  210. package/dist/middleware/tenant-resolver.d.ts.map +1 -1
  211. package/dist/middleware/tenant-resolver.js +1 -5
  212. package/dist/middleware/tenant-resolver.js.map +1 -1
  213. package/dist/middleware/token-rate-limiter.d.ts +37 -16
  214. package/dist/middleware/token-rate-limiter.d.ts.map +1 -1
  215. package/dist/middleware/token-rate-limiter.js +126 -54
  216. package/dist/middleware/token-rate-limiter.js.map +1 -1
  217. package/dist/oidc/account-finder.d.ts +5 -5
  218. package/dist/oidc/account-finder.d.ts.map +1 -1
  219. package/dist/oidc/account-finder.js +31 -23
  220. package/dist/oidc/account-finder.js.map +1 -1
  221. package/dist/oidc/adapter-factory.d.ts.map +1 -1
  222. package/dist/oidc/adapter-factory.js +83 -3
  223. package/dist/oidc/adapter-factory.js.map +1 -1
  224. package/dist/oidc/configuration.d.ts +3 -8
  225. package/dist/oidc/configuration.d.ts.map +1 -1
  226. package/dist/oidc/configuration.js +64 -50
  227. package/dist/oidc/configuration.js.map +1 -1
  228. package/dist/oidc/provider.d.ts.map +1 -1
  229. package/dist/oidc/provider.js +7 -0
  230. package/dist/oidc/provider.js.map +1 -1
  231. package/dist/oidc/redis-adapter.d.ts +2 -3
  232. package/dist/oidc/redis-adapter.d.ts.map +1 -1
  233. package/dist/oidc/redis-adapter.js +54 -46
  234. package/dist/oidc/redis-adapter.js.map +1 -1
  235. package/dist/organizations/branding-url.d.ts +17 -0
  236. package/dist/organizations/branding-url.d.ts.map +1 -0
  237. package/dist/organizations/branding-url.js +38 -0
  238. package/dist/organizations/branding-url.js.map +1 -0
  239. package/dist/organizations/index.d.ts +2 -2
  240. package/dist/organizations/index.d.ts.map +1 -1
  241. package/dist/organizations/index.js +1 -1
  242. package/dist/organizations/index.js.map +1 -1
  243. package/dist/organizations/repository.d.ts +22 -32
  244. package/dist/organizations/repository.d.ts.map +1 -1
  245. package/dist/organizations/repository.js +64 -45
  246. package/dist/organizations/repository.js.map +1 -1
  247. package/dist/organizations/service.d.ts +14 -46
  248. package/dist/organizations/service.d.ts.map +1 -1
  249. package/dist/organizations/service.js +60 -112
  250. package/dist/organizations/service.js.map +1 -1
  251. package/dist/organizations/types.d.ts +1 -15
  252. package/dist/organizations/types.d.ts.map +1 -1
  253. package/dist/organizations/validators.d.ts +41 -0
  254. package/dist/organizations/validators.d.ts.map +1 -0
  255. package/dist/organizations/validators.js +48 -0
  256. package/dist/organizations/validators.js.map +1 -0
  257. package/dist/portability/apply.d.ts +15 -0
  258. package/dist/portability/apply.d.ts.map +1 -0
  259. package/dist/portability/apply.js +274 -0
  260. package/dist/portability/apply.js.map +1 -0
  261. package/dist/portability/authorization.d.ts +30 -0
  262. package/dist/portability/authorization.d.ts.map +1 -0
  263. package/dist/portability/authorization.js +130 -0
  264. package/dist/portability/authorization.js.map +1 -0
  265. package/dist/portability/cleanup.d.ts +29 -0
  266. package/dist/portability/cleanup.d.ts.map +1 -0
  267. package/dist/portability/cleanup.js +167 -0
  268. package/dist/portability/cleanup.js.map +1 -0
  269. package/dist/portability/export.d.ts +18 -0
  270. package/dist/portability/export.d.ts.map +1 -0
  271. package/dist/portability/export.js +125 -0
  272. package/dist/portability/export.js.map +1 -0
  273. package/dist/portability/import-repository.d.ts +204 -0
  274. package/dist/portability/import-repository.d.ts.map +1 -0
  275. package/dist/portability/import-repository.js +347 -0
  276. package/dist/portability/import-repository.js.map +1 -0
  277. package/dist/portability/import-user-client-writers.d.ts +40 -0
  278. package/dist/portability/import-user-client-writers.d.ts.map +1 -0
  279. package/dist/portability/import-user-client-writers.js +168 -0
  280. package/dist/portability/import-user-client-writers.js.map +1 -0
  281. package/dist/portability/index.d.ts +8 -0
  282. package/dist/portability/index.d.ts.map +1 -0
  283. package/dist/portability/index.js +8 -0
  284. package/dist/portability/index.js.map +1 -0
  285. package/dist/portability/plan-support.d.ts +137 -0
  286. package/dist/portability/plan-support.d.ts.map +1 -0
  287. package/dist/portability/plan-support.js +336 -0
  288. package/dist/portability/plan-support.js.map +1 -0
  289. package/dist/portability/plan.d.ts +34 -0
  290. package/dist/portability/plan.d.ts.map +1 -0
  291. package/dist/portability/plan.js +450 -0
  292. package/dist/portability/plan.js.map +1 -0
  293. package/dist/portability/repository.d.ts +95 -0
  294. package/dist/portability/repository.d.ts.map +1 -0
  295. package/dist/portability/repository.js +388 -0
  296. package/dist/portability/repository.js.map +1 -0
  297. package/dist/portability/schema.d.ts +589 -0
  298. package/dist/portability/schema.d.ts.map +1 -0
  299. package/dist/portability/schema.js +458 -0
  300. package/dist/portability/schema.js.map +1 -0
  301. package/dist/portability/types.d.ts +381 -0
  302. package/dist/portability/types.d.ts.map +1 -0
  303. package/dist/portability/types.js +19 -0
  304. package/dist/portability/types.js.map +1 -0
  305. package/dist/rbac/errors.d.ts +4 -0
  306. package/dist/rbac/errors.d.ts.map +1 -1
  307. package/dist/rbac/errors.js +7 -0
  308. package/dist/rbac/errors.js.map +1 -1
  309. package/dist/rbac/index.d.ts +3 -3
  310. package/dist/rbac/index.d.ts.map +1 -1
  311. package/dist/rbac/index.js +3 -3
  312. package/dist/rbac/index.js.map +1 -1
  313. package/dist/rbac/mapping-repository.d.ts +84 -9
  314. package/dist/rbac/mapping-repository.d.ts.map +1 -1
  315. package/dist/rbac/mapping-repository.js +222 -55
  316. package/dist/rbac/mapping-repository.js.map +1 -1
  317. package/dist/rbac/permission-repository.d.ts +36 -19
  318. package/dist/rbac/permission-repository.d.ts.map +1 -1
  319. package/dist/rbac/permission-repository.js +93 -35
  320. package/dist/rbac/permission-repository.js.map +1 -1
  321. package/dist/rbac/permission-service.d.ts +18 -19
  322. package/dist/rbac/permission-service.d.ts.map +1 -1
  323. package/dist/rbac/permission-service.js +100 -57
  324. package/dist/rbac/permission-service.js.map +1 -1
  325. package/dist/rbac/role-repository.d.ts +29 -24
  326. package/dist/rbac/role-repository.d.ts.map +1 -1
  327. package/dist/rbac/role-repository.js +66 -43
  328. package/dist/rbac/role-repository.js.map +1 -1
  329. package/dist/rbac/role-service.d.ts +35 -32
  330. package/dist/rbac/role-service.d.ts.map +1 -1
  331. package/dist/rbac/role-service.js +210 -96
  332. package/dist/rbac/role-service.js.map +1 -1
  333. package/dist/rbac/slugs.d.ts +16 -27
  334. package/dist/rbac/slugs.d.ts.map +1 -1
  335. package/dist/rbac/slugs.js +36 -59
  336. package/dist/rbac/slugs.js.map +1 -1
  337. package/dist/rbac/types.d.ts +2 -4
  338. package/dist/rbac/types.d.ts.map +1 -1
  339. package/dist/rbac/types.js.map +1 -1
  340. package/dist/rbac/user-role-service.d.ts +23 -24
  341. package/dist/rbac/user-role-service.d.ts.map +1 -1
  342. package/dist/rbac/user-role-service.js +117 -61
  343. package/dist/rbac/user-role-service.js.map +1 -1
  344. package/dist/routes/applications.d.ts +4 -2
  345. package/dist/routes/applications.d.ts.map +1 -1
  346. package/dist/routes/applications.js +57 -19
  347. package/dist/routes/applications.js.map +1 -1
  348. package/dist/routes/audit.js +1 -1
  349. package/dist/routes/audit.js.map +1 -1
  350. package/dist/routes/branding.d.ts +3 -3
  351. package/dist/routes/branding.d.ts.map +1 -1
  352. package/dist/routes/branding.js +44 -16
  353. package/dist/routes/branding.js.map +1 -1
  354. package/dist/routes/bulk.d.ts +0 -5
  355. package/dist/routes/bulk.d.ts.map +1 -1
  356. package/dist/routes/bulk.js +3 -5
  357. package/dist/routes/bulk.js.map +1 -1
  358. package/dist/routes/clients.d.ts +4 -4
  359. package/dist/routes/clients.d.ts.map +1 -1
  360. package/dist/routes/clients.js +111 -52
  361. package/dist/routes/clients.js.map +1 -1
  362. package/dist/routes/config.d.ts +17 -12
  363. package/dist/routes/config.d.ts.map +1 -1
  364. package/dist/routes/config.js +165 -64
  365. package/dist/routes/config.js.map +1 -1
  366. package/dist/routes/custom-claims.d.ts.map +1 -1
  367. package/dist/routes/custom-claims.js +8 -2
  368. package/dist/routes/custom-claims.js.map +1 -1
  369. package/dist/routes/exports.d.ts +2 -1
  370. package/dist/routes/exports.d.ts.map +1 -1
  371. package/dist/routes/exports.js +57 -1
  372. package/dist/routes/exports.js.map +1 -1
  373. package/dist/routes/imports.d.ts +2 -2
  374. package/dist/routes/imports.d.ts.map +1 -1
  375. package/dist/routes/imports.js +95 -40
  376. package/dist/routes/imports.js.map +1 -1
  377. package/dist/routes/interactions.d.ts.map +1 -1
  378. package/dist/routes/interactions.js +16 -34
  379. package/dist/routes/interactions.js.map +1 -1
  380. package/dist/routes/invitation.d.ts.map +1 -1
  381. package/dist/routes/invitation.js +10 -23
  382. package/dist/routes/invitation.js.map +1 -1
  383. package/dist/routes/keys.d.ts.map +1 -1
  384. package/dist/routes/keys.js +26 -13
  385. package/dist/routes/keys.js.map +1 -1
  386. package/dist/routes/magic-link.d.ts.map +1 -1
  387. package/dist/routes/magic-link.js +5 -17
  388. package/dist/routes/magic-link.js.map +1 -1
  389. package/dist/routes/organizations.d.ts +1 -2
  390. package/dist/routes/organizations.d.ts.map +1 -1
  391. package/dist/routes/organizations.js +43 -104
  392. package/dist/routes/organizations.js.map +1 -1
  393. package/dist/routes/password-reset.d.ts.map +1 -1
  394. package/dist/routes/password-reset.js +13 -35
  395. package/dist/routes/password-reset.js.map +1 -1
  396. package/dist/routes/permissions.d.ts +1 -1
  397. package/dist/routes/permissions.d.ts.map +1 -1
  398. package/dist/routes/permissions.js +58 -17
  399. package/dist/routes/permissions.js.map +1 -1
  400. package/dist/routes/public-branding.d.ts +16 -0
  401. package/dist/routes/public-branding.d.ts.map +1 -0
  402. package/dist/routes/public-branding.js +52 -0
  403. package/dist/routes/public-branding.js.map +1 -0
  404. package/dist/routes/roles.d.ts +1 -1
  405. package/dist/routes/roles.d.ts.map +1 -1
  406. package/dist/routes/roles.js +63 -21
  407. package/dist/routes/roles.js.map +1 -1
  408. package/dist/routes/sessions.d.ts.map +1 -1
  409. package/dist/routes/sessions.js +23 -12
  410. package/dist/routes/sessions.js.map +1 -1
  411. package/dist/routes/two-factor.d.ts.map +1 -1
  412. package/dist/routes/two-factor.js +91 -38
  413. package/dist/routes/two-factor.js.map +1 -1
  414. package/dist/routes/user-roles.d.ts.map +1 -1
  415. package/dist/routes/user-roles.js +56 -9
  416. package/dist/routes/user-roles.js.map +1 -1
  417. package/dist/routes/users.d.ts +4 -8
  418. package/dist/routes/users.d.ts.map +1 -1
  419. package/dist/routes/users.js +108 -265
  420. package/dist/routes/users.js.map +1 -1
  421. package/dist/server.d.ts.map +1 -1
  422. package/dist/server.js +53 -37
  423. package/dist/server.js.map +1 -1
  424. package/dist/two-factor/errors.d.ts +9 -0
  425. package/dist/two-factor/errors.d.ts.map +1 -1
  426. package/dist/two-factor/errors.js +12 -0
  427. package/dist/two-factor/errors.js.map +1 -1
  428. package/dist/two-factor/index.d.ts +5 -4
  429. package/dist/two-factor/index.d.ts.map +1 -1
  430. package/dist/two-factor/index.js +4 -4
  431. package/dist/two-factor/index.js.map +1 -1
  432. package/dist/two-factor/repository.d.ts +17 -6
  433. package/dist/two-factor/repository.d.ts.map +1 -1
  434. package/dist/two-factor/repository.js +37 -9
  435. package/dist/two-factor/repository.js.map +1 -1
  436. package/dist/two-factor/service.d.ts.map +1 -1
  437. package/dist/two-factor/service.js +26 -19
  438. package/dist/two-factor/service.js.map +1 -1
  439. package/dist/two-factor/totp.d.ts +13 -2
  440. package/dist/two-factor/totp.d.ts.map +1 -1
  441. package/dist/two-factor/totp.js +20 -7
  442. package/dist/two-factor/totp.js.map +1 -1
  443. package/dist/two-factor/types.d.ts +3 -0
  444. package/dist/two-factor/types.d.ts.map +1 -1
  445. package/dist/two-factor/types.js +5 -0
  446. package/dist/two-factor/types.js.map +1 -1
  447. package/dist/users/gdpr.d.ts +2 -40
  448. package/dist/users/gdpr.d.ts.map +1 -1
  449. package/dist/users/gdpr.js +3 -110
  450. package/dist/users/gdpr.js.map +1 -1
  451. package/dist/users/index.d.ts +5 -4
  452. package/dist/users/index.d.ts.map +1 -1
  453. package/dist/users/index.js +5 -4
  454. package/dist/users/index.js.map +1 -1
  455. package/dist/users/repository.d.ts +49 -3
  456. package/dist/users/repository.d.ts.map +1 -1
  457. package/dist/users/repository.js +169 -18
  458. package/dist/users/repository.js.map +1 -1
  459. package/dist/users/service.d.ts +19 -51
  460. package/dist/users/service.d.ts.map +1 -1
  461. package/dist/users/service.js +72 -122
  462. package/dist/users/service.js.map +1 -1
  463. package/dist/users/types.d.ts +4 -5
  464. package/dist/users/types.d.ts.map +1 -1
  465. package/dist/users/types.js.map +1 -1
  466. package/dist/users/validators.d.ts +28 -0
  467. package/dist/users/validators.d.ts.map +1 -0
  468. package/dist/users/validators.js +25 -0
  469. package/dist/users/validators.js.map +1 -0
  470. package/locales/default/en/errors.json +2 -1
  471. package/migrations/024_application_client_correction.sql +39 -0
  472. package/migrations/025_record_deletion_lifecycle.sql +26 -0
  473. package/migrations/026_simplify_user_lifecycle.sql +33 -0
  474. package/migrations/027_branding_asset_size_limits.sql +19 -0
  475. package/migrations/028_totp_replay_protection.sql +17 -0
  476. package/migrations/029_public_session_identifiers.sql +16 -0
  477. package/migrations/030_global_configuration_catalog.sql +39 -0
  478. package/migrations/031_monotonic_updated_at.sql +28 -0
  479. package/package.json +2 -2
  480. package/dist/lib/data-import-plan.d.ts +0 -50
  481. package/dist/lib/data-import-plan.d.ts.map +0 -1
  482. package/dist/lib/data-import-plan.js +0 -235
  483. package/dist/lib/data-import-plan.js.map +0 -1
  484. package/dist/lib/data-import.d.ts +0 -276
  485. package/dist/lib/data-import.d.ts.map +0 -1
  486. package/dist/lib/data-import.js +0 -1694
  487. package/dist/lib/data-import.js.map +0 -1
@@ -17,15 +17,18 @@
17
17
  */
18
18
  import { createPrivateKey, generateKeyPairSync, createHash } from 'node:crypto';
19
19
  import { config } from '../config/index.js';
20
- import { getPool } from './database.js';
20
+ import { getPool, runDatabaseTransaction } from './database.js';
21
21
  import { logger } from './logger.js';
22
- import { encryptPrivateKey, decryptPrivateKey } from './signing-key-crypto.js';
22
+ import { encryptPrivateKey, decryptPrivateKey, SigningKeyCryptoError, } from './signing-key-crypto.js';
23
23
  // ---------------------------------------------------------------------------
24
24
  // Cached JWKS for JWT verification (admin auth middleware, etc.)
25
25
  // ---------------------------------------------------------------------------
26
26
  /** In-memory cache for the active JWK set — avoids a DB round-trip per request */
27
27
  let cachedJwks = null;
28
+ /** Millisecond timestamp of the currently installed cache entry. */
28
29
  let jwksCacheTimestamp = 0;
30
+ /** Monotonic invalidation marker used to reject stale in-flight cache installations. */
31
+ let jwksCacheGeneration = 0;
29
32
  /** Cache TTL for the active JWK set — 60 seconds matches system-config cache */
30
33
  const JWKS_CACHE_TTL_MS = 60_000;
31
34
  /**
@@ -42,15 +45,22 @@ export async function getActiveJwks() {
42
45
  if (cachedJwks && now - jwksCacheTimestamp < JWKS_CACHE_TTL_MS) {
43
46
  return cachedJwks;
44
47
  }
48
+ const loadGeneration = jwksCacheGeneration;
45
49
  const records = await loadSigningKeysFromDb();
46
- cachedJwks = signingKeysToJwks(records);
47
- jwksCacheTimestamp = now;
48
- return cachedJwks;
50
+ const loadedJwks = signingKeysToJwks(records);
51
+ // A mutation may invalidate the cache while this database read is pending. The caller may use
52
+ // its completed snapshot, but installing it would make later callers observe stale key state.
53
+ if (loadGeneration === jwksCacheGeneration) {
54
+ cachedJwks = loadedJwks;
55
+ jwksCacheTimestamp = now;
56
+ }
57
+ return loadedJwks;
49
58
  }
50
59
  /**
51
60
  * Clear the cached JWK set — useful for testing and after key rotation.
52
61
  */
53
62
  export function clearJwksCache() {
63
+ jwksCacheGeneration += 1;
54
64
  cachedJwks = null;
55
65
  jwksCacheTimestamp = 0;
56
66
  }
@@ -120,10 +130,8 @@ export function signingKeysToJwks(records) {
120
130
  try {
121
131
  keys.push(pemToJwk(record.privateKey, record.kid));
122
132
  }
123
- catch (error) {
124
- // Skip invalid PEM keys rather than crashing — log error and continue
125
- // with remaining keys so the provider can still start
126
- logger.error({ kid: record.kid, error }, 'Failed to convert signing key PEM to JWK, skipping');
133
+ catch {
134
+ throw invalidSigningKeyRecord(record.kid);
127
135
  }
128
136
  }
129
137
  return { keys };
@@ -146,38 +154,51 @@ export async function loadSigningKeysFromDb() {
146
154
  WHERE status IN ('active', 'retired')
147
155
  AND (expires_at IS NULL OR expires_at > NOW())
148
156
  ORDER BY activated_at DESC`);
149
- // Map snake_case DB columns to camelCase TypeScript interface.
150
- // Decrypt private keys that are stored encrypted; pass through plaintext legacy keys.
157
+ // Map snake_case DB columns to camelCase TypeScript interface. Every private key must use the
158
+ // authenticated encrypted representation; accepting a partial or plaintext row would weaken
159
+ // the storage guarantee and could expose key material through later error handling.
151
160
  return result.rows.map((row) => {
152
- let privateKey;
153
- if (row.encrypted && row.private_key_iv && row.private_key_tag) {
154
- // Encrypted key — decrypt with AES-256-GCM
155
- privateKey = decryptPrivateKey(row.private_key, row.private_key_iv, row.private_key_tag, config.signingKeyEncryptionKey);
161
+ if (!row.encrypted || !row.private_key_iv || !row.private_key_tag) {
162
+ throw invalidSigningKeyRecord(row.kid);
163
+ }
164
+ try {
165
+ const privateKey = decryptPrivateKey(row.private_key, row.private_key_iv, row.private_key_tag, config.signingKeyEncryptionKey);
166
+ return {
167
+ id: row.id,
168
+ kid: row.kid,
169
+ algorithm: row.algorithm,
170
+ publicKey: row.public_key,
171
+ privateKey,
172
+ status: row.status,
173
+ activatedAt: row.activated_at,
174
+ retiredAt: row.retired_at,
175
+ expiresAt: row.expires_at,
176
+ };
156
177
  }
157
- else {
158
- // Legacy plaintext key — use as-is
159
- privateKey = row.private_key;
178
+ catch {
179
+ throw invalidSigningKeyRecord(row.kid);
160
180
  }
161
- return {
162
- id: row.id,
163
- kid: row.kid,
164
- algorithm: row.algorithm,
165
- publicKey: row.public_key,
166
- privateKey,
167
- status: row.status,
168
- activatedAt: row.activated_at,
169
- retiredAt: row.retired_at,
170
- expiresAt: row.expires_at,
171
- };
172
181
  });
173
182
  }
183
+ /**
184
+ * Creates and records the fixed failure used for any unusable stored signing key.
185
+ *
186
+ * Only the public key identifier is logged. Ciphertext, metadata, parser errors, and stack traces
187
+ * are deliberately omitted because they can reveal secrets or internal deployment details.
188
+ *
189
+ * @param kid - Public identifier of the unusable database row.
190
+ * @returns A safe domain error suitable for propagation to startup and CLI boundaries.
191
+ */
192
+ function invalidSigningKeyRecord(kid) {
193
+ logger.error({ event: 'signing-key-record-invalid', kid }, 'Signing key record is invalid');
194
+ return new SigningKeyCryptoError('Signing key record is invalid');
195
+ }
174
196
  /**
175
197
  * Ensure at least one active signing key exists in the database.
176
198
  *
177
- * Called at application startup. If no active keys are found:
178
- * 1. Generate a new ES256 key pair
179
- * 2. Insert it into the signing_keys table with status='active'
180
- * 3. Log a warning that a key was auto-generated
199
+ * Called at application startup. A transaction-scoped table lock serializes the active-key
200
+ * recheck and optional encrypted insert, so simultaneous new processes cannot each create a
201
+ * bootstrap key. Every caller reloads the committed rows after releasing the lock.
181
202
  *
182
203
  * This guarantees the OIDC provider can always start, even on a fresh database
183
204
  * that has no signing keys yet (e.g., first run after migrations).
@@ -185,22 +206,26 @@ export async function loadSigningKeysFromDb() {
185
206
  * @returns The JWK key set containing all active and retired keys
186
207
  */
187
208
  export async function ensureSigningKeys() {
188
- let records = await loadSigningKeysFromDb();
189
- // Check if there are any active keys
190
- const hasActiveKey = records.some((r) => r.status === 'active');
191
- if (!hasActiveKey) {
209
+ await runDatabaseTransaction(async () => {
210
+ const pool = getPool();
211
+ await pool.query('LOCK TABLE signing_keys IN SHARE ROW EXCLUSIVE MODE');
212
+ // Recheck under the lock because another process may have inserted the first key while this
213
+ // process was waiting. Only the lock holder that still sees no active key may create one.
214
+ const lockedRecords = await loadSigningKeysFromDb();
215
+ if (lockedRecords.some((record) => record.status === 'active'))
216
+ return;
192
217
  logger.warn('No active signing keys found — auto-generating a new ES256 key pair');
193
218
  const keyPair = generateES256KeyPair();
194
- const pool = getPool();
195
219
  // Encrypt the private key before storage (AES-256-GCM)
196
220
  const { encrypted, iv, tag } = encryptPrivateKey(keyPair.privateKeyPem, config.signingKeyEncryptionKey);
197
221
  // Insert the new key with encrypted private key
198
222
  await pool.query(`INSERT INTO signing_keys (kid, algorithm, public_key, private_key, private_key_iv, private_key_tag, encrypted, status, activated_at)
199
223
  VALUES ($1, $2, $3, $4, $5, $6, true, 'active', NOW())`, [keyPair.kid, keyPair.algorithm, keyPair.publicKeyPem, encrypted, iv, tag]);
200
224
  logger.info({ kid: keyPair.kid }, 'Auto-generated signing key inserted into database');
201
- // Reload keys from DB to get the full record including generated UUID
202
- records = await loadSigningKeysFromDb();
203
- }
225
+ });
226
+ // Every caller reloads after the lock transaction commits. This gives both the inserting caller
227
+ // and any waiter the same authoritative winner, including its database-generated identifier.
228
+ const records = await loadSigningKeysFromDb();
204
229
  return signingKeysToJwks(records);
205
230
  }
206
231
  //# sourceMappingURL=signing-keys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signing-keys.js","sourceRoot":"","sources":["../../src/lib/signing-keys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signing-keys.js","sourceRoot":"","sources":["../../src/lib/signing-keys.ts"],"names":[],"mappings":"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"}
@@ -11,8 +11,6 @@
11
11
  *
12
12
  * Protected operations (all throw 403 Forbidden):
13
13
  * - Delete
14
- * - Suspend
15
- * - Lock
16
14
  * - Deactivate
17
15
  * - Remove porta-super-admin role
18
16
  * - Manage 2FA (disable, reset, regenerate recovery codes)
@@ -25,7 +23,8 @@ export declare const SUPER_ADMIN_USER_ID_KEY = "super_admin_user_id";
25
23
  * Operations that are forbidden on the super-admin user.
26
24
  * Used in error messages to clearly communicate what was attempted.
27
25
  */
28
- export declare const PROTECTED_OPERATIONS: readonly ['delete', 'suspend', 'lock', 'deactivate', 'remove-super-admin-role', 'manage-2fa'];
26
+ export declare const PROTECTED_OPERATIONS: readonly ['delete', 'deactivate', 'remove-super-admin-role', 'manage-2fa'];
27
+ /** Destructive operations that cannot target the bootstrap administrator. */
29
28
  export type ProtectedOperation = (typeof PROTECTED_OPERATIONS)[number];
30
29
  /**
31
30
  * Check if a user is the protected super-admin user.
@@ -47,6 +46,7 @@ export declare class SuperAdminProtectionError extends Error {
47
46
  readonly status = 403;
48
47
  /** The operation that was attempted */
49
48
  readonly operation: ProtectedOperation;
49
+ /** Create the public rejection for an attempted protected operation. */
50
50
  constructor(operation: ProtectedOperation);
51
51
  }
52
52
  /**
@@ -54,8 +54,8 @@ export declare class SuperAdminProtectionError extends Error {
54
54
  *
55
55
  * Call this before executing any destructive operation on a user:
56
56
  * ```typescript
57
- * await guardSuperAdmin(userId, 'suspend');
58
- * // ... proceed with suspend logic
57
+ * await guardSuperAdmin(userId, 'deactivate');
58
+ * // ... proceed with deactivation
59
59
  * ```
60
60
  *
61
61
  * If the user is not the super-admin, this function is a no-op.
@@ -1 +1 @@
1
- {"version":3,"file":"super-admin-protection.d.ts","sourceRoot":"","sources":["../../src/lib/super-admin-protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,YAC/B,QAAQ,EACR,SAAS,EACT,MAAM,EACN,YAAY,EACZ,yBAAyB,EACzB,YAAY,CACJ,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAMvE;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvE;AAMD;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,oCAAoC;IACpC,QAAQ,CAAC,MAAM,OAAO;IACtB,uCAAuC;IACvC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IAEvC,YAAY,SAAS,EAAE,kBAAkB,EAIxC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAKf"}
1
+ {"version":3,"file":"super-admin-protection.d.ts","sourceRoot":"","sources":["../../src/lib/super-admin-protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,YAC/B,QAAQ,EACR,YAAY,EACZ,yBAAyB,EACzB,YAAY,CACJ,CAAC;AAEX,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAMvE;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvE;AAMD;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,oCAAoC;IACpC,QAAQ,CAAC,MAAM,OAAO;IACtB,uCAAuC;IACvC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IAEvC,wEAAwE;IACxE,YAAY,SAAS,EAAE,kBAAkB,EAIxC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -11,15 +11,13 @@
11
11
  *
12
12
  * Protected operations (all throw 403 Forbidden):
13
13
  * - Delete
14
- * - Suspend
15
- * - Lock
16
14
  * - Deactivate
17
15
  * - Remove porta-super-admin role
18
16
  * - Manage 2FA (disable, reset, regenerate recovery codes)
19
17
  *
20
18
  * @module lib/super-admin-protection
21
19
  */
22
- import { getSystemConfigString } from './system-config.js';
20
+ import { getInternalSystemConfigString } from './system-config.js';
23
21
  // ============================================================================
24
22
  // Constants
25
23
  // ============================================================================
@@ -31,8 +29,6 @@ export const SUPER_ADMIN_USER_ID_KEY = 'super_admin_user_id';
31
29
  */
32
30
  export const PROTECTED_OPERATIONS = [
33
31
  'delete',
34
- 'suspend',
35
- 'lock',
36
32
  'deactivate',
37
33
  'remove-super-admin-role',
38
34
  'manage-2fa',
@@ -51,9 +47,9 @@ export const PROTECTED_OPERATIONS = [
51
47
  * @returns true if the user is the super-admin
52
48
  */
53
49
  export async function isSuperAdminUser(userId) {
54
- // getSystemConfigString returns the fallback when the key doesn't exist.
50
+ // The internal reader returns the fallback when the key doesn't exist.
55
51
  // Empty string fallback means: if no super-admin is configured, nobody matches.
56
- const superAdminUserId = await getSystemConfigString(SUPER_ADMIN_USER_ID_KEY, '');
52
+ const superAdminUserId = await getInternalSystemConfigString(SUPER_ADMIN_USER_ID_KEY, '');
57
53
  if (!superAdminUserId) {
58
54
  return false;
59
55
  }
@@ -71,6 +67,7 @@ export class SuperAdminProtectionError extends Error {
71
67
  status = 403;
72
68
  /** The operation that was attempted */
73
69
  operation;
70
+ /** Create the public rejection for an attempted protected operation. */
74
71
  constructor(operation) {
75
72
  super(`Cannot ${operation} the super-admin user`);
76
73
  this.name = 'SuperAdminProtectionError';
@@ -82,8 +79,8 @@ export class SuperAdminProtectionError extends Error {
82
79
  *
83
80
  * Call this before executing any destructive operation on a user:
84
81
  * ```typescript
85
- * await guardSuperAdmin(userId, 'suspend');
86
- * // ... proceed with suspend logic
82
+ * await guardSuperAdmin(userId, 'deactivate');
83
+ * // ... proceed with deactivation
87
84
  * ```
88
85
  *
89
86
  * If the user is not the super-admin, this function is a no-op.
@@ -1 +1 @@
1
- {"version":3,"file":"super-admin-protection.js","sourceRoot":"","sources":["../../src/lib/super-admin-protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,gEAAgE;AAChE,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,QAAQ;IACR,SAAS;IACT,MAAM;IACN,YAAY;IACZ,yBAAyB;IACzB,YAAY;CACJ,CAAC;AAIX,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,yEAAyE;IACzE,gFAAgF;IAChF,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAClF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,gBAAgB,KAAK,MAAM,CAAC;AACrC,CAAC;AAED,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,oCAAoC;IAC3B,MAAM,GAAG,GAAG,CAAC;IACtB,uCAAuC;IAC9B,SAAS,CAAqB;IAEvC,YAAY,SAA6B;QACvC,KAAK,CAAC,UAAU,SAAS,uBAAuB,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,SAA6B;IAE7B,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"super-admin-protection.js","sourceRoot":"","sources":["../../src/lib/super-admin-protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAEnE,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,gEAAgE;AAChE,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,QAAQ;IACR,YAAY;IACZ,yBAAyB;IACzB,YAAY;CACJ,CAAC;AAKX,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,uEAAuE;IACvE,gFAAgF;IAChF,MAAM,gBAAgB,GAAG,MAAM,6BAA6B,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAC1F,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,gBAAgB,KAAK,MAAM,CAAC;AACrC,CAAC;AAED,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,oCAAoC;IAC3B,MAAM,GAAG,GAAG,CAAC;IACtB,uCAAuC;IAC9B,SAAS,CAAqB;IAEvC,wEAAwE;IACxE,YAAY,SAA6B;QACvC,KAAK,CAAC,UAAU,SAAS,uBAAuB,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,SAA6B;IAE7B,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,268 @@
1
+ /** Closed operational policy. Database rows own values, never these definitions or defaults. */
2
+ /** Locales for which Porta ships every authentication namespace. */
3
+ export declare const SUPPORTED_LOCALES: readonly ["en"];
4
+ /** A completely packaged authentication locale. */
5
+ export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
6
+ /** Administrative tab containing a policy field. */
7
+ export type SystemConfigGroup = 'lifetimes' | 'rate-limits' | 'lockout' | 'general';
8
+ /** Whether a saved value is read at runtime or only during provider construction. */
9
+ export type SystemConfigApplicationMode = 'runtime' | 'restart-required';
10
+ /** Native JSON scalar kind accepted by a policy field. */
11
+ export type SystemConfigValueType = 'integer' | 'string';
12
+ /** Unit used to explain a native policy value without changing its representation. */
13
+ export type SystemConfigUnit = 'seconds' | 'attempts' | 'days' | 'locale';
14
+ /** Valid native operational policy; locale strings must be completely packaged. */
15
+ export type SystemConfigValue = number | SupportedLocale;
16
+ /**
17
+ * Immutable public policy in administrative display order. Bootstrap settings and secrets are
18
+ * deliberately absent; adding a field requires an explicit application change and migration.
19
+ *
20
+ * @example
21
+ * const defaults = SYSTEM_CONFIG_CATALOG.map(({ key, defaultValue }) => [key, defaultValue]);
22
+ */
23
+ export declare const SYSTEM_CONFIG_CATALOG: readonly [Readonly<{
24
+ key: "access_token_ttl";
25
+ group: SystemConfigGroup;
26
+ label: string;
27
+ description: string;
28
+ valueType: 'integer';
29
+ unit: "attempts" | "days" | "seconds";
30
+ defaultValue: number;
31
+ minimum: number;
32
+ maximum: number;
33
+ applicationMode: SystemConfigApplicationMode;
34
+ }>, Readonly<{
35
+ key: "id_token_ttl";
36
+ group: SystemConfigGroup;
37
+ label: string;
38
+ description: string;
39
+ valueType: 'integer';
40
+ unit: "attempts" | "days" | "seconds";
41
+ defaultValue: number;
42
+ minimum: number;
43
+ maximum: number;
44
+ applicationMode: SystemConfigApplicationMode;
45
+ }>, Readonly<{
46
+ key: "refresh_token_ttl";
47
+ group: SystemConfigGroup;
48
+ label: string;
49
+ description: string;
50
+ valueType: 'integer';
51
+ unit: "attempts" | "days" | "seconds";
52
+ defaultValue: number;
53
+ minimum: number;
54
+ maximum: number;
55
+ applicationMode: SystemConfigApplicationMode;
56
+ }>, Readonly<{
57
+ key: "authorization_code_ttl";
58
+ group: SystemConfigGroup;
59
+ label: string;
60
+ description: string;
61
+ valueType: 'integer';
62
+ unit: "attempts" | "days" | "seconds";
63
+ defaultValue: number;
64
+ minimum: number;
65
+ maximum: number;
66
+ applicationMode: SystemConfigApplicationMode;
67
+ }>, Readonly<{
68
+ key: "session_ttl";
69
+ group: SystemConfigGroup;
70
+ label: string;
71
+ description: string;
72
+ valueType: 'integer';
73
+ unit: "attempts" | "days" | "seconds";
74
+ defaultValue: number;
75
+ minimum: number;
76
+ maximum: number;
77
+ applicationMode: SystemConfigApplicationMode;
78
+ }>, Readonly<{
79
+ key: "magic_link_ttl";
80
+ group: SystemConfigGroup;
81
+ label: string;
82
+ description: string;
83
+ valueType: 'integer';
84
+ unit: "attempts" | "days" | "seconds";
85
+ defaultValue: number;
86
+ minimum: number;
87
+ maximum: number;
88
+ applicationMode: SystemConfigApplicationMode;
89
+ }>, Readonly<{
90
+ key: "password_reset_ttl";
91
+ group: SystemConfigGroup;
92
+ label: string;
93
+ description: string;
94
+ valueType: 'integer';
95
+ unit: "attempts" | "days" | "seconds";
96
+ defaultValue: number;
97
+ minimum: number;
98
+ maximum: number;
99
+ applicationMode: SystemConfigApplicationMode;
100
+ }>, Readonly<{
101
+ key: "invitation_ttl";
102
+ group: SystemConfigGroup;
103
+ label: string;
104
+ description: string;
105
+ valueType: 'integer';
106
+ unit: "attempts" | "days" | "seconds";
107
+ defaultValue: number;
108
+ minimum: number;
109
+ maximum: number;
110
+ applicationMode: SystemConfigApplicationMode;
111
+ }>, Readonly<{
112
+ key: "rate_limit_login_max";
113
+ group: SystemConfigGroup;
114
+ label: string;
115
+ description: string;
116
+ valueType: 'integer';
117
+ unit: "attempts" | "days" | "seconds";
118
+ defaultValue: number;
119
+ minimum: number;
120
+ maximum: number;
121
+ applicationMode: SystemConfigApplicationMode;
122
+ }>, Readonly<{
123
+ key: "rate_limit_login_window";
124
+ group: SystemConfigGroup;
125
+ label: string;
126
+ description: string;
127
+ valueType: 'integer';
128
+ unit: "attempts" | "days" | "seconds";
129
+ defaultValue: number;
130
+ minimum: number;
131
+ maximum: number;
132
+ applicationMode: SystemConfigApplicationMode;
133
+ }>, Readonly<{
134
+ key: "rate_limit_magic_link_max";
135
+ group: SystemConfigGroup;
136
+ label: string;
137
+ description: string;
138
+ valueType: 'integer';
139
+ unit: "attempts" | "days" | "seconds";
140
+ defaultValue: number;
141
+ minimum: number;
142
+ maximum: number;
143
+ applicationMode: SystemConfigApplicationMode;
144
+ }>, Readonly<{
145
+ key: "rate_limit_magic_link_window";
146
+ group: SystemConfigGroup;
147
+ label: string;
148
+ description: string;
149
+ valueType: 'integer';
150
+ unit: "attempts" | "days" | "seconds";
151
+ defaultValue: number;
152
+ minimum: number;
153
+ maximum: number;
154
+ applicationMode: SystemConfigApplicationMode;
155
+ }>, Readonly<{
156
+ key: "rate_limit_password_reset_max";
157
+ group: SystemConfigGroup;
158
+ label: string;
159
+ description: string;
160
+ valueType: 'integer';
161
+ unit: "attempts" | "days" | "seconds";
162
+ defaultValue: number;
163
+ minimum: number;
164
+ maximum: number;
165
+ applicationMode: SystemConfigApplicationMode;
166
+ }>, Readonly<{
167
+ key: "rate_limit_password_reset_window";
168
+ group: SystemConfigGroup;
169
+ label: string;
170
+ description: string;
171
+ valueType: 'integer';
172
+ unit: "attempts" | "days" | "seconds";
173
+ defaultValue: number;
174
+ minimum: number;
175
+ maximum: number;
176
+ applicationMode: SystemConfigApplicationMode;
177
+ }>, Readonly<{
178
+ key: "max_failed_logins";
179
+ group: SystemConfigGroup;
180
+ label: string;
181
+ description: string;
182
+ valueType: 'integer';
183
+ unit: "attempts" | "days" | "seconds";
184
+ defaultValue: number;
185
+ minimum: number;
186
+ maximum: number;
187
+ applicationMode: SystemConfigApplicationMode;
188
+ }>, Readonly<{
189
+ key: "lockout_duration_seconds";
190
+ group: SystemConfigGroup;
191
+ label: string;
192
+ description: string;
193
+ valueType: 'integer';
194
+ unit: "attempts" | "days" | "seconds";
195
+ defaultValue: number;
196
+ minimum: number;
197
+ maximum: number;
198
+ applicationMode: SystemConfigApplicationMode;
199
+ }>, Readonly<{
200
+ key: "audit_retention_days";
201
+ group: SystemConfigGroup;
202
+ label: string;
203
+ description: string;
204
+ valueType: 'integer';
205
+ unit: "attempts" | "days" | "seconds";
206
+ defaultValue: number;
207
+ minimum: number;
208
+ maximum: number;
209
+ applicationMode: SystemConfigApplicationMode;
210
+ }>, Readonly<{
211
+ readonly key: 'default_locale';
212
+ readonly group: 'general';
213
+ readonly label: 'Default locale';
214
+ readonly description: 'Final locale fallback used by the authentication UI.';
215
+ readonly valueType: 'string';
216
+ readonly unit: 'locale';
217
+ readonly defaultValue: 'en';
218
+ readonly allowedValues: readonly ["en"];
219
+ readonly applicationMode: 'runtime';
220
+ }>];
221
+ /** Exact public keys, derived from the same catalog used by runtime and administrative readers. */
222
+ export type SystemConfigKey = (typeof SYSTEM_CONFIG_CATALOG)[number]['key'];
223
+ /** Public keys whose native values are integers. */
224
+ export type NumericSystemConfigKey = Exclude<SystemConfigKey, 'default_locale'>;
225
+ /** Application-owned metadata for one editable operational-policy field. */
226
+ export interface SystemConfigDefinition {
227
+ /** Closed identifier used in storage and requests. */
228
+ readonly key: SystemConfigKey;
229
+ /** Administrative tab to which this field belongs. */
230
+ readonly group: SystemConfigGroup;
231
+ /** Human-readable field caption. */
232
+ readonly label: string;
233
+ /** Operational effect explained without infrastructure details. */
234
+ readonly description: string;
235
+ /** Accepted native JSON scalar kind. */
236
+ readonly valueType: SystemConfigValueType;
237
+ /** Unit of the stored value. */
238
+ readonly unit: SystemConfigUnit;
239
+ /** Safe runtime fallback when storage is missing, invalid or unavailable. */
240
+ readonly defaultValue: SystemConfigValue;
241
+ /** Inclusive lower bound for integer fields. */
242
+ readonly minimum?: number;
243
+ /** Inclusive upper bound for integer fields. */
244
+ readonly maximum?: number;
245
+ /** Completely supported values for a locale field. */
246
+ readonly allowedValues?: readonly SupportedLocale[];
247
+ /** Whether every provider instance must restart after saving this field. */
248
+ readonly applicationMode: SystemConfigApplicationMode;
249
+ }
250
+ /**
251
+ * Resolve an untrusted name without querying whether an internal database row exists.
252
+ * @param key - Exact, case-sensitive name; no trimming or normalization is performed.
253
+ * @returns Public definition, or undefined for every non-catalog name.
254
+ * @example
255
+ * findSystemConfigDefinition('magic_link_ttl')?.defaultValue; // 900
256
+ */
257
+ export declare function findSystemConfigDefinition(key: string): SystemConfigDefinition | undefined;
258
+ /**
259
+ * Validate submitted or stored policy without coercion. Numeric text and unsupported locales fail.
260
+ * @param definition - Application-owned public metadata.
261
+ * @param value - Untrusted native value from JSON or PostgreSQL.
262
+ * @returns The same valid scalar, or undefined when its type or bounds are wrong.
263
+ * @example
264
+ * const definition = findSystemConfigDefinition('magic_link_ttl');
265
+ * if (definition) validateSystemConfigValue(definition, 1200); // 1200
266
+ */
267
+ export declare function validateSystemConfigValue(definition: SystemConfigDefinition, value: unknown): SystemConfigValue | undefined;
268
+ //# sourceMappingURL=system-config-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-config-catalog.d.ts","sourceRoot":"","sources":["../../src/lib/system-config-catalog.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAEhG,oEAAoE;AACpE,eAAO,MAAM,iBAAiB,iBAAiC,CAAC;AAEhE,mDAAmD;AACnD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,oDAAoD;AACpD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpF,qFAAqF;AACrF,MAAM,MAAM,2BAA2B,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAEzE,0DAA0D;AAC1D,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD,sFAAsF;AACtF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1E,mFAAmF;AACnF,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,eAAe,CAAC;AA4BzD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB;;;;;eAhBnB,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;;;;;eAAT,SAAS;;;;;;;kBAiMf,gBAAgB;oBACd,SAAS;oBACT,gBAAgB;0BACV,sDAAsD;wBACxD,QAAQ;mBACb,QAAQ;2BACA,IAAI;;8BAED,SAAS;GAEnB,CAAC;AAEZ,mGAAmG;AACnG,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;AAE5E,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAEhF,4EAA4E;AAC5E,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC;IAC1C,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,gDAAgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpD,4EAA4E;IAC5E,QAAQ,CAAC,eAAe,EAAE,2BAA2B,CAAC;CACvD;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAE1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,sBAAsB,EAClC,KAAK,EAAE,OAAO,GACb,iBAAiB,GAAG,SAAS,CAe/B"}