@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,90 @@
|
|
|
1
|
+
/** Closed operational policy. Database rows own values, never these definitions or defaults. */
|
|
2
|
+
/** Locales for which Porta ships every authentication namespace. */
|
|
3
|
+
export const SUPPORTED_LOCALES = Object.freeze(['en']);
|
|
4
|
+
/** Build a frozen integer definition while preserving its literal key for typed callers. */
|
|
5
|
+
function integerDefinition(key, group, label, description, unit, defaultValue, minimum, maximum, applicationMode = 'runtime') {
|
|
6
|
+
return Object.freeze({
|
|
7
|
+
key,
|
|
8
|
+
group,
|
|
9
|
+
label,
|
|
10
|
+
description,
|
|
11
|
+
valueType: 'integer',
|
|
12
|
+
unit,
|
|
13
|
+
defaultValue,
|
|
14
|
+
minimum,
|
|
15
|
+
maximum,
|
|
16
|
+
applicationMode,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Immutable public policy in administrative display order. Bootstrap settings and secrets are
|
|
21
|
+
* deliberately absent; adding a field requires an explicit application change and migration.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* const defaults = SYSTEM_CONFIG_CATALOG.map(({ key, defaultValue }) => [key, defaultValue]);
|
|
25
|
+
*/
|
|
26
|
+
export const SYSTEM_CONFIG_CATALOG = Object.freeze([
|
|
27
|
+
integerDefinition('access_token_ttl', 'lifetimes', 'Access token lifetime', 'How long newly issued access tokens remain valid.', 'seconds', 3600, 60, 86400, 'restart-required'),
|
|
28
|
+
integerDefinition('id_token_ttl', 'lifetimes', 'ID token lifetime', 'How long newly issued ID tokens remain valid.', 'seconds', 3600, 60, 86400, 'restart-required'),
|
|
29
|
+
integerDefinition('refresh_token_ttl', 'lifetimes', 'Refresh token lifetime', 'How long newly issued refresh tokens remain valid.', 'seconds', 2592000, 300, 31536000, 'restart-required'),
|
|
30
|
+
integerDefinition('authorization_code_ttl', 'lifetimes', 'Authorization code lifetime', 'How long a newly issued authorization code remains valid.', 'seconds', 600, 30, 3600, 'restart-required'),
|
|
31
|
+
integerDefinition('session_ttl', 'lifetimes', 'Session lifetime', 'How long newly created OIDC sessions remain valid.', 'seconds', 86400, 300, 2592000, 'restart-required'),
|
|
32
|
+
integerDefinition('magic_link_ttl', 'lifetimes', 'Magic-link lifetime', 'How long a newly created magic-link token remains valid.', 'seconds', 900, 60, 3600),
|
|
33
|
+
integerDefinition('password_reset_ttl', 'lifetimes', 'Password-reset lifetime', 'How long a newly created password-reset token remains valid.', 'seconds', 3600, 300, 86400),
|
|
34
|
+
integerDefinition('invitation_ttl', 'lifetimes', 'Invitation lifetime', 'How long a newly created user invitation remains valid.', 'seconds', 604800, 300, 2592000),
|
|
35
|
+
integerDefinition('rate_limit_login_max', 'rate-limits', 'Login attempt limit', 'Maximum login attempts allowed in one login window.', 'attempts', 10, 1, 100),
|
|
36
|
+
integerDefinition('rate_limit_login_window', 'rate-limits', 'Login window', 'Window used to count login attempts.', 'seconds', 900, 60, 86400),
|
|
37
|
+
integerDefinition('rate_limit_magic_link_max', 'rate-limits', 'Magic-link request limit', 'Maximum magic-link requests allowed in one window.', 'attempts', 5, 1, 100),
|
|
38
|
+
integerDefinition('rate_limit_magic_link_window', 'rate-limits', 'Magic-link request window', 'Window used to count magic-link requests.', 'seconds', 900, 60, 86400),
|
|
39
|
+
integerDefinition('rate_limit_password_reset_max', 'rate-limits', 'Password-reset request limit', 'Maximum password-reset requests allowed in one window.', 'attempts', 5, 1, 100),
|
|
40
|
+
integerDefinition('rate_limit_password_reset_window', 'rate-limits', 'Password-reset request window', 'Window used to count password-reset requests.', 'seconds', 900, 60, 86400),
|
|
41
|
+
integerDefinition('max_failed_logins', 'lockout', 'Failed login limit', 'Failed login count that activates automatic lockout.', 'attempts', 5, 1, 100),
|
|
42
|
+
integerDefinition('lockout_duration_seconds', 'lockout', 'Lockout duration', 'Duration applied when automatic lockout eligibility is checked.', 'seconds', 900, 60, 604800),
|
|
43
|
+
integerDefinition('audit_retention_days', 'general', 'Audit retention', 'Default number of days retained by audit cleanup.', 'days', 90, 1, 3650),
|
|
44
|
+
Object.freeze({
|
|
45
|
+
key: 'default_locale',
|
|
46
|
+
group: 'general',
|
|
47
|
+
label: 'Default locale',
|
|
48
|
+
description: 'Final locale fallback used by the authentication UI.',
|
|
49
|
+
valueType: 'string',
|
|
50
|
+
unit: 'locale',
|
|
51
|
+
defaultValue: 'en',
|
|
52
|
+
allowedValues: SUPPORTED_LOCALES,
|
|
53
|
+
applicationMode: 'runtime',
|
|
54
|
+
}),
|
|
55
|
+
]);
|
|
56
|
+
/**
|
|
57
|
+
* Resolve an untrusted name without querying whether an internal database row exists.
|
|
58
|
+
* @param key - Exact, case-sensitive name; no trimming or normalization is performed.
|
|
59
|
+
* @returns Public definition, or undefined for every non-catalog name.
|
|
60
|
+
* @example
|
|
61
|
+
* findSystemConfigDefinition('magic_link_ttl')?.defaultValue; // 900
|
|
62
|
+
*/
|
|
63
|
+
export function findSystemConfigDefinition(key) {
|
|
64
|
+
return SYSTEM_CONFIG_CATALOG.find((definition) => definition.key === key);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Validate submitted or stored policy without coercion. Numeric text and unsupported locales fail.
|
|
68
|
+
* @param definition - Application-owned public metadata.
|
|
69
|
+
* @param value - Untrusted native value from JSON or PostgreSQL.
|
|
70
|
+
* @returns The same valid scalar, or undefined when its type or bounds are wrong.
|
|
71
|
+
* @example
|
|
72
|
+
* const definition = findSystemConfigDefinition('magic_link_ttl');
|
|
73
|
+
* if (definition) validateSystemConfigValue(definition, 1200); // 1200
|
|
74
|
+
*/
|
|
75
|
+
export function validateSystemConfigValue(definition, value) {
|
|
76
|
+
if (definition.valueType === 'integer') {
|
|
77
|
+
if (typeof value !== 'number' ||
|
|
78
|
+
!Number.isInteger(value) ||
|
|
79
|
+
definition.minimum === undefined ||
|
|
80
|
+
definition.maximum === undefined ||
|
|
81
|
+
value < definition.minimum ||
|
|
82
|
+
value > definition.maximum)
|
|
83
|
+
return undefined;
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
if (typeof value !== 'string')
|
|
87
|
+
return undefined;
|
|
88
|
+
return definition.allowedValues?.find((locale) => locale === value);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=system-config-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-config-catalog.js","sourceRoot":"","sources":["../../src/lib/system-config-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* System configuration service — reads runtime settings from the system_config table.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Found values are cached in-memory for 60 seconds to minimize database queries.
|
|
5
5
|
* The cache is shared across all requests within the process.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* native JSONB types. The typed getters handle parsing and coercion for each type.
|
|
7
|
+
* Public values use native JSONB scalars and the immutable catalog's validation and defaults.
|
|
8
|
+
* No coercion is performed. Missing, invalid or unavailable policy uses a bounded safe warning.
|
|
10
9
|
*
|
|
11
10
|
* @example
|
|
12
|
-
* const ttl = await getSystemConfigNumber('access_token_ttl'
|
|
13
|
-
* const secure = await getSystemConfigBoolean('cookie_secure', true);
|
|
11
|
+
* const ttl = await getSystemConfigNumber('access_token_ttl');
|
|
14
12
|
* const allTtls = await loadOidcTtlConfig();
|
|
15
13
|
*/
|
|
14
|
+
import type { NumericSystemConfigKey, SupportedLocale } from './system-config-catalog.js';
|
|
16
15
|
/** OIDC TTL configuration loaded from system_config table */
|
|
17
16
|
export interface OidcTtlConfig {
|
|
18
17
|
/** Access token lifetime in seconds (default: 3600 = 1 hour) */
|
|
@@ -31,40 +30,37 @@ export interface OidcTtlConfig {
|
|
|
31
30
|
grant: number;
|
|
32
31
|
}
|
|
33
32
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* @
|
|
37
|
-
* @
|
|
38
|
-
* @
|
|
33
|
+
* Read a native, bounded integer or its exact catalog default, without caller-owned fallbacks.
|
|
34
|
+
* @param key - Public integer policy key.
|
|
35
|
+
* @returns Valid stored integer or the same catalog's safe default.
|
|
36
|
+
* @throws Error when JavaScript callers supply a non-numeric or non-catalog key.
|
|
37
|
+
* @example
|
|
38
|
+
* await getSystemConfigNumber('magic_link_ttl'); // seconds
|
|
39
39
|
*/
|
|
40
|
-
export declare function
|
|
40
|
+
export declare function getSystemConfigNumber(key: NumericSystemConfigKey): Promise<number>;
|
|
41
41
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* @param key - Config key (e.g., 'access_token_ttl')
|
|
49
|
-
* @param fallback - Default value returned if key not found or not a valid number
|
|
50
|
-
* @returns The config value as a number, or the fallback
|
|
42
|
+
* Read the final authentication locale fallback without coercing arbitrary database content.
|
|
43
|
+
* @param key - The closed public locale key.
|
|
44
|
+
* @returns Completely supported stored locale or its catalog default.
|
|
45
|
+
* @throws Error when JavaScript callers supply a non-locale or non-catalog key.
|
|
46
|
+
* @example
|
|
47
|
+
* await getSystemConfigString('default_locale'); // 'en'
|
|
51
48
|
*/
|
|
52
|
-
export declare function
|
|
49
|
+
export declare function getSystemConfigString(key: 'default_locale'): Promise<SupportedLocale>;
|
|
53
50
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* @
|
|
60
|
-
*
|
|
61
|
-
* @returns The config value as a boolean, or the fallback
|
|
51
|
+
* Read trusted internal string rows independently of public operational policy. Internal rows
|
|
52
|
+
* never enter administrative projections, and raw exceptions or stored content are not logged.
|
|
53
|
+
* @param key - Internal name supplied by Porta code, not by an administrative request.
|
|
54
|
+
* @param fallback - Safe result when storage is absent, unavailable or not a native string.
|
|
55
|
+
* @returns Native internal string, or the supplied fallback.
|
|
56
|
+
* @example
|
|
57
|
+
* await getInternalSystemConfigString('super_admin_user_id', '');
|
|
62
58
|
*/
|
|
63
|
-
export declare function
|
|
59
|
+
export declare function getInternalSystemConfigString(key: string, fallback: string): Promise<string>;
|
|
64
60
|
/**
|
|
65
61
|
* Load all TTL config values needed by the OIDC provider.
|
|
66
62
|
*
|
|
67
|
-
* Reads each TTL
|
|
63
|
+
* Reads each native TTL through the same catalog used by administrative policy.
|
|
68
64
|
* Called once at provider initialization to build the TTL configuration.
|
|
69
65
|
* The interaction TTL is hardcoded (not stored in system_config).
|
|
70
66
|
*
|
|
@@ -73,7 +69,8 @@ export declare function getSystemConfigBoolean(key: string, fallback: boolean):
|
|
|
73
69
|
export declare function loadOidcTtlConfig(): Promise<OidcTtlConfig>;
|
|
74
70
|
/**
|
|
75
71
|
* Clear the in-memory config cache.
|
|
76
|
-
*
|
|
72
|
+
* Successful administrative saves call this after commit. Replacing the map also isolates
|
|
73
|
+
* reads already awaiting PostgreSQL, so their later completion cannot restore stale policy.
|
|
77
74
|
*/
|
|
78
75
|
export declare function clearSystemConfigCache(): void;
|
|
79
76
|
//# sourceMappingURL=system-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-config.d.ts","sourceRoot":"","sources":["../../src/lib/system-config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"system-config.d.ts","sourceRoot":"","sources":["../../src/lib/system-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EACV,sBAAsB,EACtB,eAAe,EAGhB,MAAM,4BAA4B,CAAC;AAUpC,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;CACf;AA+DD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAIxF;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAI3F;AAED;;;;;;;;GAQG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAoBhE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -1,129 +1,113 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* System configuration service — reads runtime settings from the system_config table.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Found values are cached in-memory for 60 seconds to minimize database queries.
|
|
5
5
|
* The cache is shared across all requests within the process.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* native JSONB types. The typed getters handle parsing and coercion for each type.
|
|
7
|
+
* Public values use native JSONB scalars and the immutable catalog's validation and defaults.
|
|
8
|
+
* No coercion is performed. Missing, invalid or unavailable policy uses a bounded safe warning.
|
|
10
9
|
*
|
|
11
10
|
* @example
|
|
12
|
-
* const ttl = await getSystemConfigNumber('access_token_ttl'
|
|
13
|
-
* const secure = await getSystemConfigBoolean('cookie_secure', true);
|
|
11
|
+
* const ttl = await getSystemConfigNumber('access_token_ttl');
|
|
14
12
|
* const allTtls = await loadOidcTtlConfig();
|
|
15
13
|
*/
|
|
16
14
|
import { getPool } from './database.js';
|
|
17
15
|
import { logger } from './logger.js';
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
import { findSystemConfigDefinition, validateSystemConfigValue } from './system-config-catalog.js';
|
|
17
|
+
/** Active local cache; old queries retain their original map after explicit invalidation. */
|
|
18
|
+
let cache = new Map();
|
|
19
|
+
/** Maximum time another healthy process may retain a previously read policy value. */
|
|
20
20
|
const CACHE_TTL_MS = 60_000;
|
|
21
21
|
/**
|
|
22
22
|
* Fetch a raw config value from the database by key.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
23
|
+
* Only found rows are cached. Each query captures its cache map before awaiting PostgreSQL,
|
|
24
|
+
* so a completion from before invalidation cannot refill the replacement cache with stale policy.
|
|
25
25
|
*
|
|
26
26
|
* @param key - Config key to look up (e.g., 'access_token_ttl')
|
|
27
|
-
* @returns
|
|
27
|
+
* @returns Found JSONB content, missing, or unavailable; raw errors never escape this boundary.
|
|
28
28
|
*/
|
|
29
29
|
async function getRawConfigValue(key) {
|
|
30
30
|
const now = Date.now();
|
|
31
|
+
const startingCache = cache;
|
|
31
32
|
// Check cache first
|
|
32
|
-
const cached =
|
|
33
|
+
const cached = startingCache.get(key);
|
|
33
34
|
if (cached && cached.expiresAt > now) {
|
|
34
|
-
return cached.value;
|
|
35
|
+
return { status: 'found', value: cached.value };
|
|
35
36
|
}
|
|
36
37
|
try {
|
|
37
38
|
const pool = getPool();
|
|
38
39
|
const result = await pool.query('SELECT value FROM system_config WHERE key = $1', [key]);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
const value = result.rows[0].value;
|
|
45
|
-
cache.set(key, { value, expiresAt: now + CACHE_TTL_MS });
|
|
46
|
-
return value;
|
|
40
|
+
const row = result.rows[0];
|
|
41
|
+
if (!row)
|
|
42
|
+
return { status: 'missing' };
|
|
43
|
+
startingCache.set(key, { value: row.value, expiresAt: now + CACHE_TTL_MS });
|
|
44
|
+
return { status: 'found', value: row.value };
|
|
47
45
|
}
|
|
48
|
-
catch
|
|
49
|
-
|
|
50
|
-
logger.warn({ key, error }, 'Failed to read system_config value, using fallback');
|
|
51
|
-
return undefined;
|
|
46
|
+
catch {
|
|
47
|
+
return { status: 'unavailable' };
|
|
52
48
|
}
|
|
53
49
|
}
|
|
54
50
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* @param key - Config key (e.g., 'magic_link_length')
|
|
58
|
-
* @param fallback - Default value returned if key not found or value is not a string
|
|
59
|
-
* @returns The config value as a string, or the fallback
|
|
51
|
+
* Read public policy through application-owned validation and defaults. Warning fields contain
|
|
52
|
+
* only a catalog key and closed reason; neither stored content nor infrastructure exceptions leak.
|
|
60
53
|
*/
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
54
|
+
async function readCatalogValue(key) {
|
|
55
|
+
const definition = findSystemConfigDefinition(key);
|
|
56
|
+
if (!definition)
|
|
57
|
+
throw new Error('Unsupported system configuration key');
|
|
58
|
+
const result = await getRawConfigValue(key);
|
|
59
|
+
const value = result.status === 'found' ? validateSystemConfigValue(definition, result.value) : undefined;
|
|
60
|
+
if (value !== undefined)
|
|
61
|
+
return value;
|
|
62
|
+
const reason = result.status === 'found' ? 'invalid' : result.status;
|
|
63
|
+
logger.warn({ event: 'system-config-fallback', key, reason }, 'Using default system configuration value');
|
|
64
|
+
return definition.defaultValue;
|
|
67
65
|
}
|
|
68
66
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* @param key - Config key (e.g., 'access_token_ttl')
|
|
76
|
-
* @param fallback - Default value returned if key not found or not a valid number
|
|
77
|
-
* @returns The config value as a number, or the fallback
|
|
67
|
+
* Read a native, bounded integer or its exact catalog default, without caller-owned fallbacks.
|
|
68
|
+
* @param key - Public integer policy key.
|
|
69
|
+
* @returns Valid stored integer or the same catalog's safe default.
|
|
70
|
+
* @throws Error when JavaScript callers supply a non-numeric or non-catalog key.
|
|
71
|
+
* @example
|
|
72
|
+
* await getSystemConfigNumber('magic_link_ttl'); // seconds
|
|
78
73
|
*/
|
|
79
|
-
export async function getSystemConfigNumber(key
|
|
80
|
-
const
|
|
81
|
-
if (
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (typeof raw === 'number' && !Number.isNaN(raw))
|
|
85
|
-
return raw;
|
|
86
|
-
// If it's a string (duration values stored as JSONB strings like '"3600"'),
|
|
87
|
-
// parse as number
|
|
88
|
-
if (typeof raw === 'string') {
|
|
89
|
-
const parsed = Number(raw);
|
|
90
|
-
if (!Number.isNaN(parsed))
|
|
91
|
-
return parsed;
|
|
92
|
-
}
|
|
93
|
-
logger.warn({ key, raw }, 'system_config value is not a valid number, using fallback');
|
|
94
|
-
return fallback;
|
|
74
|
+
export async function getSystemConfigNumber(key) {
|
|
75
|
+
const value = await readCatalogValue(key);
|
|
76
|
+
if (typeof value !== 'number')
|
|
77
|
+
throw new Error('Expected numeric system configuration key');
|
|
78
|
+
return value;
|
|
95
79
|
}
|
|
96
80
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* @param fallback - Default value returned if key not found or not a valid boolean
|
|
104
|
-
* @returns The config value as a boolean, or the fallback
|
|
81
|
+
* Read the final authentication locale fallback without coercing arbitrary database content.
|
|
82
|
+
* @param key - The closed public locale key.
|
|
83
|
+
* @returns Completely supported stored locale or its catalog default.
|
|
84
|
+
* @throws Error when JavaScript callers supply a non-locale or non-catalog key.
|
|
85
|
+
* @example
|
|
86
|
+
* await getSystemConfigString('default_locale'); // 'en'
|
|
105
87
|
*/
|
|
106
|
-
export async function
|
|
107
|
-
const
|
|
108
|
-
if (
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
88
|
+
export async function getSystemConfigString(key) {
|
|
89
|
+
const value = await readCatalogValue(key);
|
|
90
|
+
if (typeof value !== 'string')
|
|
91
|
+
throw new Error('Expected locale system configuration key');
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Read trusted internal string rows independently of public operational policy. Internal rows
|
|
96
|
+
* never enter administrative projections, and raw exceptions or stored content are not logged.
|
|
97
|
+
* @param key - Internal name supplied by Porta code, not by an administrative request.
|
|
98
|
+
* @param fallback - Safe result when storage is absent, unavailable or not a native string.
|
|
99
|
+
* @returns Native internal string, or the supplied fallback.
|
|
100
|
+
* @example
|
|
101
|
+
* await getInternalSystemConfigString('super_admin_user_id', '');
|
|
102
|
+
*/
|
|
103
|
+
export async function getInternalSystemConfigString(key, fallback) {
|
|
104
|
+
const result = await getRawConfigValue(key);
|
|
105
|
+
return result.status === 'found' && typeof result.value === 'string' ? result.value : fallback;
|
|
122
106
|
}
|
|
123
107
|
/**
|
|
124
108
|
* Load all TTL config values needed by the OIDC provider.
|
|
125
109
|
*
|
|
126
|
-
* Reads each TTL
|
|
110
|
+
* Reads each native TTL through the same catalog used by administrative policy.
|
|
127
111
|
* Called once at provider initialization to build the TTL configuration.
|
|
128
112
|
* The interaction TTL is hardcoded (not stored in system_config).
|
|
129
113
|
*
|
|
@@ -131,11 +115,11 @@ export async function getSystemConfigBoolean(key, fallback) {
|
|
|
131
115
|
*/
|
|
132
116
|
export async function loadOidcTtlConfig() {
|
|
133
117
|
const [accessToken, idToken, refreshToken, authorizationCode, session] = await Promise.all([
|
|
134
|
-
getSystemConfigNumber('access_token_ttl'
|
|
135
|
-
getSystemConfigNumber('id_token_ttl'
|
|
136
|
-
getSystemConfigNumber('refresh_token_ttl'
|
|
137
|
-
getSystemConfigNumber('authorization_code_ttl'
|
|
138
|
-
getSystemConfigNumber('session_ttl'
|
|
118
|
+
getSystemConfigNumber('access_token_ttl'),
|
|
119
|
+
getSystemConfigNumber('id_token_ttl'),
|
|
120
|
+
getSystemConfigNumber('refresh_token_ttl'),
|
|
121
|
+
getSystemConfigNumber('authorization_code_ttl'),
|
|
122
|
+
getSystemConfigNumber('session_ttl'),
|
|
139
123
|
]);
|
|
140
124
|
return {
|
|
141
125
|
accessToken,
|
|
@@ -151,9 +135,10 @@ export async function loadOidcTtlConfig() {
|
|
|
151
135
|
}
|
|
152
136
|
/**
|
|
153
137
|
* Clear the in-memory config cache.
|
|
154
|
-
*
|
|
138
|
+
* Successful administrative saves call this after commit. Replacing the map also isolates
|
|
139
|
+
* reads already awaiting PostgreSQL, so their later completion cannot restore stale policy.
|
|
155
140
|
*/
|
|
156
141
|
export function clearSystemConfigCache() {
|
|
157
|
-
cache
|
|
142
|
+
cache = new Map();
|
|
158
143
|
}
|
|
159
144
|
//# sourceMappingURL=system-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-config.js","sourceRoot":"","sources":["../../src/lib/system-config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"system-config.js","sourceRoot":"","sources":["../../src/lib/system-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded dependency probing.
|
|
3
|
+
*
|
|
4
|
+
* Health and readiness probes must never wait indefinitely for a dependency
|
|
5
|
+
* that has stopped responding. An unbounded probe lets a degraded dependency
|
|
6
|
+
* hang an orchestrator check, so every check is raced against a short timeout
|
|
7
|
+
* and the timer is cleared as soon as the probe settles.
|
|
8
|
+
*
|
|
9
|
+
* @module lib/with-timeout
|
|
10
|
+
*/
|
|
11
|
+
/** Default budget (milliseconds) for a single dependency probe. */
|
|
12
|
+
export declare const DEPENDENCY_PROBE_TIMEOUT_MS = 2000;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve with `promise`, or reject with a labeled timeout error when the
|
|
15
|
+
* promise does not settle within `timeoutMs`.
|
|
16
|
+
*
|
|
17
|
+
* The timeout only bounds how long a probe may hold a health response; it does
|
|
18
|
+
* not cancel the underlying operation, which the owning client bounds itself.
|
|
19
|
+
*
|
|
20
|
+
* @param promise - Probe promise to bound.
|
|
21
|
+
* @param label - Short dependency name used in the timeout error message.
|
|
22
|
+
* @param timeoutMs - Maximum wait; defaults to {@link DEPENDENCY_PROBE_TIMEOUT_MS}.
|
|
23
|
+
* @returns The probe result when it settles in time.
|
|
24
|
+
* @throws {Error} When the probe exceeds `timeoutMs`.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* await withTimeout(getPool().query('SELECT 1'), 'db');
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function withTimeout<T>(promise: Promise<T>, label: string, timeoutMs?: number): Promise<T>;
|
|
32
|
+
//# sourceMappingURL=with-timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-timeout.d.ts","sourceRoot":"","sources":["../../src/lib/with-timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,mEAAmE;AACnE,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAoC,GAC9C,OAAO,CAAC,CAAC,CAAC,CAmBZ"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded dependency probing.
|
|
3
|
+
*
|
|
4
|
+
* Health and readiness probes must never wait indefinitely for a dependency
|
|
5
|
+
* that has stopped responding. An unbounded probe lets a degraded dependency
|
|
6
|
+
* hang an orchestrator check, so every check is raced against a short timeout
|
|
7
|
+
* and the timer is cleared as soon as the probe settles.
|
|
8
|
+
*
|
|
9
|
+
* @module lib/with-timeout
|
|
10
|
+
*/
|
|
11
|
+
/** Default budget (milliseconds) for a single dependency probe. */
|
|
12
|
+
export const DEPENDENCY_PROBE_TIMEOUT_MS = 2000;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve with `promise`, or reject with a labeled timeout error when the
|
|
15
|
+
* promise does not settle within `timeoutMs`.
|
|
16
|
+
*
|
|
17
|
+
* The timeout only bounds how long a probe may hold a health response; it does
|
|
18
|
+
* not cancel the underlying operation, which the owning client bounds itself.
|
|
19
|
+
*
|
|
20
|
+
* @param promise - Probe promise to bound.
|
|
21
|
+
* @param label - Short dependency name used in the timeout error message.
|
|
22
|
+
* @param timeoutMs - Maximum wait; defaults to {@link DEPENDENCY_PROBE_TIMEOUT_MS}.
|
|
23
|
+
* @returns The probe result when it settles in time.
|
|
24
|
+
* @throws {Error} When the probe exceeds `timeoutMs`.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* await withTimeout(getPool().query('SELECT 1'), 'db');
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function withTimeout(promise, label, timeoutMs = DEPENDENCY_PROBE_TIMEOUT_MS) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const timer = setTimeout(() => reject(new Error(`${label} timeout after ${timeoutMs}ms`)), timeoutMs);
|
|
34
|
+
// Never keep the process alive solely for a pending probe timeout.
|
|
35
|
+
timer.unref?.();
|
|
36
|
+
promise.then((value) => {
|
|
37
|
+
clearTimeout(timer);
|
|
38
|
+
resolve(value);
|
|
39
|
+
}, (error) => {
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
reject(error);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=with-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-timeout.js","sourceRoot":"","sources":["../../src/lib/with-timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,mEAAmE;AACnE,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CACzB,OAAmB,EACnB,KAAa,EACb,SAAS,GAAW,2BAA2B;IAE/C,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,kBAAkB,SAAS,IAAI,CAAC,CAAC,EAChE,SAAS,CACV,CAAC;QACF,mEAAmE;QACnE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Validates Bearer access tokens against Porta's own OIDC provider
|
|
5
5
|
* using opaque token lookup (provider.AccessToken.find()). Verifies
|
|
6
|
-
* the user belongs to the super-admin organization and has
|
|
7
|
-
*
|
|
8
|
-
* and audit logging.
|
|
6
|
+
* the user belongs to the super-admin organization and has a recognized
|
|
7
|
+
* built-in role owned by the canonical Porta Admin application. Sets
|
|
8
|
+
* ctx.state.adminUser for downstream handlers and audit logging.
|
|
9
9
|
*
|
|
10
10
|
* This middleware replaces the old requireSuperAdmin() that checked
|
|
11
11
|
* ctx.state.organization.isSuperAdmin (which required tenant-resolver
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* 3. Resolve super-admin organization
|
|
18
18
|
* 4. Look up user — must be active
|
|
19
19
|
* 5. Verify user belongs to the super-admin organization
|
|
20
|
-
* 6. Verify user has the
|
|
20
|
+
* 6. Verify the user has a recognized role from the canonical Admin application
|
|
21
21
|
* 7. Set ctx.state.adminUser and proceed
|
|
22
22
|
*
|
|
23
23
|
* Response codes:
|
|
@@ -89,7 +89,8 @@ declare module 'koa' {
|
|
|
89
89
|
*
|
|
90
90
|
* Validates the Bearer access token in the Authorization header by looking
|
|
91
91
|
* it up via the OIDC provider's opaque token store, then verifies the user
|
|
92
|
-
* is an active member of the super-admin organization with
|
|
92
|
+
* is an active member of the super-admin organization with a recognized role
|
|
93
|
+
* owned by the canonical Porta Admin application.
|
|
93
94
|
*
|
|
94
95
|
* On success, sets ctx.state.adminUser with the authenticated identity.
|
|
95
96
|
* On failure, responds with 401 (unauthenticated) or 403 (unauthorized).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-auth.d.ts","sourceRoot":"","sources":["../../src/middleware/admin-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-auth.d.ts","sourceRoot":"","sources":["../../src/middleware/admin-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAgB9D,4EAA4E;AAC5E,MAAM,WAAW,wBAAwB;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE;QACpB,4EAA4E;QAC5E,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC,CAAC;KAClE,CAAC;CACH;AAID;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAE7E;AAED,gFAAgF;AAChF,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAC9B,kBAAkB,EAAE,MAAM,EAC1B,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAaT;AAMD;;;GAGG;AACH,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAU,YAAY;QACpB,oFAAoF;QACpF,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,+FAA+F;QAC/F,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB;CACF;AASD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CA+K7C"}
|