@portaidentity/server 1.7.3 → 1.9.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 (494) hide show
  1. package/CHANGELOG.md +28 -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/auth/token-repository.d.ts +9 -3
  44. package/dist/auth/token-repository.d.ts.map +1 -1
  45. package/dist/auth/token-repository.js +17 -8
  46. package/dist/auth/token-repository.js.map +1 -1
  47. package/dist/cli/commands/init.d.ts +1 -1
  48. package/dist/cli/commands/init.d.ts.map +1 -1
  49. package/dist/cli/commands/init.js +12 -12
  50. package/dist/cli/commands/init.js.map +1 -1
  51. package/dist/cli/error-handler.d.ts +3 -2
  52. package/dist/cli/error-handler.d.ts.map +1 -1
  53. package/dist/cli/error-handler.js +9 -2
  54. package/dist/cli/error-handler.js.map +1 -1
  55. package/dist/cli/index.d.ts +1 -1
  56. package/dist/cli/index.d.ts.map +1 -1
  57. package/dist/cli/index.js +1 -1
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/clients/index.d.ts +1 -1
  60. package/dist/clients/index.js +1 -1
  61. package/dist/clients/repository.d.ts +24 -0
  62. package/dist/clients/repository.d.ts.map +1 -1
  63. package/dist/clients/repository.js +39 -0
  64. package/dist/clients/repository.js.map +1 -1
  65. package/dist/clients/secret-repository.d.ts +35 -8
  66. package/dist/clients/secret-repository.d.ts.map +1 -1
  67. package/dist/clients/secret-repository.js +69 -16
  68. package/dist/clients/secret-repository.js.map +1 -1
  69. package/dist/clients/secret-service.d.ts +5 -9
  70. package/dist/clients/secret-service.d.ts.map +1 -1
  71. package/dist/clients/secret-service.js +13 -22
  72. package/dist/clients/secret-service.js.map +1 -1
  73. package/dist/clients/service.d.ts +10 -13
  74. package/dist/clients/service.d.ts.map +1 -1
  75. package/dist/clients/service.js +121 -42
  76. package/dist/clients/service.js.map +1 -1
  77. package/dist/clients/types.d.ts +14 -1
  78. package/dist/clients/types.d.ts.map +1 -1
  79. package/dist/clients/types.js +1 -0
  80. package/dist/clients/types.js.map +1 -1
  81. package/dist/clients/validators.d.ts +83 -1
  82. package/dist/clients/validators.d.ts.map +1 -1
  83. package/dist/clients/validators.js +110 -0
  84. package/dist/clients/validators.js.map +1 -1
  85. package/dist/config/index.d.ts +1 -0
  86. package/dist/config/index.d.ts.map +1 -1
  87. package/dist/config/index.js +1 -0
  88. package/dist/config/index.js.map +1 -1
  89. package/dist/config/schema.d.ts +1 -0
  90. package/dist/config/schema.d.ts.map +1 -1
  91. package/dist/config/schema.js +23 -1
  92. package/dist/config/schema.js.map +1 -1
  93. package/dist/custom-claims/repository.d.ts +14 -9
  94. package/dist/custom-claims/repository.d.ts.map +1 -1
  95. package/dist/custom-claims/repository.js +38 -11
  96. package/dist/custom-claims/repository.js.map +1 -1
  97. package/dist/custom-claims/service.d.ts +11 -6
  98. package/dist/custom-claims/service.d.ts.map +1 -1
  99. package/dist/custom-claims/service.js +43 -20
  100. package/dist/custom-claims/service.js.map +1 -1
  101. package/dist/index.js +8 -2
  102. package/dist/index.js.map +1 -1
  103. package/dist/lib/admin-permissions.d.ts +12 -7
  104. package/dist/lib/admin-permissions.d.ts.map +1 -1
  105. package/dist/lib/admin-permissions.js +26 -16
  106. package/dist/lib/admin-permissions.js.map +1 -1
  107. package/dist/lib/audit-log.d.ts +2 -2
  108. package/dist/lib/audit-log.d.ts.map +1 -1
  109. package/dist/lib/audit-log.js +1 -1
  110. package/dist/lib/audit-log.js.map +1 -1
  111. package/dist/lib/authority-revocation.d.ts +18 -0
  112. package/dist/lib/authority-revocation.d.ts.map +1 -0
  113. package/dist/lib/authority-revocation.js +37 -0
  114. package/dist/lib/authority-revocation.js.map +1 -0
  115. package/dist/lib/branding-assets.d.ts +35 -5
  116. package/dist/lib/branding-assets.d.ts.map +1 -1
  117. package/dist/lib/branding-assets.js +33 -26
  118. package/dist/lib/branding-assets.js.map +1 -1
  119. package/dist/lib/bulk-operations.d.ts +1 -1
  120. package/dist/lib/bulk-operations.d.ts.map +1 -1
  121. package/dist/lib/bulk-operations.js +1 -13
  122. package/dist/lib/bulk-operations.js.map +1 -1
  123. package/dist/lib/cursor.d.ts +2 -0
  124. package/dist/lib/cursor.d.ts.map +1 -1
  125. package/dist/lib/cursor.js +2 -7
  126. package/dist/lib/cursor.js.map +1 -1
  127. package/dist/lib/database.d.ts.map +1 -1
  128. package/dist/lib/database.js +5 -0
  129. package/dist/lib/database.js.map +1 -1
  130. package/dist/lib/deletion-cleanup.d.ts +43 -0
  131. package/dist/lib/deletion-cleanup.d.ts.map +1 -0
  132. package/dist/lib/deletion-cleanup.js +207 -0
  133. package/dist/lib/deletion-cleanup.js.map +1 -0
  134. package/dist/lib/image-validator.d.ts +3 -1
  135. package/dist/lib/image-validator.d.ts.map +1 -1
  136. package/dist/lib/image-validator.js +32 -19
  137. package/dist/lib/image-validator.js.map +1 -1
  138. package/dist/lib/log-format.d.ts +20 -0
  139. package/dist/lib/log-format.d.ts.map +1 -0
  140. package/dist/lib/log-format.js +22 -0
  141. package/dist/lib/log-format.js.map +1 -0
  142. package/dist/lib/logger.d.ts +3 -1
  143. package/dist/lib/logger.d.ts.map +1 -1
  144. package/dist/lib/logger.js +21 -4
  145. package/dist/lib/logger.js.map +1 -1
  146. package/dist/lib/redis.d.ts.map +1 -1
  147. package/dist/lib/redis.js +3 -0
  148. package/dist/lib/redis.js.map +1 -1
  149. package/dist/lib/session-tracking.d.ts +73 -11
  150. package/dist/lib/session-tracking.d.ts.map +1 -1
  151. package/dist/lib/session-tracking.js +76 -32
  152. package/dist/lib/session-tracking.js.map +1 -1
  153. package/dist/lib/signing-key-crypto.d.ts.map +1 -1
  154. package/dist/lib/signing-key-crypto.js +4 -5
  155. package/dist/lib/signing-key-crypto.js.map +1 -1
  156. package/dist/lib/signing-keys.d.ts +3 -4
  157. package/dist/lib/signing-keys.d.ts.map +1 -1
  158. package/dist/lib/signing-keys.js +66 -41
  159. package/dist/lib/signing-keys.js.map +1 -1
  160. package/dist/lib/super-admin-protection.d.ts +5 -5
  161. package/dist/lib/super-admin-protection.d.ts.map +1 -1
  162. package/dist/lib/super-admin-protection.js +6 -9
  163. package/dist/lib/super-admin-protection.js.map +1 -1
  164. package/dist/lib/system-config-catalog.d.ts +268 -0
  165. package/dist/lib/system-config-catalog.d.ts.map +1 -0
  166. package/dist/lib/system-config-catalog.js +90 -0
  167. package/dist/lib/system-config-catalog.js.map +1 -0
  168. package/dist/lib/system-config.d.ts +30 -33
  169. package/dist/lib/system-config.d.ts.map +1 -1
  170. package/dist/lib/system-config.js +78 -93
  171. package/dist/lib/system-config.js.map +1 -1
  172. package/dist/lib/with-timeout.d.ts +32 -0
  173. package/dist/lib/with-timeout.d.ts.map +1 -0
  174. package/dist/lib/with-timeout.js +45 -0
  175. package/dist/lib/with-timeout.js.map +1 -0
  176. package/dist/middleware/admin-auth.d.ts +6 -5
  177. package/dist/middleware/admin-auth.d.ts.map +1 -1
  178. package/dist/middleware/admin-auth.js +30 -20
  179. package/dist/middleware/admin-auth.js.map +1 -1
  180. package/dist/middleware/admin-cors.d.ts +3 -3
  181. package/dist/middleware/admin-cors.js +3 -3
  182. package/dist/middleware/admin-mutation-audit.d.ts +3 -2
  183. package/dist/middleware/admin-mutation-audit.d.ts.map +1 -1
  184. package/dist/middleware/admin-mutation-audit.js +12 -5
  185. package/dist/middleware/admin-mutation-audit.js.map +1 -1
  186. package/dist/middleware/admin-rate-limiter.d.ts +7 -8
  187. package/dist/middleware/admin-rate-limiter.d.ts.map +1 -1
  188. package/dist/middleware/admin-rate-limiter.js +7 -8
  189. package/dist/middleware/admin-rate-limiter.js.map +1 -1
  190. package/dist/middleware/client-secret-hash.d.ts +10 -29
  191. package/dist/middleware/client-secret-hash.d.ts.map +1 -1
  192. package/dist/middleware/client-secret-hash.js +161 -59
  193. package/dist/middleware/client-secret-hash.js.map +1 -1
  194. package/dist/middleware/health.d.ts +17 -0
  195. package/dist/middleware/health.d.ts.map +1 -1
  196. package/dist/middleware/health.js +25 -21
  197. package/dist/middleware/health.js.map +1 -1
  198. package/dist/middleware/ready.d.ts.map +1 -1
  199. package/dist/middleware/ready.js +1 -12
  200. package/dist/middleware/ready.js.map +1 -1
  201. package/dist/middleware/require-existing-organization.d.ts +18 -0
  202. package/dist/middleware/require-existing-organization.d.ts.map +1 -0
  203. package/dist/middleware/require-existing-organization.js +38 -0
  204. package/dist/middleware/require-existing-organization.js.map +1 -0
  205. package/dist/middleware/require-permission.d.ts.map +1 -1
  206. package/dist/middleware/require-permission.js +35 -1
  207. package/dist/middleware/require-permission.js.map +1 -1
  208. package/dist/middleware/require-user-organization.d.ts.map +1 -1
  209. package/dist/middleware/require-user-organization.js +4 -2
  210. package/dist/middleware/require-user-organization.js.map +1 -1
  211. package/dist/middleware/security-headers.d.ts +18 -0
  212. package/dist/middleware/security-headers.d.ts.map +1 -1
  213. package/dist/middleware/security-headers.js +32 -1
  214. package/dist/middleware/security-headers.js.map +1 -1
  215. package/dist/middleware/tenant-resolver.d.ts +1 -2
  216. package/dist/middleware/tenant-resolver.d.ts.map +1 -1
  217. package/dist/middleware/tenant-resolver.js +1 -5
  218. package/dist/middleware/tenant-resolver.js.map +1 -1
  219. package/dist/middleware/token-rate-limiter.d.ts +37 -16
  220. package/dist/middleware/token-rate-limiter.d.ts.map +1 -1
  221. package/dist/middleware/token-rate-limiter.js +126 -54
  222. package/dist/middleware/token-rate-limiter.js.map +1 -1
  223. package/dist/oidc/account-finder.d.ts +5 -5
  224. package/dist/oidc/account-finder.d.ts.map +1 -1
  225. package/dist/oidc/account-finder.js +31 -23
  226. package/dist/oidc/account-finder.js.map +1 -1
  227. package/dist/oidc/adapter-factory.d.ts.map +1 -1
  228. package/dist/oidc/adapter-factory.js +83 -3
  229. package/dist/oidc/adapter-factory.js.map +1 -1
  230. package/dist/oidc/configuration.d.ts +3 -8
  231. package/dist/oidc/configuration.d.ts.map +1 -1
  232. package/dist/oidc/configuration.js +67 -50
  233. package/dist/oidc/configuration.js.map +1 -1
  234. package/dist/oidc/provider.d.ts.map +1 -1
  235. package/dist/oidc/provider.js +7 -0
  236. package/dist/oidc/provider.js.map +1 -1
  237. package/dist/oidc/redis-adapter.d.ts +2 -3
  238. package/dist/oidc/redis-adapter.d.ts.map +1 -1
  239. package/dist/oidc/redis-adapter.js +54 -46
  240. package/dist/oidc/redis-adapter.js.map +1 -1
  241. package/dist/organizations/branding-url.d.ts +17 -0
  242. package/dist/organizations/branding-url.d.ts.map +1 -0
  243. package/dist/organizations/branding-url.js +38 -0
  244. package/dist/organizations/branding-url.js.map +1 -0
  245. package/dist/organizations/index.d.ts +2 -2
  246. package/dist/organizations/index.d.ts.map +1 -1
  247. package/dist/organizations/index.js +1 -1
  248. package/dist/organizations/index.js.map +1 -1
  249. package/dist/organizations/repository.d.ts +22 -32
  250. package/dist/organizations/repository.d.ts.map +1 -1
  251. package/dist/organizations/repository.js +64 -45
  252. package/dist/organizations/repository.js.map +1 -1
  253. package/dist/organizations/service.d.ts +14 -46
  254. package/dist/organizations/service.d.ts.map +1 -1
  255. package/dist/organizations/service.js +60 -112
  256. package/dist/organizations/service.js.map +1 -1
  257. package/dist/organizations/types.d.ts +1 -15
  258. package/dist/organizations/types.d.ts.map +1 -1
  259. package/dist/organizations/validators.d.ts +41 -0
  260. package/dist/organizations/validators.d.ts.map +1 -0
  261. package/dist/organizations/validators.js +48 -0
  262. package/dist/organizations/validators.js.map +1 -0
  263. package/dist/portability/apply.d.ts +15 -0
  264. package/dist/portability/apply.d.ts.map +1 -0
  265. package/dist/portability/apply.js +274 -0
  266. package/dist/portability/apply.js.map +1 -0
  267. package/dist/portability/authorization.d.ts +30 -0
  268. package/dist/portability/authorization.d.ts.map +1 -0
  269. package/dist/portability/authorization.js +130 -0
  270. package/dist/portability/authorization.js.map +1 -0
  271. package/dist/portability/cleanup.d.ts +29 -0
  272. package/dist/portability/cleanup.d.ts.map +1 -0
  273. package/dist/portability/cleanup.js +167 -0
  274. package/dist/portability/cleanup.js.map +1 -0
  275. package/dist/portability/export.d.ts +18 -0
  276. package/dist/portability/export.d.ts.map +1 -0
  277. package/dist/portability/export.js +125 -0
  278. package/dist/portability/export.js.map +1 -0
  279. package/dist/portability/import-repository.d.ts +204 -0
  280. package/dist/portability/import-repository.d.ts.map +1 -0
  281. package/dist/portability/import-repository.js +348 -0
  282. package/dist/portability/import-repository.js.map +1 -0
  283. package/dist/portability/import-user-client-writers.d.ts +40 -0
  284. package/dist/portability/import-user-client-writers.d.ts.map +1 -0
  285. package/dist/portability/import-user-client-writers.js +171 -0
  286. package/dist/portability/import-user-client-writers.js.map +1 -0
  287. package/dist/portability/index.d.ts +8 -0
  288. package/dist/portability/index.d.ts.map +1 -0
  289. package/dist/portability/index.js +8 -0
  290. package/dist/portability/index.js.map +1 -0
  291. package/dist/portability/plan-support.d.ts +137 -0
  292. package/dist/portability/plan-support.d.ts.map +1 -0
  293. package/dist/portability/plan-support.js +337 -0
  294. package/dist/portability/plan-support.js.map +1 -0
  295. package/dist/portability/plan.d.ts +34 -0
  296. package/dist/portability/plan.d.ts.map +1 -0
  297. package/dist/portability/plan.js +450 -0
  298. package/dist/portability/plan.js.map +1 -0
  299. package/dist/portability/repository.d.ts +95 -0
  300. package/dist/portability/repository.d.ts.map +1 -0
  301. package/dist/portability/repository.js +390 -0
  302. package/dist/portability/repository.js.map +1 -0
  303. package/dist/portability/schema.d.ts +591 -0
  304. package/dist/portability/schema.d.ts.map +1 -0
  305. package/dist/portability/schema.js +459 -0
  306. package/dist/portability/schema.js.map +1 -0
  307. package/dist/portability/types.d.ts +382 -0
  308. package/dist/portability/types.d.ts.map +1 -0
  309. package/dist/portability/types.js +19 -0
  310. package/dist/portability/types.js.map +1 -0
  311. package/dist/rbac/errors.d.ts +4 -0
  312. package/dist/rbac/errors.d.ts.map +1 -1
  313. package/dist/rbac/errors.js +7 -0
  314. package/dist/rbac/errors.js.map +1 -1
  315. package/dist/rbac/index.d.ts +3 -3
  316. package/dist/rbac/index.d.ts.map +1 -1
  317. package/dist/rbac/index.js +3 -3
  318. package/dist/rbac/index.js.map +1 -1
  319. package/dist/rbac/mapping-repository.d.ts +84 -9
  320. package/dist/rbac/mapping-repository.d.ts.map +1 -1
  321. package/dist/rbac/mapping-repository.js +222 -55
  322. package/dist/rbac/mapping-repository.js.map +1 -1
  323. package/dist/rbac/permission-repository.d.ts +36 -19
  324. package/dist/rbac/permission-repository.d.ts.map +1 -1
  325. package/dist/rbac/permission-repository.js +93 -35
  326. package/dist/rbac/permission-repository.js.map +1 -1
  327. package/dist/rbac/permission-service.d.ts +18 -19
  328. package/dist/rbac/permission-service.d.ts.map +1 -1
  329. package/dist/rbac/permission-service.js +100 -57
  330. package/dist/rbac/permission-service.js.map +1 -1
  331. package/dist/rbac/role-repository.d.ts +29 -24
  332. package/dist/rbac/role-repository.d.ts.map +1 -1
  333. package/dist/rbac/role-repository.js +66 -43
  334. package/dist/rbac/role-repository.js.map +1 -1
  335. package/dist/rbac/role-service.d.ts +35 -32
  336. package/dist/rbac/role-service.d.ts.map +1 -1
  337. package/dist/rbac/role-service.js +210 -96
  338. package/dist/rbac/role-service.js.map +1 -1
  339. package/dist/rbac/slugs.d.ts +16 -27
  340. package/dist/rbac/slugs.d.ts.map +1 -1
  341. package/dist/rbac/slugs.js +36 -59
  342. package/dist/rbac/slugs.js.map +1 -1
  343. package/dist/rbac/types.d.ts +2 -4
  344. package/dist/rbac/types.d.ts.map +1 -1
  345. package/dist/rbac/types.js.map +1 -1
  346. package/dist/rbac/user-role-service.d.ts +23 -24
  347. package/dist/rbac/user-role-service.d.ts.map +1 -1
  348. package/dist/rbac/user-role-service.js +117 -61
  349. package/dist/rbac/user-role-service.js.map +1 -1
  350. package/dist/routes/applications.d.ts +4 -2
  351. package/dist/routes/applications.d.ts.map +1 -1
  352. package/dist/routes/applications.js +57 -19
  353. package/dist/routes/applications.js.map +1 -1
  354. package/dist/routes/audit.js +1 -1
  355. package/dist/routes/audit.js.map +1 -1
  356. package/dist/routes/branding.d.ts +3 -3
  357. package/dist/routes/branding.d.ts.map +1 -1
  358. package/dist/routes/branding.js +44 -16
  359. package/dist/routes/branding.js.map +1 -1
  360. package/dist/routes/bulk.d.ts +0 -5
  361. package/dist/routes/bulk.d.ts.map +1 -1
  362. package/dist/routes/bulk.js +3 -5
  363. package/dist/routes/bulk.js.map +1 -1
  364. package/dist/routes/clients.d.ts +4 -4
  365. package/dist/routes/clients.d.ts.map +1 -1
  366. package/dist/routes/clients.js +113 -52
  367. package/dist/routes/clients.js.map +1 -1
  368. package/dist/routes/config.d.ts +17 -12
  369. package/dist/routes/config.d.ts.map +1 -1
  370. package/dist/routes/config.js +165 -64
  371. package/dist/routes/config.js.map +1 -1
  372. package/dist/routes/custom-claims.d.ts.map +1 -1
  373. package/dist/routes/custom-claims.js +8 -2
  374. package/dist/routes/custom-claims.js.map +1 -1
  375. package/dist/routes/exports.d.ts +2 -1
  376. package/dist/routes/exports.d.ts.map +1 -1
  377. package/dist/routes/exports.js +57 -1
  378. package/dist/routes/exports.js.map +1 -1
  379. package/dist/routes/imports.d.ts +2 -2
  380. package/dist/routes/imports.d.ts.map +1 -1
  381. package/dist/routes/imports.js +95 -40
  382. package/dist/routes/imports.js.map +1 -1
  383. package/dist/routes/interactions.d.ts.map +1 -1
  384. package/dist/routes/interactions.js +113 -87
  385. package/dist/routes/interactions.js.map +1 -1
  386. package/dist/routes/invitation.d.ts.map +1 -1
  387. package/dist/routes/invitation.js +28 -27
  388. package/dist/routes/invitation.js.map +1 -1
  389. package/dist/routes/keys.d.ts.map +1 -1
  390. package/dist/routes/keys.js +26 -13
  391. package/dist/routes/keys.js.map +1 -1
  392. package/dist/routes/magic-link.d.ts.map +1 -1
  393. package/dist/routes/magic-link.js +5 -17
  394. package/dist/routes/magic-link.js.map +1 -1
  395. package/dist/routes/organizations.d.ts +1 -2
  396. package/dist/routes/organizations.d.ts.map +1 -1
  397. package/dist/routes/organizations.js +43 -104
  398. package/dist/routes/organizations.js.map +1 -1
  399. package/dist/routes/password-reset.d.ts.map +1 -1
  400. package/dist/routes/password-reset.js +13 -35
  401. package/dist/routes/password-reset.js.map +1 -1
  402. package/dist/routes/permissions.d.ts +1 -1
  403. package/dist/routes/permissions.d.ts.map +1 -1
  404. package/dist/routes/permissions.js +58 -17
  405. package/dist/routes/permissions.js.map +1 -1
  406. package/dist/routes/public-branding.d.ts +16 -0
  407. package/dist/routes/public-branding.d.ts.map +1 -0
  408. package/dist/routes/public-branding.js +52 -0
  409. package/dist/routes/public-branding.js.map +1 -0
  410. package/dist/routes/roles.d.ts +1 -1
  411. package/dist/routes/roles.d.ts.map +1 -1
  412. package/dist/routes/roles.js +63 -21
  413. package/dist/routes/roles.js.map +1 -1
  414. package/dist/routes/sessions.d.ts.map +1 -1
  415. package/dist/routes/sessions.js +23 -12
  416. package/dist/routes/sessions.js.map +1 -1
  417. package/dist/routes/two-factor.d.ts.map +1 -1
  418. package/dist/routes/two-factor.js +91 -38
  419. package/dist/routes/two-factor.js.map +1 -1
  420. package/dist/routes/user-roles.d.ts.map +1 -1
  421. package/dist/routes/user-roles.js +56 -9
  422. package/dist/routes/user-roles.js.map +1 -1
  423. package/dist/routes/users.d.ts +4 -8
  424. package/dist/routes/users.d.ts.map +1 -1
  425. package/dist/routes/users.js +108 -265
  426. package/dist/routes/users.js.map +1 -1
  427. package/dist/server.d.ts.map +1 -1
  428. package/dist/server.js +53 -37
  429. package/dist/server.js.map +1 -1
  430. package/dist/two-factor/errors.d.ts +9 -0
  431. package/dist/two-factor/errors.d.ts.map +1 -1
  432. package/dist/two-factor/errors.js +12 -0
  433. package/dist/two-factor/errors.js.map +1 -1
  434. package/dist/two-factor/index.d.ts +5 -4
  435. package/dist/two-factor/index.d.ts.map +1 -1
  436. package/dist/two-factor/index.js +4 -4
  437. package/dist/two-factor/index.js.map +1 -1
  438. package/dist/two-factor/repository.d.ts +17 -6
  439. package/dist/two-factor/repository.d.ts.map +1 -1
  440. package/dist/two-factor/repository.js +37 -9
  441. package/dist/two-factor/repository.js.map +1 -1
  442. package/dist/two-factor/service.d.ts.map +1 -1
  443. package/dist/two-factor/service.js +26 -19
  444. package/dist/two-factor/service.js.map +1 -1
  445. package/dist/two-factor/totp.d.ts +13 -2
  446. package/dist/two-factor/totp.d.ts.map +1 -1
  447. package/dist/two-factor/totp.js +20 -7
  448. package/dist/two-factor/totp.js.map +1 -1
  449. package/dist/two-factor/types.d.ts +3 -0
  450. package/dist/two-factor/types.d.ts.map +1 -1
  451. package/dist/two-factor/types.js +5 -0
  452. package/dist/two-factor/types.js.map +1 -1
  453. package/dist/users/gdpr.d.ts +2 -40
  454. package/dist/users/gdpr.d.ts.map +1 -1
  455. package/dist/users/gdpr.js +3 -110
  456. package/dist/users/gdpr.js.map +1 -1
  457. package/dist/users/index.d.ts +5 -4
  458. package/dist/users/index.d.ts.map +1 -1
  459. package/dist/users/index.js +5 -4
  460. package/dist/users/index.js.map +1 -1
  461. package/dist/users/repository.d.ts +49 -3
  462. package/dist/users/repository.d.ts.map +1 -1
  463. package/dist/users/repository.js +169 -18
  464. package/dist/users/repository.js.map +1 -1
  465. package/dist/users/service.d.ts +19 -51
  466. package/dist/users/service.d.ts.map +1 -1
  467. package/dist/users/service.js +72 -122
  468. package/dist/users/service.js.map +1 -1
  469. package/dist/users/types.d.ts +4 -5
  470. package/dist/users/types.d.ts.map +1 -1
  471. package/dist/users/types.js.map +1 -1
  472. package/dist/users/validators.d.ts +28 -0
  473. package/dist/users/validators.d.ts.map +1 -0
  474. package/dist/users/validators.js +25 -0
  475. package/dist/users/validators.js.map +1 -0
  476. package/locales/default/en/errors.json +2 -1
  477. package/migrations/024_application_client_correction.sql +39 -0
  478. package/migrations/025_record_deletion_lifecycle.sql +26 -0
  479. package/migrations/026_simplify_user_lifecycle.sql +33 -0
  480. package/migrations/027_branding_asset_size_limits.sql +19 -0
  481. package/migrations/028_totp_replay_protection.sql +17 -0
  482. package/migrations/029_public_session_identifiers.sql +16 -0
  483. package/migrations/030_global_configuration_catalog.sql +39 -0
  484. package/migrations/031_monotonic_updated_at.sql +28 -0
  485. package/migrations/032_client_require_consent.sql +15 -0
  486. package/package.json +2 -2
  487. package/dist/lib/data-import-plan.d.ts +0 -50
  488. package/dist/lib/data-import-plan.d.ts.map +0 -1
  489. package/dist/lib/data-import-plan.js +0 -235
  490. package/dist/lib/data-import-plan.js.map +0 -1
  491. package/dist/lib/data-import.d.ts +0 -276
  492. package/dist/lib/data-import.d.ts.map +0 -1
  493. package/dist/lib/data-import.js +0 -1694
  494. package/dist/lib/data-import.js.map +0 -1
