@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 @@
|
|
|
1
|
+
{"version":3,"file":"decision-event.js","sourceRoot":"","sources":["../../src/security/decision-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Privacy-safe handling for HTTP parser failures which occur before Koa middleware. */
|
|
2
|
+
import type { Server } from 'node:http';
|
|
3
|
+
import { type SecurityDecisionSink } from './decision-context.js';
|
|
4
|
+
/** Attach one owner for HTTP parser failures and return a removal callback. */
|
|
5
|
+
export declare function attachTransportDecisionHandler(server: Server, sink?: SecurityDecisionSink): () => void;
|
|
6
|
+
//# sourceMappingURL=transport-decision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-decision.d.ts","sourceRoot":"","sources":["../../src/security/transport-decision.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAGxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAK/B,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,oBAA0C,GAC/C,MAAM,IAAI,CA4BZ"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Privacy-safe handling for HTTP parser failures which occur before Koa middleware. */
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { createSecurityDecisionEvent } from './decision-event.js';
|
|
4
|
+
import { logSecurityDecision, recordSecurityDecisionSinkFailure, } from './decision-context.js';
|
|
5
|
+
const MINIMAL_BAD_REQUEST = 'HTTP/1.1 400 Bad Request\r\nConnection: close\r\nContent-Length: 0\r\n\r\n';
|
|
6
|
+
/** Attach one owner for HTTP parser failures and return a removal callback. */
|
|
7
|
+
export function attachTransportDecisionHandler(server, sink = logSecurityDecision) {
|
|
8
|
+
const handledSockets = new WeakSet();
|
|
9
|
+
const onClientError = (_error, socket) => {
|
|
10
|
+
if (handledSockets.has(socket))
|
|
11
|
+
return;
|
|
12
|
+
handledSockets.add(socket);
|
|
13
|
+
const event = createSecurityDecisionEvent({
|
|
14
|
+
requestId: randomUUID(),
|
|
15
|
+
surface: 'transport',
|
|
16
|
+
method: 'UNKNOWN',
|
|
17
|
+
routeTemplate: '/transport',
|
|
18
|
+
statusCode: 400,
|
|
19
|
+
outcome: 'deny',
|
|
20
|
+
decisionPoint: 'transport',
|
|
21
|
+
reasonCode: 'transport-parse-failed',
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
void Promise.resolve(sink(event)).catch(recordSecurityDecisionSinkFailure);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
recordSecurityDecisionSinkFailure();
|
|
28
|
+
}
|
|
29
|
+
if (socket.writable && !socket.destroyed)
|
|
30
|
+
socket.end(MINIMAL_BAD_REQUEST);
|
|
31
|
+
else
|
|
32
|
+
socket.destroy();
|
|
33
|
+
};
|
|
34
|
+
server.on('clientError', onClientError);
|
|
35
|
+
return () => server.off('clientError', onClientError);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=transport-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-decision.js","sourceRoot":"","sources":["../../src/security/transport-decision.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,iCAAiC,GAElC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,mBAAmB,GACvB,4EAA4E,CAAC;AAE/E,+EAA+E;AAC/E,MAAM,UAAU,8BAA8B,CAC5C,MAAc,EACd,IAAI,GAAyB,mBAAmB;IAEhD,MAAM,cAAc,GAAG,IAAI,OAAO,EAAU,CAAC;IAC7C,MAAM,aAAa,GAAG,CAAC,MAAa,EAAE,MAAc,EAAQ,EAAE;QAC5D,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QACvC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,2BAA2B,CAAC;YACxC,SAAS,EAAE,UAAU,EAAE;YACvB,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,WAAW;YAC1B,UAAU,EAAE,wBAAwB;SACrC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC7E,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC,EAAE,CAAC;QACtC,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;;YACrE,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Koa application factory.
|
|
3
|
+
*
|
|
4
|
+
* Creates the Koa app with all middleware and routes. Optionally accepts
|
|
5
|
+
* an OIDC provider instance to mount under /:orgSlug/* for multi-tenant
|
|
6
|
+
* OIDC functionality.
|
|
7
|
+
*
|
|
8
|
+
* Route structure:
|
|
9
|
+
* /health — Health check (DB + Redis status)
|
|
10
|
+
* /api/admin/organizations/* — Organization management (admin auth)
|
|
11
|
+
* /api/admin/applications/* — Application management (admin auth)
|
|
12
|
+
* /api/admin/clients/* — Client & secret management (admin auth)
|
|
13
|
+
* /api/admin/organizations/:orgId/users/* — User management (admin auth)
|
|
14
|
+
* /api/admin/applications/:appId/roles/* — Role management (admin auth)
|
|
15
|
+
* /api/admin/applications/:appId/permissions/* — Permission management (admin auth)
|
|
16
|
+
* /api/admin/organizations/:orgId/users/:userId/roles/* — User-role assignments (admin auth)
|
|
17
|
+
* /api/admin/applications/:appId/claims/* — Custom claims management (admin auth)
|
|
18
|
+
* /api/admin/config/* — System configuration management (admin auth)
|
|
19
|
+
* /api/admin/keys/* — Signing key management (admin auth)
|
|
20
|
+
* /api/admin/audit/* — Audit log viewer (admin auth)
|
|
21
|
+
* /interaction/:uid/* — OIDC interaction routes (login, consent, abort)
|
|
22
|
+
* /:orgSlug/auth/* — Auth routes (magic link, password reset, invitation)
|
|
23
|
+
* /:orgSlug/* — OIDC provider endpoints (auth, token, jwks, etc.)
|
|
24
|
+
*/
|
|
25
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
26
|
+
import Koa from 'koa';
|
|
27
|
+
import type Provider from 'oidc-provider';
|
|
28
|
+
/**
|
|
29
|
+
* Per-request OIDC issuer store.
|
|
30
|
+
*
|
|
31
|
+
* node-oidc-provider is initialized with a single base issuer URL, but
|
|
32
|
+
* Porta uses path-based multi-tenancy (/:orgSlug/*) where each org needs
|
|
33
|
+
* its own issuer (e.g., https://porta.local:3443/acme-corp).
|
|
34
|
+
*
|
|
35
|
+
* This AsyncLocalStorage holds the org-scoped issuer for the current
|
|
36
|
+
* request. The provider's `issuer` property is overridden with a getter
|
|
37
|
+
* that reads from this store, so all JWT `iss` claims, discovery responses,
|
|
38
|
+
* and redirect `iss` parameters automatically use the correct org issuer.
|
|
39
|
+
*/
|
|
40
|
+
export declare const issuerStore: AsyncLocalStorage<string>;
|
|
41
|
+
/**
|
|
42
|
+
* Create the Koa application with all middleware and routes.
|
|
43
|
+
*
|
|
44
|
+
* @param oidcProvider - Optional OIDC provider instance. If provided,
|
|
45
|
+
* OIDC endpoints are mounted under /:orgSlug/* with tenant resolution.
|
|
46
|
+
* Pass undefined for testing scenarios that don't need OIDC.
|
|
47
|
+
* @returns Configured Koa application
|
|
48
|
+
*/
|
|
49
|
+
export declare function createApp(oidcProvider?: Provider): Koa;
|
|
50
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAiD1C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,2BAAkC,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,YAAY,CAAC,EAAE,QAAQ,GAAG,GAAG,CAuctD"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Koa application factory.
|
|
3
|
+
*
|
|
4
|
+
* Creates the Koa app with all middleware and routes. Optionally accepts
|
|
5
|
+
* an OIDC provider instance to mount under /:orgSlug/* for multi-tenant
|
|
6
|
+
* OIDC functionality.
|
|
7
|
+
*
|
|
8
|
+
* Route structure:
|
|
9
|
+
* /health — Health check (DB + Redis status)
|
|
10
|
+
* /api/admin/organizations/* — Organization management (admin auth)
|
|
11
|
+
* /api/admin/applications/* — Application management (admin auth)
|
|
12
|
+
* /api/admin/clients/* — Client & secret management (admin auth)
|
|
13
|
+
* /api/admin/organizations/:orgId/users/* — User management (admin auth)
|
|
14
|
+
* /api/admin/applications/:appId/roles/* — Role management (admin auth)
|
|
15
|
+
* /api/admin/applications/:appId/permissions/* — Permission management (admin auth)
|
|
16
|
+
* /api/admin/organizations/:orgId/users/:userId/roles/* — User-role assignments (admin auth)
|
|
17
|
+
* /api/admin/applications/:appId/claims/* — Custom claims management (admin auth)
|
|
18
|
+
* /api/admin/config/* — System configuration management (admin auth)
|
|
19
|
+
* /api/admin/keys/* — Signing key management (admin auth)
|
|
20
|
+
* /api/admin/audit/* — Audit log viewer (admin auth)
|
|
21
|
+
* /interaction/:uid/* — OIDC interaction routes (login, consent, abort)
|
|
22
|
+
* /:orgSlug/auth/* — Auth routes (magic link, password reset, invitation)
|
|
23
|
+
* /:orgSlug/* — OIDC provider endpoints (auth, token, jwks, etc.)
|
|
24
|
+
*/
|
|
25
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
26
|
+
import Koa from 'koa';
|
|
27
|
+
import bodyParser from 'koa-bodyparser';
|
|
28
|
+
import Router from '@koa/router';
|
|
29
|
+
import { requestLogger } from './middleware/request-logger.js';
|
|
30
|
+
import { errorHandler } from './middleware/error-handler.js';
|
|
31
|
+
import { securityHeaders, HTML_CSP } from './middleware/security-headers.js';
|
|
32
|
+
import { healthCheck } from './middleware/health.js';
|
|
33
|
+
import { readyHandler } from './middleware/ready.js';
|
|
34
|
+
import { createRootPageRouter } from './middleware/root-page.js';
|
|
35
|
+
import { tenantResolver } from './middleware/tenant-resolver.js';
|
|
36
|
+
import { oidcClientTenantBinding } from './middleware/oidc-client-tenant.js';
|
|
37
|
+
import { clientSecretHash } from './middleware/client-secret-hash.js';
|
|
38
|
+
import { promptLoginReset } from './middleware/prompt-login-reset.js';
|
|
39
|
+
import { createOrganizationRouter } from './routes/organizations.js';
|
|
40
|
+
import { createApplicationRouter } from './routes/applications.js';
|
|
41
|
+
import { createClientRouter } from './routes/clients.js';
|
|
42
|
+
import { createUserRouter, createStandaloneUserRouter } from './routes/users.js';
|
|
43
|
+
import { createInteractionRouter } from './routes/interactions.js';
|
|
44
|
+
import { createMagicLinkRouter } from './routes/magic-link.js';
|
|
45
|
+
import { createPasswordResetRouter } from './routes/password-reset.js';
|
|
46
|
+
import { createInvitationRouter } from './routes/invitation.js';
|
|
47
|
+
import { createRoleRouter } from './routes/roles.js';
|
|
48
|
+
import { createPermissionRouter } from './routes/permissions.js';
|
|
49
|
+
import { createUserRoleRouter } from './routes/user-roles.js';
|
|
50
|
+
import { createCustomClaimRouter } from './routes/custom-claims.js';
|
|
51
|
+
import { createTwoFactorRouter } from './routes/two-factor.js';
|
|
52
|
+
import { createConfigRouter } from './routes/config.js';
|
|
53
|
+
import { createKeysRouter } from './routes/keys.js';
|
|
54
|
+
import { createAuditRouter } from './routes/audit.js';
|
|
55
|
+
import { createStatsRouter } from './routes/stats.js';
|
|
56
|
+
import { createSessionRouter, createUserSessionRouter } from './routes/sessions.js';
|
|
57
|
+
import { createBulkRouter } from './routes/bulk.js';
|
|
58
|
+
import { createExportRouter } from './routes/exports.js';
|
|
59
|
+
import { createImportRouter } from './routes/imports.js';
|
|
60
|
+
import { createBrandingRouter } from './routes/branding.js';
|
|
61
|
+
import { createTwoFactorUserAdminRouter, createTwoFactorOrgAdminRouter, } from './routes/two-factor-admin.js';
|
|
62
|
+
import { adminCors } from './middleware/admin-cors.js';
|
|
63
|
+
import { oidcPreflightCors } from './middleware/oidc-preflight-cors.js';
|
|
64
|
+
import { metricsCounter, metricsHandler } from './middleware/metrics.js';
|
|
65
|
+
import { tokenRateLimiter, introspectionRateLimiter } from './middleware/token-rate-limiter.js';
|
|
66
|
+
import { adminRateLimiter } from './middleware/admin-rate-limiter.js';
|
|
67
|
+
import { adminMutationAudit } from './middleware/admin-mutation-audit.js';
|
|
68
|
+
import { setAdminAuthProvider } from './middleware/admin-auth.js';
|
|
69
|
+
import { findSuperAdminOrganization } from './organizations/repository.js';
|
|
70
|
+
import { getApplicationBySlug } from './applications/index.js';
|
|
71
|
+
import { listClientsByApplication } from './clients/index.js';
|
|
72
|
+
import { config } from './config/index.js';
|
|
73
|
+
/**
|
|
74
|
+
* Per-request OIDC issuer store.
|
|
75
|
+
*
|
|
76
|
+
* node-oidc-provider is initialized with a single base issuer URL, but
|
|
77
|
+
* Porta uses path-based multi-tenancy (/:orgSlug/*) where each org needs
|
|
78
|
+
* its own issuer (e.g., https://porta.local:3443/acme-corp).
|
|
79
|
+
*
|
|
80
|
+
* This AsyncLocalStorage holds the org-scoped issuer for the current
|
|
81
|
+
* request. The provider's `issuer` property is overridden with a getter
|
|
82
|
+
* that reads from this store, so all JWT `iss` claims, discovery responses,
|
|
83
|
+
* and redirect `iss` parameters automatically use the correct org issuer.
|
|
84
|
+
*/
|
|
85
|
+
export const issuerStore = new AsyncLocalStorage();
|
|
86
|
+
/**
|
|
87
|
+
* Create the Koa application with all middleware and routes.
|
|
88
|
+
*
|
|
89
|
+
* @param oidcProvider - Optional OIDC provider instance. If provided,
|
|
90
|
+
* OIDC endpoints are mounted under /:orgSlug/* with tenant resolution.
|
|
91
|
+
* Pass undefined for testing scenarios that don't need OIDC.
|
|
92
|
+
* @returns Configured Koa application
|
|
93
|
+
*/
|
|
94
|
+
export function createApp(oidcProvider) {
|
|
95
|
+
const app = new Koa();
|
|
96
|
+
// Trust proxy headers (X-Forwarded-Proto, X-Forwarded-For, etc.) when
|
|
97
|
+
// running behind a TLS-terminating reverse proxy. This makes ctx.secure,
|
|
98
|
+
// ctx.ip, and ctx.protocol reflect the client's real connection, which is
|
|
99
|
+
// required for secure cookie flags and correct IP-based rate limiting.
|
|
100
|
+
if (config.trustProxy) {
|
|
101
|
+
app.proxy = true;
|
|
102
|
+
}
|
|
103
|
+
// Global middleware stack (order matters):
|
|
104
|
+
// 1. Request correlation and terminal finalization wrap every Koa request
|
|
105
|
+
// 2. Error handler converts downstream failures into minimal public responses
|
|
106
|
+
// 3. Security headers (CSP, HSTS, X-Frame-Options, etc.)
|
|
107
|
+
// 4. Selective body parser — only routes that need it (NOT OIDC routes)
|
|
108
|
+
app.use(requestLogger());
|
|
109
|
+
app.use(errorHandler());
|
|
110
|
+
app.use(securityHeaders());
|
|
111
|
+
// Prometheus metrics counter — increments porta_http_requests_total per response.
|
|
112
|
+
// Only active when METRICS_ENABLED=true; otherwise no overhead.
|
|
113
|
+
if (config.metricsEnabled) {
|
|
114
|
+
app.use(metricsCounter());
|
|
115
|
+
}
|
|
116
|
+
// Selective body parser: apply only to admin API, interaction, and auth routes.
|
|
117
|
+
// OIDC provider routes (/:orgSlug/*) must NOT have pre-parsed bodies because
|
|
118
|
+
// oidc-provider uses its own internal body parser (selective_body.js).
|
|
119
|
+
// Pre-parsing the body consumes the request stream, which causes
|
|
120
|
+
// client_secret_post authentication to fail at the token endpoint with
|
|
121
|
+
// "no client authentication mechanism provided".
|
|
122
|
+
//
|
|
123
|
+
// Routes that NEED body parsing:
|
|
124
|
+
// /api/* — Admin API routes (JSON request bodies)
|
|
125
|
+
// /interaction/* — OIDC interaction routes (login/consent form submissions)
|
|
126
|
+
// /:orgSlug/auth/* — Auth workflow routes (magic-link, password-reset, invitation)
|
|
127
|
+
// /health — GET-only, no body needed, but harmless to parse
|
|
128
|
+
//
|
|
129
|
+
// Routes that must NOT be body-parsed:
|
|
130
|
+
// /:orgSlug/* — OIDC provider endpoints (token, revocation, introspection, etc.)
|
|
131
|
+
const bp = bodyParser({
|
|
132
|
+
jsonLimit: '100kb', // Defence-in-depth: limit JSON body size (default was 1mb)
|
|
133
|
+
formLimit: '100kb', // Limit form body size
|
|
134
|
+
textLimit: '100kb', // Limit text body size
|
|
135
|
+
});
|
|
136
|
+
app.use(async (ctx, next) => {
|
|
137
|
+
if (ctx.path.startsWith('/api/') ||
|
|
138
|
+
ctx.path.startsWith('/interaction/') ||
|
|
139
|
+
ctx.path.startsWith('/health') ||
|
|
140
|
+
ctx.path.includes('/auth/')) {
|
|
141
|
+
return bp(ctx, next);
|
|
142
|
+
}
|
|
143
|
+
return next();
|
|
144
|
+
});
|
|
145
|
+
// Health check (liveness) and readiness probe — root level, no tenant context.
|
|
146
|
+
// Kubernetes / container orchestrators map:
|
|
147
|
+
// livenessProbe → GET /health
|
|
148
|
+
// readinessProbe → GET /ready
|
|
149
|
+
const router = new Router();
|
|
150
|
+
router.get('/health', healthCheck());
|
|
151
|
+
router.get('/ready', readyHandler());
|
|
152
|
+
// Prometheus metrics endpoint — only registered when METRICS_ENABLED=true.
|
|
153
|
+
// When disabled, GET /metrics falls through to 404 (no route match).
|
|
154
|
+
if (config.metricsEnabled) {
|
|
155
|
+
router.get('/metrics', metricsHandler());
|
|
156
|
+
}
|
|
157
|
+
app.use(router.routes());
|
|
158
|
+
app.use(router.allowedMethods());
|
|
159
|
+
// Public-surface handlers — neutral response at GET /, robots.txt, favicon.
|
|
160
|
+
// Prevents the default Koa "Not Found" page at the public root without
|
|
161
|
+
// disclosing any product information to unauthenticated visitors. See
|
|
162
|
+
// src/middleware/root-page.ts for the security posture.
|
|
163
|
+
const rootPageRouter = createRootPageRouter();
|
|
164
|
+
app.use(rootPageRouter.routes());
|
|
165
|
+
app.use(rootPageRouter.allowedMethods());
|
|
166
|
+
// Admin metadata endpoint — unauthenticated, provides OIDC discovery
|
|
167
|
+
// info needed by the CLI to initiate the login flow. Returns the issuer
|
|
168
|
+
// URL, client_id, and org slug for the admin CLI PKCE client.
|
|
169
|
+
// The client_id is looked up from the database (created by `porta init`)
|
|
170
|
+
// rather than hardcoded, since client IDs are randomly generated.
|
|
171
|
+
const metadataRouter = new Router();
|
|
172
|
+
metadataRouter.get('/api/admin/metadata', async (ctx) => {
|
|
173
|
+
const superAdminOrg = await findSuperAdminOrganization();
|
|
174
|
+
if (!superAdminOrg) {
|
|
175
|
+
ctx.status = 503;
|
|
176
|
+
ctx.body = {
|
|
177
|
+
error: 'Not initialized',
|
|
178
|
+
message: 'Run porta init to set up the admin system',
|
|
179
|
+
};
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Look up the admin application and its CLI client
|
|
183
|
+
const adminApp = await getApplicationBySlug('porta-admin');
|
|
184
|
+
if (!adminApp) {
|
|
185
|
+
ctx.status = 503;
|
|
186
|
+
ctx.body = {
|
|
187
|
+
error: 'Not initialized',
|
|
188
|
+
message: 'Run porta init to set up the admin system',
|
|
189
|
+
};
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// Find the CLI client (native, public PKCE client) in the admin app.
|
|
193
|
+
// Only need the first page — porta init creates exactly one client.
|
|
194
|
+
const clients = await listClientsByApplication(adminApp.id, {
|
|
195
|
+
page: 1,
|
|
196
|
+
pageSize: 10,
|
|
197
|
+
});
|
|
198
|
+
const cliClient = clients.data.find((c) => c.applicationType === 'native');
|
|
199
|
+
ctx.body = {
|
|
200
|
+
issuer: `${config.issuerBaseUrl}/${superAdminOrg.slug}`,
|
|
201
|
+
orgSlug: superAdminOrg.slug,
|
|
202
|
+
clientId: cliClient?.clientId ?? null,
|
|
203
|
+
};
|
|
204
|
+
});
|
|
205
|
+
app.use(metadataRouter.routes());
|
|
206
|
+
app.use(metadataRouter.allowedMethods());
|
|
207
|
+
// Admin CORS allow-list — emits CORS headers for /api/admin/* only when
|
|
208
|
+
// ADMIN_CORS_ORIGINS is configured. Mounted before admin-auth because
|
|
209
|
+
// preflight OPTIONS requests don't carry Authorization headers.
|
|
210
|
+
// Default (empty config) = deny all cross-origin requests.
|
|
211
|
+
app.use(adminCors(config));
|
|
212
|
+
// Admin API rate limiter — protects state-changing admin endpoints
|
|
213
|
+
// (POST/PUT/PATCH/DELETE /api/admin/*) against brute-force and abuse.
|
|
214
|
+
// Per-IP key, 60 req / 60s. GET requests pass through unmetered.
|
|
215
|
+
// Mounted before admin routes so it fires before route handlers.
|
|
216
|
+
app.use(adminRateLimiter());
|
|
217
|
+
app.use(adminMutationAudit());
|
|
218
|
+
// Set the OIDC provider for admin auth middleware — enables opaque access
|
|
219
|
+
// token validation via provider.AccessToken.find() for all /api/admin/* routes.
|
|
220
|
+
if (oidcProvider) {
|
|
221
|
+
setAdminAuthProvider(oidcProvider);
|
|
222
|
+
// Override the provider's static issuer with a dynamic per-request getter.
|
|
223
|
+
// node-oidc-provider sets `this.issuer` once at construction (the base URL).
|
|
224
|
+
// For path-based multi-tenancy, each org needs its own issuer URL. The getter
|
|
225
|
+
// reads from issuerStore (AsyncLocalStorage) which is populated per-request
|
|
226
|
+
// in the /:orgSlug route handler via issuerStore.run(). Outside a request
|
|
227
|
+
// context (e.g., startup, admin API), it falls back to the base issuer.
|
|
228
|
+
const baseIssuer = config.issuerBaseUrl;
|
|
229
|
+
Object.defineProperty(oidcProvider, 'issuer', {
|
|
230
|
+
get: () => issuerStore.getStore() ?? baseIssuer,
|
|
231
|
+
configurable: true,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// Organization management API — requires admin authentication
|
|
235
|
+
// Mounted at /api/admin/organizations (see routes/organizations.ts)
|
|
236
|
+
const orgRouter = createOrganizationRouter();
|
|
237
|
+
app.use(orgRouter.routes());
|
|
238
|
+
app.use(orgRouter.allowedMethods());
|
|
239
|
+
// Application management API — requires admin authentication
|
|
240
|
+
// Mounted at /api/admin/applications (see routes/applications.ts)
|
|
241
|
+
const appRouter = createApplicationRouter();
|
|
242
|
+
app.use(appRouter.routes());
|
|
243
|
+
app.use(appRouter.allowedMethods());
|
|
244
|
+
// Client & secret management API — requires admin authentication
|
|
245
|
+
// Mounted at /api/admin/clients (see routes/clients.ts)
|
|
246
|
+
const clientRouter = createClientRouter();
|
|
247
|
+
app.use(clientRouter.routes());
|
|
248
|
+
app.use(clientRouter.allowedMethods());
|
|
249
|
+
// User management API — requires admin authentication
|
|
250
|
+
// Mounted at /api/admin/organizations/:orgId/users (see routes/users.ts)
|
|
251
|
+
const userRouter = createUserRouter();
|
|
252
|
+
app.use(userRouter.routes());
|
|
253
|
+
app.use(userRouter.allowedMethods());
|
|
254
|
+
// Standalone user admin API — non-org-scoped user access by userId
|
|
255
|
+
// Mounted at /api/admin/users/:userId (see routes/users.ts)
|
|
256
|
+
// Used by the Admin GUI SPA for user detail/mutation operations
|
|
257
|
+
const standaloneUserRouter = createStandaloneUserRouter();
|
|
258
|
+
app.use(standaloneUserRouter.routes());
|
|
259
|
+
app.use(standaloneUserRouter.allowedMethods());
|
|
260
|
+
// RBAC and custom-claims admin APIs require admin authentication.
|
|
261
|
+
// Role management at /api/admin/applications/:appId/roles
|
|
262
|
+
const roleRouter = createRoleRouter();
|
|
263
|
+
app.use(roleRouter.routes());
|
|
264
|
+
app.use(roleRouter.allowedMethods());
|
|
265
|
+
// Permission management at /api/admin/applications/:appId/permissions
|
|
266
|
+
const permissionRouter = createPermissionRouter();
|
|
267
|
+
app.use(permissionRouter.routes());
|
|
268
|
+
app.use(permissionRouter.allowedMethods());
|
|
269
|
+
// User-role assignments at /api/admin/organizations/:orgId/users/:userId/roles
|
|
270
|
+
const userRoleRouter = createUserRoleRouter();
|
|
271
|
+
app.use(userRoleRouter.routes());
|
|
272
|
+
app.use(userRoleRouter.allowedMethods());
|
|
273
|
+
// 2FA admin — user-level management (status, disable, reset, regenerate)
|
|
274
|
+
// Mounted at /api/admin/organizations/:orgId/users/:userId/two-factor
|
|
275
|
+
const twoFactorUserAdminRouter = createTwoFactorUserAdminRouter();
|
|
276
|
+
app.use(twoFactorUserAdminRouter.routes());
|
|
277
|
+
app.use(twoFactorUserAdminRouter.allowedMethods());
|
|
278
|
+
// Custom claims at /api/admin/applications/:appId/claims
|
|
279
|
+
const customClaimRouter = createCustomClaimRouter();
|
|
280
|
+
app.use(customClaimRouter.routes());
|
|
281
|
+
app.use(customClaimRouter.allowedMethods());
|
|
282
|
+
// System config management API — requires admin authentication
|
|
283
|
+
// Mounted at /api/admin/config (see routes/config.ts)
|
|
284
|
+
const configRouter = createConfigRouter();
|
|
285
|
+
app.use(configRouter.routes());
|
|
286
|
+
app.use(configRouter.allowedMethods());
|
|
287
|
+
// Signing key management API — requires admin authentication
|
|
288
|
+
// Mounted at /api/admin/keys (see routes/keys.ts)
|
|
289
|
+
const keysRouter = createKeysRouter();
|
|
290
|
+
app.use(keysRouter.routes());
|
|
291
|
+
app.use(keysRouter.allowedMethods());
|
|
292
|
+
// Audit log API — requires admin authentication
|
|
293
|
+
// Mounted at /api/admin/audit (see routes/audit.ts)
|
|
294
|
+
const auditRouter = createAuditRouter();
|
|
295
|
+
app.use(auditRouter.routes());
|
|
296
|
+
app.use(auditRouter.allowedMethods());
|
|
297
|
+
// Dashboard statistics API — requires admin authentication
|
|
298
|
+
// Mounted at /api/admin/stats (see routes/stats.ts)
|
|
299
|
+
const statsRouter = createStatsRouter();
|
|
300
|
+
app.use(statsRouter.routes());
|
|
301
|
+
app.use(statsRouter.allowedMethods());
|
|
302
|
+
// Session management API — requires admin authentication
|
|
303
|
+
// Mounted at /api/admin/sessions (see routes/sessions.ts)
|
|
304
|
+
const sessionRouter = createSessionRouter();
|
|
305
|
+
app.use(sessionRouter.routes());
|
|
306
|
+
app.use(sessionRouter.allowedMethods());
|
|
307
|
+
// User session revocation — requires admin authentication
|
|
308
|
+
// Mounted at /api/admin/users/:userId/sessions (see routes/sessions.ts)
|
|
309
|
+
const userSessionRouter = createUserSessionRouter();
|
|
310
|
+
app.use(userSessionRouter.routes());
|
|
311
|
+
app.use(userSessionRouter.allowedMethods());
|
|
312
|
+
// Bulk operations API — requires admin authentication
|
|
313
|
+
// Mounted at /api/admin/bulk (see routes/bulk.ts)
|
|
314
|
+
const bulkRouter = createBulkRouter();
|
|
315
|
+
app.use(bulkRouter.routes());
|
|
316
|
+
app.use(bulkRouter.allowedMethods());
|
|
317
|
+
// Branding assets API — requires admin authentication
|
|
318
|
+
// Mounted at /api/admin/organizations/:orgId/branding (see routes/branding.ts)
|
|
319
|
+
const brandingRouter = createBrandingRouter();
|
|
320
|
+
app.use(brandingRouter.routes());
|
|
321
|
+
app.use(brandingRouter.allowedMethods());
|
|
322
|
+
// 2FA admin — org-level management (policy, summary)
|
|
323
|
+
// Mounted at /api/admin/organizations/:orgId/two-factor
|
|
324
|
+
const twoFactorOrgAdminRouter = createTwoFactorOrgAdminRouter();
|
|
325
|
+
app.use(twoFactorOrgAdminRouter.routes());
|
|
326
|
+
app.use(twoFactorOrgAdminRouter.allowedMethods());
|
|
327
|
+
// Data export API — requires admin authentication
|
|
328
|
+
// Mounted at /api/admin/export (see routes/exports.ts)
|
|
329
|
+
const exportRouter = createExportRouter();
|
|
330
|
+
app.use(exportRouter.routes());
|
|
331
|
+
app.use(exportRouter.allowedMethods());
|
|
332
|
+
// Data import API — requires admin authentication
|
|
333
|
+
// Mounted at /api/admin/import (see routes/imports.ts)
|
|
334
|
+
const importRouter = createImportRouter();
|
|
335
|
+
app.use(importRouter.routes());
|
|
336
|
+
app.use(importRouter.allowedMethods());
|
|
337
|
+
// OIDC interaction routes — mounted at /interaction/:uid/* (root level).
|
|
338
|
+
// These must be at the root (not under /:orgSlug) because the provider sets
|
|
339
|
+
// interaction cookie paths relative to /interaction/{uid}, and the browser
|
|
340
|
+
// must send those cookies when navigating to the interaction URL.
|
|
341
|
+
// Organization context is resolved from the interaction's client_id.
|
|
342
|
+
if (oidcProvider) {
|
|
343
|
+
const interactionRouter = createInteractionRouter(oidcProvider);
|
|
344
|
+
app.use(interactionRouter.routes());
|
|
345
|
+
app.use(interactionRouter.allowedMethods());
|
|
346
|
+
// Two-factor authentication routes — mounted at /interaction/:uid/two-factor/*
|
|
347
|
+
// Must be after the main interaction router for proper routing precedence.
|
|
348
|
+
const twoFactorRouter = createTwoFactorRouter(oidcProvider);
|
|
349
|
+
app.use(twoFactorRouter.routes());
|
|
350
|
+
app.use(twoFactorRouter.allowedMethods());
|
|
351
|
+
}
|
|
352
|
+
// Auth routes — magic link, password reset, invitation
|
|
353
|
+
// These are org-scoped via /:orgSlug/auth/* and use tenant resolution.
|
|
354
|
+
// Mounted before the OIDC catch-all to prevent it from swallowing auth paths.
|
|
355
|
+
// Magic link no longer needs the provider — authentication is completed via
|
|
356
|
+
// the _ml_session cookie and the interaction login handler.
|
|
357
|
+
const magicLinkRouter = createMagicLinkRouter(oidcProvider);
|
|
358
|
+
app.use(magicLinkRouter.routes());
|
|
359
|
+
app.use(magicLinkRouter.allowedMethods());
|
|
360
|
+
// Password reset and invitation routes don't need the provider
|
|
361
|
+
const passwordResetRouter = createPasswordResetRouter();
|
|
362
|
+
app.use(passwordResetRouter.routes());
|
|
363
|
+
app.use(passwordResetRouter.allowedMethods());
|
|
364
|
+
const invitationRouter = createInvitationRouter();
|
|
365
|
+
app.use(invitationRouter.routes());
|
|
366
|
+
app.use(invitationRouter.allowedMethods());
|
|
367
|
+
// Token endpoint rate limiter — protects POST /:orgSlug/oidc/token against
|
|
368
|
+
// flooding and brute-force. Uses per-IP + per-client_id composite key,
|
|
369
|
+
// 30 req / 5 min. Returns 429 with Retry-After when exceeded.
|
|
370
|
+
// Mounted before the OIDC provider so it fires before token processing.
|
|
371
|
+
app.use(tokenRateLimiter());
|
|
372
|
+
// Introspection endpoint rate limiter — protects POST
|
|
373
|
+
// /:orgSlug/oidc/token/introspection against token enumeration.
|
|
374
|
+
// Per-IP + per-client_id key, 100 req / 60s (higher than token endpoint
|
|
375
|
+
// since resource servers introspect on every API call).
|
|
376
|
+
app.use(introspectionRateLimiter());
|
|
377
|
+
// OIDC provider routes — mounted under /:orgSlug prefix
|
|
378
|
+
// This is the catch-all for OIDC protocol endpoints (auth, token, jwks, etc.)
|
|
379
|
+
// MUST be last because /:orgSlug/* matches everything.
|
|
380
|
+
if (oidcProvider) {
|
|
381
|
+
// prompt=login session reset (Bug #1) — mounted on the outer app BEFORE the
|
|
382
|
+
// OIDC router so it runs on a GET /{orgSlug}/auth request (with prompt=login)
|
|
383
|
+
// before node-oidc-provider processes it. Clears the stale `_session` cookie
|
|
384
|
+
// pair so the provider mints a fresh session and resume cannot hit a uid
|
|
385
|
+
// mismatch. No-op for any non-prompt=login request (normal SSO preserved).
|
|
386
|
+
app.use(promptLoginReset(oidcProvider));
|
|
387
|
+
const oidcRouter = new Router({ prefix: '/:orgSlug' });
|
|
388
|
+
// Tenant resolver validates the org slug and sets ctx.state.organization
|
|
389
|
+
oidcRouter.use(tenantResolver());
|
|
390
|
+
// Body parser for OIDC routes — parses application/x-www-form-urlencoded
|
|
391
|
+
// and JSON bodies before they reach our middleware.
|
|
392
|
+
//
|
|
393
|
+
// When the body is already parsed, oidc-provider's selective_body.js detects
|
|
394
|
+
// ctx.req.readable === false and falls back to reading ctx.req.body.
|
|
395
|
+
//
|
|
396
|
+
// IMPORTANT: We must copy the parsed body to ctx.req.body (Node's IncomingMessage)
|
|
397
|
+
// because oidcProvider.callback() receives ctx.req/ctx.res (raw Node objects),
|
|
398
|
+
// and oidc-provider creates its own internal Koa context — so it can NOT access
|
|
399
|
+
// our Koa app's ctx.request.body. Setting ctx.req.body makes the parsed body
|
|
400
|
+
// available via the fallback path in selective_body.js.
|
|
401
|
+
const oidcBodyParser = bodyParser();
|
|
402
|
+
oidcRouter.use(async (ctx, next) => {
|
|
403
|
+
await oidcBodyParser(ctx, next);
|
|
404
|
+
});
|
|
405
|
+
oidcRouter.use(async (ctx, next) => {
|
|
406
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
407
|
+
const body = ctx.request.body;
|
|
408
|
+
if (body && typeof body === 'object' && Object.keys(body).length > 0) {
|
|
409
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
410
|
+
ctx.req.body = body;
|
|
411
|
+
}
|
|
412
|
+
await next();
|
|
413
|
+
});
|
|
414
|
+
// A client is valid only beneath the issuer owned by its organization. This check runs before
|
|
415
|
+
// CORS, secret transformation, and oidc-provider so a foreign client cannot create an
|
|
416
|
+
// interaction or authenticate under another tenant's issuer.
|
|
417
|
+
oidcRouter.use(oidcClientTenantBinding(oidcProvider));
|
|
418
|
+
// OIDC CORS — pre-sets Access-Control-Allow-Origin and related headers
|
|
419
|
+
// BEFORE the request enters oidc-provider's internal Koa context.
|
|
420
|
+
//
|
|
421
|
+
// node-oidc-provider uses @koa/cors with keepHeadersOnError: false,
|
|
422
|
+
// which strips CORS headers from error responses (e.g., 400 from the
|
|
423
|
+
// token endpoint). This middleware fixes that by setting CORS headers
|
|
424
|
+
// at the outer Koa level. The provider's cors.js detects existing
|
|
425
|
+
// access-control-* headers and skips its own handling, so our headers
|
|
426
|
+
// survive both success and error responses.
|
|
427
|
+
//
|
|
428
|
+
// Mounted after body parser so client_id is available for production
|
|
429
|
+
// origin checks. OPTIONS preflights are short-circuited here with 204.
|
|
430
|
+
oidcRouter.use(oidcPreflightCors());
|
|
431
|
+
// Pre-hash client secrets with SHA-256 before oidc-provider processes them.
|
|
432
|
+
// This enables secure secret storage: we store SHA-256 hashes in the DB,
|
|
433
|
+
// the middleware hashes the presented secret, and oidc-provider compares them.
|
|
434
|
+
// Requires body parser above so ctx.request.body.client_secret is available.
|
|
435
|
+
oidcRouter.use(clientSecretHash());
|
|
436
|
+
// Delegate all OIDC requests to node-oidc-provider's callback handler.
|
|
437
|
+
// URL rewriting strips the /:orgSlug prefix so the provider sees
|
|
438
|
+
// standard OIDC paths (/auth, /token, /jwks, etc.).
|
|
439
|
+
oidcRouter.all('/{*path}', async (ctx) => {
|
|
440
|
+
// Preserve the original URL so the provider can detect the mount path
|
|
441
|
+
// and generate correct endpoint URLs (e.g., /playground/auth instead of /auth).
|
|
442
|
+
// node-oidc-provider compares originalUrl vs url to extract the mount prefix.
|
|
443
|
+
const originalUrl = ctx.req.url;
|
|
444
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
445
|
+
ctx.req.originalUrl = originalUrl;
|
|
446
|
+
// Strip the org slug prefix from the URL before passing to the provider.
|
|
447
|
+
// e.g., /acme-corp/token → /token
|
|
448
|
+
ctx.req.url = originalUrl.replace(`/${ctx.params.orgSlug}`, '');
|
|
449
|
+
// Pass the tenant-resolved org to the provider's internal context.
|
|
450
|
+
// The interactionUrl callback (provider.ts) stores it so interaction
|
|
451
|
+
// handlers can recover the issuer organization after the slug is stripped.
|
|
452
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
453
|
+
ctx.req._portaOrganization = ctx.state.organization;
|
|
454
|
+
// Override CSP for OIDC provider responses.
|
|
455
|
+
//
|
|
456
|
+
// The security-headers middleware (Phase 1) set the strict default CSP
|
|
457
|
+
// (`default-src 'none'`) on ctx.res. That CSP lacks a `script-src`
|
|
458
|
+
// directive. node-oidc-provider's `pushScriptSrcSha()` helper only
|
|
459
|
+
// adds inline-script hashes when `script-src` already exists in the
|
|
460
|
+
// CSP — so with our strict default, it silently does nothing.
|
|
461
|
+
//
|
|
462
|
+
// Additionally, `oidcProvider.callback()` creates its own internal Koa
|
|
463
|
+
// context and calls `ctx.res.end()` directly, which means our Phase 3
|
|
464
|
+
// (post-response CSP upgrade for HTML) never runs for provider responses.
|
|
465
|
+
//
|
|
466
|
+
// Setting the HTML-safe CSP here fixes both issues:
|
|
467
|
+
// - form_post / web_message response modes render HTML with inline
|
|
468
|
+
// <script> tags that need `script-src 'unsafe-inline'`
|
|
469
|
+
// - Logout, error, and device-flow pages rendered by provider hooks
|
|
470
|
+
// use inline styles needing `style-src 'unsafe-inline'`
|
|
471
|
+
// - Non-HTML provider responses (token, jwks, introspection JSON)
|
|
472
|
+
// are unaffected — browsers don't execute scripts in JSON responses
|
|
473
|
+
ctx.set('Content-Security-Policy', HTML_CSP);
|
|
474
|
+
// --- Dynamic per-request issuer (RFC 8414 §2 compliance) ---
|
|
475
|
+
// node-oidc-provider uses `this.issuer` for everything: discovery
|
|
476
|
+
// JSON, JWT `iss` claims, and redirect `iss` query parameters.
|
|
477
|
+
// We override the provider's issuer property with a getter that
|
|
478
|
+
// reads from AsyncLocalStorage (see issuerStore above), so all
|
|
479
|
+
// outputs automatically include the org slug. Running the provider
|
|
480
|
+
// callback inside issuerStore.run() scopes the issuer to this
|
|
481
|
+
// request without affecting concurrent requests for other orgs.
|
|
482
|
+
const orgIssuer = `${config.issuerBaseUrl}/${ctx.params.orgSlug}`;
|
|
483
|
+
// Delegate to node-oidc-provider inside the per-request issuer context
|
|
484
|
+
await issuerStore.run(orgIssuer, () => oidcProvider.callback()(ctx.req, ctx.res));
|
|
485
|
+
});
|
|
486
|
+
app.use(oidcRouter.routes());
|
|
487
|
+
app.use(oidcRouter.allowedMethods());
|
|
488
|
+
}
|
|
489
|
+
return app;
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=server.js.map
|