@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,523 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client service — business logic orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* Composes the repository, cache, validators, crypto utilities, and audit log
|
|
5
|
+
* to provide the complete client management API. All write operations follow:
|
|
6
|
+
* 1. Validate inputs (org, app, URIs)
|
|
7
|
+
* 2. Perform DB operation (via repository)
|
|
8
|
+
* 3. Invalidate + re-cache (via cache)
|
|
9
|
+
* 4. Write audit log (fire-and-forget)
|
|
10
|
+
*
|
|
11
|
+
* Read operations check cache first, fall back to DB on miss.
|
|
12
|
+
*
|
|
13
|
+
* Status lifecycle:
|
|
14
|
+
* - activate: inactive → active
|
|
15
|
+
* - deactivate: active → inactive
|
|
16
|
+
* - revoke: active|inactive → revoked (permanent, cannot be undone)
|
|
17
|
+
*
|
|
18
|
+
* The findForOidc() function maps internal Client objects to oidc-provider
|
|
19
|
+
* metadata format, used by the adapter factory during OIDC operations.
|
|
20
|
+
*/
|
|
21
|
+
import { LOGIN_METHODS } from './types.js';
|
|
22
|
+
import { insertClient, findClientById, findClientByClientId, updateClient as repoUpdateClient, listClients as repoListClients, listClientsCursor as repoListClientsCursor, } from './repository.js';
|
|
23
|
+
import { getLatestActiveSha256 } from './secret-repository.js';
|
|
24
|
+
import { getCachedClientByClientId, getCachedClientById, cacheClient, invalidateClientCache, } from './cache.js';
|
|
25
|
+
import { generateClientId } from './crypto.js';
|
|
26
|
+
import { validateRedirectUris, getDefaultGrantTypes, getDefaultTokenEndpointAuthMethod, getDefaultResponseTypes, getDefaultScope, } from './validators.js';
|
|
27
|
+
import { normalizeLoginMethods } from './resolve-login-methods.js';
|
|
28
|
+
import { verify } from './secret-service.js';
|
|
29
|
+
import { writeAuditLog } from '../lib/audit-log.js';
|
|
30
|
+
import { ClientNotFoundError, ClientValidationError } from './errors.js';
|
|
31
|
+
import { getApplicationById } from '../applications/service.js';
|
|
32
|
+
import { getOrganizationById } from '../organizations/service.js';
|
|
33
|
+
// ===========================================================================
|
|
34
|
+
// Validation helpers (private)
|
|
35
|
+
// ===========================================================================
|
|
36
|
+
/**
|
|
37
|
+
* Validate + normalize a client-level `loginMethods` override.
|
|
38
|
+
*
|
|
39
|
+
* Three-state input:
|
|
40
|
+
* - `undefined` → returns `undefined` (caller must preserve "leave alone"
|
|
41
|
+
* semantics on update and "inherit from org default" on create)
|
|
42
|
+
* - `null` → returns `null` (caller clears the override / inherits)
|
|
43
|
+
* - non-empty array → returns the normalized (deduplicated, order-preserving)
|
|
44
|
+
* array with only recognized {@link LoginMethod} entries
|
|
45
|
+
*
|
|
46
|
+
* Throws {@link ClientValidationError} when:
|
|
47
|
+
* - the value is neither `undefined`, `null`, nor an array
|
|
48
|
+
* - the array is empty (empty = "no login possible" and is never valid)
|
|
49
|
+
* - any element is not a valid {@link LoginMethod}
|
|
50
|
+
*
|
|
51
|
+
* Empty arrays are rejected explicitly so the DB column carries either
|
|
52
|
+
* "override present with ≥1 method" or "null = inherit". This mirrors the
|
|
53
|
+
* contract documented on `UpdateClientInput.loginMethods`.
|
|
54
|
+
*/
|
|
55
|
+
function validateClientLoginMethods(methods) {
|
|
56
|
+
if (methods === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
if (methods === null)
|
|
59
|
+
return null;
|
|
60
|
+
if (!Array.isArray(methods) || methods.length === 0) {
|
|
61
|
+
throw new ClientValidationError('loginMethods: must be a non-empty array, null, or omitted');
|
|
62
|
+
}
|
|
63
|
+
for (const m of methods) {
|
|
64
|
+
if (!LOGIN_METHODS.includes(m)) {
|
|
65
|
+
throw new ClientValidationError(`loginMethods: invalid method "${String(m)}"`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return normalizeLoginMethods(methods);
|
|
69
|
+
}
|
|
70
|
+
// ===========================================================================
|
|
71
|
+
// Client CRUD
|
|
72
|
+
// ===========================================================================
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Create
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Create a new OIDC client.
|
|
78
|
+
*
|
|
79
|
+
* Flow:
|
|
80
|
+
* 1. Validate organization exists and is active
|
|
81
|
+
* 2. Validate application exists and is active
|
|
82
|
+
* 3. Validate redirect URIs
|
|
83
|
+
* 4. Apply defaults (grant types, response types, scope, auth method, PKCE)
|
|
84
|
+
* 5. Generate cryptographically random client_id
|
|
85
|
+
* 6. Insert client row
|
|
86
|
+
* 7. Cache the client
|
|
87
|
+
* 8. Write audit log
|
|
88
|
+
* 9. Return ClientWithSecret (secret is null for public clients;
|
|
89
|
+
* for confidential clients, the caller must generate the initial
|
|
90
|
+
* secret separately via the secret service)
|
|
91
|
+
*
|
|
92
|
+
* @param input - Client creation data
|
|
93
|
+
* @param actorId - UUID of the user performing the action (for audit)
|
|
94
|
+
* @returns Created client wrapped in ClientWithSecret (secret always null here)
|
|
95
|
+
* @throws ClientValidationError if org/app invalid or URIs fail validation
|
|
96
|
+
*/
|
|
97
|
+
export async function createClient(input, actorId) {
|
|
98
|
+
// Validate organization exists and is active
|
|
99
|
+
const org = await getOrganizationById(input.organizationId);
|
|
100
|
+
if (!org) {
|
|
101
|
+
throw new ClientValidationError('Organization not found');
|
|
102
|
+
}
|
|
103
|
+
if (org.status !== 'active') {
|
|
104
|
+
throw new ClientValidationError('Organization is not active');
|
|
105
|
+
}
|
|
106
|
+
// Validate application exists and is active
|
|
107
|
+
const app = await getApplicationById(input.applicationId);
|
|
108
|
+
if (!app) {
|
|
109
|
+
throw new ClientValidationError('Application not found');
|
|
110
|
+
}
|
|
111
|
+
if (app.status !== 'active') {
|
|
112
|
+
throw new ClientValidationError('Application is not active');
|
|
113
|
+
}
|
|
114
|
+
// Validate redirect URIs
|
|
115
|
+
// Use non-production mode for validation (production mode enforcement
|
|
116
|
+
// is done at the API layer based on environment config)
|
|
117
|
+
const uriValidation = validateRedirectUris(input.redirectUris, false);
|
|
118
|
+
if (!uriValidation.isValid) {
|
|
119
|
+
throw new ClientValidationError(`Invalid redirect URIs: ${uriValidation.errors.join('; ')}`);
|
|
120
|
+
}
|
|
121
|
+
// Apply defaults for optional fields
|
|
122
|
+
const grantTypes = input.grantTypes ??
|
|
123
|
+
getDefaultGrantTypes(input.clientType, input.applicationType);
|
|
124
|
+
const responseTypes = input.responseTypes ?? getDefaultResponseTypes();
|
|
125
|
+
const scope = input.scope ?? getDefaultScope();
|
|
126
|
+
const tokenEndpointAuthMethod = input.tokenEndpointAuthMethod ??
|
|
127
|
+
getDefaultTokenEndpointAuthMethod(input.clientType);
|
|
128
|
+
const requirePkce = input.requirePkce ?? true;
|
|
129
|
+
// Validate + normalize the login-method override (may throw). Three-state
|
|
130
|
+
// input: undefined → column omitted → DB DEFAULT NULL → inherit.
|
|
131
|
+
// null → inherit explicitly. Array → override with validated methods.
|
|
132
|
+
const loginMethods = validateClientLoginMethods(input.loginMethods);
|
|
133
|
+
// Generate a unique OIDC client_id
|
|
134
|
+
const clientId = generateClientId();
|
|
135
|
+
// Insert into database
|
|
136
|
+
const client = await insertClient({
|
|
137
|
+
organizationId: input.organizationId,
|
|
138
|
+
applicationId: input.applicationId,
|
|
139
|
+
clientId,
|
|
140
|
+
clientName: input.clientName,
|
|
141
|
+
clientType: input.clientType,
|
|
142
|
+
applicationType: input.applicationType,
|
|
143
|
+
redirectUris: input.redirectUris,
|
|
144
|
+
postLogoutRedirectUris: input.postLogoutRedirectUris ?? [],
|
|
145
|
+
grantTypes,
|
|
146
|
+
responseTypes,
|
|
147
|
+
scope,
|
|
148
|
+
tokenEndpointAuthMethod,
|
|
149
|
+
allowedOrigins: input.allowedOrigins ?? [],
|
|
150
|
+
requirePkce,
|
|
151
|
+
// Pass through validated value as-is: `undefined` triggers column
|
|
152
|
+
// omission (DB default), `null` inserts NULL explicitly, array inserts
|
|
153
|
+
// the validated methods. The repo honors all three states.
|
|
154
|
+
...(loginMethods !== undefined ? { loginMethods } : {}),
|
|
155
|
+
});
|
|
156
|
+
// Cache the new client
|
|
157
|
+
await cacheClient(client);
|
|
158
|
+
// Audit log (fire-and-forget) — include the persisted loginMethods value
|
|
159
|
+
// so operator history captures whether the client inherits or overrides.
|
|
160
|
+
await writeAuditLog({
|
|
161
|
+
organizationId: input.organizationId,
|
|
162
|
+
eventType: 'client.created',
|
|
163
|
+
eventCategory: 'admin',
|
|
164
|
+
actorId,
|
|
165
|
+
metadata: {
|
|
166
|
+
clientDbId: client.id,
|
|
167
|
+
clientId: client.clientId,
|
|
168
|
+
clientName: client.clientName,
|
|
169
|
+
clientType: client.clientType,
|
|
170
|
+
applicationType: client.applicationType,
|
|
171
|
+
applicationId: input.applicationId,
|
|
172
|
+
loginMethods: client.loginMethods,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
// Return without secret — caller must use secret service for confidential clients
|
|
176
|
+
return { client, secret: null };
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Read
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* Find a client by internal UUID.
|
|
183
|
+
* Checks Redis cache first, falls back to database on miss.
|
|
184
|
+
*
|
|
185
|
+
* @param id - Client internal UUID
|
|
186
|
+
* @returns Client or null if not found
|
|
187
|
+
*/
|
|
188
|
+
export async function getClientById(id) {
|
|
189
|
+
// Try cache first
|
|
190
|
+
const cached = await getCachedClientById(id);
|
|
191
|
+
if (cached)
|
|
192
|
+
return cached;
|
|
193
|
+
// Fall back to database
|
|
194
|
+
const client = await findClientById(id);
|
|
195
|
+
if (client) {
|
|
196
|
+
await cacheClient(client);
|
|
197
|
+
}
|
|
198
|
+
return client;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Find a client by OIDC client_id.
|
|
202
|
+
* Checks Redis cache first, falls back to database on miss.
|
|
203
|
+
*
|
|
204
|
+
* @param clientId - OIDC client_id (public identifier)
|
|
205
|
+
* @returns Client or null if not found
|
|
206
|
+
*/
|
|
207
|
+
export async function getClientByClientId(clientId) {
|
|
208
|
+
// Try cache first
|
|
209
|
+
const cached = await getCachedClientByClientId(clientId);
|
|
210
|
+
if (cached)
|
|
211
|
+
return cached;
|
|
212
|
+
// Fall back to database
|
|
213
|
+
const client = await findClientByClientId(clientId);
|
|
214
|
+
if (client) {
|
|
215
|
+
await cacheClient(client);
|
|
216
|
+
}
|
|
217
|
+
return client;
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// Update
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
/**
|
|
223
|
+
* Update a client's configurable fields.
|
|
224
|
+
*
|
|
225
|
+
* Validates redirect URIs if they are being changed.
|
|
226
|
+
*
|
|
227
|
+
* @param id - Client internal UUID
|
|
228
|
+
* @param input - Fields to update
|
|
229
|
+
* @param actorId - UUID of the user performing the action
|
|
230
|
+
* @returns Updated client
|
|
231
|
+
* @throws ClientNotFoundError if client not found
|
|
232
|
+
* @throws ClientValidationError if redirect URIs are invalid
|
|
233
|
+
*/
|
|
234
|
+
export async function updateClient(id, input, actorId) {
|
|
235
|
+
// Validate redirect URIs if provided
|
|
236
|
+
if (input.redirectUris) {
|
|
237
|
+
const uriValidation = validateRedirectUris(input.redirectUris, false);
|
|
238
|
+
if (!uriValidation.isValid) {
|
|
239
|
+
throw new ClientValidationError(`Invalid redirect URIs: ${uriValidation.errors.join('; ')}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Build update data from input
|
|
243
|
+
const updateData = {};
|
|
244
|
+
if (input.clientName !== undefined)
|
|
245
|
+
updateData.clientName = input.clientName;
|
|
246
|
+
if (input.redirectUris !== undefined)
|
|
247
|
+
updateData.redirectUris = input.redirectUris;
|
|
248
|
+
if (input.postLogoutRedirectUris !== undefined)
|
|
249
|
+
updateData.postLogoutRedirectUris = input.postLogoutRedirectUris;
|
|
250
|
+
if (input.grantTypes !== undefined)
|
|
251
|
+
updateData.grantTypes = input.grantTypes;
|
|
252
|
+
if (input.responseTypes !== undefined)
|
|
253
|
+
updateData.responseTypes = input.responseTypes;
|
|
254
|
+
if (input.scope !== undefined)
|
|
255
|
+
updateData.scope = input.scope;
|
|
256
|
+
if (input.tokenEndpointAuthMethod !== undefined)
|
|
257
|
+
updateData.tokenEndpointAuthMethod = input.tokenEndpointAuthMethod;
|
|
258
|
+
if (input.allowedOrigins !== undefined)
|
|
259
|
+
updateData.allowedOrigins = input.allowedOrigins;
|
|
260
|
+
if (input.requirePkce !== undefined)
|
|
261
|
+
updateData.requirePkce = input.requirePkce;
|
|
262
|
+
// Validate + normalize the login-method override if the caller passed the
|
|
263
|
+
// key (including `null` = clear). Capture the previous value first for the
|
|
264
|
+
// audit log diff — we use the cache-aware accessor so stale reads don't
|
|
265
|
+
// sneak in; if the client doesn't exist the repo update below will throw
|
|
266
|
+
// and we short-circuit before audit.
|
|
267
|
+
let previousLoginMethods;
|
|
268
|
+
if (Object.prototype.hasOwnProperty.call(input, 'loginMethods')) {
|
|
269
|
+
const normalized = validateClientLoginMethods(input.loginMethods);
|
|
270
|
+
// normalized is either null or a validated array here (undefined is only
|
|
271
|
+
// returned when the key is absent, which we already filtered out).
|
|
272
|
+
updateData.loginMethods = normalized;
|
|
273
|
+
const existing = await getClientById(id);
|
|
274
|
+
if (existing) {
|
|
275
|
+
previousLoginMethods = existing.loginMethods;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
let client;
|
|
279
|
+
try {
|
|
280
|
+
client = await repoUpdateClient(id, updateData);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
if (err instanceof Error && err.message === 'Client not found') {
|
|
284
|
+
throw new ClientNotFoundError(id);
|
|
285
|
+
}
|
|
286
|
+
throw err;
|
|
287
|
+
}
|
|
288
|
+
// Invalidate old cache and re-cache the updated version
|
|
289
|
+
await invalidateClientCache(client.clientId, client.id);
|
|
290
|
+
await cacheClient(client);
|
|
291
|
+
// Audit log (fire-and-forget) — record the old → new login-methods
|
|
292
|
+
// transition only when the field actually changed, so audit history
|
|
293
|
+
// stays readable for updates that touch other fields.
|
|
294
|
+
const auditMetadata = {
|
|
295
|
+
clientDbId: client.id,
|
|
296
|
+
clientId: client.clientId,
|
|
297
|
+
fields: Object.keys(updateData),
|
|
298
|
+
};
|
|
299
|
+
if (previousLoginMethods !== undefined) {
|
|
300
|
+
auditMetadata.previousLoginMethods = previousLoginMethods;
|
|
301
|
+
auditMetadata.newLoginMethods = client.loginMethods;
|
|
302
|
+
}
|
|
303
|
+
await writeAuditLog({
|
|
304
|
+
organizationId: client.organizationId,
|
|
305
|
+
eventType: 'client.updated',
|
|
306
|
+
eventCategory: 'admin',
|
|
307
|
+
actorId,
|
|
308
|
+
metadata: auditMetadata,
|
|
309
|
+
});
|
|
310
|
+
return client;
|
|
311
|
+
}
|
|
312
|
+
// ---------------------------------------------------------------------------
|
|
313
|
+
// List
|
|
314
|
+
// ---------------------------------------------------------------------------
|
|
315
|
+
/**
|
|
316
|
+
* List clients by organization with pagination.
|
|
317
|
+
*
|
|
318
|
+
* @param organizationId - Organization UUID
|
|
319
|
+
* @param options - Pagination and sort options
|
|
320
|
+
* @returns Paginated result
|
|
321
|
+
*/
|
|
322
|
+
export async function listClientsByOrganization(organizationId, options) {
|
|
323
|
+
return repoListClients({ ...options, organizationId });
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* List clients by application with pagination.
|
|
327
|
+
*
|
|
328
|
+
* @param applicationId - Application UUID
|
|
329
|
+
* @param options - Pagination and sort options
|
|
330
|
+
* @returns Paginated result
|
|
331
|
+
*/
|
|
332
|
+
export async function listClientsByApplication(applicationId, options) {
|
|
333
|
+
return repoListClients({ ...options, applicationId });
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* List clients with cursor-based keyset pagination.
|
|
337
|
+
* Supports all existing filters (org, app, status, search).
|
|
338
|
+
*
|
|
339
|
+
* @param options - Cursor, limit, filter, and sort options
|
|
340
|
+
* @returns Cursor-paginated result with nextCursor/hasMore
|
|
341
|
+
*/
|
|
342
|
+
export async function listClientsCursor(options) {
|
|
343
|
+
return repoListClientsCursor(options);
|
|
344
|
+
}
|
|
345
|
+
// ===========================================================================
|
|
346
|
+
// Status lifecycle
|
|
347
|
+
// ===========================================================================
|
|
348
|
+
/**
|
|
349
|
+
* Load and validate a client exists before a status change.
|
|
350
|
+
* @throws ClientNotFoundError if not found
|
|
351
|
+
*/
|
|
352
|
+
async function loadClientForStatusChange(id) {
|
|
353
|
+
const client = await findClientById(id);
|
|
354
|
+
if (!client)
|
|
355
|
+
throw new ClientNotFoundError(id);
|
|
356
|
+
return client;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Deactivate a client (active → inactive).
|
|
360
|
+
*
|
|
361
|
+
* @param id - Client internal UUID
|
|
362
|
+
* @param actorId - UUID of the user performing the action
|
|
363
|
+
* @throws ClientNotFoundError if not found
|
|
364
|
+
* @throws ClientValidationError if not currently active
|
|
365
|
+
*/
|
|
366
|
+
export async function deactivateClient(id, actorId) {
|
|
367
|
+
const client = await loadClientForStatusChange(id);
|
|
368
|
+
if (client.status !== 'active') {
|
|
369
|
+
throw new ClientValidationError(`Cannot deactivate client from status: ${client.status}`);
|
|
370
|
+
}
|
|
371
|
+
await repoUpdateClient(id, { status: 'inactive' });
|
|
372
|
+
await invalidateClientCache(client.clientId, client.id);
|
|
373
|
+
await writeAuditLog({
|
|
374
|
+
organizationId: client.organizationId,
|
|
375
|
+
eventType: 'client.deactivated',
|
|
376
|
+
eventCategory: 'admin',
|
|
377
|
+
actorId,
|
|
378
|
+
metadata: { clientDbId: client.id, clientId: client.clientId },
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Activate a client (inactive → active).
|
|
383
|
+
*
|
|
384
|
+
* @param id - Client internal UUID
|
|
385
|
+
* @param actorId - UUID of the user performing the action
|
|
386
|
+
* @throws ClientNotFoundError if not found
|
|
387
|
+
* @throws ClientValidationError if not currently inactive
|
|
388
|
+
*/
|
|
389
|
+
export async function activateClient(id, actorId) {
|
|
390
|
+
const client = await loadClientForStatusChange(id);
|
|
391
|
+
if (client.status !== 'inactive') {
|
|
392
|
+
throw new ClientValidationError(`Cannot activate client from status: ${client.status}`);
|
|
393
|
+
}
|
|
394
|
+
await repoUpdateClient(id, { status: 'active' });
|
|
395
|
+
await invalidateClientCache(client.clientId, client.id);
|
|
396
|
+
await writeAuditLog({
|
|
397
|
+
organizationId: client.organizationId,
|
|
398
|
+
eventType: 'client.activated',
|
|
399
|
+
eventCategory: 'admin',
|
|
400
|
+
actorId,
|
|
401
|
+
metadata: { clientDbId: client.id, clientId: client.clientId },
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Revoke a client (active or inactive → revoked).
|
|
406
|
+
*
|
|
407
|
+
* Revocation is permanent — revoked clients cannot be reactivated.
|
|
408
|
+
* This effectively disables the client for all OIDC operations.
|
|
409
|
+
*
|
|
410
|
+
* @param id - Client internal UUID
|
|
411
|
+
* @param actorId - UUID of the user performing the action
|
|
412
|
+
* @throws ClientNotFoundError if not found
|
|
413
|
+
* @throws ClientValidationError if already revoked
|
|
414
|
+
*/
|
|
415
|
+
export async function revokeClient(id, actorId) {
|
|
416
|
+
const client = await loadClientForStatusChange(id);
|
|
417
|
+
if (client.status === 'revoked') {
|
|
418
|
+
throw new ClientValidationError('Client is already revoked');
|
|
419
|
+
}
|
|
420
|
+
await repoUpdateClient(id, { status: 'revoked' });
|
|
421
|
+
await invalidateClientCache(client.clientId, client.id);
|
|
422
|
+
await writeAuditLog({
|
|
423
|
+
organizationId: client.organizationId,
|
|
424
|
+
eventType: 'client.revoked',
|
|
425
|
+
eventCategory: 'admin',
|
|
426
|
+
actorId,
|
|
427
|
+
metadata: {
|
|
428
|
+
clientDbId: client.id,
|
|
429
|
+
clientId: client.clientId,
|
|
430
|
+
previousStatus: client.status,
|
|
431
|
+
},
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
// ===========================================================================
|
|
435
|
+
// OIDC integration
|
|
436
|
+
// ===========================================================================
|
|
437
|
+
/**
|
|
438
|
+
* Find a client by OIDC client_id and return oidc-provider metadata format.
|
|
439
|
+
*
|
|
440
|
+
* This function is the bridge between Porta's internal client model and
|
|
441
|
+
* the metadata shape expected by node-oidc-provider. It's called by the
|
|
442
|
+
* adapter factory during OIDC flows (authorization, token exchange, etc.).
|
|
443
|
+
*
|
|
444
|
+
* Returns undefined (not null) for compatibility with oidc-provider which
|
|
445
|
+
* expects undefined for "client not found".
|
|
446
|
+
*
|
|
447
|
+
* @param clientId - OIDC client_id
|
|
448
|
+
* @returns OIDC client metadata object, or undefined if not found/inactive
|
|
449
|
+
*/
|
|
450
|
+
export async function findForOidc(clientId) {
|
|
451
|
+
const client = await getClientByClientId(clientId);
|
|
452
|
+
// Client must exist and be active for OIDC operations
|
|
453
|
+
if (!client || client.status !== 'active') {
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
// Build base oidc-provider metadata
|
|
457
|
+
const metadata = {
|
|
458
|
+
client_id: client.clientId,
|
|
459
|
+
client_name: client.clientName,
|
|
460
|
+
application_type: client.applicationType,
|
|
461
|
+
redirect_uris: client.redirectUris,
|
|
462
|
+
post_logout_redirect_uris: client.postLogoutRedirectUris,
|
|
463
|
+
grant_types: client.grantTypes,
|
|
464
|
+
response_types: client.responseTypes,
|
|
465
|
+
scope: client.scope,
|
|
466
|
+
token_endpoint_auth_method: client.clientType === 'public'
|
|
467
|
+
? 'none'
|
|
468
|
+
: client.tokenEndpointAuthMethod,
|
|
469
|
+
// Porta uses ES256 signing keys — must declare this explicitly
|
|
470
|
+
// or oidc-provider defaults to RS256 and rejects the client.
|
|
471
|
+
id_token_signed_response_alg: 'ES256',
|
|
472
|
+
// allowed_origins needed for CORS checks on OIDC endpoints
|
|
473
|
+
'urn:porta:allowed_origins': client.allowedOrigins,
|
|
474
|
+
// Client type for internal use
|
|
475
|
+
'urn:porta:client_type': client.clientType,
|
|
476
|
+
// Per-client login-methods override. Null means "inherit org default";
|
|
477
|
+
// a non-null array is the validated override. The OIDC configuration
|
|
478
|
+
// layer registers this URN under `extraClientMetadata.properties` so
|
|
479
|
+
// oidc-provider preserves it on the client metadata object passed to
|
|
480
|
+
// the interaction handlers — where `resolveLoginMethodsFromOidcClient()`
|
|
481
|
+
// combines it with the org default to compute the effective methods.
|
|
482
|
+
'urn:porta:login_methods': client.loginMethods,
|
|
483
|
+
// Organization ID — used by auto-consent logic in showConsent() to
|
|
484
|
+
// identify first-party clients (same org → skip consent screen)
|
|
485
|
+
organizationId: client.organizationId,
|
|
486
|
+
};
|
|
487
|
+
// For confidential clients, include the SHA-256 hash as client_secret.
|
|
488
|
+
// oidc-provider will compare this against the SHA-256 of the presented
|
|
489
|
+
// secret (pre-hashed by the client-secret-hash middleware).
|
|
490
|
+
if (client.clientType === 'confidential') {
|
|
491
|
+
const sha256Hash = await getLatestActiveSha256(client.id);
|
|
492
|
+
if (sha256Hash) {
|
|
493
|
+
metadata.client_secret = sha256Hash;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return metadata;
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Verify a client secret for OIDC authentication.
|
|
500
|
+
*
|
|
501
|
+
* Convenience wrapper around secret-service.verify() that resolves the
|
|
502
|
+
* internal DB id from the OIDC client_id and performs guard checks:
|
|
503
|
+
* - Client must exist and be active
|
|
504
|
+
* - Client must be confidential (public clients have no secrets)
|
|
505
|
+
*
|
|
506
|
+
* Used during token endpoint authentication via the admin API.
|
|
507
|
+
*
|
|
508
|
+
* @param clientId - The OIDC client_id (external identifier)
|
|
509
|
+
* @param plaintext - The presented secret to verify
|
|
510
|
+
* @returns true if secret matches any active hash, false otherwise
|
|
511
|
+
*/
|
|
512
|
+
export async function verifyClientSecret(clientId, plaintext) {
|
|
513
|
+
const client = await getClientByClientId(clientId);
|
|
514
|
+
// Client must exist and be active
|
|
515
|
+
if (!client || client.status !== 'active')
|
|
516
|
+
return false;
|
|
517
|
+
// Public clients should not have secrets — reject verification attempts
|
|
518
|
+
if (client.clientType === 'public')
|
|
519
|
+
return false;
|
|
520
|
+
// Delegate to secret-service which checks all active, non-expired hashes
|
|
521
|
+
return verify(client.id, plaintext);
|
|
522
|
+
}
|
|
523
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/clients/service.ts"],"names":[],"mappings":"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"}
|