@@ -0,0 +1,274 @@
1
+ /** Atomic selective portability import orchestration. */
2
+ import { createHash } from 'node:crypto';
3
+ import { writeAuditLogInTransaction } from '../lib/audit-log.js';
4
+ import { getPool, runDatabaseTransaction } from '../lib/database.js';
5
+ import { registerPortabilityCleanup } from './cleanup.js';
6
+ import { writePortabilityApplication, writePortabilityClaimDefinition, writePortabilityModule, writePortabilityOrganization, writePortabilityPermission, writePortabilityRole, writePortabilityRolePermissions, } from './import-repository.js';
7
+ import { writePortabilityClient, writePortabilityUser, writePortabilityUserClaimValue, writePortabilityUserRole, } from './import-user-client-writers.js';
8
+ import { buildResolvedPortabilityPlan } from './plan.js';
9
+ import { key, normalizedEmail, normalizedRbac, normalizedSlug } from './plan-support.js';
10
+ import { PortabilityError, } from './types.js';
11
+ /**
12
+ * @param plan - Valid resolved plan
13
+ * @param entityType - Manifest collection
14
+ * @param naturalKey - Exact public record identity
15
+ * @returns Planned action for the record
16
+ */
17
+ function plannedAction(plan, entityType, naturalKey) {
18
+ const encoded = JSON.stringify(naturalKey);
19
+ const item = plan.result.items.find((candidate) => candidate.entity_type === entityType && JSON.stringify(candidate.natural_key) === encoded);
20
+ if (item === undefined)
21
+ throw new Error('Portability plan is missing a write action');
22
+ return item.action;
23
+ }
24
+ /**
25
+ * @param rows - Existing destination records
26
+ * @param selectKey - Normalized natural-key selector
27
+ * @param naturalKey - Normalized key to find
28
+ * @returns Existing private identifier, or null when absent
29
+ */
30
+ function existingId(rows, selectKey, naturalKey) {
31
+ return rows.find((row) => selectKey(row) === naturalKey)?.id ?? null;
32
+ }
33
+ /**
34
+ * Apply organization and application-authorization records in dependency order.
35
+ *
36
+ * @param plan - Valid plan and destination snapshot from this transaction
37
+ */
38
+ async function applyAuthorizationRecords(plan) {
39
+ const { manifest, snapshot } = plan;
40
+ const organizationIds = new Map(snapshot.organizations.map((row) => [normalizedSlug(row.slug), row.id]));
41
+ const applicationIds = new Map(snapshot.applications.map((row) => [normalizedSlug(row.slug), row.id]));
42
+ const moduleIds = new Map(snapshot.applicationModules.map((row) => [
43
+ key(normalizedSlug(row.application_slug), normalizedSlug(row.slug)),
44
+ row.id,
45
+ ]));
46
+ const roleIds = new Map(snapshot.roles.map((row) => [
47
+ key(normalizedSlug(row.application_slug), normalizedRbac(row.slug)),
48
+ row.id,
49
+ ]));
50
+ const permissionIds = new Map(snapshot.permissions.map((row) => [
51
+ key(normalizedSlug(row.application_slug), normalizedRbac(row.slug)),
52
+ row.id,
53
+ ]));
54
+ const claimIds = new Map(snapshot.claimDefinitions.map((row) => [
55
+ key(normalizedSlug(row.application_slug), row.claim_name),
56
+ row.id,
57
+ ]));
58
+ const userIds = new Map(snapshot.users.map((row) => [
59
+ key(normalizedSlug(row.organization_slug), normalizedEmail(row.email)),
60
+ row.id,
61
+ ]));
62
+ const clientIds = new Map(snapshot.clients.map((row) => [row.client_id, row.id]));
63
+ for (const record of manifest.organizations) {
64
+ const naturalKey = { slug: record.slug };
65
+ const action = plannedAction(plan, 'organizations', naturalKey);
66
+ if (action === 'skipped')
67
+ continue;
68
+ const normalizedKey = normalizedSlug(record.slug);
69
+ const id = await writePortabilityOrganization(record, organizationIds.get(normalizedKey) ?? null, new Set(snapshot.brandingAssets
70
+ .filter((asset) => normalizedSlug(asset.organization_slug) === normalizedKey)
71
+ .map((asset) => asset.asset_type)));
72
+ organizationIds.set(normalizedKey, id);
73
+ }
74
+ for (const record of manifest.applications) {
75
+ const naturalKey = { slug: record.slug };
76
+ const action = plannedAction(plan, 'applications', naturalKey);
77
+ if (action === 'skipped')
78
+ continue;
79
+ const normalizedKey = normalizedSlug(record.slug);
80
+ const id = await writePortabilityApplication(record, applicationIds.get(normalizedKey) ?? null);
81
+ applicationIds.set(normalizedKey, id);
82
+ }
83
+ for (const record of manifest.application_modules) {
84
+ const naturalKey = { application_slug: record.application_slug, slug: record.slug };
85
+ const action = plannedAction(plan, 'application_modules', naturalKey);
86
+ if (action === 'skipped')
87
+ continue;
88
+ const applicationId = applicationIds.get(normalizedSlug(record.application_slug));
89
+ if (applicationId === undefined)
90
+ throw new Error('Resolved application is missing');
91
+ const normalizedKey = key(normalizedSlug(record.application_slug), normalizedSlug(record.slug));
92
+ const id = await writePortabilityModule(record, applicationId, moduleIds.get(normalizedKey) ?? null);
93
+ moduleIds.set(normalizedKey, id);
94
+ }
95
+ for (const record of manifest.roles) {
96
+ const naturalKey = { application_slug: record.application_slug, slug: record.slug };
97
+ const action = plannedAction(plan, 'roles', naturalKey);
98
+ if (action === 'skipped')
99
+ continue;
100
+ const applicationId = applicationIds.get(normalizedSlug(record.application_slug));
101
+ if (applicationId === undefined)
102
+ throw new Error('Resolved application is missing');
103
+ const normalizedKey = key(normalizedSlug(record.application_slug), normalizedRbac(record.slug));
104
+ const id = await writePortabilityRole(record, applicationId, roleIds.get(normalizedKey) ?? null);
105
+ roleIds.set(normalizedKey, id);
106
+ }
107
+ for (const record of manifest.permissions) {
108
+ const naturalKey = { application_slug: record.application_slug, slug: record.slug };
109
+ const action = plannedAction(plan, 'permissions', naturalKey);
110
+ if (action === 'skipped')
111
+ continue;
112
+ const appKey = normalizedSlug(record.application_slug);
113
+ const applicationId = applicationIds.get(appKey);
114
+ if (applicationId === undefined)
115
+ throw new Error('Resolved application is missing');
116
+ const moduleId = record.module_slug === null
117
+ ? null
118
+ : (moduleIds.get(key(appKey, normalizedSlug(record.module_slug))) ?? null);
119
+ if (record.module_slug !== null && moduleId === null) {
120
+ throw new Error('Resolved application module is missing');
121
+ }
122
+ const normalizedKey = key(appKey, normalizedRbac(record.slug));
123
+ const id = await writePortabilityPermission(record, applicationId, moduleId, permissionIds.get(normalizedKey) ?? null);
124
+ permissionIds.set(normalizedKey, id);
125
+ }
126
+ for (const record of manifest.claim_definitions) {
127
+ const naturalKey = { application_slug: record.application_slug, claim_name: record.claim_name };
128
+ const action = plannedAction(plan, 'claim_definitions', naturalKey);
129
+ if (action === 'skipped')
130
+ continue;
131
+ const appKey = normalizedSlug(record.application_slug);
132
+ const applicationId = applicationIds.get(appKey);
133
+ if (applicationId === undefined)
134
+ throw new Error('Resolved application is missing');
135
+ const destinationId = existingId(snapshot.claimDefinitions, (row) => key(normalizedSlug(row.application_slug), row.claim_name), key(appKey, record.claim_name));
136
+ const id = await writePortabilityClaimDefinition(record, applicationId, destinationId);
137
+ claimIds.set(key(appKey, record.claim_name), id);
138
+ }
139
+ for (const record of manifest.role_permission_mappings) {
140
+ const naturalKey = { application_slug: record.application_slug, role_slug: record.role_slug };
141
+ const action = plannedAction(plan, 'role_permission_mappings', naturalKey);
142
+ if (action === 'skipped')
143
+ continue;
144
+ const appKey = normalizedSlug(record.application_slug);
145
+ const roleId = roleIds.get(key(appKey, normalizedRbac(record.role_slug)));
146
+ if (roleId === undefined)
147
+ throw new Error('Resolved role is missing');
148
+ const mappedPermissionIds = record.permission_slugs.map((slug) => {
149
+ const permissionId = permissionIds.get(key(appKey, normalizedRbac(slug)));
150
+ if (permissionId === undefined)
151
+ throw new Error('Resolved permission is missing');
152
+ return permissionId;
153
+ });
154
+ await writePortabilityRolePermissions(roleId, mappedPermissionIds);
155
+ }
156
+ return { organizationIds, applicationIds, roleIds, claimIds, userIds, clientIds };
157
+ }
158
+ /**
159
+ * Apply users, their listed relationships, and clients after parent identifiers resolve.
160
+ *
161
+ * @param plan - Valid plan and destination snapshot from this transaction
162
+ * @param ids - Parent identifiers resolved while writing the authorization graph
163
+ * @returns Planned result with any newly generated one-time client credentials
164
+ */
165
+ async function applyUserAndClientRecords(plan, ids) {
166
+ const credentials = [];
167
+ for (const record of plan.manifest.users) {
168
+ const naturalKey = { organization_slug: record.organization_slug, email: record.email };
169
+ const action = plannedAction(plan, 'users', naturalKey);
170
+ if (action === 'skipped')
171
+ continue;
172
+ const orgKey = normalizedSlug(record.organization_slug);
173
+ const organizationId = ids.organizationIds.get(orgKey);
174
+ if (organizationId === undefined)
175
+ throw new Error('Resolved organization is missing');
176
+ const userKey = key(orgKey, normalizedEmail(record.email));
177
+ const id = await writePortabilityUser(record, organizationId, ids.userIds.get(userKey) ?? null);
178
+ ids.userIds.set(userKey, id);
179
+ }
180
+ for (const record of plan.manifest.user_role_assignments) {
181
+ const naturalKey = {
182
+ organization_slug: record.organization_slug,
183
+ email: record.email,
184
+ application_slug: record.application_slug,
185
+ role_slug: record.role_slug,
186
+ };
187
+ if (plannedAction(plan, 'user_role_assignments', naturalKey) === 'skipped')
188
+ continue;
189
+ const userId = ids.userIds.get(key(normalizedSlug(record.organization_slug), normalizedEmail(record.email)));
190
+ const roleId = ids.roleIds.get(key(normalizedSlug(record.application_slug), normalizedRbac(record.role_slug)));
191
+ if (userId === undefined || roleId === undefined)
192
+ throw new Error('Resolved assignment parent is missing');
193
+ await writePortabilityUserRole(userId, roleId);
194
+ }
195
+ for (const record of plan.manifest.user_claim_values) {
196
+ const naturalKey = {
197
+ organization_slug: record.organization_slug,
198
+ email: record.email,
199
+ application_slug: record.application_slug,
200
+ claim_name: record.claim_name,
201
+ };
202
+ if (plannedAction(plan, 'user_claim_values', naturalKey) === 'skipped')
203
+ continue;
204
+ const userId = ids.userIds.get(key(normalizedSlug(record.organization_slug), normalizedEmail(record.email)));
205
+ const claimId = ids.claimIds.get(key(normalizedSlug(record.application_slug), record.claim_name));
206
+ if (userId === undefined || claimId === undefined)
207
+ throw new Error('Resolved claim-value parent is missing');
208
+ await writePortabilityUserClaimValue(userId, claimId, record.value);
209
+ }
210
+ for (const record of plan.manifest.clients) {
211
+ const action = plannedAction(plan, 'clients', { client_id: record.client_id });
212
+ if (action === 'skipped')
213
+ continue;
214
+ const organizationId = ids.organizationIds.get(normalizedSlug(record.organization_slug));
215
+ const applicationId = ids.applicationIds.get(normalizedSlug(record.application_slug));
216
+ if (organizationId === undefined || applicationId === undefined)
217
+ throw new Error('Resolved client parent is missing');
218
+ const written = await writePortabilityClient(record, organizationId, applicationId, ids.clientIds.get(record.client_id) ?? null);
219
+ ids.clientIds.set(record.client_id, written.id);
220
+ if (written.credential !== undefined)
221
+ credentials.push(written.credential);
222
+ }
223
+ return credentials.length === 0 ? plan.result : { ...plan.result, credentials };
224
+ }
225
+ /**
226
+ * Validate and atomically apply one portability manifest.
227
+ *
228
+ * It applies every selected portable collection in dependency order, writes one content-free
229
+ * audit row, and returns the safe result only after the transaction commits.
230
+ *
231
+ * @param manifest - Complete manifest received from an import request
232
+ * @param mode - Keep-existing or update-existing behavior
233
+ * @param actor - Authenticated actor retained for the transaction audit
234
+ * @returns Ordered committed result
235
+ */
236
+ export async function applyPortabilityManifest(manifest, mode, actor) {
237
+ try {
238
+ return await runDatabaseTransaction(async () => {
239
+ const plan = await buildResolvedPortabilityPlan(manifest, mode);
240
+ if (plan.result.errors.length > 0) {
241
+ throw new PortabilityError(409, 'import_plan_rejected', 'Import plan rejected', plan.result);
242
+ }
243
+ const ids = await applyAuthorizationRecords(plan);
244
+ const result = await applyUserAndClientRecords(plan, ids);
245
+ await registerPortabilityCleanup(plan, ids);
246
+ const auditOrganizationId = plan.manifest.scope.kind === 'organization'
247
+ ? ids.organizationIds.get(normalizedSlug(plan.manifest.scope.organization_slug))
248
+ : actor.controlPlaneOrganizationId;
249
+ if (auditOrganizationId === undefined) {
250
+ throw new Error('Resolved import organization is unavailable for audit ownership');
251
+ }
252
+ await writeAuditLogInTransaction(getPool(), {
253
+ organizationId: auditOrganizationId,
254
+ actorId: actor.userId,
255
+ eventType: 'admin.import',
256
+ eventCategory: 'admin',
257
+ metadata: {
258
+ manifest_version: plan.manifest.version,
259
+ sha256_digest: createHash('sha256').update(JSON.stringify(plan.manifest)).digest('hex'),
260
+ mode,
261
+ categories: plan.manifest.categories,
262
+ record_counts: plan.result.summary,
263
+ },
264
+ });
265
+ return result;
266
+ });
267
+ }
268
+ catch (error) {
269
+ if (error instanceof PortabilityError)
270
+ throw error;
271
+ throw new PortabilityError(503, 'import_execution_failed', 'Import failed');
272
+ }
273
+ }
274
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/portability/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** Closed authorization rules for manifest export, preview, and apply. */
2
+ import type { Context, Middleware } from 'koa';
3
+ import { type AdminPermission } from '../lib/admin-permissions.js';
4
+ import type { PortabilityCategory } from './types.js';
5
+ /** Portability operation whose base permission and category matrix are evaluated. */
6
+ type PortabilityOperation = 'export' | 'import';
7
+ /**
8
+ * Calculate the de-duplicated closed permission union for selected categories.
9
+ *
10
+ * The operation's base permission is always first. Remaining permissions retain category-matrix
11
+ * order so audit and test output stays deterministic.
12
+ *
13
+ * @param operation - Export or import operation
14
+ * @param categories - Validated selected categories
15
+ * @returns Exact permissions required for the request
16
+ */
17
+ export declare function requiredPortabilityPermissions(operation: PortabilityOperation, categories: readonly PortabilityCategory[]): readonly AdminPermission[];
18
+ /**
19
+ * Require every permission selected by a portability request and exact environment authority.
20
+ *
21
+ * This middleware runs after strict request parsing. Import routes separately enforce the base
22
+ * import permission before their larger route-local body parser.
23
+ *
24
+ * @param operation - Export or import operation
25
+ * @param readCategories - Reads validated categories from the route context
26
+ * @returns Koa middleware enforcing the closed permission boundary
27
+ */
28
+ export declare function requirePortabilityAuthorization(operation: PortabilityOperation, readCategories: (context: Context) => readonly PortabilityCategory[] | undefined): Middleware;
29
+ export {};
30
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/portability/authorization.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC/C,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,qFAAqF;AACrF,KAAK,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AA+EhD;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,oBAAoB,EAC/B,UAAU,EAAE,SAAS,mBAAmB,EAAE,GACzC,SAAS,eAAe,EAAE,CAM5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,oBAAoB,EAC/B,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,mBAAmB,EAAE,GAAG,SAAS,GAC/E,UAAU,CA+BZ"}
@@ -0,0 +1,130 @@
1
+ /** Closed authorization rules for manifest export, preview, and apply. */
2
+ import { ADMIN_PERMISSIONS, SUPER_ADMIN_ROLE_SLUG, } from '../lib/admin-permissions.js';
3
+ import { requirePermission } from '../middleware/require-permission.js';
4
+ import { recordSecurityDecision } from '../security/decision-context.js';
5
+ /** Category-specific permissions added to the operation's base permission. */
6
+ const CATEGORY_PERMISSIONS = {
7
+ organizations: {
8
+ export: [ADMIN_PERMISSIONS.ORG_READ],
9
+ import: [
10
+ ADMIN_PERMISSIONS.ORG_CREATE,
11
+ ADMIN_PERMISSIONS.ORG_UPDATE,
12
+ ADMIN_PERMISSIONS.ORG_SUSPEND,
13
+ ],
14
+ },
15
+ applications_authorization: {
16
+ export: [
17
+ ADMIN_PERMISSIONS.APP_READ,
18
+ ADMIN_PERMISSIONS.ROLE_READ,
19
+ ADMIN_PERMISSIONS.PERMISSION_READ,
20
+ ADMIN_PERMISSIONS.CLAIM_READ,
21
+ ],
22
+ import: [
23
+ ADMIN_PERMISSIONS.APP_CREATE,
24
+ ADMIN_PERMISSIONS.APP_UPDATE,
25
+ ADMIN_PERMISSIONS.ROLE_CREATE,
26
+ ADMIN_PERMISSIONS.ROLE_UPDATE,
27
+ ADMIN_PERMISSIONS.PERMISSION_CREATE,
28
+ ADMIN_PERMISSIONS.PERMISSION_UPDATE,
29
+ ADMIN_PERMISSIONS.CLAIM_CREATE,
30
+ ADMIN_PERMISSIONS.CLAIM_UPDATE,
31
+ ],
32
+ },
33
+ users_assignments: {
34
+ export: [
35
+ ADMIN_PERMISSIONS.USER_READ,
36
+ ADMIN_PERMISSIONS.ROLE_READ,
37
+ ADMIN_PERMISSIONS.CLAIM_READ,
38
+ ],
39
+ import: [
40
+ ADMIN_PERMISSIONS.USER_CREATE,
41
+ ADMIN_PERMISSIONS.USER_UPDATE,
42
+ ADMIN_PERMISSIONS.USER_LIFECYCLE,
43
+ ADMIN_PERMISSIONS.ROLE_ASSIGN,
44
+ ADMIN_PERMISSIONS.CLAIM_UPDATE,
45
+ ],
46
+ },
47
+ oidc_clients: {
48
+ export: [ADMIN_PERMISSIONS.CLIENT_READ, ADMIN_PERMISSIONS.APP_READ],
49
+ import: [ADMIN_PERMISSIONS.CLIENT_CREATE, ADMIN_PERMISSIONS.CLIENT_UPDATE],
50
+ },
51
+ };
52
+ /** Return the base permission for a portability operation. */
53
+ function basePermission(operation) {
54
+ return operation === 'export' ? ADMIN_PERMISSIONS.EXPORT_READ : ADMIN_PERMISSIONS.IMPORT_WRITE;
55
+ }
56
+ /** Return whether a value is a plain object that can be inspected safely. */
57
+ function isRecord(value) {
58
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
59
+ }
60
+ /** Read the already-validated scope from an operation request body. */
61
+ function hasEnvironmentScope(body, operation) {
62
+ if (!isRecord(body))
63
+ return false;
64
+ const scope = operation === 'export' ? body.scope : isRecord(body.manifest) ? body.manifest.scope : undefined;
65
+ return isRecord(scope) && scope.kind === 'environment';
66
+ }
67
+ /** Write the fixed validation response used when categories are unavailable. */
68
+ function rejectUnavailableCategories(context, operation) {
69
+ context.status = 400;
70
+ context.body =
71
+ operation === 'export'
72
+ ? { error: 'Invalid export request', code: 'export_request_invalid' }
73
+ : { error: 'Invalid import manifest', code: 'import_manifest_invalid' };
74
+ }
75
+ /**
76
+ * Calculate the de-duplicated closed permission union for selected categories.
77
+ *
78
+ * The operation's base permission is always first. Remaining permissions retain category-matrix
79
+ * order so audit and test output stays deterministic.
80
+ *
81
+ * @param operation - Export or import operation
82
+ * @param categories - Validated selected categories
83
+ * @returns Exact permissions required for the request
84
+ */
85
+ export function requiredPortabilityPermissions(operation, categories) {
86
+ const permissions = new Set([basePermission(operation)]);
87
+ for (const category of categories) {
88
+ for (const permission of CATEGORY_PERMISSIONS[category][operation])
89
+ permissions.add(permission);
90
+ }
91
+ return [...permissions];
92
+ }
93
+ /**
94
+ * Require every permission selected by a portability request and exact environment authority.
95
+ *
96
+ * This middleware runs after strict request parsing. Import routes separately enforce the base
97
+ * import permission before their larger route-local body parser.
98
+ *
99
+ * @param operation - Export or import operation
100
+ * @param readCategories - Reads validated categories from the route context
101
+ * @returns Koa middleware enforcing the closed permission boundary
102
+ */
103
+ export function requirePortabilityAuthorization(operation, readCategories) {
104
+ return async (context, next) => {
105
+ const categories = readCategories(context);
106
+ if (categories === undefined) {
107
+ rejectUnavailableCategories(context, operation);
108
+ return;
109
+ }
110
+ const permissionMiddleware = requirePermission(...requiredPortabilityPermissions(operation, categories));
111
+ await permissionMiddleware(context, async () => {
112
+ if (hasEnvironmentScope(context.request.body, operation) &&
113
+ !context.state.adminUser?.roles.includes(SUPER_ADMIN_ROLE_SLUG)) {
114
+ recordSecurityDecision(context, {
115
+ decisionPoint: 'permission',
116
+ reasonCode: 'permission-required',
117
+ outcome: 'deny',
118
+ });
119
+ context.status = 403;
120
+ context.body = {
121
+ error: 'Forbidden',
122
+ message: 'The requested operation is not permitted',
123
+ };
124
+ return;
125
+ }
126
+ await next();
127
+ });
128
+ };
129
+ }
130
+ //# sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../src/portability/authorization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** Targeted cache and authority cleanup for committed portability imports. */
2
+ import type { ResolvedPortabilityPlan } from './plan.js';
3
+ /** Destination identifiers resolved while applying the portable graph. */
4
+ export interface PortabilityWriteIds {
5
+ /** Organization slug to destination UUID. */
6
+ readonly organizationIds: Map<string, string>;
7
+ /** Application slug to destination UUID. */
8
+ readonly applicationIds: Map<string, string>;
9
+ /** Application and role slug to destination UUID. */
10
+ readonly roleIds: Map<string, string>;
11
+ /** Application and claim name to destination UUID. */
12
+ readonly claimIds: Map<string, string>;
13
+ /** Organization and email to destination UUID. */
14
+ readonly userIds: Map<string, string>;
15
+ /** Public client ID to destination UUID. */
16
+ readonly clientIds: Map<string, string>;
17
+ }
18
+ /**
19
+ * Register exact cache invalidation and affected-user revocation for the commit boundary.
20
+ *
21
+ * The authority callback starts only after the import commits. Its short PostgreSQL transaction
22
+ * revokes durable sessions and grant rows, then the existing cleanup helper schedules Redis work
23
+ * without keeping a PostgreSQL transaction open for Redis.
24
+ *
25
+ * @param plan - Valid plan and destination snapshot used by the apply transaction
26
+ * @param ids - Destination identifiers resolved by successful writes
27
+ */
28
+ export declare function registerPortabilityCleanup(plan: ResolvedPortabilityPlan, ids: PortabilityWriteIds): Promise<void>;
29
+ //# sourceMappingURL=cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/portability/cleanup.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAW9E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAIzD,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,4CAA4C;IAC5C,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AA0ID;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,uBAAuB,EAC7B,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBf"}