@portaidentity/server 1.7.2 → 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 +10 -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,39 @@
|
|
|
1
|
+
-- Up Migration
|
|
2
|
+
|
|
3
|
+
-- Operational policy uses native JSONB scalars. Canonical earlier values are intentionally reset;
|
|
4
|
+
-- bootstrap/internal rows are not part of the administrative catalog and remain untouched.
|
|
5
|
+
INSERT INTO system_config (key, value, value_type, description, is_sensitive) VALUES
|
|
6
|
+
('access_token_ttl', '3600'::jsonb, 'duration', 'How long newly issued access tokens remain valid.', FALSE),
|
|
7
|
+
('id_token_ttl', '3600'::jsonb, 'duration', 'How long newly issued ID tokens remain valid.', FALSE),
|
|
8
|
+
('refresh_token_ttl', '2592000'::jsonb, 'duration', 'How long newly issued refresh tokens remain valid.', FALSE),
|
|
9
|
+
('authorization_code_ttl', '600'::jsonb, 'duration', 'How long a newly issued authorization code remains valid.', FALSE),
|
|
10
|
+
('session_ttl', '86400'::jsonb, 'duration', 'How long newly created OIDC sessions remain valid.', FALSE),
|
|
11
|
+
('magic_link_ttl', '900'::jsonb, 'duration', 'How long a newly created magic-link token remains valid.', FALSE),
|
|
12
|
+
('password_reset_ttl', '3600'::jsonb, 'duration', 'How long a newly created password-reset token remains valid.', FALSE),
|
|
13
|
+
('invitation_ttl', '604800'::jsonb, 'duration', 'How long a newly created user invitation remains valid.', FALSE),
|
|
14
|
+
('rate_limit_login_max', '10'::jsonb, 'number', 'Maximum login attempts allowed in one login window.', FALSE),
|
|
15
|
+
('rate_limit_login_window', '900'::jsonb, 'duration', 'Window used to count login attempts.', FALSE),
|
|
16
|
+
('rate_limit_magic_link_max', '5'::jsonb, 'number', 'Maximum magic-link requests allowed in one window.', FALSE),
|
|
17
|
+
('rate_limit_magic_link_window', '900'::jsonb, 'duration', 'Window used to count magic-link requests.', FALSE),
|
|
18
|
+
('rate_limit_password_reset_max', '5'::jsonb, 'number', 'Maximum password-reset requests allowed in one window.', FALSE),
|
|
19
|
+
('rate_limit_password_reset_window', '900'::jsonb, 'duration', 'Window used to count password-reset requests.', FALSE),
|
|
20
|
+
('max_failed_logins', '5'::jsonb, 'number', 'Failed login count that activates automatic lockout.', FALSE),
|
|
21
|
+
('lockout_duration_seconds', '900'::jsonb, 'duration', 'Duration applied when automatic lockout eligibility is checked.', FALSE),
|
|
22
|
+
('audit_retention_days', '90'::jsonb, 'number', 'Default number of days retained by audit cleanup.', FALSE),
|
|
23
|
+
('default_locale', '"en"'::jsonb, 'string', 'Final locale fallback used by the authentication UI.', FALSE)
|
|
24
|
+
ON CONFLICT (key) DO UPDATE SET
|
|
25
|
+
value = EXCLUDED.value,
|
|
26
|
+
value_type = EXCLUDED.value_type,
|
|
27
|
+
description = EXCLUDED.description,
|
|
28
|
+
is_sensitive = EXCLUDED.is_sensitive,
|
|
29
|
+
updated_at = NOW();
|
|
30
|
+
|
|
31
|
+
DELETE FROM system_config WHERE key IN (
|
|
32
|
+
'login_rate_limit', 'lockout_duration', 'api_rate_limit', 'cookie_secure',
|
|
33
|
+
'magic_link_length', 'require_pkce', 'cors_max_age'
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
-- Down Migration
|
|
37
|
+
|
|
38
|
+
-- No-op: earlier policy values cannot be reconstructed after the intentional reset.
|
|
39
|
+
-- Development recovery uses yarn admin:env reset rather than reversing these defaults.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-- Up Migration
|
|
2
|
+
|
|
3
|
+
-- Make updated_at strictly advance on every row update.
|
|
4
|
+
--
|
|
5
|
+
-- ETags are derived from updated_at at millisecond precision, while PostgreSQL
|
|
6
|
+
-- stores microseconds and the JavaScript driver truncates the value to
|
|
7
|
+
-- milliseconds. Two updates stamped within the same millisecond therefore
|
|
8
|
+
-- produced an identical ETag even though the row changed, which let a stale
|
|
9
|
+
-- If-Match header match after a concurrent write. Advancing the stored value by
|
|
10
|
+
-- at least one millisecond per update keeps millisecond-precision ETags unique
|
|
11
|
+
-- across consecutive updates.
|
|
12
|
+
CREATE OR REPLACE FUNCTION trigger_set_updated_at()
|
|
13
|
+
RETURNS TRIGGER AS $$
|
|
14
|
+
BEGIN
|
|
15
|
+
NEW.updated_at = GREATEST(clock_timestamp(), OLD.updated_at + interval '1 millisecond');
|
|
16
|
+
RETURN NEW;
|
|
17
|
+
END;
|
|
18
|
+
$$ LANGUAGE plpgsql;
|
|
19
|
+
|
|
20
|
+
-- Down Migration
|
|
21
|
+
|
|
22
|
+
CREATE OR REPLACE FUNCTION trigger_set_updated_at()
|
|
23
|
+
RETURNS TRIGGER AS $$
|
|
24
|
+
BEGIN
|
|
25
|
+
NEW.updated_at = NOW();
|
|
26
|
+
RETURN NEW;
|
|
27
|
+
END;
|
|
28
|
+
$$ LANGUAGE plpgsql;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@portaidentity/server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Multi-tenant OIDC provider built on node-oidc-provider, Koa, and TypeScript",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"koa": "3.2.1",
|
|
58
58
|
"koa-bodyparser": "4.4.1",
|
|
59
59
|
"node-pg-migrate": "9.0.0",
|
|
60
|
-
"nodemailer": "9.
|
|
60
|
+
"nodemailer": "9.1.1",
|
|
61
61
|
"oidc-provider": "9.11.2",
|
|
62
62
|
"open": "11.0.0",
|
|
63
63
|
"otpauth": "9.5.1",
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure import-manifest planning.
|
|
3
|
-
*
|
|
4
|
-
* The planner assigns every admitted entity a stable tenant-qualified natural key and explicit
|
|
5
|
-
* parent references before database mutation begins. Database-backed planning later resolves the
|
|
6
|
-
* returned external references against one consistent transaction snapshot.
|
|
7
|
-
*/
|
|
8
|
-
import type { ImportManifest } from './data-import.js';
|
|
9
|
-
import type { PoolClient } from 'pg';
|
|
10
|
-
/** Closed entity catalog accepted by the version 1.0 manifest. */
|
|
11
|
-
export type ImportEntityType = 'organization' | 'application' | 'client' | 'role' | 'permission' | 'claim_definition' | 'role_permission_mapping' | 'application_module' | 'user' | 'user_role_assignment' | 'user_claim_value' | 'config';
|
|
12
|
-
/** Parent reference which must exist in the manifest or the database snapshot. */
|
|
13
|
-
export interface ImportPlanDependency {
|
|
14
|
-
readonly entityType: ImportEntityType;
|
|
15
|
-
readonly naturalKey: string;
|
|
16
|
-
readonly source: 'manifest' | 'database';
|
|
17
|
-
}
|
|
18
|
-
/** One deterministic manifest entry prepared for database-backed action planning. */
|
|
19
|
-
export interface ImportPlanEntry {
|
|
20
|
-
readonly entityType: ImportEntityType;
|
|
21
|
-
readonly naturalKey: string;
|
|
22
|
-
readonly mutableFields: readonly string[];
|
|
23
|
-
readonly dependencies: readonly ImportPlanDependency[];
|
|
24
|
-
readonly credentialWillBeGenerated: boolean;
|
|
25
|
-
}
|
|
26
|
-
/** Immutable mutation-free plan produced from a validated manifest. */
|
|
27
|
-
export interface ImportManifestPlan {
|
|
28
|
-
readonly version: '1.0';
|
|
29
|
-
readonly entries: readonly ImportPlanEntry[];
|
|
30
|
-
readonly externalDependencies: readonly ImportPlanDependency[];
|
|
31
|
-
}
|
|
32
|
-
/** Return whether a configuration key can carry authentication material. */
|
|
33
|
-
export declare function isProhibitedImportConfigKey(configKey: string): boolean;
|
|
34
|
-
/**
|
|
35
|
-
* Build a deterministic, mutation-free plan from a schema-validated manifest.
|
|
36
|
-
*
|
|
37
|
-
* @param manifest - Strictly parsed version 1.0 manifest.
|
|
38
|
-
* @returns Ordered entries and the exact parents that must be resolved from the database.
|
|
39
|
-
* @throws Error when a system configuration key could carry authentication material.
|
|
40
|
-
*/
|
|
41
|
-
export declare function buildImportManifestPlan(manifest: ImportManifest): ImportManifestPlan;
|
|
42
|
-
/**
|
|
43
|
-
* Resolve every external parent against the current transaction snapshot.
|
|
44
|
-
*
|
|
45
|
-
* @param client - Transaction client used by the later import execution.
|
|
46
|
-
* @param plan - Pure manifest plan built before acquiring the client.
|
|
47
|
-
* @throws Error when a parent is missing or storage contains an ambiguous natural key.
|
|
48
|
-
*/
|
|
49
|
-
export declare function requireResolvedImportDependencies(client: PoolClient, plan: ImportManifestPlan): Promise<void>;
|
|
50
|
-
//# sourceMappingURL=data-import-plan.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-import-plan.d.ts","sourceRoot":"","sources":["../../src/lib/data-import-plan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAErC,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,aAAa,GACb,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,kBAAkB,GAClB,yBAAyB,GACzB,oBAAoB,GACpB,MAAM,GACN,sBAAsB,GACtB,kBAAkB,GAClB,QAAQ,CAAC;AAEb,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CAC1C;AAED,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACvD,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC7C;AAED,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAChE;AA4BD,4EAA4E;AAC5E,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEtE;AAgDD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,kBAAkB,CAgKpF;AAoDD;;;;;;GAMG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure import-manifest planning.
|
|
3
|
-
*
|
|
4
|
-
* The planner assigns every admitted entity a stable tenant-qualified natural key and explicit
|
|
5
|
-
* parent references before database mutation begins. Database-backed planning later resolves the
|
|
6
|
-
* returned external references against one consistent transaction snapshot.
|
|
7
|
-
*/
|
|
8
|
-
const MUTABLE_FIELDS = Object.freeze({
|
|
9
|
-
organization: [
|
|
10
|
-
'name',
|
|
11
|
-
'default_locale',
|
|
12
|
-
'branding_primary_color',
|
|
13
|
-
'branding_company_name',
|
|
14
|
-
'branding_custom_css',
|
|
15
|
-
'branding_logo_url',
|
|
16
|
-
'branding_favicon_url',
|
|
17
|
-
],
|
|
18
|
-
application: ['name', 'description'],
|
|
19
|
-
client: ['client_name'],
|
|
20
|
-
role: ['name', 'description'],
|
|
21
|
-
permission: ['name', 'description'],
|
|
22
|
-
claim_definition: ['name', 'description'],
|
|
23
|
-
role_permission_mapping: [],
|
|
24
|
-
application_module: ['name', 'description'],
|
|
25
|
-
user: ['given_name', 'family_name', 'locale'],
|
|
26
|
-
user_role_assignment: [],
|
|
27
|
-
user_claim_value: ['value'],
|
|
28
|
-
config: ['value'],
|
|
29
|
-
});
|
|
30
|
-
const PROHIBITED_CONFIG_KEY = /(^|_)(password|secret|private_key|signing_key|cookie_key|session_key|recovery_code|totp_secret)(_|$)/i;
|
|
31
|
-
/** Return whether a configuration key can carry authentication material. */
|
|
32
|
-
export function isProhibitedImportConfigKey(configKey) {
|
|
33
|
-
return PROHIBITED_CONFIG_KEY.test(configKey);
|
|
34
|
-
}
|
|
35
|
-
/** Join natural-key components without ambiguous concatenation. */
|
|
36
|
-
function key(...parts) {
|
|
37
|
-
return parts.join('\u001f');
|
|
38
|
-
}
|
|
39
|
-
/** Split an internal natural key and reject malformed planner state. */
|
|
40
|
-
function keyParts(naturalKey, expectedParts) {
|
|
41
|
-
const parts = naturalKey.split('\u001f');
|
|
42
|
-
if (parts.length !== expectedParts || parts.some((part) => part.length === 0)) {
|
|
43
|
-
throw new Error('Import plan contains an invalid natural key');
|
|
44
|
-
}
|
|
45
|
-
return parts;
|
|
46
|
-
}
|
|
47
|
-
/** Return a manifest/database reference for one required parent. */
|
|
48
|
-
function dependency(entityType, naturalKey, manifestKeys) {
|
|
49
|
-
return Object.freeze({
|
|
50
|
-
entityType,
|
|
51
|
-
naturalKey,
|
|
52
|
-
source: manifestKeys.has(naturalKey) ? 'manifest' : 'database',
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
/** Add one immutable entry to the ordered plan. */
|
|
56
|
-
function addEntry(entries, entityType, naturalKey, dependencies, credentialWillBeGenerated = false) {
|
|
57
|
-
entries.push(Object.freeze({
|
|
58
|
-
entityType,
|
|
59
|
-
naturalKey,
|
|
60
|
-
mutableFields: MUTABLE_FIELDS[entityType],
|
|
61
|
-
dependencies: Object.freeze([...dependencies]),
|
|
62
|
-
credentialWillBeGenerated,
|
|
63
|
-
}));
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Build a deterministic, mutation-free plan from a schema-validated manifest.
|
|
67
|
-
*
|
|
68
|
-
* @param manifest - Strictly parsed version 1.0 manifest.
|
|
69
|
-
* @returns Ordered entries and the exact parents that must be resolved from the database.
|
|
70
|
-
* @throws Error when a system configuration key could carry authentication material.
|
|
71
|
-
*/
|
|
72
|
-
export function buildImportManifestPlan(manifest) {
|
|
73
|
-
const entries = [];
|
|
74
|
-
const organizationKeys = new Set(manifest.organizations.map((item) => item.slug));
|
|
75
|
-
const applicationKeys = new Set(manifest.applications.map((item) => item.slug));
|
|
76
|
-
const roleKeys = new Set(manifest.roles.map((item) => key(item.application_slug, item.slug)));
|
|
77
|
-
const permissionKeys = new Set(manifest.permissions.map((item) => key(item.application_slug, item.slug)));
|
|
78
|
-
const claimKeys = new Set(manifest.claim_definitions.map((item) => key(item.application_slug, item.slug)));
|
|
79
|
-
const userKeys = new Set(manifest.users.map((item) => key(item.organization_slug, item.email.toLowerCase())));
|
|
80
|
-
for (const organization of manifest.organizations) {
|
|
81
|
-
addEntry(entries, 'organization', organization.slug, []);
|
|
82
|
-
}
|
|
83
|
-
for (const application of manifest.applications) {
|
|
84
|
-
addEntry(entries, 'application', application.slug, [
|
|
85
|
-
dependency('organization', application.organization_slug, organizationKeys),
|
|
86
|
-
]);
|
|
87
|
-
}
|
|
88
|
-
for (const client of manifest.clients) {
|
|
89
|
-
addEntry(entries, 'client', key(client.organization_slug, client.application_slug, client.client_name), [
|
|
90
|
-
dependency('organization', client.organization_slug, organizationKeys),
|
|
91
|
-
dependency('application', client.application_slug, applicationKeys),
|
|
92
|
-
], client.client_type === 'confidential');
|
|
93
|
-
}
|
|
94
|
-
for (const role of manifest.roles) {
|
|
95
|
-
addEntry(entries, 'role', key(role.application_slug, role.slug), [
|
|
96
|
-
dependency('organization', role.organization_slug, organizationKeys),
|
|
97
|
-
dependency('application', role.application_slug, applicationKeys),
|
|
98
|
-
]);
|
|
99
|
-
}
|
|
100
|
-
for (const permission of manifest.permissions) {
|
|
101
|
-
addEntry(entries, 'permission', key(permission.application_slug, permission.slug), [
|
|
102
|
-
dependency('organization', permission.organization_slug, organizationKeys),
|
|
103
|
-
dependency('application', permission.application_slug, applicationKeys),
|
|
104
|
-
]);
|
|
105
|
-
}
|
|
106
|
-
for (const claim of manifest.claim_definitions) {
|
|
107
|
-
addEntry(entries, 'claim_definition', key(claim.application_slug, claim.slug), [
|
|
108
|
-
dependency('organization', claim.organization_slug, organizationKeys),
|
|
109
|
-
dependency('application', claim.application_slug, applicationKeys),
|
|
110
|
-
]);
|
|
111
|
-
}
|
|
112
|
-
for (const mapping of manifest.role_permission_mappings) {
|
|
113
|
-
const dependencies = [
|
|
114
|
-
dependency('organization', mapping.organization_slug, organizationKeys),
|
|
115
|
-
dependency('application', mapping.application_slug, applicationKeys),
|
|
116
|
-
dependency('role', key(mapping.application_slug, mapping.role_slug), roleKeys),
|
|
117
|
-
...mapping.permission_slugs.map((slug) => dependency('permission', key(mapping.application_slug, slug), permissionKeys)),
|
|
118
|
-
];
|
|
119
|
-
addEntry(entries, 'role_permission_mapping', key(mapping.application_slug, mapping.role_slug), dependencies);
|
|
120
|
-
}
|
|
121
|
-
for (const module of manifest.application_modules) {
|
|
122
|
-
addEntry(entries, 'application_module', key(module.application_slug, module.slug), [
|
|
123
|
-
dependency('organization', module.organization_slug, organizationKeys),
|
|
124
|
-
dependency('application', module.application_slug, applicationKeys),
|
|
125
|
-
]);
|
|
126
|
-
}
|
|
127
|
-
for (const user of manifest.users) {
|
|
128
|
-
addEntry(entries, 'user', key(user.organization_slug, user.email.toLowerCase()), [
|
|
129
|
-
dependency('organization', user.organization_slug, organizationKeys),
|
|
130
|
-
]);
|
|
131
|
-
}
|
|
132
|
-
for (const assignment of manifest.user_role_assignments) {
|
|
133
|
-
addEntry(entries, 'user_role_assignment', key(assignment.organization_slug, assignment.application_slug, assignment.email.toLowerCase(), assignment.role_slug), [
|
|
134
|
-
dependency('organization', assignment.organization_slug, organizationKeys),
|
|
135
|
-
dependency('application', assignment.application_slug, applicationKeys),
|
|
136
|
-
dependency('user', key(assignment.organization_slug, assignment.email.toLowerCase()), userKeys),
|
|
137
|
-
dependency('role', key(assignment.application_slug, assignment.role_slug), roleKeys),
|
|
138
|
-
]);
|
|
139
|
-
}
|
|
140
|
-
for (const claimValue of manifest.user_claim_values) {
|
|
141
|
-
addEntry(entries, 'user_claim_value', key(claimValue.organization_slug, claimValue.application_slug, claimValue.email.toLowerCase(), claimValue.claim_slug), [
|
|
142
|
-
dependency('organization', claimValue.organization_slug, organizationKeys),
|
|
143
|
-
dependency('application', claimValue.application_slug, applicationKeys),
|
|
144
|
-
dependency('user', key(claimValue.organization_slug, claimValue.email.toLowerCase()), userKeys),
|
|
145
|
-
dependency('claim_definition', key(claimValue.application_slug, claimValue.claim_slug), claimKeys),
|
|
146
|
-
]);
|
|
147
|
-
}
|
|
148
|
-
for (const configKey of Object.keys(manifest.config ?? {}).sort()) {
|
|
149
|
-
if (isProhibitedImportConfigKey(configKey)) {
|
|
150
|
-
throw new Error('Import manifest contains prohibited authentication material');
|
|
151
|
-
}
|
|
152
|
-
addEntry(entries, 'config', configKey, []);
|
|
153
|
-
}
|
|
154
|
-
const externalByKey = new Map();
|
|
155
|
-
for (const entry of entries) {
|
|
156
|
-
for (const required of entry.dependencies) {
|
|
157
|
-
if (required.source === 'database') {
|
|
158
|
-
externalByKey.set(key(required.entityType, required.naturalKey), required);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return Object.freeze({
|
|
163
|
-
version: '1.0',
|
|
164
|
-
entries: Object.freeze(entries),
|
|
165
|
-
externalDependencies: Object.freeze([...externalByKey.values()]),
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
/** Resolve one database-owned parent without exposing its identifier in an error. */
|
|
169
|
-
async function databaseDependencyExists(client, required) {
|
|
170
|
-
if (required.entityType === 'organization') {
|
|
171
|
-
const result = await client.query('SELECT 1 FROM organizations WHERE slug = $1', [
|
|
172
|
-
required.naturalKey,
|
|
173
|
-
]);
|
|
174
|
-
return result.rowCount === 1;
|
|
175
|
-
}
|
|
176
|
-
if (required.entityType === 'application') {
|
|
177
|
-
const result = await client.query('SELECT 1 FROM applications WHERE slug = $1', [
|
|
178
|
-
required.naturalKey,
|
|
179
|
-
]);
|
|
180
|
-
return result.rowCount === 1;
|
|
181
|
-
}
|
|
182
|
-
if (required.entityType === 'role' ||
|
|
183
|
-
required.entityType === 'permission' ||
|
|
184
|
-
required.entityType === 'claim_definition') {
|
|
185
|
-
const [applicationSlug, entitySlug] = keyParts(required.naturalKey, 2);
|
|
186
|
-
const table = required.entityType === 'role'
|
|
187
|
-
? 'roles'
|
|
188
|
-
: required.entityType === 'permission'
|
|
189
|
-
? 'permissions'
|
|
190
|
-
: 'claim_definitions';
|
|
191
|
-
const result = await client.query(`SELECT 1 FROM ${table} entity
|
|
192
|
-
JOIN applications application ON application.id = entity.application_id
|
|
193
|
-
WHERE application.slug = $1 AND entity.slug = $2`, [applicationSlug, entitySlug]);
|
|
194
|
-
return result.rowCount === 1;
|
|
195
|
-
}
|
|
196
|
-
if (required.entityType === 'user') {
|
|
197
|
-
const [organizationSlug, email] = keyParts(required.naturalKey, 2);
|
|
198
|
-
const result = await client.query(`SELECT 1 FROM users user_account
|
|
199
|
-
JOIN organizations organization ON organization.id = user_account.organization_id
|
|
200
|
-
WHERE organization.slug = $1 AND user_account.email = $2`, [organizationSlug, email]);
|
|
201
|
-
return result.rowCount === 1;
|
|
202
|
-
}
|
|
203
|
-
throw new Error('Import plan contains an unsupported external dependency');
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Resolve every external parent against the current transaction snapshot.
|
|
207
|
-
*
|
|
208
|
-
* @param client - Transaction client used by the later import execution.
|
|
209
|
-
* @param plan - Pure manifest plan built before acquiring the client.
|
|
210
|
-
* @throws Error when a parent is missing or storage contains an ambiguous natural key.
|
|
211
|
-
*/
|
|
212
|
-
export async function requireResolvedImportDependencies(client, plan) {
|
|
213
|
-
for (const required of plan.externalDependencies) {
|
|
214
|
-
if (!(await databaseDependencyExists(client, required))) {
|
|
215
|
-
throw new Error('Import manifest contains a missing or unauthorized parent reference');
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
for (const entry of plan.entries) {
|
|
219
|
-
if (entry.entityType !== 'client')
|
|
220
|
-
continue;
|
|
221
|
-
const [organizationSlug, applicationSlug, clientName] = keyParts(entry.naturalKey, 3);
|
|
222
|
-
const result = await client.query(`SELECT COUNT(*)::integer AS count
|
|
223
|
-
FROM clients client
|
|
224
|
-
JOIN organizations organization ON organization.id = client.organization_id
|
|
225
|
-
JOIN applications application ON application.id = client.application_id
|
|
226
|
-
WHERE organization.slug = $1
|
|
227
|
-
AND application.slug = $2
|
|
228
|
-
AND client.client_name = $3`, [organizationSlug, applicationSlug, clientName]);
|
|
229
|
-
const count = Number(result.rows[0]?.count ?? 0);
|
|
230
|
-
if (!Number.isSafeInteger(count) || count > 1) {
|
|
231
|
-
throw new Error('Import manifest natural key collides with ambiguous stored data');
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
//# sourceMappingURL=data-import-plan.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-import-plan.js","sourceRoot":"","sources":["../../src/lib/data-import-plan.ts"],"names":[],"mappings":"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"}
|