@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.
- package/CHANGELOG.md +5 -0
- package/dist/applications/index.d.ts +2 -2
- package/dist/applications/index.d.ts.map +1 -1
- package/dist/applications/index.js +2 -2
- package/dist/applications/index.js.map +1 -1
- package/dist/applications/repository.d.ts +49 -4
- package/dist/applications/repository.d.ts.map +1 -1
- package/dist/applications/repository.js +148 -10
- package/dist/applications/repository.js.map +1 -1
- package/dist/applications/service.d.ts +35 -17
- package/dist/applications/service.d.ts.map +1 -1
- package/dist/applications/service.js +144 -35
- package/dist/applications/service.js.map +1 -1
- package/dist/applications/types.d.ts +1 -1
- package/dist/applications/types.d.ts.map +1 -1
- package/dist/applications/validators.d.ts +14 -0
- package/dist/applications/validators.d.ts.map +1 -0
- package/dist/applications/validators.js +14 -0
- package/dist/applications/validators.js.map +1 -0
- package/dist/auth/effective-branding.d.ts +35 -0
- package/dist/auth/effective-branding.d.ts.map +1 -0
- package/dist/auth/effective-branding.js +81 -0
- package/dist/auth/effective-branding.js.map +1 -0
- package/dist/auth/email-service.d.ts +3 -8
- package/dist/auth/email-service.d.ts.map +1 -1
- package/dist/auth/email-service.js +22 -30
- package/dist/auth/email-service.js.map +1 -1
- package/dist/auth/i18n.d.ts +5 -0
- package/dist/auth/i18n.d.ts.map +1 -1
- package/dist/auth/i18n.js +6 -5
- package/dist/auth/i18n.js.map +1 -1
- package/dist/auth/rate-limiter.d.ts +6 -10
- package/dist/auth/rate-limiter.d.ts.map +1 -1
- package/dist/auth/rate-limiter.js +12 -16
- package/dist/auth/rate-limiter.js.map +1 -1
- package/dist/auth/recovery-job-processor.d.ts.map +1 -1
- package/dist/auth/recovery-job-processor.js +1 -1
- package/dist/auth/recovery-job-processor.js.map +1 -1
- package/dist/auth/template-engine.d.ts +3 -1
- package/dist/auth/template-engine.d.ts.map +1 -1
- package/dist/auth/template-engine.js +1 -1
- package/dist/auth/template-engine.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +12 -12
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/error-handler.d.ts +3 -2
- package/dist/cli/error-handler.d.ts.map +1 -1
- package/dist/cli/error-handler.js +9 -2
- package/dist/cli/error-handler.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/clients/index.d.ts +1 -1
- package/dist/clients/index.js +1 -1
- package/dist/clients/repository.d.ts +18 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +36 -0
- package/dist/clients/repository.js.map +1 -1
- package/dist/clients/secret-repository.d.ts +35 -8
- package/dist/clients/secret-repository.d.ts.map +1 -1
- package/dist/clients/secret-repository.js +69 -16
- package/dist/clients/secret-repository.js.map +1 -1
- package/dist/clients/secret-service.d.ts +5 -9
- package/dist/clients/secret-service.d.ts.map +1 -1
- package/dist/clients/secret-service.js +13 -22
- package/dist/clients/secret-service.js.map +1 -1
- package/dist/clients/service.d.ts +10 -13
- package/dist/clients/service.d.ts.map +1 -1
- package/dist/clients/service.js +112 -40
- package/dist/clients/service.js.map +1 -1
- package/dist/clients/types.d.ts +1 -1
- package/dist/clients/types.d.ts.map +1 -1
- package/dist/clients/validators.d.ts +83 -1
- package/dist/clients/validators.d.ts.map +1 -1
- package/dist/clients/validators.js +110 -0
- package/dist/clients/validators.js.map +1 -1
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +23 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/custom-claims/repository.d.ts +14 -9
- package/dist/custom-claims/repository.d.ts.map +1 -1
- package/dist/custom-claims/repository.js +38 -11
- package/dist/custom-claims/repository.js.map +1 -1
- package/dist/custom-claims/service.d.ts +11 -6
- package/dist/custom-claims/service.d.ts.map +1 -1
- package/dist/custom-claims/service.js +43 -20
- package/dist/custom-claims/service.js.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/admin-permissions.d.ts +12 -7
- package/dist/lib/admin-permissions.d.ts.map +1 -1
- package/dist/lib/admin-permissions.js +26 -16
- package/dist/lib/admin-permissions.js.map +1 -1
- package/dist/lib/audit-log.d.ts +2 -2
- package/dist/lib/audit-log.d.ts.map +1 -1
- package/dist/lib/audit-log.js +1 -1
- package/dist/lib/audit-log.js.map +1 -1
- package/dist/lib/authority-revocation.d.ts +18 -0
- package/dist/lib/authority-revocation.d.ts.map +1 -0
- package/dist/lib/authority-revocation.js +37 -0
- package/dist/lib/authority-revocation.js.map +1 -0
- package/dist/lib/branding-assets.d.ts +35 -5
- package/dist/lib/branding-assets.d.ts.map +1 -1
- package/dist/lib/branding-assets.js +33 -26
- package/dist/lib/branding-assets.js.map +1 -1
- package/dist/lib/bulk-operations.d.ts +1 -1
- package/dist/lib/bulk-operations.d.ts.map +1 -1
- package/dist/lib/bulk-operations.js +1 -13
- package/dist/lib/bulk-operations.js.map +1 -1
- package/dist/lib/cursor.d.ts +2 -0
- package/dist/lib/cursor.d.ts.map +1 -1
- package/dist/lib/cursor.js +2 -7
- package/dist/lib/cursor.js.map +1 -1
- package/dist/lib/database.d.ts.map +1 -1
- package/dist/lib/database.js +5 -0
- package/dist/lib/database.js.map +1 -1
- package/dist/lib/deletion-cleanup.d.ts +43 -0
- package/dist/lib/deletion-cleanup.d.ts.map +1 -0
- package/dist/lib/deletion-cleanup.js +207 -0
- package/dist/lib/deletion-cleanup.js.map +1 -0
- package/dist/lib/image-validator.d.ts +3 -1
- package/dist/lib/image-validator.d.ts.map +1 -1
- package/dist/lib/image-validator.js +32 -19
- package/dist/lib/image-validator.js.map +1 -1
- package/dist/lib/log-format.d.ts +20 -0
- package/dist/lib/log-format.d.ts.map +1 -0
- package/dist/lib/log-format.js +22 -0
- package/dist/lib/log-format.js.map +1 -0
- package/dist/lib/logger.d.ts +3 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +21 -4
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/redis.d.ts.map +1 -1
- package/dist/lib/redis.js +3 -0
- package/dist/lib/redis.js.map +1 -1
- package/dist/lib/session-tracking.d.ts +73 -11
- package/dist/lib/session-tracking.d.ts.map +1 -1
- package/dist/lib/session-tracking.js +76 -32
- package/dist/lib/session-tracking.js.map +1 -1
- package/dist/lib/signing-key-crypto.d.ts.map +1 -1
- package/dist/lib/signing-key-crypto.js +4 -5
- package/dist/lib/signing-key-crypto.js.map +1 -1
- package/dist/lib/signing-keys.d.ts +3 -4
- package/dist/lib/signing-keys.d.ts.map +1 -1
- package/dist/lib/signing-keys.js +66 -41
- package/dist/lib/signing-keys.js.map +1 -1
- package/dist/lib/super-admin-protection.d.ts +5 -5
- package/dist/lib/super-admin-protection.d.ts.map +1 -1
- package/dist/lib/super-admin-protection.js +6 -9
- package/dist/lib/super-admin-protection.js.map +1 -1
- package/dist/lib/system-config-catalog.d.ts +268 -0
- package/dist/lib/system-config-catalog.d.ts.map +1 -0
- package/dist/lib/system-config-catalog.js +90 -0
- package/dist/lib/system-config-catalog.js.map +1 -0
- package/dist/lib/system-config.d.ts +30 -33
- package/dist/lib/system-config.d.ts.map +1 -1
- package/dist/lib/system-config.js +78 -93
- package/dist/lib/system-config.js.map +1 -1
- package/dist/lib/with-timeout.d.ts +32 -0
- package/dist/lib/with-timeout.d.ts.map +1 -0
- package/dist/lib/with-timeout.js +45 -0
- package/dist/lib/with-timeout.js.map +1 -0
- package/dist/middleware/admin-auth.d.ts +6 -5
- package/dist/middleware/admin-auth.d.ts.map +1 -1
- package/dist/middleware/admin-auth.js +30 -20
- package/dist/middleware/admin-auth.js.map +1 -1
- package/dist/middleware/admin-cors.d.ts +3 -3
- package/dist/middleware/admin-cors.js +3 -3
- package/dist/middleware/admin-mutation-audit.d.ts +3 -2
- package/dist/middleware/admin-mutation-audit.d.ts.map +1 -1
- package/dist/middleware/admin-mutation-audit.js +12 -5
- package/dist/middleware/admin-mutation-audit.js.map +1 -1
- package/dist/middleware/admin-rate-limiter.d.ts +7 -8
- package/dist/middleware/admin-rate-limiter.d.ts.map +1 -1
- package/dist/middleware/admin-rate-limiter.js +7 -8
- package/dist/middleware/admin-rate-limiter.js.map +1 -1
- package/dist/middleware/client-secret-hash.d.ts +10 -29
- package/dist/middleware/client-secret-hash.d.ts.map +1 -1
- package/dist/middleware/client-secret-hash.js +161 -59
- package/dist/middleware/client-secret-hash.js.map +1 -1
- package/dist/middleware/health.d.ts +17 -0
- package/dist/middleware/health.d.ts.map +1 -1
- package/dist/middleware/health.js +25 -21
- package/dist/middleware/health.js.map +1 -1
- package/dist/middleware/ready.d.ts.map +1 -1
- package/dist/middleware/ready.js +1 -12
- package/dist/middleware/ready.js.map +1 -1
- package/dist/middleware/require-existing-organization.d.ts +18 -0
- package/dist/middleware/require-existing-organization.d.ts.map +1 -0
- package/dist/middleware/require-existing-organization.js +38 -0
- package/dist/middleware/require-existing-organization.js.map +1 -0
- package/dist/middleware/require-permission.d.ts.map +1 -1
- package/dist/middleware/require-permission.js +35 -1
- package/dist/middleware/require-permission.js.map +1 -1
- package/dist/middleware/require-user-organization.d.ts.map +1 -1
- package/dist/middleware/require-user-organization.js +4 -2
- package/dist/middleware/require-user-organization.js.map +1 -1
- package/dist/middleware/security-headers.d.ts +18 -0
- package/dist/middleware/security-headers.d.ts.map +1 -1
- package/dist/middleware/security-headers.js +32 -1
- package/dist/middleware/security-headers.js.map +1 -1
- package/dist/middleware/tenant-resolver.d.ts +1 -2
- package/dist/middleware/tenant-resolver.d.ts.map +1 -1
- package/dist/middleware/tenant-resolver.js +1 -5
- package/dist/middleware/tenant-resolver.js.map +1 -1
- package/dist/middleware/token-rate-limiter.d.ts +37 -16
- package/dist/middleware/token-rate-limiter.d.ts.map +1 -1
- package/dist/middleware/token-rate-limiter.js +126 -54
- package/dist/middleware/token-rate-limiter.js.map +1 -1
- package/dist/oidc/account-finder.d.ts +5 -5
- package/dist/oidc/account-finder.d.ts.map +1 -1
- package/dist/oidc/account-finder.js +31 -23
- package/dist/oidc/account-finder.js.map +1 -1
- package/dist/oidc/adapter-factory.d.ts.map +1 -1
- package/dist/oidc/adapter-factory.js +83 -3
- package/dist/oidc/adapter-factory.js.map +1 -1
- package/dist/oidc/configuration.d.ts +3 -8
- package/dist/oidc/configuration.d.ts.map +1 -1
- package/dist/oidc/configuration.js +64 -50
- package/dist/oidc/configuration.js.map +1 -1
- package/dist/oidc/provider.d.ts.map +1 -1
- package/dist/oidc/provider.js +7 -0
- package/dist/oidc/provider.js.map +1 -1
- package/dist/oidc/redis-adapter.d.ts +2 -3
- package/dist/oidc/redis-adapter.d.ts.map +1 -1
- package/dist/oidc/redis-adapter.js +54 -46
- package/dist/oidc/redis-adapter.js.map +1 -1
- package/dist/organizations/branding-url.d.ts +17 -0
- package/dist/organizations/branding-url.d.ts.map +1 -0
- package/dist/organizations/branding-url.js +38 -0
- package/dist/organizations/branding-url.js.map +1 -0
- package/dist/organizations/index.d.ts +2 -2
- package/dist/organizations/index.d.ts.map +1 -1
- package/dist/organizations/index.js +1 -1
- package/dist/organizations/index.js.map +1 -1
- package/dist/organizations/repository.d.ts +22 -32
- package/dist/organizations/repository.d.ts.map +1 -1
- package/dist/organizations/repository.js +64 -45
- package/dist/organizations/repository.js.map +1 -1
- package/dist/organizations/service.d.ts +14 -46
- package/dist/organizations/service.d.ts.map +1 -1
- package/dist/organizations/service.js +60 -112
- package/dist/organizations/service.js.map +1 -1
- package/dist/organizations/types.d.ts +1 -15
- package/dist/organizations/types.d.ts.map +1 -1
- package/dist/organizations/validators.d.ts +41 -0
- package/dist/organizations/validators.d.ts.map +1 -0
- package/dist/organizations/validators.js +48 -0
- package/dist/organizations/validators.js.map +1 -0
- package/dist/portability/apply.d.ts +15 -0
- package/dist/portability/apply.d.ts.map +1 -0
- package/dist/portability/apply.js +274 -0
- package/dist/portability/apply.js.map +1 -0
- package/dist/portability/authorization.d.ts +30 -0
- package/dist/portability/authorization.d.ts.map +1 -0
- package/dist/portability/authorization.js +130 -0
- package/dist/portability/authorization.js.map +1 -0
- package/dist/portability/cleanup.d.ts +29 -0
- package/dist/portability/cleanup.d.ts.map +1 -0
- package/dist/portability/cleanup.js +167 -0
- package/dist/portability/cleanup.js.map +1 -0
- package/dist/portability/export.d.ts +18 -0
- package/dist/portability/export.d.ts.map +1 -0
- package/dist/portability/export.js +125 -0
- package/dist/portability/export.js.map +1 -0
- package/dist/portability/import-repository.d.ts +204 -0
- package/dist/portability/import-repository.d.ts.map +1 -0
- package/dist/portability/import-repository.js +347 -0
- package/dist/portability/import-repository.js.map +1 -0
- package/dist/portability/import-user-client-writers.d.ts +40 -0
- package/dist/portability/import-user-client-writers.d.ts.map +1 -0
- package/dist/portability/import-user-client-writers.js +168 -0
- package/dist/portability/import-user-client-writers.js.map +1 -0
- package/dist/portability/index.d.ts +8 -0
- package/dist/portability/index.d.ts.map +1 -0
- package/dist/portability/index.js +8 -0
- package/dist/portability/index.js.map +1 -0
- package/dist/portability/plan-support.d.ts +137 -0
- package/dist/portability/plan-support.d.ts.map +1 -0
- package/dist/portability/plan-support.js +336 -0
- package/dist/portability/plan-support.js.map +1 -0
- package/dist/portability/plan.d.ts +34 -0
- package/dist/portability/plan.d.ts.map +1 -0
- package/dist/portability/plan.js +450 -0
- package/dist/portability/plan.js.map +1 -0
- package/dist/portability/repository.d.ts +95 -0
- package/dist/portability/repository.d.ts.map +1 -0
- package/dist/portability/repository.js +388 -0
- package/dist/portability/repository.js.map +1 -0
- package/dist/portability/schema.d.ts +589 -0
- package/dist/portability/schema.d.ts.map +1 -0
- package/dist/portability/schema.js +458 -0
- package/dist/portability/schema.js.map +1 -0
- package/dist/portability/types.d.ts +381 -0
- package/dist/portability/types.d.ts.map +1 -0
- package/dist/portability/types.js +19 -0
- package/dist/portability/types.js.map +1 -0
- package/dist/rbac/errors.d.ts +4 -0
- package/dist/rbac/errors.d.ts.map +1 -1
- package/dist/rbac/errors.js +7 -0
- package/dist/rbac/errors.js.map +1 -1
- package/dist/rbac/index.d.ts +3 -3
- package/dist/rbac/index.d.ts.map +1 -1
- package/dist/rbac/index.js +3 -3
- package/dist/rbac/index.js.map +1 -1
- package/dist/rbac/mapping-repository.d.ts +84 -9
- package/dist/rbac/mapping-repository.d.ts.map +1 -1
- package/dist/rbac/mapping-repository.js +222 -55
- package/dist/rbac/mapping-repository.js.map +1 -1
- package/dist/rbac/permission-repository.d.ts +36 -19
- package/dist/rbac/permission-repository.d.ts.map +1 -1
- package/dist/rbac/permission-repository.js +93 -35
- package/dist/rbac/permission-repository.js.map +1 -1
- package/dist/rbac/permission-service.d.ts +18 -19
- package/dist/rbac/permission-service.d.ts.map +1 -1
- package/dist/rbac/permission-service.js +100 -57
- package/dist/rbac/permission-service.js.map +1 -1
- package/dist/rbac/role-repository.d.ts +29 -24
- package/dist/rbac/role-repository.d.ts.map +1 -1
- package/dist/rbac/role-repository.js +66 -43
- package/dist/rbac/role-repository.js.map +1 -1
- package/dist/rbac/role-service.d.ts +35 -32
- package/dist/rbac/role-service.d.ts.map +1 -1
- package/dist/rbac/role-service.js +210 -96
- package/dist/rbac/role-service.js.map +1 -1
- package/dist/rbac/slugs.d.ts +16 -27
- package/dist/rbac/slugs.d.ts.map +1 -1
- package/dist/rbac/slugs.js +36 -59
- package/dist/rbac/slugs.js.map +1 -1
- package/dist/rbac/types.d.ts +2 -4
- package/dist/rbac/types.d.ts.map +1 -1
- package/dist/rbac/types.js.map +1 -1
- package/dist/rbac/user-role-service.d.ts +23 -24
- package/dist/rbac/user-role-service.d.ts.map +1 -1
- package/dist/rbac/user-role-service.js +117 -61
- package/dist/rbac/user-role-service.js.map +1 -1
- package/dist/routes/applications.d.ts +4 -2
- package/dist/routes/applications.d.ts.map +1 -1
- package/dist/routes/applications.js +57 -19
- package/dist/routes/applications.js.map +1 -1
- package/dist/routes/audit.js +1 -1
- package/dist/routes/audit.js.map +1 -1
- package/dist/routes/branding.d.ts +3 -3
- package/dist/routes/branding.d.ts.map +1 -1
- package/dist/routes/branding.js +44 -16
- package/dist/routes/branding.js.map +1 -1
- package/dist/routes/bulk.d.ts +0 -5
- package/dist/routes/bulk.d.ts.map +1 -1
- package/dist/routes/bulk.js +3 -5
- package/dist/routes/bulk.js.map +1 -1
- package/dist/routes/clients.d.ts +4 -4
- package/dist/routes/clients.d.ts.map +1 -1
- package/dist/routes/clients.js +111 -52
- package/dist/routes/clients.js.map +1 -1
- package/dist/routes/config.d.ts +17 -12
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +165 -64
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/custom-claims.d.ts.map +1 -1
- package/dist/routes/custom-claims.js +8 -2
- package/dist/routes/custom-claims.js.map +1 -1
- package/dist/routes/exports.d.ts +2 -1
- package/dist/routes/exports.d.ts.map +1 -1
- package/dist/routes/exports.js +57 -1
- package/dist/routes/exports.js.map +1 -1
- package/dist/routes/imports.d.ts +2 -2
- package/dist/routes/imports.d.ts.map +1 -1
- package/dist/routes/imports.js +95 -40
- package/dist/routes/imports.js.map +1 -1
- package/dist/routes/interactions.d.ts.map +1 -1
- package/dist/routes/interactions.js +16 -34
- package/dist/routes/interactions.js.map +1 -1
- package/dist/routes/invitation.d.ts.map +1 -1
- package/dist/routes/invitation.js +10 -23
- package/dist/routes/invitation.js.map +1 -1
- package/dist/routes/keys.d.ts.map +1 -1
- package/dist/routes/keys.js +26 -13
- package/dist/routes/keys.js.map +1 -1
- package/dist/routes/magic-link.d.ts.map +1 -1
- package/dist/routes/magic-link.js +5 -17
- package/dist/routes/magic-link.js.map +1 -1
- package/dist/routes/organizations.d.ts +1 -2
- package/dist/routes/organizations.d.ts.map +1 -1
- package/dist/routes/organizations.js +43 -104
- package/dist/routes/organizations.js.map +1 -1
- package/dist/routes/password-reset.d.ts.map +1 -1
- package/dist/routes/password-reset.js +13 -35
- package/dist/routes/password-reset.js.map +1 -1
- package/dist/routes/permissions.d.ts +1 -1
- package/dist/routes/permissions.d.ts.map +1 -1
- package/dist/routes/permissions.js +58 -17
- package/dist/routes/permissions.js.map +1 -1
- package/dist/routes/public-branding.d.ts +16 -0
- package/dist/routes/public-branding.d.ts.map +1 -0
- package/dist/routes/public-branding.js +52 -0
- package/dist/routes/public-branding.js.map +1 -0
- package/dist/routes/roles.d.ts +1 -1
- package/dist/routes/roles.d.ts.map +1 -1
- package/dist/routes/roles.js +63 -21
- package/dist/routes/roles.js.map +1 -1
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +23 -12
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/two-factor.d.ts.map +1 -1
- package/dist/routes/two-factor.js +91 -38
- package/dist/routes/two-factor.js.map +1 -1
- package/dist/routes/user-roles.d.ts.map +1 -1
- package/dist/routes/user-roles.js +56 -9
- package/dist/routes/user-roles.js.map +1 -1
- package/dist/routes/users.d.ts +4 -8
- package/dist/routes/users.d.ts.map +1 -1
- package/dist/routes/users.js +108 -265
- package/dist/routes/users.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +53 -37
- package/dist/server.js.map +1 -1
- package/dist/two-factor/errors.d.ts +9 -0
- package/dist/two-factor/errors.d.ts.map +1 -1
- package/dist/two-factor/errors.js +12 -0
- package/dist/two-factor/errors.js.map +1 -1
- package/dist/two-factor/index.d.ts +5 -4
- package/dist/two-factor/index.d.ts.map +1 -1
- package/dist/two-factor/index.js +4 -4
- package/dist/two-factor/index.js.map +1 -1
- package/dist/two-factor/repository.d.ts +17 -6
- package/dist/two-factor/repository.d.ts.map +1 -1
- package/dist/two-factor/repository.js +37 -9
- package/dist/two-factor/repository.js.map +1 -1
- package/dist/two-factor/service.d.ts.map +1 -1
- package/dist/two-factor/service.js +26 -19
- package/dist/two-factor/service.js.map +1 -1
- package/dist/two-factor/totp.d.ts +13 -2
- package/dist/two-factor/totp.d.ts.map +1 -1
- package/dist/two-factor/totp.js +20 -7
- package/dist/two-factor/totp.js.map +1 -1
- package/dist/two-factor/types.d.ts +3 -0
- package/dist/two-factor/types.d.ts.map +1 -1
- package/dist/two-factor/types.js +5 -0
- package/dist/two-factor/types.js.map +1 -1
- package/dist/users/gdpr.d.ts +2 -40
- package/dist/users/gdpr.d.ts.map +1 -1
- package/dist/users/gdpr.js +3 -110
- package/dist/users/gdpr.js.map +1 -1
- package/dist/users/index.d.ts +5 -4
- package/dist/users/index.d.ts.map +1 -1
- package/dist/users/index.js +5 -4
- package/dist/users/index.js.map +1 -1
- package/dist/users/repository.d.ts +49 -3
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +169 -18
- package/dist/users/repository.js.map +1 -1
- package/dist/users/service.d.ts +19 -51
- package/dist/users/service.d.ts.map +1 -1
- package/dist/users/service.js +72 -122
- package/dist/users/service.js.map +1 -1
- package/dist/users/types.d.ts +4 -5
- package/dist/users/types.d.ts.map +1 -1
- package/dist/users/types.js.map +1 -1
- package/dist/users/validators.d.ts +28 -0
- package/dist/users/validators.d.ts.map +1 -0
- package/dist/users/validators.js +25 -0
- package/dist/users/validators.js.map +1 -0
- package/locales/default/en/errors.json +2 -1
- package/migrations/024_application_client_correction.sql +39 -0
- package/migrations/025_record_deletion_lifecycle.sql +26 -0
- package/migrations/026_simplify_user_lifecycle.sql +33 -0
- package/migrations/027_branding_asset_size_limits.sql +19 -0
- package/migrations/028_totp_replay_protection.sql +17 -0
- package/migrations/029_public_session_identifiers.sql +16 -0
- package/migrations/030_global_configuration_catalog.sql +39 -0
- package/migrations/031_monotonic_updated_at.sql +28 -0
- package/package.json +2 -2
- package/dist/lib/data-import-plan.d.ts +0 -50
- package/dist/lib/data-import-plan.d.ts.map +0 -1
- package/dist/lib/data-import-plan.js +0 -235
- package/dist/lib/data-import-plan.js.map +0 -1
- package/dist/lib/data-import.d.ts +0 -276
- package/dist/lib/data-import.d.ts.map +0 -1
- package/dist/lib/data-import.js +0 -1694
- 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"}
|