@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,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handlebars-based page template engine for auth workflow pages.
|
|
3
|
+
*
|
|
4
|
+
* Renders server-side HTML pages using a layout + page template pattern.
|
|
5
|
+
* Supports per-organization template overrides:
|
|
6
|
+
* 1. Try: templates/{orgSlug}/pages/{pageName}.hbs
|
|
7
|
+
* 2. Fall back: templates/default/pages/{pageName}.hbs
|
|
8
|
+
*
|
|
9
|
+
* The engine pre-registers partials (header, footer, flash-messages) and
|
|
10
|
+
* compiles the base layout at startup. Page templates are compiled on
|
|
11
|
+
* demand and injected into the layout's {{{body}}} placeholder.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* await initTemplateEngine();
|
|
15
|
+
* const html = await renderPage('login', {
|
|
16
|
+
* branding: { logoUrl: null, faviconUrl: null, primaryColor: '#3B82F6', companyName: 'Acme', customCss: null },
|
|
17
|
+
* locale: 'en',
|
|
18
|
+
* t: translationFn,
|
|
19
|
+
* csrfToken: 'abc123',
|
|
20
|
+
* orgSlug: 'acme-corp',
|
|
21
|
+
* });
|
|
22
|
+
*/
|
|
23
|
+
import fs from 'node:fs/promises';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import Handlebars from 'handlebars';
|
|
26
|
+
import { logger } from '../lib/logger.js';
|
|
27
|
+
import { getTemplatesDirectory } from '../lib/runtime-paths.js';
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Constants
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/** Absolute directory containing templates shipped with the server package. */
|
|
32
|
+
const TEMPLATES_DIR = getTemplatesDirectory();
|
|
33
|
+
/** Default template set name */
|
|
34
|
+
const DEFAULT_SET = 'default';
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Module state
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
/** Compiled base layout template (loaded at init) */
|
|
39
|
+
let layoutTemplate = null;
|
|
40
|
+
/** Whether the engine has been initialized */
|
|
41
|
+
let initialized = false;
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Initialization
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
/**
|
|
46
|
+
* Initialize the Handlebars template engine.
|
|
47
|
+
*
|
|
48
|
+
* Registers all default partials (header, footer, flash-messages),
|
|
49
|
+
* registers custom helpers (eq, ifCond), and compiles the base layout.
|
|
50
|
+
* Must be called once at application startup before renderPage is used.
|
|
51
|
+
*
|
|
52
|
+
* @throws Error if layout template or required partials cannot be loaded
|
|
53
|
+
*/
|
|
54
|
+
export async function initTemplateEngine() {
|
|
55
|
+
// Register partials from the default set
|
|
56
|
+
const partialsDir = path.join(TEMPLATES_DIR, DEFAULT_SET, 'partials');
|
|
57
|
+
await registerPartials(partialsDir);
|
|
58
|
+
// Register custom Handlebars helpers
|
|
59
|
+
registerHelpers();
|
|
60
|
+
// Compile the base layout
|
|
61
|
+
const layoutPath = path.join(TEMPLATES_DIR, DEFAULT_SET, 'layouts', 'main.hbs');
|
|
62
|
+
const layoutSource = await fs.readFile(layoutPath, 'utf-8');
|
|
63
|
+
layoutTemplate = Handlebars.compile(layoutSource);
|
|
64
|
+
initialized = true;
|
|
65
|
+
logger.info({ templatesDir: TEMPLATES_DIR }, 'Template engine initialized');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Register all .hbs files in a directory as Handlebars partials.
|
|
69
|
+
*
|
|
70
|
+
* Partial names are derived from filenames without extension:
|
|
71
|
+
* e.g., 'header.hbs' → partial name 'header' (used as {{> header}}).
|
|
72
|
+
*
|
|
73
|
+
* @param partialsDir - Absolute path to the partials directory
|
|
74
|
+
*/
|
|
75
|
+
async function registerPartials(partialsDir) {
|
|
76
|
+
try {
|
|
77
|
+
const files = await fs.readdir(partialsDir);
|
|
78
|
+
const hbsFiles = files.filter((f) => f.endsWith('.hbs'));
|
|
79
|
+
for (const file of hbsFiles) {
|
|
80
|
+
const name = path.basename(file, '.hbs');
|
|
81
|
+
const source = await fs.readFile(path.join(partialsDir, file), 'utf-8');
|
|
82
|
+
Handlebars.registerPartial(name, source);
|
|
83
|
+
logger.debug({ partial: name }, 'Registered Handlebars partial');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
logger.warn({ error, partialsDir }, 'Failed to register partials — directory may not exist');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Register custom Handlebars helpers used across templates.
|
|
92
|
+
*
|
|
93
|
+
* Helpers:
|
|
94
|
+
* - {{eq a b}}: Strict equality check (useful in {{#if (eq status "active")}})
|
|
95
|
+
* - {{year}}: Current year (for copyright footers)
|
|
96
|
+
*/
|
|
97
|
+
function registerHelpers() {
|
|
98
|
+
// Equality helper — {{#if (eq prompt "login")}}
|
|
99
|
+
Handlebars.registerHelper('eq', function (a, b) {
|
|
100
|
+
return a === b;
|
|
101
|
+
});
|
|
102
|
+
// Current year helper — {{year}}
|
|
103
|
+
Handlebars.registerHelper('year', function () {
|
|
104
|
+
return new Date().getFullYear();
|
|
105
|
+
});
|
|
106
|
+
// String concatenation helper — {{concat "prefix_" value}}
|
|
107
|
+
Handlebars.registerHelper('concat', function (...args) {
|
|
108
|
+
// Last argument is the Handlebars options object — exclude it
|
|
109
|
+
return args.slice(0, -1).join('');
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Template resolution
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
/**
|
|
116
|
+
* Resolve a page template path with org-override support.
|
|
117
|
+
*
|
|
118
|
+
* Checks for an organization-specific page template first, then falls
|
|
119
|
+
* back to the default. Returns null if neither exists.
|
|
120
|
+
*
|
|
121
|
+
* @param pageName - Page template name (e.g., 'login', 'consent')
|
|
122
|
+
* @param orgSlug - Organization slug for override lookup
|
|
123
|
+
* @returns Absolute path to the template file, or null if not found
|
|
124
|
+
*/
|
|
125
|
+
async function resolvePageTemplatePath(pageName, orgSlug) {
|
|
126
|
+
// Try org-specific page template first
|
|
127
|
+
const orgPath = path.join(TEMPLATES_DIR, orgSlug, 'pages', `${pageName}.hbs`);
|
|
128
|
+
try {
|
|
129
|
+
await fs.access(orgPath);
|
|
130
|
+
return orgPath;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Org-specific page doesn't exist — fall through to default
|
|
134
|
+
}
|
|
135
|
+
// Fall back to default page template
|
|
136
|
+
const defaultPath = path.join(TEMPLATES_DIR, DEFAULT_SET, 'pages', `${pageName}.hbs`);
|
|
137
|
+
try {
|
|
138
|
+
await fs.access(defaultPath);
|
|
139
|
+
return defaultPath;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// Public API
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
/**
|
|
149
|
+
* Render a page template with layout, branding, and i18n.
|
|
150
|
+
*
|
|
151
|
+
* Template resolution order:
|
|
152
|
+
* 1. templates/{orgSlug}/pages/{pageName}.hbs (org override)
|
|
153
|
+
* 2. templates/default/pages/{pageName}.hbs (default)
|
|
154
|
+
*
|
|
155
|
+
* The page content is rendered first, then injected into the base layout's
|
|
156
|
+
* {{{body}}} placeholder. Both the page and layout receive the full context,
|
|
157
|
+
* so they can access branding, i18n, CSRF, and page-specific data.
|
|
158
|
+
*
|
|
159
|
+
* @param pageName - Page template name (e.g., 'login', 'consent', 'error')
|
|
160
|
+
* @param context - Template context with branding, i18n, CSRF, flash, and page data
|
|
161
|
+
* @returns Rendered HTML string (complete page with layout)
|
|
162
|
+
* @throws Error if the template engine hasn't been initialized
|
|
163
|
+
* @throws Error if the page template cannot be found
|
|
164
|
+
*/
|
|
165
|
+
export async function renderPage(pageName, context) {
|
|
166
|
+
if (!initialized || !layoutTemplate) {
|
|
167
|
+
throw new Error('Template engine not initialized — call initTemplateEngine() first');
|
|
168
|
+
}
|
|
169
|
+
// Resolve the page template (with org-override support)
|
|
170
|
+
const templatePath = await resolvePageTemplatePath(pageName, context.orgSlug);
|
|
171
|
+
if (!templatePath) {
|
|
172
|
+
throw new Error(`Page template not found: ${pageName}.hbs (checked ${context.orgSlug}/ and default/)`);
|
|
173
|
+
}
|
|
174
|
+
// Load and compile the page template
|
|
175
|
+
const pageSource = await fs.readFile(templatePath, 'utf-8');
|
|
176
|
+
const pageTemplate = Handlebars.compile(pageSource);
|
|
177
|
+
// Build the full context with additional layout properties
|
|
178
|
+
const fullContext = {
|
|
179
|
+
...context,
|
|
180
|
+
// Add pageTitle for the <title> tag — use pageName capitalized as default
|
|
181
|
+
pageTitle: context.pageTitle ?? capitalize(pageName.replace(/-/g, ' ')),
|
|
182
|
+
year: new Date().getFullYear(),
|
|
183
|
+
};
|
|
184
|
+
// Register `t` as a runtime helper so templates can use subexpressions
|
|
185
|
+
// like {{t (concat "prefix_" value)}}. Context functions only work for
|
|
186
|
+
// simple {{t "key"}} calls; subexpressions require a registered helper.
|
|
187
|
+
// Runtime helpers are per-render (no global mutation, concurrent-safe).
|
|
188
|
+
//
|
|
189
|
+
// IMPORTANT: Handlebars helpers receive (key, HelperOptions) where hash
|
|
190
|
+
// arguments (e.g., clientName=interaction.client.clientName) are in
|
|
191
|
+
// options.hash — NOT as top-level properties. The raw context.t function
|
|
192
|
+
// expects a flat options object, so we extract .hash here.
|
|
193
|
+
const tFn = context.t;
|
|
194
|
+
const runtimeOptions = {
|
|
195
|
+
helpers: {
|
|
196
|
+
t(key, options) {
|
|
197
|
+
const hash = options?.hash ?? {};
|
|
198
|
+
return tFn(key, hash);
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
// Render the page body first
|
|
203
|
+
const pageBody = pageTemplate(fullContext, runtimeOptions);
|
|
204
|
+
// Inject the page body into the layout
|
|
205
|
+
const layoutContext = {
|
|
206
|
+
...fullContext,
|
|
207
|
+
body: pageBody,
|
|
208
|
+
};
|
|
209
|
+
return layoutTemplate(layoutContext, runtimeOptions);
|
|
210
|
+
}
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// Utilities
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
/**
|
|
215
|
+
* Capitalize the first letter of a string.
|
|
216
|
+
*
|
|
217
|
+
* @param str - Input string
|
|
218
|
+
* @returns String with first letter uppercased
|
|
219
|
+
*/
|
|
220
|
+
function capitalize(str) {
|
|
221
|
+
if (!str)
|
|
222
|
+
return str;
|
|
223
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=template-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../../src/auth/template-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token repository — PostgreSQL CRUD for all three token tables.
|
|
3
|
+
*
|
|
4
|
+
* Password-reset and invitation tokens use shared allowlisted helpers. Magic-link issuance and
|
|
5
|
+
* consumption use dedicated authority-aware transactions so callers cannot omit tenant, live
|
|
6
|
+
* client, or interaction validation.
|
|
7
|
+
*
|
|
8
|
+
* Token lifecycle:
|
|
9
|
+
* 1. insertToken() → store hash + expiry for a user
|
|
10
|
+
* 2. findValidToken() → look up unused, non-expired token by hash
|
|
11
|
+
* 3. markTokenUsed() → set used_at = NOW() after successful verification
|
|
12
|
+
* 4. invalidateUserTokens() → expire all active tokens for a user (when new token issued)
|
|
13
|
+
* 5. deleteExpiredTokens() → cleanup old rows (housekeeping)
|
|
14
|
+
*/
|
|
15
|
+
import type { PoolClient } from 'pg';
|
|
16
|
+
import type { UserStatus } from '../users/types.js';
|
|
17
|
+
/** Allowed token table names — used as an allowlist to prevent SQL injection */
|
|
18
|
+
export type TokenTable = 'magic_link_tokens' | 'password_reset_tokens' | 'invitation_tokens';
|
|
19
|
+
/** Token tables whose rows do not require magic-link tenant and interaction authority. */
|
|
20
|
+
export type GenericInsertTokenTable = Exclude<TokenTable, 'magic_link_tokens'>;
|
|
21
|
+
/** Row shape returned from any of the three token tables */
|
|
22
|
+
export interface TokenRecord {
|
|
23
|
+
id: string;
|
|
24
|
+
userId: string;
|
|
25
|
+
tokenHash: string;
|
|
26
|
+
expiresAt: Date;
|
|
27
|
+
usedAt: Date | null;
|
|
28
|
+
createdAt: Date;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extended token record for invitation tokens with optional details.
|
|
32
|
+
*
|
|
33
|
+
* The details JSONB column stores pre-assignment metadata (roles, claims,
|
|
34
|
+
* personal message) that should be applied when the invitation is accepted.
|
|
35
|
+
*/
|
|
36
|
+
export interface InvitationTokenRecord extends TokenRecord {
|
|
37
|
+
/** JSONB details stored with the invitation (roles, claims, personalMessage, inviterName) */
|
|
38
|
+
details: Record<string, unknown> | null;
|
|
39
|
+
/** User ID of the admin who created this invitation */
|
|
40
|
+
invitedBy: string | null;
|
|
41
|
+
}
|
|
42
|
+
/** Input for idempotently creating a recovery-job-owned token. */
|
|
43
|
+
interface EnsureRecoveryTokenBaseInput {
|
|
44
|
+
/** Token table selected by the closed recovery job type. */
|
|
45
|
+
/** Durable recovery job UUID. */
|
|
46
|
+
readonly recoveryJobId: string;
|
|
47
|
+
/** Eligible account UUID. */
|
|
48
|
+
readonly userId: string;
|
|
49
|
+
/** Hash of the deterministic plaintext token. */
|
|
50
|
+
readonly tokenHash: string;
|
|
51
|
+
/** Expiration instant fixed by the first successful artifact transaction. */
|
|
52
|
+
readonly expiresAt: Date;
|
|
53
|
+
}
|
|
54
|
+
/** Recovery-token input whose durable authority belongs to one OIDC tenant and interaction. */
|
|
55
|
+
export interface EnsureMagicLinkRecoveryTokenInput extends EnsureRecoveryTokenBaseInput {
|
|
56
|
+
/** Select the magic-link artifact table and its authority-aware insert path. */
|
|
57
|
+
readonly table: 'magic_link_tokens';
|
|
58
|
+
/** Organization that owns the artifact and resolved user. */
|
|
59
|
+
readonly organizationId: string;
|
|
60
|
+
/** Exact OIDC interaction authority, or null for an explicitly standalone artifact. */
|
|
61
|
+
readonly interactionUid: string | null;
|
|
62
|
+
/** Current OIDC client resolved from the provider-owned interaction. */
|
|
63
|
+
readonly clientId: string | null;
|
|
64
|
+
}
|
|
65
|
+
/** Recovery-token input for password reset, which has no OIDC interaction authority. */
|
|
66
|
+
export interface EnsurePasswordResetRecoveryTokenInput extends EnsureRecoveryTokenBaseInput {
|
|
67
|
+
/** Select the password-reset artifact table. */
|
|
68
|
+
readonly table: 'password_reset_tokens';
|
|
69
|
+
}
|
|
70
|
+
/** Closed recovery-token input union that prevents authority-free magic-link insertion. */
|
|
71
|
+
export type EnsureRecoveryTokenInput = EnsureMagicLinkRecoveryTokenInput | EnsurePasswordResetRecoveryTokenInput;
|
|
72
|
+
/** Durable artifact decision returned by idempotent recovery-token issuance. */
|
|
73
|
+
export type EnsureRecoveryTokenResult = 'active' | 'superseded';
|
|
74
|
+
/** Magic-link artifact whose persisted authority was selected under a database row lock. */
|
|
75
|
+
export interface LockedMagicLinkToken extends TokenRecord {
|
|
76
|
+
/** Organization persisted when the artifact was issued. */
|
|
77
|
+
readonly organizationId: string;
|
|
78
|
+
/** Exact persisted interaction, or null for a standalone artifact. */
|
|
79
|
+
readonly interactionUid: string | null;
|
|
80
|
+
/** Lifecycle state observed while the owning account row is locked. */
|
|
81
|
+
readonly accountStatus: UserStatus;
|
|
82
|
+
}
|
|
83
|
+
/** Inputs required to validate and consume one magic-link artifact transactionally. */
|
|
84
|
+
export interface ConsumeAuthorizedMagicLinkInput {
|
|
85
|
+
/** SHA-256 digest of the presented bearer artifact. */
|
|
86
|
+
readonly tokenHash: string;
|
|
87
|
+
/** Organization resolved from the public route. */
|
|
88
|
+
readonly organizationId: string;
|
|
89
|
+
/** Exact transport interaction, or null when the public request supplied none. */
|
|
90
|
+
readonly interactionUid: string | null;
|
|
91
|
+
/** Current interaction client, or null only for an explicitly standalone artifact. */
|
|
92
|
+
readonly clientId: string | null;
|
|
93
|
+
/** Validated request address retained only in the successful audit row. */
|
|
94
|
+
readonly ipAddress?: string;
|
|
95
|
+
}
|
|
96
|
+
/** Successful authority decision returned after the database transaction commits. */
|
|
97
|
+
export interface ConsumedAuthorizedMagicLink {
|
|
98
|
+
/** Account authorized and updated by the consumed artifact. */
|
|
99
|
+
readonly userId: string;
|
|
100
|
+
/** Persisted interaction authority, or null for a standalone artifact. */
|
|
101
|
+
readonly interactionUid: string | null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Insert a new token into the specified table.
|
|
105
|
+
*
|
|
106
|
+
* @param table - Target token table (magic_link_tokens | password_reset_tokens | invitation_tokens)
|
|
107
|
+
* @param userId - UUID of the user this token belongs to
|
|
108
|
+
* @param tokenHash - SHA-256 hex hash of the plaintext token
|
|
109
|
+
* @param expiresAt - When this token expires
|
|
110
|
+
*/
|
|
111
|
+
export declare function insertToken(table: GenericInsertTokenTable, userId: string, tokenHash: string, expiresAt: Date): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Create or observe the single token artifact owned by a recovery job.
|
|
114
|
+
*
|
|
115
|
+
* A transaction locks the user row as the shared serialization authority, reuses an existing job
|
|
116
|
+
* artifact, or invalidates an older artifact and inserts exactly one new row. A retry from an older
|
|
117
|
+
* job cannot replace authority created by any newer job, even after that authority is consumed or
|
|
118
|
+
* expires. SQL identifiers come exclusively from the closed table union.
|
|
119
|
+
*
|
|
120
|
+
* @param input - Recovery-job token authority and deterministic token facts.
|
|
121
|
+
*/
|
|
122
|
+
export declare function ensureRecoveryJobToken(input: EnsureRecoveryTokenInput): Promise<EnsureRecoveryTokenResult>;
|
|
123
|
+
/**
|
|
124
|
+
* Find a valid (unused, not expired) token by its hash.
|
|
125
|
+
*
|
|
126
|
+
* Checks both `used_at IS NULL` and `expires_at > NOW()` in a single query
|
|
127
|
+
* for efficiency. Returns null if no matching valid token exists.
|
|
128
|
+
*
|
|
129
|
+
* @param table - Target token table
|
|
130
|
+
* @param tokenHash - SHA-256 hex hash to look up
|
|
131
|
+
* @returns The token record if valid, or null if not found/expired/used
|
|
132
|
+
*/
|
|
133
|
+
export declare function findValidToken(table: TokenTable, tokenHash: string): Promise<TokenRecord | null>;
|
|
134
|
+
/**
|
|
135
|
+
* Find a valid token only when its user belongs to the resolved organization.
|
|
136
|
+
*
|
|
137
|
+
* Tenant binding is enforced in the lookup itself so a valid token presented under another
|
|
138
|
+
* tenant is indistinguishable from an invalid token and cannot reach account mutation.
|
|
139
|
+
*
|
|
140
|
+
* @param table - Target token table.
|
|
141
|
+
* @param tokenHash - SHA-256 token digest.
|
|
142
|
+
* @param organizationId - Tenant authority resolved from the public route.
|
|
143
|
+
* @returns The valid tenant-owned token, or null.
|
|
144
|
+
*/
|
|
145
|
+
export declare function findValidTokenForOrganization(table: TokenTable, tokenHash: string, organizationId: string): Promise<TokenRecord | null>;
|
|
146
|
+
/**
|
|
147
|
+
* Lock one valid magic-link artifact together with its tenant-owned user.
|
|
148
|
+
*
|
|
149
|
+
* Legacy rows without persisted organization authority do not match. The caller must keep the
|
|
150
|
+
* supplied client transaction open while validating interaction authority and applying all
|
|
151
|
+
* successful state changes.
|
|
152
|
+
*
|
|
153
|
+
* @param client - Active PostgreSQL transaction client.
|
|
154
|
+
* @param tokenHash - SHA-256 digest of the presented artifact.
|
|
155
|
+
* @param organizationId - Organization resolved from the public route.
|
|
156
|
+
* @returns The locked authority record, or null for every invalid authority state.
|
|
157
|
+
*/
|
|
158
|
+
export declare function findAndLockMagicLinkToken(client: PoolClient, tokenHash: string, organizationId: string): Promise<LockedMagicLinkToken | null>;
|
|
159
|
+
/**
|
|
160
|
+
* Conditionally consume a previously locked magic-link artifact.
|
|
161
|
+
*
|
|
162
|
+
* The predicates are repeated at mutation time so expiry or accidental prior consumption cannot
|
|
163
|
+
* be converted into a successful use. The caller must roll back when this function returns false.
|
|
164
|
+
*
|
|
165
|
+
* @param client - Active PostgreSQL transaction client that owns the artifact lock.
|
|
166
|
+
* @param tokenId - UUID of the locked magic-link artifact.
|
|
167
|
+
* @returns True only when exactly one still-valid row was consumed.
|
|
168
|
+
*/
|
|
169
|
+
export declare function consumeLockedMagicLinkToken(client: PoolClient, tokenId: string): Promise<boolean>;
|
|
170
|
+
/**
|
|
171
|
+
* Validate all durable authority and apply one magic-link login in a single transaction.
|
|
172
|
+
*
|
|
173
|
+
* The artifact and account rows remain locked from lookup through consumption, account update,
|
|
174
|
+
* and audit insertion. Every authority mismatch rolls back before mutation, including a missing,
|
|
175
|
+
* changed, or unexpectedly supplied interaction identifier. Cache and Redis continuation work
|
|
176
|
+
* deliberately happen after this durable transaction because they are separate stores.
|
|
177
|
+
*
|
|
178
|
+
* @param input - Route tenant, presented interaction, artifact digest, and safe request metadata.
|
|
179
|
+
* @returns The committed account authority, or null for every public rejection condition.
|
|
180
|
+
*/
|
|
181
|
+
export declare function consumeAuthorizedMagicLink(input: ConsumeAuthorizedMagicLinkInput): Promise<ConsumedAuthorizedMagicLink | null>;
|
|
182
|
+
/**
|
|
183
|
+
* Mark a token as used by setting used_at = NOW().
|
|
184
|
+
*
|
|
185
|
+
* Called after successful token verification to prevent reuse.
|
|
186
|
+
* This is a single-use pattern — once marked, the token cannot be found by findValidToken.
|
|
187
|
+
*
|
|
188
|
+
* @param table - Target token table
|
|
189
|
+
* @param tokenId - UUID of the token row to mark
|
|
190
|
+
*/
|
|
191
|
+
export declare function markTokenUsed(table: TokenTable, tokenId: string): Promise<void>;
|
|
192
|
+
/**
|
|
193
|
+
* Delete expired or used tokens older than a given cutoff date.
|
|
194
|
+
*
|
|
195
|
+
* Housekeeping function to prevent token tables from growing indefinitely.
|
|
196
|
+
* Removes tokens where expires_at < cutoff OR (used_at IS NOT NULL AND used_at < cutoff).
|
|
197
|
+
*
|
|
198
|
+
* @param table - Target token table
|
|
199
|
+
* @param olderThan - Cutoff date — tokens expired/used before this are deleted
|
|
200
|
+
* @returns Number of rows deleted
|
|
201
|
+
*/
|
|
202
|
+
export declare function deleteExpiredTokens(table: TokenTable, olderThan: Date): Promise<number>;
|
|
203
|
+
/**
|
|
204
|
+
* Invalidate all unused tokens for a user in a table.
|
|
205
|
+
*
|
|
206
|
+
* Sets used_at = NOW() on all active (unused, non-expired) tokens.
|
|
207
|
+
* Called when a new token is issued to ensure only the latest token is valid.
|
|
208
|
+
* This prevents token accumulation and confusion from multiple active tokens.
|
|
209
|
+
*
|
|
210
|
+
* @param table - Target token table
|
|
211
|
+
* @param userId - UUID of the user whose tokens should be invalidated
|
|
212
|
+
*/
|
|
213
|
+
export declare function invalidateUserTokens(table: TokenTable, userId: string): Promise<void>;
|
|
214
|
+
/**
|
|
215
|
+
* Insert an invitation token with optional details and inviter metadata.
|
|
216
|
+
*
|
|
217
|
+
* Unlike the generic insertToken(), this stores additional JSONB details
|
|
218
|
+
* (pre-assigned roles, claims, personal message) and tracks who sent the invite.
|
|
219
|
+
*
|
|
220
|
+
* @param userId - UUID of the invited user
|
|
221
|
+
* @param tokenHash - SHA-256 hex hash of the plaintext token
|
|
222
|
+
* @param expiresAt - When this invitation expires
|
|
223
|
+
* @param details - Optional JSONB details (roles, claims, personalMessage, inviterName)
|
|
224
|
+
* @param invitedBy - Optional UUID of the admin who created this invitation
|
|
225
|
+
*/
|
|
226
|
+
export declare function insertInvitationToken(userId: string, tokenHash: string, expiresAt: Date, details?: Record<string, unknown> | null, invitedBy?: string | null): Promise<void>;
|
|
227
|
+
/**
|
|
228
|
+
* Find a valid invitation token with its details metadata.
|
|
229
|
+
*
|
|
230
|
+
* Returns the full InvitationTokenRecord including the details JSONB
|
|
231
|
+
* column, which stores pre-assignment metadata for roles, claims, etc.
|
|
232
|
+
*
|
|
233
|
+
* @param tokenHash - SHA-256 hex hash to look up
|
|
234
|
+
* @returns The invitation token record with details, or null if not found/expired/used
|
|
235
|
+
*/
|
|
236
|
+
export declare function findValidInvitationToken(tokenHash: string): Promise<InvitationTokenRecord | null>;
|
|
237
|
+
export {};
|
|
238
|
+
//# sourceMappingURL=token-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-repository.d.ts","sourceRoot":"","sources":["../../src/auth/token-repository.ts"],"names":[],"mappings":"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"}
|