@portaidentity/server 1.7.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 +11 -0
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/applications/cache.d.ts +64 -0
- package/dist/applications/cache.d.ts.map +1 -0
- package/dist/applications/cache.js +161 -0
- package/dist/applications/cache.js.map +1 -0
- package/dist/applications/errors.d.ts +25 -0
- package/dist/applications/errors.d.ts.map +1 -0
- package/dist/applications/errors.js +31 -0
- package/dist/applications/errors.js.map +1 -0
- package/dist/applications/index.d.ts +17 -0
- package/dist/applications/index.d.ts.map +1 -0
- package/dist/applications/index.js +19 -0
- package/dist/applications/index.js.map +1 -0
- package/dist/applications/repository.d.ts +184 -0
- package/dist/applications/repository.d.ts.map +1 -0
- package/dist/applications/repository.js +367 -0
- package/dist/applications/repository.js.map +1 -0
- package/dist/applications/service.d.ts +160 -0
- package/dist/applications/service.d.ts.map +1 -0
- package/dist/applications/service.js +388 -0
- package/dist/applications/service.js.map +1 -0
- package/dist/applications/slugs.d.ts +61 -0
- package/dist/applications/slugs.d.ts.map +1 -0
- package/dist/applications/slugs.js +115 -0
- package/dist/applications/slugs.js.map +1 -0
- package/dist/applications/types.d.ts +129 -0
- package/dist/applications/types.d.ts.map +1 -0
- package/dist/applications/types.js +62 -0
- package/dist/applications/types.js.map +1 -0
- package/dist/auth/csrf.d.ts +71 -0
- package/dist/auth/csrf.d.ts.map +1 -0
- package/dist/auth/csrf.js +112 -0
- package/dist/auth/csrf.js.map +1 -0
- package/dist/auth/email-renderer.d.ts +37 -0
- package/dist/auth/email-renderer.d.ts.map +1 -0
- package/dist/auth/email-renderer.js +116 -0
- package/dist/auth/email-renderer.js.map +1 -0
- package/dist/auth/email-service.d.ts +154 -0
- package/dist/auth/email-service.d.ts.map +1 -0
- package/dist/auth/email-service.js +415 -0
- package/dist/auth/email-service.js.map +1 -0
- package/dist/auth/email-transport.d.ts +65 -0
- package/dist/auth/email-transport.d.ts.map +1 -0
- package/dist/auth/email-transport.js +82 -0
- package/dist/auth/email-transport.js.map +1 -0
- package/dist/auth/i18n.d.ts +81 -0
- package/dist/auth/i18n.d.ts.map +1 -0
- package/dist/auth/i18n.js +395 -0
- package/dist/auth/i18n.js.map +1 -0
- package/dist/auth/index.d.ts +28 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +31 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/interaction-authority.d.ts +39 -0
- package/dist/auth/interaction-authority.d.ts.map +1 -0
- package/dist/auth/interaction-authority.js +30 -0
- package/dist/auth/interaction-authority.js.map +1 -0
- package/dist/auth/magic-link-session.d.ts +81 -0
- package/dist/auth/magic-link-session.d.ts.map +1 -0
- package/dist/auth/magic-link-session.js +183 -0
- package/dist/auth/magic-link-session.js.map +1 -0
- package/dist/auth/rate-limiter.d.ts +143 -0
- package/dist/auth/rate-limiter.d.ts.map +1 -0
- package/dist/auth/rate-limiter.js +220 -0
- package/dist/auth/rate-limiter.js.map +1 -0
- package/dist/auth/recovery-crypto.d.ts +34 -0
- package/dist/auth/recovery-crypto.d.ts.map +1 -0
- package/dist/auth/recovery-crypto.js +103 -0
- package/dist/auth/recovery-crypto.js.map +1 -0
- package/dist/auth/recovery-job-processor.d.ts +24 -0
- package/dist/auth/recovery-job-processor.d.ts.map +1 -0
- package/dist/auth/recovery-job-processor.js +123 -0
- package/dist/auth/recovery-job-processor.js.map +1 -0
- package/dist/auth/recovery-job-repository.d.ts +219 -0
- package/dist/auth/recovery-job-repository.d.ts.map +1 -0
- package/dist/auth/recovery-job-repository.js +340 -0
- package/dist/auth/recovery-job-repository.js.map +1 -0
- package/dist/auth/recovery-service.d.ts +27 -0
- package/dist/auth/recovery-service.d.ts.map +1 -0
- package/dist/auth/recovery-service.js +53 -0
- package/dist/auth/recovery-service.js.map +1 -0
- package/dist/auth/recovery-worker.d.ts +158 -0
- package/dist/auth/recovery-worker.d.ts.map +1 -0
- package/dist/auth/recovery-worker.js +306 -0
- package/dist/auth/recovery-worker.js.map +1 -0
- package/dist/auth/template-engine.d.ts +134 -0
- package/dist/auth/template-engine.d.ts.map +1 -0
- package/dist/auth/template-engine.js +225 -0
- package/dist/auth/template-engine.js.map +1 -0
- package/dist/auth/token-repository.d.ts +238 -0
- package/dist/auth/token-repository.d.ts.map +1 -0
- package/dist/auth/token-repository.js +475 -0
- package/dist/auth/token-repository.js.map +1 -0
- package/dist/auth/tokens.d.ts +45 -0
- package/dist/auth/tokens.d.ts.map +1 -0
- package/dist/auth/tokens.js +51 -0
- package/dist/auth/tokens.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +55 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +90 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/commands/health.d.ts +20 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +80 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/init.d.ts +48 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +349 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +19 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +88 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/seed.d.ts +19 -0
- package/dist/cli/commands/seed.d.ts.map +1 -0
- package/dist/cli/commands/seed.js +71 -0
- package/dist/cli/commands/seed.js.map +1 -0
- package/dist/cli/commands/user-2fa.d.ts +29 -0
- package/dist/cli/commands/user-2fa.d.ts.map +1 -0
- package/dist/cli/commands/user-2fa.js +113 -0
- package/dist/cli/commands/user-2fa.js.map +1 -0
- package/dist/cli/error-handler.d.ts +31 -0
- package/dist/cli/error-handler.d.ts.map +1 -0
- package/dist/cli/error-handler.js +65 -0
- package/dist/cli/error-handler.js.map +1 -0
- package/dist/cli/index.d.ts +48 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +94 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +124 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/prompt.d.ts +48 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +96 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/clients/cache.d.ts +63 -0
- package/dist/clients/cache.d.ts.map +1 -0
- package/dist/clients/cache.js +160 -0
- package/dist/clients/cache.js.map +1 -0
- package/dist/clients/crypto.d.ts +69 -0
- package/dist/clients/crypto.d.ts.map +1 -0
- package/dist/clients/crypto.js +83 -0
- package/dist/clients/crypto.js.map +1 -0
- package/dist/clients/errors.d.ts +27 -0
- package/dist/clients/errors.d.ts.map +1 -0
- package/dist/clients/errors.js +33 -0
- package/dist/clients/errors.js.map +1 -0
- package/dist/clients/index.d.ts +19 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +23 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/repository.d.ts +161 -0
- package/dist/clients/repository.d.ts.map +1 -0
- package/dist/clients/repository.js +318 -0
- package/dist/clients/repository.js.map +1 -0
- package/dist/clients/resolve-login-methods.d.ts +74 -0
- package/dist/clients/resolve-login-methods.d.ts.map +1 -0
- package/dist/clients/resolve-login-methods.js +68 -0
- package/dist/clients/resolve-login-methods.js.map +1 -0
- package/dist/clients/secret-repository.d.ts +109 -0
- package/dist/clients/secret-repository.d.ts.map +1 -0
- package/dist/clients/secret-repository.js +166 -0
- package/dist/clients/secret-repository.js.map +1 -0
- package/dist/clients/secret-service.d.ts +87 -0
- package/dist/clients/secret-service.d.ts.map +1 -0
- package/dist/clients/secret-service.js +204 -0
- package/dist/clients/secret-service.js.map +1 -0
- package/dist/clients/service.d.ts +158 -0
- package/dist/clients/service.d.ts.map +1 -0
- package/dist/clients/service.js +523 -0
- package/dist/clients/service.js.map +1 -0
- package/dist/clients/types.d.ts +214 -0
- package/dist/clients/types.d.ts.map +1 -0
- package/dist/clients/types.js +77 -0
- package/dist/clients/types.js.map +1 -0
- package/dist/clients/validators.d.ts +87 -0
- package/dist/clients/validators.d.ts.map +1 -0
- package/dist/clients/validators.js +164 -0
- package/dist/clients/validators.js.map +1 -0
- package/dist/config/index.d.ts +23 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +52 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +35 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +167 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/custom-claims/cache.d.ts +48 -0
- package/dist/custom-claims/cache.d.ts.map +1 -0
- package/dist/custom-claims/cache.js +122 -0
- package/dist/custom-claims/cache.js.map +1 -0
- package/dist/custom-claims/errors.d.ts +25 -0
- package/dist/custom-claims/errors.d.ts.map +1 -0
- package/dist/custom-claims/errors.js +31 -0
- package/dist/custom-claims/errors.js.map +1 -0
- package/dist/custom-claims/index.d.ts +14 -0
- package/dist/custom-claims/index.d.ts.map +1 -0
- package/dist/custom-claims/index.js +17 -0
- package/dist/custom-claims/index.js.map +1 -0
- package/dist/custom-claims/repository.d.ts +147 -0
- package/dist/custom-claims/repository.d.ts.map +1 -0
- package/dist/custom-claims/repository.js +338 -0
- package/dist/custom-claims/repository.js.map +1 -0
- package/dist/custom-claims/service.d.ts +129 -0
- package/dist/custom-claims/service.d.ts.map +1 -0
- package/dist/custom-claims/service.js +296 -0
- package/dist/custom-claims/service.js.map +1 -0
- package/dist/custom-claims/types.d.ts +132 -0
- package/dist/custom-claims/types.d.ts.map +1 -0
- package/dist/custom-claims/types.js +61 -0
- package/dist/custom-claims/types.js.map +1 -0
- package/dist/custom-claims/validators.d.ts +61 -0
- package/dist/custom-claims/validators.d.ts.map +1 -0
- package/dist/custom-claims/validators.js +136 -0
- package/dist/custom-claims/validators.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/admin-permissions.d.ts +147 -0
- package/dist/lib/admin-permissions.d.ts.map +1 -0
- package/dist/lib/admin-permissions.js +261 -0
- package/dist/lib/admin-permissions.js.map +1 -0
- package/dist/lib/audit-log.d.ts +45 -0
- package/dist/lib/audit-log.d.ts.map +1 -0
- package/dist/lib/audit-log.js +79 -0
- package/dist/lib/audit-log.js.map +1 -0
- package/dist/lib/branding-assets.d.ts +47 -0
- package/dist/lib/branding-assets.d.ts.map +1 -0
- package/dist/lib/branding-assets.js +93 -0
- package/dist/lib/branding-assets.js.map +1 -0
- package/dist/lib/bulk-operations.d.ts +54 -0
- package/dist/lib/bulk-operations.d.ts.map +1 -0
- package/dist/lib/bulk-operations.js +201 -0
- package/dist/lib/bulk-operations.js.map +1 -0
- package/dist/lib/cursor.d.ts +110 -0
- package/dist/lib/cursor.d.ts.map +1 -0
- package/dist/lib/cursor.js +115 -0
- package/dist/lib/cursor.js.map +1 -0
- package/dist/lib/data-export.d.ts +67 -0
- package/dist/lib/data-export.d.ts.map +1 -0
- package/dist/lib/data-export.js +272 -0
- package/dist/lib/data-export.js.map +1 -0
- package/dist/lib/data-import-plan.d.ts +50 -0
- package/dist/lib/data-import-plan.d.ts.map +1 -0
- package/dist/lib/data-import-plan.js +235 -0
- package/dist/lib/data-import-plan.js.map +1 -0
- package/dist/lib/data-import.d.ts +276 -0
- package/dist/lib/data-import.d.ts.map +1 -0
- package/dist/lib/data-import.js +1694 -0
- package/dist/lib/data-import.js.map +1 -0
- package/dist/lib/database.d.ts +22 -0
- package/dist/lib/database.d.ts.map +1 -0
- package/dist/lib/database.js +103 -0
- package/dist/lib/database.js.map +1 -0
- package/dist/lib/entity-history.d.ts +52 -0
- package/dist/lib/entity-history.d.ts.map +1 -0
- package/dist/lib/entity-history.js +121 -0
- package/dist/lib/entity-history.js.map +1 -0
- package/dist/lib/etag.d.ts +92 -0
- package/dist/lib/etag.d.ts.map +1 -0
- package/dist/lib/etag.js +155 -0
- package/dist/lib/etag.js.map +1 -0
- package/dist/lib/image-validator.d.ts +44 -0
- package/dist/lib/image-validator.d.ts.map +1 -0
- package/dist/lib/image-validator.js +204 -0
- package/dist/lib/image-validator.js.map +1 -0
- package/dist/lib/logger.d.ts +15 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +84 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/migrator.d.ts +14 -0
- package/dist/lib/migrator.d.ts.map +1 -0
- package/dist/lib/migrator.js +34 -0
- package/dist/lib/migrator.js.map +1 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.d.ts.map +1 -0
- package/dist/lib/redis.js +29 -0
- package/dist/lib/redis.js.map +1 -0
- package/dist/lib/runtime-paths.d.ts +38 -0
- package/dist/lib/runtime-paths.d.ts.map +1 -0
- package/dist/lib/runtime-paths.js +50 -0
- package/dist/lib/runtime-paths.js.map +1 -0
- package/dist/lib/session-tracking.d.ts +81 -0
- package/dist/lib/session-tracking.d.ts.map +1 -0
- package/dist/lib/session-tracking.js +145 -0
- package/dist/lib/session-tracking.js.map +1 -0
- package/dist/lib/signing-key-crypto.d.ts +53 -0
- package/dist/lib/signing-key-crypto.d.ts.map +1 -0
- package/dist/lib/signing-key-crypto.js +108 -0
- package/dist/lib/signing-key-crypto.js.map +1 -0
- package/dist/lib/signing-keys.d.ts +141 -0
- package/dist/lib/signing-keys.d.ts.map +1 -0
- package/dist/lib/signing-keys.js +206 -0
- package/dist/lib/signing-keys.js.map +1 -0
- package/dist/lib/stats.d.ts +83 -0
- package/dist/lib/stats.d.ts.map +1 -0
- package/dist/lib/stats.js +187 -0
- package/dist/lib/stats.js.map +1 -0
- package/dist/lib/super-admin-protection.d.ts +69 -0
- package/dist/lib/super-admin-protection.d.ts.map +1 -0
- package/dist/lib/super-admin-protection.js +102 -0
- package/dist/lib/super-admin-protection.js.map +1 -0
- package/dist/lib/system-config.d.ts +79 -0
- package/dist/lib/system-config.d.ts.map +1 -0
- package/dist/lib/system-config.js +159 -0
- package/dist/lib/system-config.js.map +1 -0
- package/dist/middleware/admin-auth.d.ts +100 -0
- package/dist/middleware/admin-auth.d.ts.map +1 -0
- package/dist/middleware/admin-auth.js +241 -0
- package/dist/middleware/admin-auth.js.map +1 -0
- package/dist/middleware/admin-cors.d.ts +41 -0
- package/dist/middleware/admin-cors.d.ts.map +1 -0
- package/dist/middleware/admin-cors.js +83 -0
- package/dist/middleware/admin-cors.js.map +1 -0
- package/dist/middleware/admin-mutation-audit.d.ts +9 -0
- package/dist/middleware/admin-mutation-audit.d.ts.map +1 -0
- package/dist/middleware/admin-mutation-audit.js +76 -0
- package/dist/middleware/admin-mutation-audit.js.map +1 -0
- package/dist/middleware/admin-rate-limiter.d.ts +56 -0
- package/dist/middleware/admin-rate-limiter.d.ts.map +1 -0
- package/dist/middleware/admin-rate-limiter.js +97 -0
- package/dist/middleware/admin-rate-limiter.js.map +1 -0
- package/dist/middleware/client-secret-hash.d.ts +34 -0
- package/dist/middleware/client-secret-hash.d.ts.map +1 -0
- package/dist/middleware/client-secret-hash.js +74 -0
- package/dist/middleware/client-secret-hash.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +3 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +93 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/health.d.ts +3 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/health.js +35 -0
- package/dist/middleware/health.js.map +1 -0
- package/dist/middleware/metrics.d.ts +40 -0
- package/dist/middleware/metrics.d.ts.map +1 -0
- package/dist/middleware/metrics.js +75 -0
- package/dist/middleware/metrics.js.map +1 -0
- package/dist/middleware/oidc-client-tenant.d.ts +37 -0
- package/dist/middleware/oidc-client-tenant.d.ts.map +1 -0
- package/dist/middleware/oidc-client-tenant.js +156 -0
- package/dist/middleware/oidc-client-tenant.js.map +1 -0
- package/dist/middleware/oidc-cors.d.ts +33 -0
- package/dist/middleware/oidc-cors.d.ts.map +1 -0
- package/dist/middleware/oidc-cors.js +68 -0
- package/dist/middleware/oidc-cors.js.map +1 -0
- package/dist/middleware/oidc-preflight-cors.d.ts +54 -0
- package/dist/middleware/oidc-preflight-cors.d.ts.map +1 -0
- package/dist/middleware/oidc-preflight-cors.js +267 -0
- package/dist/middleware/oidc-preflight-cors.js.map +1 -0
- package/dist/middleware/prompt-login-reset.d.ts +103 -0
- package/dist/middleware/prompt-login-reset.d.ts.map +1 -0
- package/dist/middleware/prompt-login-reset.js +204 -0
- package/dist/middleware/prompt-login-reset.js.map +1 -0
- package/dist/middleware/ready.d.ts +23 -0
- package/dist/middleware/ready.d.ts.map +1 -0
- package/dist/middleware/ready.js +60 -0
- package/dist/middleware/ready.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +27 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +46 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/middleware/require-permission.d.ts +28 -0
- package/dist/middleware/require-permission.d.ts.map +1 -0
- package/dist/middleware/require-permission.js +63 -0
- package/dist/middleware/require-permission.js.map +1 -0
- package/dist/middleware/require-user-organization.d.ts +18 -0
- package/dist/middleware/require-user-organization.d.ts.map +1 -0
- package/dist/middleware/require-user-organization.js +53 -0
- package/dist/middleware/require-user-organization.js.map +1 -0
- package/dist/middleware/root-page.d.ts +62 -0
- package/dist/middleware/root-page.d.ts.map +1 -0
- package/dist/middleware/root-page.js +134 -0
- package/dist/middleware/root-page.js.map +1 -0
- package/dist/middleware/security-headers.d.ts +98 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/security-headers.js +159 -0
- package/dist/middleware/security-headers.js.map +1 -0
- package/dist/middleware/tenant-resolver.d.ts +37 -0
- package/dist/middleware/tenant-resolver.d.ts.map +1 -0
- package/dist/middleware/tenant-resolver.js +71 -0
- package/dist/middleware/tenant-resolver.js.map +1 -0
- package/dist/middleware/token-rate-limiter.d.ts +89 -0
- package/dist/middleware/token-rate-limiter.d.ts.map +1 -0
- package/dist/middleware/token-rate-limiter.js +189 -0
- package/dist/middleware/token-rate-limiter.js.map +1 -0
- package/dist/oidc/account-finder.d.ts +52 -0
- package/dist/oidc/account-finder.d.ts.map +1 -0
- package/dist/oidc/account-finder.js +134 -0
- package/dist/oidc/account-finder.js.map +1 -0
- package/dist/oidc/adapter-factory.d.ts +90 -0
- package/dist/oidc/adapter-factory.d.ts.map +1 -0
- package/dist/oidc/adapter-factory.js +165 -0
- package/dist/oidc/adapter-factory.js.map +1 -0
- package/dist/oidc/configuration.d.ts +155 -0
- package/dist/oidc/configuration.d.ts.map +1 -0
- package/dist/oidc/configuration.js +531 -0
- package/dist/oidc/configuration.js.map +1 -0
- package/dist/oidc/postgres-adapter.d.ts +159 -0
- package/dist/oidc/postgres-adapter.d.ts.map +1 -0
- package/dist/oidc/postgres-adapter.js +222 -0
- package/dist/oidc/postgres-adapter.js.map +1 -0
- package/dist/oidc/protocol-security-observer.d.ts +38 -0
- package/dist/oidc/protocol-security-observer.d.ts.map +1 -0
- package/dist/oidc/protocol-security-observer.js +93 -0
- package/dist/oidc/protocol-security-observer.js.map +1 -0
- package/dist/oidc/provider.d.ts +37 -0
- package/dist/oidc/provider.d.ts.map +1 -0
- package/dist/oidc/provider.js +71 -0
- package/dist/oidc/provider.js.map +1 -0
- package/dist/oidc/redis-adapter.d.ts +140 -0
- package/dist/oidc/redis-adapter.d.ts.map +1 -0
- package/dist/oidc/redis-adapter.js +344 -0
- package/dist/oidc/redis-adapter.js.map +1 -0
- package/dist/organizations/cache.d.ts +60 -0
- package/dist/organizations/cache.d.ts.map +1 -0
- package/dist/organizations/cache.js +157 -0
- package/dist/organizations/cache.js.map +1 -0
- package/dist/organizations/errors.d.ts +25 -0
- package/dist/organizations/errors.d.ts.map +1 -0
- package/dist/organizations/errors.js +31 -0
- package/dist/organizations/errors.js.map +1 -0
- package/dist/organizations/index.d.ts +15 -0
- package/dist/organizations/index.d.ts.map +1 -0
- package/dist/organizations/index.js +15 -0
- package/dist/organizations/index.js.map +1 -0
- package/dist/organizations/repository.d.ts +183 -0
- package/dist/organizations/repository.d.ts.map +1 -0
- package/dist/organizations/repository.js +354 -0
- package/dist/organizations/repository.js.map +1 -0
- package/dist/organizations/service.d.ts +168 -0
- package/dist/organizations/service.d.ts.map +1 -0
- package/dist/organizations/service.js +511 -0
- package/dist/organizations/service.js.map +1 -0
- package/dist/organizations/slugs.d.ts +57 -0
- package/dist/organizations/slugs.d.ts.map +1 -0
- package/dist/organizations/slugs.js +130 -0
- package/dist/organizations/slugs.js.map +1 -0
- package/dist/organizations/types.d.ts +146 -0
- package/dist/organizations/types.d.ts.map +1 -0
- package/dist/organizations/types.js +49 -0
- package/dist/organizations/types.js.map +1 -0
- package/dist/rbac/cache.d.ts +110 -0
- package/dist/rbac/cache.d.ts.map +1 -0
- package/dist/rbac/cache.js +271 -0
- package/dist/rbac/cache.js.map +1 -0
- package/dist/rbac/errors.d.ts +34 -0
- package/dist/rbac/errors.d.ts.map +1 -0
- package/dist/rbac/errors.js +43 -0
- package/dist/rbac/errors.js.map +1 -0
- package/dist/rbac/index.d.ts +17 -0
- package/dist/rbac/index.d.ts.map +1 -0
- package/dist/rbac/index.js +21 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/rbac/mapping-repository.d.ts +121 -0
- package/dist/rbac/mapping-repository.d.ts.map +1 -0
- package/dist/rbac/mapping-repository.js +224 -0
- package/dist/rbac/mapping-repository.js.map +1 -0
- package/dist/rbac/permission-repository.d.ts +100 -0
- package/dist/rbac/permission-repository.d.ts.map +1 -0
- package/dist/rbac/permission-repository.js +190 -0
- package/dist/rbac/permission-repository.js.map +1 -0
- package/dist/rbac/permission-service.d.ts +85 -0
- package/dist/rbac/permission-service.d.ts.map +1 -0
- package/dist/rbac/permission-service.js +179 -0
- package/dist/rbac/permission-service.js.map +1 -0
- package/dist/rbac/role-repository.d.ts +104 -0
- package/dist/rbac/role-repository.d.ts.map +1 -0
- package/dist/rbac/role-repository.js +202 -0
- package/dist/rbac/role-repository.js.map +1 -0
- package/dist/rbac/role-service.d.ts +111 -0
- package/dist/rbac/role-service.d.ts.map +1 -0
- package/dist/rbac/role-service.js +256 -0
- package/dist/rbac/role-service.js.map +1 -0
- package/dist/rbac/slugs.d.ts +116 -0
- package/dist/rbac/slugs.d.ts.map +1 -0
- package/dist/rbac/slugs.js +178 -0
- package/dist/rbac/slugs.js.map +1 -0
- package/dist/rbac/types.d.ts +187 -0
- package/dist/rbac/types.d.ts.map +1 -0
- package/dist/rbac/types.js +75 -0
- package/dist/rbac/types.js.map +1 -0
- package/dist/rbac/user-role-service.d.ts +101 -0
- package/dist/rbac/user-role-service.d.ts.map +1 -0
- package/dist/rbac/user-role-service.js +166 -0
- package/dist/rbac/user-role-service.js.map +1 -0
- package/dist/routes/applications.d.ts +40 -0
- package/dist/routes/applications.d.ts.map +1 -0
- package/dist/routes/applications.js +284 -0
- package/dist/routes/applications.js.map +1 -0
- package/dist/routes/audit.d.ts +31 -0
- package/dist/routes/audit.d.ts.map +1 -0
- package/dist/routes/audit.js +140 -0
- package/dist/routes/audit.js.map +1 -0
- package/dist/routes/branding.d.ts +17 -0
- package/dist/routes/branding.d.ts.map +1 -0
- package/dist/routes/branding.js +104 -0
- package/dist/routes/branding.js.map +1 -0
- package/dist/routes/bulk.d.ts +37 -0
- package/dist/routes/bulk.d.ts.map +1 -0
- package/dist/routes/bulk.js +94 -0
- package/dist/routes/bulk.js.map +1 -0
- package/dist/routes/clients.d.ts +44 -0
- package/dist/routes/clients.d.ts.map +1 -0
- package/dist/routes/clients.js +353 -0
- package/dist/routes/clients.js.map +1 -0
- package/dist/routes/config.d.ts +35 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +115 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/custom-claims.d.ts +38 -0
- package/dist/routes/custom-claims.d.ts.map +1 -0
- package/dist/routes/custom-claims.js +208 -0
- package/dist/routes/custom-claims.js.map +1 -0
- package/dist/routes/exports.d.ts +21 -0
- package/dist/routes/exports.d.ts.map +1 -0
- package/dist/routes/exports.js +98 -0
- package/dist/routes/exports.js.map +1 -0
- package/dist/routes/imports.d.ts +18 -0
- package/dist/routes/imports.d.ts.map +1 -0
- package/dist/routes/imports.js +72 -0
- package/dist/routes/imports.js.map +1 -0
- package/dist/routes/interactions.d.ts +111 -0
- package/dist/routes/interactions.d.ts.map +1 -0
- package/dist/routes/interactions.js +1074 -0
- package/dist/routes/interactions.js.map +1 -0
- package/dist/routes/invitation.d.ts +31 -0
- package/dist/routes/invitation.d.ts.map +1 -0
- package/dist/routes/invitation.js +342 -0
- package/dist/routes/invitation.js.map +1 -0
- package/dist/routes/keys.d.ts +28 -0
- package/dist/routes/keys.d.ts.map +1 -0
- package/dist/routes/keys.js +91 -0
- package/dist/routes/keys.js.map +1 -0
- package/dist/routes/magic-link.d.ts +43 -0
- package/dist/routes/magic-link.d.ts.map +1 -0
- package/dist/routes/magic-link.js +264 -0
- package/dist/routes/magic-link.js.map +1 -0
- package/dist/routes/organizations.d.ts +38 -0
- package/dist/routes/organizations.d.ts.map +1 -0
- package/dist/routes/organizations.js +347 -0
- package/dist/routes/organizations.js.map +1 -0
- package/dist/routes/password-reset.d.ts +65 -0
- package/dist/routes/password-reset.d.ts.map +1 -0
- package/dist/routes/password-reset.js +493 -0
- package/dist/routes/password-reset.js.map +1 -0
- package/dist/routes/permissions.d.ts +33 -0
- package/dist/routes/permissions.d.ts.map +1 -0
- package/dist/routes/permissions.js +166 -0
- package/dist/routes/permissions.js.map +1 -0
- package/dist/routes/roles.d.ts +37 -0
- package/dist/routes/roles.d.ts.map +1 -0
- package/dist/routes/roles.js +222 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/sessions.d.ts +37 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +121 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/stats.d.ts +28 -0
- package/dist/routes/stats.d.ts.map +1 -0
- package/dist/routes/stats.js +65 -0
- package/dist/routes/stats.js.map +1 -0
- package/dist/routes/two-factor-admin.d.ts +54 -0
- package/dist/routes/two-factor-admin.d.ts.map +1 -0
- package/dist/routes/two-factor-admin.js +344 -0
- package/dist/routes/two-factor-admin.js.map +1 -0
- package/dist/routes/two-factor.d.ts +31 -0
- package/dist/routes/two-factor.d.ts.map +1 -0
- package/dist/routes/two-factor.js +595 -0
- package/dist/routes/two-factor.js.map +1 -0
- package/dist/routes/user-roles.d.ts +33 -0
- package/dist/routes/user-roles.d.ts.map +1 -0
- package/dist/routes/user-roles.js +129 -0
- package/dist/routes/user-roles.js.map +1 -0
- package/dist/routes/users.d.ts +61 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +868 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/security/decision-context.d.ts +52 -0
- package/dist/security/decision-context.d.ts.map +1 -0
- package/dist/security/decision-context.js +150 -0
- package/dist/security/decision-context.js.map +1 -0
- package/dist/security/decision-event.d.ts +128 -0
- package/dist/security/decision-event.d.ts.map +1 -0
- package/dist/security/decision-event.js +225 -0
- package/dist/security/decision-event.js.map +1 -0
- package/dist/security/transport-decision.d.ts +6 -0
- package/dist/security/transport-decision.d.ts.map +1 -0
- package/dist/security/transport-decision.js +37 -0
- package/dist/security/transport-decision.js.map +1 -0
- package/dist/server.d.ts +50 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +491 -0
- package/dist/server.js.map +1 -0
- package/dist/two-factor/cache.d.ts +47 -0
- package/dist/two-factor/cache.d.ts.map +1 -0
- package/dist/two-factor/cache.js +122 -0
- package/dist/two-factor/cache.js.map +1 -0
- package/dist/two-factor/crypto.d.ts +41 -0
- package/dist/two-factor/crypto.d.ts.map +1 -0
- package/dist/two-factor/crypto.js +94 -0
- package/dist/two-factor/crypto.js.map +1 -0
- package/dist/two-factor/errors.d.ts +82 -0
- package/dist/two-factor/errors.d.ts.map +1 -0
- package/dist/two-factor/errors.js +112 -0
- package/dist/two-factor/errors.js.map +1 -0
- package/dist/two-factor/index.d.ts +18 -0
- package/dist/two-factor/index.d.ts.map +1 -0
- package/dist/two-factor/index.js +25 -0
- package/dist/two-factor/index.js.map +1 -0
- package/dist/two-factor/otp.d.ts +43 -0
- package/dist/two-factor/otp.d.ts.map +1 -0
- package/dist/two-factor/otp.js +57 -0
- package/dist/two-factor/otp.js.map +1 -0
- package/dist/two-factor/recovery.d.ts +45 -0
- package/dist/two-factor/recovery.d.ts.map +1 -0
- package/dist/two-factor/recovery.js +104 -0
- package/dist/two-factor/recovery.js.map +1 -0
- package/dist/two-factor/repository.d.ts +156 -0
- package/dist/two-factor/repository.d.ts.map +1 -0
- package/dist/two-factor/repository.js +251 -0
- package/dist/two-factor/repository.js.map +1 -0
- package/dist/two-factor/service.d.ts +232 -0
- package/dist/two-factor/service.d.ts.map +1 -0
- package/dist/two-factor/service.js +599 -0
- package/dist/two-factor/service.js.map +1 -0
- package/dist/two-factor/totp.d.ts +57 -0
- package/dist/two-factor/totp.d.ts.map +1 -0
- package/dist/two-factor/totp.js +96 -0
- package/dist/two-factor/totp.js.map +1 -0
- package/dist/two-factor/types.d.ts +152 -0
- package/dist/two-factor/types.d.ts.map +1 -0
- package/dist/two-factor/types.js +64 -0
- package/dist/two-factor/types.js.map +1 -0
- package/dist/users/cache.d.ts +49 -0
- package/dist/users/cache.d.ts.map +1 -0
- package/dist/users/cache.js +140 -0
- package/dist/users/cache.js.map +1 -0
- package/dist/users/claims.d.ts +67 -0
- package/dist/users/claims.d.ts.map +1 -0
- package/dist/users/claims.js +104 -0
- package/dist/users/claims.js.map +1 -0
- package/dist/users/errors.d.ts +25 -0
- package/dist/users/errors.d.ts.map +1 -0
- package/dist/users/errors.js +31 -0
- package/dist/users/errors.js.map +1 -0
- package/dist/users/gdpr.d.ts +110 -0
- package/dist/users/gdpr.d.ts.map +1 -0
- package/dist/users/gdpr.js +211 -0
- package/dist/users/gdpr.js.map +1 -0
- package/dist/users/index.d.ts +20 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +19 -0
- package/dist/users/index.js.map +1 -0
- package/dist/users/password.d.ts +85 -0
- package/dist/users/password.d.ts.map +1 -0
- package/dist/users/password.js +138 -0
- package/dist/users/password.js.map +1 -0
- package/dist/users/repository.d.ts +263 -0
- package/dist/users/repository.d.ts.map +1 -0
- package/dist/users/repository.js +499 -0
- package/dist/users/repository.js.map +1 -0
- package/dist/users/service.d.ts +299 -0
- package/dist/users/service.d.ts.map +1 -0
- package/dist/users/service.js +698 -0
- package/dist/users/service.js.map +1 -0
- package/dist/users/types.d.ts +220 -0
- package/dist/users/types.d.ts.map +1 -0
- package/dist/users/types.js +77 -0
- package/dist/users/types.js.map +1 -0
- package/locales/default/en/common.json +10 -0
- package/locales/default/en/consent.json +13 -0
- package/locales/default/en/emails.json +17 -0
- package/locales/default/en/errors.json +21 -0
- package/locales/default/en/forgot-password.json +11 -0
- package/locales/default/en/invitation.json +18 -0
- package/locales/default/en/login.json +17 -0
- package/locales/default/en/logout.json +9 -0
- package/locales/default/en/magic-link.json +12 -0
- package/locales/default/en/reset-password.json +16 -0
- package/locales/default/en/two-factor.json +29 -0
- package/migrations/.gitkeep +0 -0
- package/migrations/001_extensions.sql +22 -0
- package/migrations/002_organizations.sql +43 -0
- package/migrations/003_applications.sql +50 -0
- package/migrations/004_clients.sql +74 -0
- package/migrations/005_users.sql +119 -0
- package/migrations/006_roles_permissions.sql +80 -0
- package/migrations/007_custom_claims.sql +55 -0
- package/migrations/008_config.sql +51 -0
- package/migrations/009_audit_log.sql +31 -0
- package/migrations/010_oidc_adapter.sql +34 -0
- package/migrations/011_seed.sql +53 -0
- package/migrations/012_two_factor.sql +88 -0
- package/migrations/013_client_secret_sha256.sql +22 -0
- package/migrations/014_login_methods.sql +34 -0
- package/migrations/015_signing_key_encryption.sql +20 -0
- package/migrations/016_failed_login_count.sql +27 -0
- package/migrations/017_audit_retention.sql +11 -0
- package/migrations/018_admin_api_enhancements.sql +78 -0
- package/migrations/019_invitation_details.sql +27 -0
- package/migrations/020_two_factor_admin_permission.sql +108 -0
- package/migrations/021_auth_recovery_jobs.sql +74 -0
- package/migrations/022_recovery_artifact_ownership.sql +25 -0
- package/migrations/023_magic_link_authority.sql +39 -0
- package/package.json +106 -0
- package/templates/default/emails/invitation.hbs +39 -0
- package/templates/default/emails/invitation.txt.hbs +18 -0
- package/templates/default/emails/magic-link.hbs +30 -0
- package/templates/default/emails/magic-link.txt.hbs +11 -0
- package/templates/default/emails/otp-code.hbs +31 -0
- package/templates/default/emails/otp-code.txt.hbs +15 -0
- package/templates/default/emails/password-changed.hbs +24 -0
- package/templates/default/emails/password-changed.txt.hbs +7 -0
- package/templates/default/emails/password-reset.hbs +30 -0
- package/templates/default/emails/password-reset.txt.hbs +11 -0
- package/templates/default/emails/welcome.hbs +25 -0
- package/templates/default/emails/welcome.txt.hbs +9 -0
- package/templates/default/layouts/main.hbs +49 -0
- package/templates/default/pages/accept-invite.hbs +25 -0
- package/templates/default/pages/consent.hbs +27 -0
- package/templates/default/pages/error.hbs +15 -0
- package/templates/default/pages/forgot-password.hbs +21 -0
- package/templates/default/pages/invite-expired.hbs +6 -0
- package/templates/default/pages/invite-success.hbs +9 -0
- package/templates/default/pages/login.hbs +108 -0
- package/templates/default/pages/logout-success.hbs +5 -0
- package/templates/default/pages/logout.hbs +24 -0
- package/templates/default/pages/magic-link-sent.hbs +10 -0
- package/templates/default/pages/magic-link-success.hbs +17 -0
- package/templates/default/pages/reset-password.hbs +20 -0
- package/templates/default/pages/reset-success.hbs +9 -0
- package/templates/default/pages/two-factor-setup.hbs +65 -0
- package/templates/default/pages/two-factor-verify.hbs +77 -0
- package/templates/default/partials/flash-messages.hbs +10 -0
- package/templates/default/partials/footer.hbs +4 -0
- package/templates/default/partials/header.hbs +8 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom claims service — business logic layer.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates claim definition CRUD, value management, and token claims
|
|
5
|
+
* building. This is the primary public interface for the custom-claims
|
|
6
|
+
* module — callers should use these functions instead of accessing the
|
|
7
|
+
* repository or cache directly.
|
|
8
|
+
*
|
|
9
|
+
* Responsibilities:
|
|
10
|
+
* - Validate claim names (reserved, format) before create
|
|
11
|
+
* - Enforce uniqueness (application_id + claim_name)
|
|
12
|
+
* - Validate value types against definition types before set
|
|
13
|
+
* - Cache orchestration for definitions (cache-first reads, invalidation on writes)
|
|
14
|
+
* - Audit logging for all write operations (fire-and-forget)
|
|
15
|
+
* - Build custom claims for token issuance (filtered by token type)
|
|
16
|
+
*
|
|
17
|
+
* @see repository.ts — Database operations
|
|
18
|
+
* @see cache.ts — Redis cache for definitions
|
|
19
|
+
* @see validators.ts — Name and value validation
|
|
20
|
+
*/
|
|
21
|
+
import { insertDefinition as repoInsertDefinition, findDefinitionById as repoFindDefinitionById, updateDefinition as repoUpdateDefinition, deleteDefinition as repoDeleteDefinition, listDefinitionsByApplication as repoListDefinitions, claimNameExists, upsertValue as repoUpsertValue, findValue as repoFindValue, deleteValue as repoDeleteValue, getValuesForUser as repoGetValuesForUser, getValuesForUserByApp, } from './repository.js';
|
|
22
|
+
import { getCachedDefinitions, setCachedDefinitions, invalidateDefinitionsCache, } from './cache.js';
|
|
23
|
+
import { validateClaimName, validateClaimValue } from './validators.js';
|
|
24
|
+
import { ClaimNotFoundError, ClaimValidationError } from './errors.js';
|
|
25
|
+
import { writeAuditLog } from '../lib/audit-log.js';
|
|
26
|
+
// ===========================================================================
|
|
27
|
+
// Definition Management
|
|
28
|
+
// ===========================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Create a custom claim definition for an application.
|
|
31
|
+
*
|
|
32
|
+
* Validates the claim name is not reserved, matches the required format,
|
|
33
|
+
* and is unique within the application. Invalidates the definitions cache
|
|
34
|
+
* after successful creation.
|
|
35
|
+
*
|
|
36
|
+
* @param input - Definition data to create
|
|
37
|
+
* @returns The newly created definition
|
|
38
|
+
* @throws ClaimValidationError if name is reserved, invalid format, or duplicate
|
|
39
|
+
*/
|
|
40
|
+
export async function createDefinition(input) {
|
|
41
|
+
// 1. Validate claim name format and reserved names
|
|
42
|
+
const nameValidation = validateClaimName(input.claimName);
|
|
43
|
+
if (!nameValidation.valid) {
|
|
44
|
+
throw new ClaimValidationError(nameValidation.reason);
|
|
45
|
+
}
|
|
46
|
+
// 2. Check uniqueness within the application
|
|
47
|
+
const exists = await claimNameExists(input.applicationId, input.claimName);
|
|
48
|
+
if (exists) {
|
|
49
|
+
throw new ClaimValidationError(`Claim name '${input.claimName}' already exists for this application`);
|
|
50
|
+
}
|
|
51
|
+
// 3. Insert into database
|
|
52
|
+
const definition = await repoInsertDefinition(input);
|
|
53
|
+
// 4. Invalidate definitions cache for this application
|
|
54
|
+
await invalidateDefinitionsCache(input.applicationId);
|
|
55
|
+
// 5. Audit log (fire-and-forget)
|
|
56
|
+
void writeAuditLog({
|
|
57
|
+
eventType: 'claim.defined',
|
|
58
|
+
eventCategory: 'admin',
|
|
59
|
+
metadata: {
|
|
60
|
+
definitionId: definition.id,
|
|
61
|
+
applicationId: definition.applicationId,
|
|
62
|
+
claimName: definition.claimName,
|
|
63
|
+
claimType: definition.claimType,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
return definition;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Update a claim definition (inclusion flags and description only).
|
|
70
|
+
*
|
|
71
|
+
* claimName and claimType cannot be changed — they define the claim's
|
|
72
|
+
* identity. Invalidates the definitions cache after update.
|
|
73
|
+
*
|
|
74
|
+
* @param id - Definition UUID
|
|
75
|
+
* @param input - Fields to update
|
|
76
|
+
* @returns Updated definition
|
|
77
|
+
* @throws ClaimNotFoundError if definition not found
|
|
78
|
+
*/
|
|
79
|
+
export async function updateDefinition(id, input) {
|
|
80
|
+
// 1. Verify definition exists (needed to get applicationId for cache invalidation)
|
|
81
|
+
const existing = await repoFindDefinitionById(id);
|
|
82
|
+
if (!existing) {
|
|
83
|
+
throw new ClaimNotFoundError(id);
|
|
84
|
+
}
|
|
85
|
+
// 2. Update in database
|
|
86
|
+
const updated = await repoUpdateDefinition(id, input);
|
|
87
|
+
// 3. Invalidate definitions cache for this application
|
|
88
|
+
await invalidateDefinitionsCache(existing.applicationId);
|
|
89
|
+
// 4. Audit log (fire-and-forget)
|
|
90
|
+
void writeAuditLog({
|
|
91
|
+
eventType: 'claim.updated',
|
|
92
|
+
eventCategory: 'admin',
|
|
93
|
+
metadata: {
|
|
94
|
+
definitionId: id,
|
|
95
|
+
applicationId: existing.applicationId,
|
|
96
|
+
claimName: existing.claimName,
|
|
97
|
+
changes: input,
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
return updated;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Delete a claim definition (cascades to all associated values).
|
|
104
|
+
*
|
|
105
|
+
* Invalidates the definitions cache after deletion.
|
|
106
|
+
*
|
|
107
|
+
* @param id - Definition UUID
|
|
108
|
+
* @throws ClaimNotFoundError if definition not found
|
|
109
|
+
*/
|
|
110
|
+
export async function deleteDefinition(id) {
|
|
111
|
+
// 1. Verify definition exists (needed for cache invalidation and audit)
|
|
112
|
+
const existing = await repoFindDefinitionById(id);
|
|
113
|
+
if (!existing) {
|
|
114
|
+
throw new ClaimNotFoundError(id);
|
|
115
|
+
}
|
|
116
|
+
// 2. Delete from database (CASCADE removes values)
|
|
117
|
+
await repoDeleteDefinition(id);
|
|
118
|
+
// 3. Invalidate definitions cache for this application
|
|
119
|
+
await invalidateDefinitionsCache(existing.applicationId);
|
|
120
|
+
// 4. Audit log (fire-and-forget)
|
|
121
|
+
void writeAuditLog({
|
|
122
|
+
eventType: 'claim.deleted',
|
|
123
|
+
eventCategory: 'admin',
|
|
124
|
+
metadata: {
|
|
125
|
+
definitionId: id,
|
|
126
|
+
applicationId: existing.applicationId,
|
|
127
|
+
claimName: existing.claimName,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Find a claim definition by ID.
|
|
133
|
+
*
|
|
134
|
+
* @param id - Definition UUID
|
|
135
|
+
* @returns Definition or null if not found
|
|
136
|
+
*/
|
|
137
|
+
export async function findDefinitionById(id) {
|
|
138
|
+
return repoFindDefinitionById(id);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* List all claim definitions for an application. Cache-first.
|
|
142
|
+
*
|
|
143
|
+
* Checks Redis cache first. On cache miss, queries the database
|
|
144
|
+
* and populates the cache for subsequent requests.
|
|
145
|
+
*
|
|
146
|
+
* @param applicationId - Application UUID
|
|
147
|
+
* @returns Array of definitions
|
|
148
|
+
*/
|
|
149
|
+
export async function listDefinitions(applicationId) {
|
|
150
|
+
// 1. Check cache
|
|
151
|
+
const cached = await getCachedDefinitions(applicationId);
|
|
152
|
+
if (cached !== null) {
|
|
153
|
+
return cached;
|
|
154
|
+
}
|
|
155
|
+
// 2. Cache miss — query database
|
|
156
|
+
const definitions = await repoListDefinitions(applicationId);
|
|
157
|
+
// 3. Cache the result
|
|
158
|
+
await setCachedDefinitions(applicationId, definitions);
|
|
159
|
+
return definitions;
|
|
160
|
+
}
|
|
161
|
+
// ===========================================================================
|
|
162
|
+
// Value Management
|
|
163
|
+
// ===========================================================================
|
|
164
|
+
/**
|
|
165
|
+
* Set a custom claim value for a user.
|
|
166
|
+
*
|
|
167
|
+
* Validates that the claim definition exists and the value matches
|
|
168
|
+
* the definition's claim type. Uses upsert semantics (insert or update).
|
|
169
|
+
*
|
|
170
|
+
* @param userId - User UUID
|
|
171
|
+
* @param claimId - Definition UUID
|
|
172
|
+
* @param value - The value to set (must match definition's claimType)
|
|
173
|
+
* @returns The upserted claim value
|
|
174
|
+
* @throws ClaimNotFoundError if definition not found
|
|
175
|
+
* @throws ClaimValidationError if value type mismatch
|
|
176
|
+
*/
|
|
177
|
+
export async function setValue(userId, claimId, value) {
|
|
178
|
+
// 1. Verify definition exists and get its type
|
|
179
|
+
const definition = await repoFindDefinitionById(claimId);
|
|
180
|
+
if (!definition) {
|
|
181
|
+
throw new ClaimNotFoundError(claimId);
|
|
182
|
+
}
|
|
183
|
+
// 2. Validate value matches definition type
|
|
184
|
+
const valueValidation = validateClaimValue(definition.claimType, value);
|
|
185
|
+
if (!valueValidation.valid) {
|
|
186
|
+
throw new ClaimValidationError(valueValidation.reason);
|
|
187
|
+
}
|
|
188
|
+
// 3. Upsert the value
|
|
189
|
+
const result = await repoUpsertValue(userId, claimId, value);
|
|
190
|
+
// 4. Audit log (fire-and-forget)
|
|
191
|
+
void writeAuditLog({
|
|
192
|
+
eventType: 'claim.value.set',
|
|
193
|
+
eventCategory: 'admin',
|
|
194
|
+
userId,
|
|
195
|
+
metadata: {
|
|
196
|
+
definitionId: claimId,
|
|
197
|
+
claimName: definition.claimName,
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get a specific claim value for a user.
|
|
204
|
+
*
|
|
205
|
+
* @param userId - User UUID
|
|
206
|
+
* @param claimId - Definition UUID
|
|
207
|
+
* @returns Claim value or null if not set
|
|
208
|
+
*/
|
|
209
|
+
export async function getValue(userId, claimId) {
|
|
210
|
+
return repoFindValue(userId, claimId);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Delete a claim value for a user.
|
|
214
|
+
*
|
|
215
|
+
* @param userId - User UUID
|
|
216
|
+
* @param claimId - Definition UUID
|
|
217
|
+
* @throws ClaimNotFoundError if value not found
|
|
218
|
+
*/
|
|
219
|
+
export async function deleteValue(userId, claimId) {
|
|
220
|
+
const deleted = await repoDeleteValue(userId, claimId);
|
|
221
|
+
if (!deleted) {
|
|
222
|
+
throw new ClaimNotFoundError(`value for user ${userId}, claim ${claimId}`);
|
|
223
|
+
}
|
|
224
|
+
// Audit log (fire-and-forget)
|
|
225
|
+
void writeAuditLog({
|
|
226
|
+
eventType: 'claim.value.deleted',
|
|
227
|
+
eventCategory: 'admin',
|
|
228
|
+
userId,
|
|
229
|
+
metadata: { definitionId: claimId },
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get all claim values for a user (across all applications).
|
|
234
|
+
*
|
|
235
|
+
* Returns joined definition+value pairs for admin views.
|
|
236
|
+
*
|
|
237
|
+
* @param userId - User UUID
|
|
238
|
+
* @returns Array of definition+value pairs
|
|
239
|
+
*/
|
|
240
|
+
export async function getValuesForUser(userId) {
|
|
241
|
+
return repoGetValuesForUser(userId);
|
|
242
|
+
}
|
|
243
|
+
// ===========================================================================
|
|
244
|
+
// Token Claims Building
|
|
245
|
+
// ===========================================================================
|
|
246
|
+
/**
|
|
247
|
+
* Build custom claims for inclusion in a token.
|
|
248
|
+
*
|
|
249
|
+
* Resolves the user's custom claim values for the specified application,
|
|
250
|
+
* filtered by the token type (id_token, access_token, or userinfo).
|
|
251
|
+
* Returns a flat object: { claimName: value, ... }
|
|
252
|
+
*
|
|
253
|
+
* Token type filtering:
|
|
254
|
+
* - id_token → only claims where includeInIdToken is true
|
|
255
|
+
* - access_token → only claims where includeInAccessToken is true
|
|
256
|
+
* - userinfo → only claims where includeInUserinfo is true
|
|
257
|
+
*
|
|
258
|
+
* @param userId - The user whose claims to resolve
|
|
259
|
+
* @param applicationId - The application whose claim definitions to use
|
|
260
|
+
* @param tokenType - Which token type is being built
|
|
261
|
+
* @returns Flat object with claim names as keys and values
|
|
262
|
+
*/
|
|
263
|
+
export async function buildCustomClaims(userId, applicationId, tokenType) {
|
|
264
|
+
// 1. Query all user's claim values for this application (with definitions)
|
|
265
|
+
const claimsWithValues = await getValuesForUserByApp(userId, applicationId);
|
|
266
|
+
// 2. Filter by token type inclusion flag and build result
|
|
267
|
+
const result = {};
|
|
268
|
+
for (const { definition, value } of claimsWithValues) {
|
|
269
|
+
// Check the appropriate inclusion flag based on token type
|
|
270
|
+
const included = isClaimIncluded(definition, tokenType);
|
|
271
|
+
if (included) {
|
|
272
|
+
result[definition.claimName] = value.value;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return result;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Check whether a claim definition should be included for a specific token type.
|
|
279
|
+
*
|
|
280
|
+
* @param definition - The claim definition with inclusion flags
|
|
281
|
+
* @param tokenType - The token type being built
|
|
282
|
+
* @returns true if the claim should be included
|
|
283
|
+
*/
|
|
284
|
+
function isClaimIncluded(definition, tokenType) {
|
|
285
|
+
switch (tokenType) {
|
|
286
|
+
case 'id_token':
|
|
287
|
+
return definition.includeInIdToken;
|
|
288
|
+
case 'access_token':
|
|
289
|
+
return definition.includeInAccessToken;
|
|
290
|
+
case 'userinfo':
|
|
291
|
+
return definition.includeInUserinfo;
|
|
292
|
+
default:
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/custom-claims/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom claims types and interfaces.
|
|
3
|
+
*
|
|
4
|
+
* Defines the data structures for custom claim definitions and values.
|
|
5
|
+
* Definitions are per-application (which claims exist and where to include
|
|
6
|
+
* them), values are per-user (actual claim data stored as JSONB).
|
|
7
|
+
*
|
|
8
|
+
* Includes database row interfaces, input types for create/update, a
|
|
9
|
+
* convenience joined type, and mapping functions to convert snake_case
|
|
10
|
+
* database rows to camelCase TypeScript objects.
|
|
11
|
+
*
|
|
12
|
+
* Database tables: custom_claim_definitions, custom_claim_values
|
|
13
|
+
* (see migration 007_custom_claims.sql)
|
|
14
|
+
*/
|
|
15
|
+
/** Supported custom claim value types (stored in claim_type column) */
|
|
16
|
+
export type ClaimType = 'string' | 'number' | 'boolean' | 'json';
|
|
17
|
+
/** Token types where a claim can be included — used for filtering at issuance */
|
|
18
|
+
export type TokenType = 'id_token' | 'access_token' | 'userinfo';
|
|
19
|
+
/**
|
|
20
|
+
* Full claim definition record as stored in the database.
|
|
21
|
+
* Maps to the `custom_claim_definitions` table columns (see migration 007).
|
|
22
|
+
* Definitions are scoped to an application — each app can have its own set
|
|
23
|
+
* of custom claims with independent inclusion rules.
|
|
24
|
+
*/
|
|
25
|
+
export interface CustomClaimDefinition {
|
|
26
|
+
id: string;
|
|
27
|
+
applicationId: string;
|
|
28
|
+
claimName: string;
|
|
29
|
+
claimType: ClaimType;
|
|
30
|
+
description: string | null;
|
|
31
|
+
includeInIdToken: boolean;
|
|
32
|
+
includeInAccessToken: boolean;
|
|
33
|
+
includeInUserinfo: boolean;
|
|
34
|
+
createdAt: Date;
|
|
35
|
+
updatedAt: Date;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Raw database row from the custom_claim_definitions table (snake_case columns).
|
|
39
|
+
* Used by the repository layer; mapped to CustomClaimDefinition via mapRowToDefinition().
|
|
40
|
+
*/
|
|
41
|
+
export interface CustomClaimDefinitionRow {
|
|
42
|
+
id: string;
|
|
43
|
+
application_id: string;
|
|
44
|
+
claim_name: string;
|
|
45
|
+
claim_type: string;
|
|
46
|
+
description: string | null;
|
|
47
|
+
include_in_id_token: boolean;
|
|
48
|
+
include_in_access_token: boolean;
|
|
49
|
+
include_in_userinfo: boolean;
|
|
50
|
+
created_at: Date;
|
|
51
|
+
updated_at: Date;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Input for creating a new claim definition.
|
|
55
|
+
* claimName and claimType are required and immutable once created.
|
|
56
|
+
* Token inclusion flags default to: id_token=false, access_token=true, userinfo=true.
|
|
57
|
+
*/
|
|
58
|
+
export interface CreateClaimDefinitionInput {
|
|
59
|
+
applicationId: string;
|
|
60
|
+
claimName: string;
|
|
61
|
+
claimType: ClaimType;
|
|
62
|
+
description?: string;
|
|
63
|
+
includeInIdToken?: boolean;
|
|
64
|
+
includeInAccessToken?: boolean;
|
|
65
|
+
includeInUserinfo?: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Input for updating an existing claim definition (partial).
|
|
69
|
+
* Only description and token inclusion flags are updatable — claimName
|
|
70
|
+
* and claimType define the claim identity and cannot be changed.
|
|
71
|
+
*/
|
|
72
|
+
export interface UpdateClaimDefinitionInput {
|
|
73
|
+
description?: string | null;
|
|
74
|
+
includeInIdToken?: boolean;
|
|
75
|
+
includeInAccessToken?: boolean;
|
|
76
|
+
includeInUserinfo?: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Full claim value record as stored in the database.
|
|
80
|
+
* Maps to the `custom_claim_values` table columns (see migration 007).
|
|
81
|
+
* Values are per-user, per-claim — stored as JSONB to support any type.
|
|
82
|
+
*/
|
|
83
|
+
export interface CustomClaimValue {
|
|
84
|
+
id: string;
|
|
85
|
+
userId: string;
|
|
86
|
+
claimId: string;
|
|
87
|
+
value: unknown;
|
|
88
|
+
createdAt: Date;
|
|
89
|
+
updatedAt: Date;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Raw database row from the custom_claim_values table (snake_case columns).
|
|
93
|
+
* Used by the repository layer; mapped to CustomClaimValue via mapRowToValue().
|
|
94
|
+
*/
|
|
95
|
+
export interface CustomClaimValueRow {
|
|
96
|
+
id: string;
|
|
97
|
+
user_id: string;
|
|
98
|
+
claim_id: string;
|
|
99
|
+
value: unknown;
|
|
100
|
+
created_at: Date;
|
|
101
|
+
updated_at: Date;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* A claim definition joined with its user value.
|
|
105
|
+
* Used when resolving all claims for a user (e.g., for token building).
|
|
106
|
+
*/
|
|
107
|
+
export interface CustomClaimWithValue {
|
|
108
|
+
definition: CustomClaimDefinition;
|
|
109
|
+
value: CustomClaimValue;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Map a database row to a CustomClaimDefinition object.
|
|
113
|
+
*
|
|
114
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
115
|
+
* TypeScript properties. The claim_type column is cast to ClaimType.
|
|
116
|
+
*
|
|
117
|
+
* @param row - Raw database row from the custom_claim_definitions table
|
|
118
|
+
* @returns Mapped definition with camelCase properties
|
|
119
|
+
*/
|
|
120
|
+
export declare function mapRowToDefinition(row: CustomClaimDefinitionRow): CustomClaimDefinition;
|
|
121
|
+
/**
|
|
122
|
+
* Map a database row to a CustomClaimValue object.
|
|
123
|
+
*
|
|
124
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
125
|
+
* TypeScript properties. The value field is preserved as-is (JSONB
|
|
126
|
+
* already parsed by the pg driver).
|
|
127
|
+
*
|
|
128
|
+
* @param row - Raw database row from the custom_claim_values table
|
|
129
|
+
* @returns Mapped value with camelCase properties
|
|
130
|
+
*/
|
|
131
|
+
export declare function mapRowToValue(row: CustomClaimValueRow): CustomClaimValue;
|
|
132
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/custom-claims/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,uEAAuE;AACvE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjE,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;AAMjE;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAMD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;CAClB;AAMD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,qBAAqB,CAAC;IAClC,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,wBAAwB,GAAG,qBAAqB,CAavF;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,mBAAmB,GAAG,gBAAgB,CASxE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom claims types and interfaces.
|
|
3
|
+
*
|
|
4
|
+
* Defines the data structures for custom claim definitions and values.
|
|
5
|
+
* Definitions are per-application (which claims exist and where to include
|
|
6
|
+
* them), values are per-user (actual claim data stored as JSONB).
|
|
7
|
+
*
|
|
8
|
+
* Includes database row interfaces, input types for create/update, a
|
|
9
|
+
* convenience joined type, and mapping functions to convert snake_case
|
|
10
|
+
* database rows to camelCase TypeScript objects.
|
|
11
|
+
*
|
|
12
|
+
* Database tables: custom_claim_definitions, custom_claim_values
|
|
13
|
+
* (see migration 007_custom_claims.sql)
|
|
14
|
+
*/
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Database row mapping functions
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Map a database row to a CustomClaimDefinition object.
|
|
20
|
+
*
|
|
21
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
22
|
+
* TypeScript properties. The claim_type column is cast to ClaimType.
|
|
23
|
+
*
|
|
24
|
+
* @param row - Raw database row from the custom_claim_definitions table
|
|
25
|
+
* @returns Mapped definition with camelCase properties
|
|
26
|
+
*/
|
|
27
|
+
export function mapRowToDefinition(row) {
|
|
28
|
+
return {
|
|
29
|
+
id: row.id,
|
|
30
|
+
applicationId: row.application_id,
|
|
31
|
+
claimName: row.claim_name,
|
|
32
|
+
claimType: row.claim_type,
|
|
33
|
+
description: row.description,
|
|
34
|
+
includeInIdToken: row.include_in_id_token,
|
|
35
|
+
includeInAccessToken: row.include_in_access_token,
|
|
36
|
+
includeInUserinfo: row.include_in_userinfo,
|
|
37
|
+
createdAt: row.created_at,
|
|
38
|
+
updatedAt: row.updated_at,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Map a database row to a CustomClaimValue object.
|
|
43
|
+
*
|
|
44
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
45
|
+
* TypeScript properties. The value field is preserved as-is (JSONB
|
|
46
|
+
* already parsed by the pg driver).
|
|
47
|
+
*
|
|
48
|
+
* @param row - Raw database row from the custom_claim_values table
|
|
49
|
+
* @returns Mapped value with camelCase properties
|
|
50
|
+
*/
|
|
51
|
+
export function mapRowToValue(row) {
|
|
52
|
+
return {
|
|
53
|
+
id: row.id,
|
|
54
|
+
userId: row.user_id,
|
|
55
|
+
claimId: row.claim_id,
|
|
56
|
+
value: row.value,
|
|
57
|
+
createdAt: row.created_at,
|
|
58
|
+
updatedAt: row.updated_at,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/custom-claims/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA2HH,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAA6B;IAC9D,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAuB;QACtC,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,gBAAgB,EAAE,GAAG,CAAC,mBAAmB;QACzC,oBAAoB,EAAE,GAAG,CAAC,uBAAuB;QACjD,iBAAiB,EAAE,GAAG,CAAC,mBAAmB;QAC1C,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,GAAwB;IACpD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom claim validators.
|
|
3
|
+
*
|
|
4
|
+
* Provides validation logic for claim names and values:
|
|
5
|
+
* - Reserved claim name check (OIDC standard + Porta internal names)
|
|
6
|
+
* - Claim name format validation (lowercase alphanumeric + underscores)
|
|
7
|
+
* - Value type validation against claim definition type
|
|
8
|
+
*
|
|
9
|
+
* These validators are used by the service layer before any database
|
|
10
|
+
* operations to provide clear error messages.
|
|
11
|
+
*/
|
|
12
|
+
import type { ClaimType } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* OIDC standard and Porta reserved claim names.
|
|
15
|
+
*
|
|
16
|
+
* Custom claims cannot use any of these names to prevent conflicts with
|
|
17
|
+
* standard OIDC claims (RFC 7519, OpenID Connect Core 1.0 §5.1) and
|
|
18
|
+
* Porta's own internal claims (roles, permissions, org context).
|
|
19
|
+
*/
|
|
20
|
+
export declare const RESERVED_CLAIM_NAMES: ReadonlySet<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a claim name is reserved (cannot be used as a custom claim).
|
|
23
|
+
*
|
|
24
|
+
* @param name - Claim name to check
|
|
25
|
+
* @returns true if the name is reserved
|
|
26
|
+
*/
|
|
27
|
+
export declare function isReservedClaimName(name: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Validate a custom claim name.
|
|
30
|
+
*
|
|
31
|
+
* Rules:
|
|
32
|
+
* 1. Must not be empty
|
|
33
|
+
* 2. Must match format: lowercase alphanumeric + underscores, starting with a letter
|
|
34
|
+
* 3. Must be 1-100 characters
|
|
35
|
+
* 4. Must not be a reserved OIDC/Porta claim name
|
|
36
|
+
*
|
|
37
|
+
* @param name - Claim name to validate
|
|
38
|
+
* @returns Object with valid=true or valid=false with reason
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateClaimName(name: string): {
|
|
41
|
+
valid: boolean;
|
|
42
|
+
reason?: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Validate that a claim value matches the expected type from the definition.
|
|
46
|
+
*
|
|
47
|
+
* Type rules:
|
|
48
|
+
* - string: typeof value === 'string'
|
|
49
|
+
* - number: typeof value === 'number' && isFinite(value) (NaN and Infinity rejected)
|
|
50
|
+
* - boolean: typeof value === 'boolean'
|
|
51
|
+
* - json: value !== null && typeof value === 'object' (arrays and objects allowed)
|
|
52
|
+
*
|
|
53
|
+
* @param claimType - Expected type from the claim definition
|
|
54
|
+
* @param value - The value to validate
|
|
55
|
+
* @returns Object with valid=true or valid=false with reason
|
|
56
|
+
*/
|
|
57
|
+
export declare function validateClaimValue(claimType: ClaimType, value: unknown): {
|
|
58
|
+
valid: boolean;
|
|
59
|
+
reason?: string;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/custom-claims/validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAUnD,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAaD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBnF;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,OAAO,GACb;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAuCrC"}
|