@trokky/trokky 2.0.3
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/dist/adapters/filesystem/filesystem-adapter.d.ts +80 -0
- package/dist/adapters/filesystem/filesystem-adapter.d.ts.map +1 -0
- package/dist/adapters/filesystem/filesystem-adapter.js +1370 -0
- package/dist/adapters/filesystem/filesystem-adapter.js.map +1 -0
- package/dist/adapters/filesystem/index.d.ts +29 -0
- package/dist/adapters/filesystem/index.d.ts.map +1 -0
- package/dist/adapters/filesystem/index.js +31 -0
- package/dist/adapters/filesystem/index.js.map +1 -0
- package/dist/adapters/filesystem/types.d.ts +111 -0
- package/dist/adapters/filesystem/types.d.ts.map +1 -0
- package/dist/adapters/filesystem/types.js +2 -0
- package/dist/adapters/filesystem/types.js.map +1 -0
- package/dist/adapters/filesystem-data/filesystem-data-adapter.d.ts +111 -0
- package/dist/adapters/filesystem-data/filesystem-data-adapter.d.ts.map +1 -0
- package/dist/adapters/filesystem-data/filesystem-data-adapter.js +1363 -0
- package/dist/adapters/filesystem-data/filesystem-data-adapter.js.map +1 -0
- package/dist/adapters/filesystem-data/index.d.ts +3 -0
- package/dist/adapters/filesystem-data/index.d.ts.map +1 -0
- package/dist/adapters/filesystem-data/index.js +13 -0
- package/dist/adapters/filesystem-data/index.js.map +1 -0
- package/dist/adapters/filesystem-data/types.d.ts +147 -0
- package/dist/adapters/filesystem-data/types.d.ts.map +1 -0
- package/dist/adapters/filesystem-data/types.js +2 -0
- package/dist/adapters/filesystem-data/types.js.map +1 -0
- package/dist/adapters/filesystem-media/filesystem-media-adapter.d.ts +32 -0
- package/dist/adapters/filesystem-media/filesystem-media-adapter.d.ts.map +1 -0
- package/dist/adapters/filesystem-media/filesystem-media-adapter.js +639 -0
- package/dist/adapters/filesystem-media/filesystem-media-adapter.js.map +1 -0
- package/dist/adapters/filesystem-media/index.d.ts +3 -0
- package/dist/adapters/filesystem-media/index.d.ts.map +1 -0
- package/dist/adapters/filesystem-media/index.js +13 -0
- package/dist/adapters/filesystem-media/index.js.map +1 -0
- package/dist/adapters/filesystem-media/types.d.ts +76 -0
- package/dist/adapters/filesystem-media/types.d.ts.map +1 -0
- package/dist/adapters/filesystem-media/types.js +2 -0
- package/dist/adapters/filesystem-media/types.js.map +1 -0
- package/dist/adapters/postgres-data/index.d.ts +3 -0
- package/dist/adapters/postgres-data/index.d.ts.map +1 -0
- package/dist/adapters/postgres-data/index.js +13 -0
- package/dist/adapters/postgres-data/index.js.map +1 -0
- package/dist/adapters/postgres-data/postgres-data-adapter.d.ts +154 -0
- package/dist/adapters/postgres-data/postgres-data-adapter.d.ts.map +1 -0
- package/dist/adapters/postgres-data/postgres-data-adapter.js +1432 -0
- package/dist/adapters/postgres-data/postgres-data-adapter.js.map +1 -0
- package/dist/adapters/postgres-data/types.d.ts +139 -0
- package/dist/adapters/postgres-data/types.d.ts.map +1 -0
- package/dist/adapters/postgres-data/types.js +2 -0
- package/dist/adapters/postgres-data/types.js.map +1 -0
- package/dist/core/adapters/registry.d.ts +79 -0
- package/dist/core/adapters/registry.d.ts.map +1 -0
- package/dist/core/adapters/registry.js +149 -0
- package/dist/core/adapters/registry.js.map +1 -0
- package/dist/core/core/engine.d.ts +551 -0
- package/dist/core/core/engine.d.ts.map +1 -0
- package/dist/core/core/engine.js +1074 -0
- package/dist/core/core/engine.js.map +1 -0
- package/dist/core/crypto/adapter.d.ts +63 -0
- package/dist/core/crypto/adapter.d.ts.map +1 -0
- package/dist/core/crypto/adapter.js +63 -0
- package/dist/core/crypto/adapter.js.map +1 -0
- package/dist/core/crypto/fallback-adapter.d.ts +23 -0
- package/dist/core/crypto/fallback-adapter.d.ts.map +1 -0
- package/dist/core/crypto/fallback-adapter.js +195 -0
- package/dist/core/crypto/fallback-adapter.js.map +1 -0
- package/dist/core/crypto/node-adapter.d.ts +20 -0
- package/dist/core/crypto/node-adapter.d.ts.map +1 -0
- package/dist/core/crypto/node-adapter.js +85 -0
- package/dist/core/crypto/node-adapter.js.map +1 -0
- package/dist/core/crypto/password-hash.d.ts +73 -0
- package/dist/core/crypto/password-hash.d.ts.map +1 -0
- package/dist/core/crypto/password-hash.js +244 -0
- package/dist/core/crypto/password-hash.js.map +1 -0
- package/dist/core/crypto/webcrypto-adapter.d.ts +24 -0
- package/dist/core/crypto/webcrypto-adapter.d.ts.map +1 -0
- package/dist/core/crypto/webcrypto-adapter.js +158 -0
- package/dist/core/crypto/webcrypto-adapter.js.map +1 -0
- package/dist/core/errors/index.d.ts +30 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +61 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/events/event-bus.d.ts +121 -0
- package/dist/core/events/event-bus.d.ts.map +1 -0
- package/dist/core/events/event-bus.js +631 -0
- package/dist/core/events/event-bus.js.map +1 -0
- package/dist/core/events/index.d.ts +17 -0
- package/dist/core/events/index.d.ts.map +1 -0
- package/dist/core/events/index.js +22 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/events/memory-storage.d.ts +57 -0
- package/dist/core/events/memory-storage.d.ts.map +1 -0
- package/dist/core/events/memory-storage.js +175 -0
- package/dist/core/events/memory-storage.js.map +1 -0
- package/dist/core/events/types.d.ts +434 -0
- package/dist/core/events/types.d.ts.map +1 -0
- package/dist/core/events/types.js +9 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/events/utils.d.ts +134 -0
- package/dist/core/events/utils.d.ts.map +1 -0
- package/dist/core/events/utils.js +333 -0
- package/dist/core/events/utils.js.map +1 -0
- package/dist/core/fields/conditional.d.ts +115 -0
- package/dist/core/fields/conditional.d.ts.map +1 -0
- package/dist/core/fields/conditional.js +296 -0
- package/dist/core/fields/conditional.js.map +1 -0
- package/dist/core/fields/field-type.d.ts +218 -0
- package/dist/core/fields/field-type.d.ts.map +1 -0
- package/dist/core/fields/field-type.js +17 -0
- package/dist/core/fields/field-type.js.map +1 -0
- package/dist/core/fields/helpers.d.ts +86 -0
- package/dist/core/fields/helpers.d.ts.map +1 -0
- package/dist/core/fields/helpers.js +260 -0
- package/dist/core/fields/helpers.js.map +1 -0
- package/dist/core/fields/index.d.ts +5 -0
- package/dist/core/fields/index.d.ts.map +1 -0
- package/dist/core/fields/index.js +6 -0
- package/dist/core/fields/index.js.map +1 -0
- package/dist/core/fields/registry.d.ts +78 -0
- package/dist/core/fields/registry.d.ts.map +1 -0
- package/dist/core/fields/registry.js +185 -0
- package/dist/core/fields/registry.js.map +1 -0
- package/dist/core/index.d.ts +39 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +57 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/media/image-processor.d.ts +24 -0
- package/dist/core/media/image-processor.d.ts.map +1 -0
- package/dist/core/media/image-processor.js +69 -0
- package/dist/core/media/image-processor.js.map +1 -0
- package/dist/core/media/processors/cloudflare-images.d.ts +83 -0
- package/dist/core/media/processors/cloudflare-images.d.ts.map +1 -0
- package/dist/core/media/processors/cloudflare-images.js +241 -0
- package/dist/core/media/processors/cloudflare-images.js.map +1 -0
- package/dist/core/media/processors/cloudflare-transform-store.d.ts +127 -0
- package/dist/core/media/processors/cloudflare-transform-store.d.ts.map +1 -0
- package/dist/core/media/processors/cloudflare-transform-store.js +237 -0
- package/dist/core/media/processors/cloudflare-transform-store.js.map +1 -0
- package/dist/core/media/processors/cloudflare-transformations.d.ts +81 -0
- package/dist/core/media/processors/cloudflare-transformations.d.ts.map +1 -0
- package/dist/core/media/processors/cloudflare-transformations.js +144 -0
- package/dist/core/media/processors/cloudflare-transformations.js.map +1 -0
- package/dist/core/media/processors/index.d.ts +9 -0
- package/dist/core/media/processors/index.d.ts.map +1 -0
- package/dist/core/media/processors/index.js +13 -0
- package/dist/core/media/processors/index.js.map +1 -0
- package/dist/core/media/processors/noop.d.ts +22 -0
- package/dist/core/media/processors/noop.d.ts.map +1 -0
- package/dist/core/media/processors/noop.js +38 -0
- package/dist/core/media/processors/noop.js.map +1 -0
- package/dist/core/media/processors/sharp.d.ts +30 -0
- package/dist/core/media/processors/sharp.d.ts.map +1 -0
- package/dist/core/media/processors/sharp.js +126 -0
- package/dist/core/media/processors/sharp.js.map +1 -0
- package/dist/core/media/processors/types.d.ts +67 -0
- package/dist/core/media/processors/types.d.ts.map +1 -0
- package/dist/core/media/processors/types.js +42 -0
- package/dist/core/media/processors/types.js.map +1 -0
- package/dist/core/media/processors/workers-images.d.ts +112 -0
- package/dist/core/media/processors/workers-images.d.ts.map +1 -0
- package/dist/core/media/processors/workers-images.js +257 -0
- package/dist/core/media/processors/workers-images.js.map +1 -0
- package/dist/core/schema/registry.d.ts +41 -0
- package/dist/core/schema/registry.d.ts.map +1 -0
- package/dist/core/schema/registry.js +248 -0
- package/dist/core/schema/registry.js.map +1 -0
- package/dist/core/schema/singleton.d.ts +107 -0
- package/dist/core/schema/singleton.d.ts.map +1 -0
- package/dist/core/schema/singleton.js +180 -0
- package/dist/core/schema/singleton.js.map +1 -0
- package/dist/core/security/auth.d.ts +120 -0
- package/dist/core/security/auth.d.ts.map +1 -0
- package/dist/core/security/auth.js +274 -0
- package/dist/core/security/auth.js.map +1 -0
- package/dist/core/security/captcha/index.d.ts +21 -0
- package/dist/core/security/captcha/index.d.ts.map +1 -0
- package/dist/core/security/captcha/index.js +34 -0
- package/dist/core/security/captcha/index.js.map +1 -0
- package/dist/core/security/captcha/recaptcha.d.ts +41 -0
- package/dist/core/security/captcha/recaptcha.d.ts.map +1 -0
- package/dist/core/security/captcha/recaptcha.js +89 -0
- package/dist/core/security/captcha/recaptcha.js.map +1 -0
- package/dist/core/security/captcha/turnstile.d.ts +41 -0
- package/dist/core/security/captcha/turnstile.d.ts.map +1 -0
- package/dist/core/security/captcha/turnstile.js +90 -0
- package/dist/core/security/captcha/turnstile.js.map +1 -0
- package/dist/core/security/captcha/types.d.ts +66 -0
- package/dist/core/security/captcha/types.d.ts.map +1 -0
- package/dist/core/security/captcha/types.js +7 -0
- package/dist/core/security/captcha/types.js.map +1 -0
- package/dist/core/security/mfa/email-otp.d.ts +91 -0
- package/dist/core/security/mfa/email-otp.d.ts.map +1 -0
- package/dist/core/security/mfa/email-otp.js +264 -0
- package/dist/core/security/mfa/email-otp.js.map +1 -0
- package/dist/core/security/mfa/index.d.ts +8 -0
- package/dist/core/security/mfa/index.d.ts.map +1 -0
- package/dist/core/security/mfa/index.js +8 -0
- package/dist/core/security/mfa/index.js.map +1 -0
- package/dist/core/security/mfa/totp.d.ts +87 -0
- package/dist/core/security/mfa/totp.d.ts.map +1 -0
- package/dist/core/security/mfa/totp.js +293 -0
- package/dist/core/security/mfa/totp.js.map +1 -0
- package/dist/core/security/middleware.d.ts +102 -0
- package/dist/core/security/middleware.d.ts.map +1 -0
- package/dist/core/security/middleware.js +261 -0
- package/dist/core/security/middleware.js.map +1 -0
- package/dist/core/security/oauth/google.d.ts +76 -0
- package/dist/core/security/oauth/google.d.ts.map +1 -0
- package/dist/core/security/oauth/google.js +154 -0
- package/dist/core/security/oauth/google.js.map +1 -0
- package/dist/core/security/oauth/index.d.ts +8 -0
- package/dist/core/security/oauth/index.d.ts.map +1 -0
- package/dist/core/security/oauth/index.js +7 -0
- package/dist/core/security/oauth/index.js.map +1 -0
- package/dist/core/security/oauth2/authorization-server.d.ts +195 -0
- package/dist/core/security/oauth2/authorization-server.d.ts.map +1 -0
- package/dist/core/security/oauth2/authorization-server.js +569 -0
- package/dist/core/security/oauth2/authorization-server.js.map +1 -0
- package/dist/core/security/oauth2/index.d.ts +9 -0
- package/dist/core/security/oauth2/index.d.ts.map +1 -0
- package/dist/core/security/oauth2/index.js +9 -0
- package/dist/core/security/oauth2/index.js.map +1 -0
- package/dist/core/security/rate-limiter.d.ts +15 -0
- package/dist/core/security/rate-limiter.d.ts.map +1 -0
- package/dist/core/security/rate-limiter.js +48 -0
- package/dist/core/security/rate-limiter.js.map +1 -0
- package/dist/core/security/validation.d.ts +20 -0
- package/dist/core/security/validation.d.ts.map +1 -0
- package/dist/core/security/validation.js +273 -0
- package/dist/core/security/validation.js.map +1 -0
- package/dist/core/services/auth-service.d.ts +128 -0
- package/dist/core/services/auth-service.d.ts.map +1 -0
- package/dist/core/services/auth-service.js +530 -0
- package/dist/core/services/auth-service.js.map +1 -0
- package/dist/core/services/captcha-service.d.ts +44 -0
- package/dist/core/services/captcha-service.d.ts.map +1 -0
- package/dist/core/services/captcha-service.js +82 -0
- package/dist/core/services/captcha-service.js.map +1 -0
- package/dist/core/services/document-service.d.ts +59 -0
- package/dist/core/services/document-service.d.ts.map +1 -0
- package/dist/core/services/document-service.js +269 -0
- package/dist/core/services/document-service.js.map +1 -0
- package/dist/core/services/media-service.d.ts +40 -0
- package/dist/core/services/media-service.d.ts.map +1 -0
- package/dist/core/services/media-service.js +396 -0
- package/dist/core/services/media-service.js.map +1 -0
- package/dist/core/services/mfa-service.d.ts +123 -0
- package/dist/core/services/mfa-service.d.ts.map +1 -0
- package/dist/core/services/mfa-service.js +606 -0
- package/dist/core/services/mfa-service.js.map +1 -0
- package/dist/core/services/oauth-service.d.ts +58 -0
- package/dist/core/services/oauth-service.d.ts.map +1 -0
- package/dist/core/services/oauth-service.js +253 -0
- package/dist/core/services/oauth-service.js.map +1 -0
- package/dist/core/services/oauth2-server-service.d.ts +61 -0
- package/dist/core/services/oauth2-server-service.d.ts.map +1 -0
- package/dist/core/services/oauth2-server-service.js +259 -0
- package/dist/core/services/oauth2-server-service.js.map +1 -0
- package/dist/core/services/passkey-service.d.ts +59 -0
- package/dist/core/services/passkey-service.d.ts.map +1 -0
- package/dist/core/services/passkey-service.js +238 -0
- package/dist/core/services/passkey-service.js.map +1 -0
- package/dist/core/services/token-service.d.ts +31 -0
- package/dist/core/services/token-service.d.ts.map +1 -0
- package/dist/core/services/token-service.js +132 -0
- package/dist/core/services/token-service.js.map +1 -0
- package/dist/core/services/trusted-device-service.d.ts +39 -0
- package/dist/core/services/trusted-device-service.d.ts.map +1 -0
- package/dist/core/services/trusted-device-service.js +123 -0
- package/dist/core/services/trusted-device-service.js.map +1 -0
- package/dist/core/services/user-service.d.ts +38 -0
- package/dist/core/services/user-service.d.ts.map +1 -0
- package/dist/core/services/user-service.js +265 -0
- package/dist/core/services/user-service.js.map +1 -0
- package/dist/core/studio/integration.d.ts +54 -0
- package/dist/core/studio/integration.d.ts.map +1 -0
- package/dist/core/studio/integration.js +326 -0
- package/dist/core/studio/integration.js.map +1 -0
- package/dist/core/types/index.d.ts +282 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +83 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/types/mail.d.ts +90 -0
- package/dist/core/types/mail.d.ts.map +1 -0
- package/dist/core/types/mail.js +7 -0
- package/dist/core/types/mail.js.map +1 -0
- package/dist/core/types/oauth2.d.ts +9 -0
- package/dist/core/types/oauth2.d.ts.map +1 -0
- package/dist/core/types/oauth2.js +7 -0
- package/dist/core/types/oauth2.js.map +1 -0
- package/dist/core/types/storage-adapters.d.ts +611 -0
- package/dist/core/types/storage-adapters.d.ts.map +1 -0
- package/dist/core/types/storage-adapters.js +14 -0
- package/dist/core/types/storage-adapters.js.map +1 -0
- package/dist/core/types/user.d.ts +10 -0
- package/dist/core/types/user.d.ts.map +1 -0
- package/dist/core/types/user.js +45 -0
- package/dist/core/types/user.js.map +1 -0
- package/dist/core/utils/id-generator.d.ts +16 -0
- package/dist/core/utils/id-generator.d.ts.map +1 -0
- package/dist/core/utils/id-generator.js +61 -0
- package/dist/core/utils/id-generator.js.map +1 -0
- package/dist/core/utils/logger.d.ts +100 -0
- package/dist/core/utils/logger.d.ts.map +1 -0
- package/dist/core/utils/logger.js +212 -0
- package/dist/core/utils/logger.js.map +1 -0
- package/dist/core/utils/reference-expander.d.ts +57 -0
- package/dist/core/utils/reference-expander.d.ts.map +1 -0
- package/dist/core/utils/reference-expander.js +192 -0
- package/dist/core/utils/reference-expander.js.map +1 -0
- package/dist/core/utils/universal-crypto.d.ts +46 -0
- package/dist/core/utils/universal-crypto.d.ts.map +1 -0
- package/dist/core/utils/universal-crypto.js +171 -0
- package/dist/core/utils/universal-crypto.js.map +1 -0
- package/dist/core/validation/validator.d.ts +11 -0
- package/dist/core/validation/validator.d.ts.map +1 -0
- package/dist/core/validation/validator.js +164 -0
- package/dist/core/validation/validator.js.map +1 -0
- package/dist/i18n/config.d.ts +4077 -0
- package/dist/i18n/config.d.ts.map +1 -0
- package/dist/i18n/config.js +116 -0
- package/dist/i18n/config.js.map +1 -0
- package/dist/i18n/hooks.d.ts +86 -0
- package/dist/i18n/hooks.d.ts.map +1 -0
- package/dist/i18n/hooks.js +122 -0
- package/dist/i18n/hooks.js.map +1 -0
- package/dist/i18n/index.d.ts +39 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +40 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en/auth.json +108 -0
- package/dist/i18n/locales/en/common.json +100 -0
- package/dist/i18n/locales/en/errors.json +55 -0
- package/dist/i18n/locales/en/fields.json +456 -0
- package/dist/i18n/locales/en/studio.json +1329 -0
- package/dist/i18n/locales/fr/auth.json +108 -0
- package/dist/i18n/locales/fr/common.json +100 -0
- package/dist/i18n/locales/fr/errors.json +55 -0
- package/dist/i18n/locales/fr/fields.json +456 -0
- package/dist/i18n/locales/fr/studio.json +1274 -0
- package/dist/i18n/provider.d.ts +45 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +49 -0
- package/dist/i18n/provider.js.map +1 -0
- package/dist/i18n/types.d.ts +8 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +7 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/express/adapter.d.ts +33 -0
- package/dist/integrations/express/adapter.d.ts.map +1 -0
- package/dist/integrations/express/adapter.js +203 -0
- package/dist/integrations/express/adapter.js.map +1 -0
- package/dist/integrations/express/config.d.ts +599 -0
- package/dist/integrations/express/config.d.ts.map +1 -0
- package/dist/integrations/express/config.js +166 -0
- package/dist/integrations/express/config.js.map +1 -0
- package/dist/integrations/express/index.d.ts +10 -0
- package/dist/integrations/express/index.d.ts.map +1 -0
- package/dist/integrations/express/index.js +9 -0
- package/dist/integrations/express/index.js.map +1 -0
- package/dist/integrations/express/integration.d.ts +111 -0
- package/dist/integrations/express/integration.d.ts.map +1 -0
- package/dist/integrations/express/integration.js +730 -0
- package/dist/integrations/express/integration.js.map +1 -0
- package/dist/integrations/express/media-rewrite-middleware.d.ts +78 -0
- package/dist/integrations/express/media-rewrite-middleware.d.ts.map +1 -0
- package/dist/integrations/express/media-rewrite-middleware.js +211 -0
- package/dist/integrations/express/media-rewrite-middleware.js.map +1 -0
- package/dist/integrations/express/media-url-generator.d.ts +52 -0
- package/dist/integrations/express/media-url-generator.d.ts.map +1 -0
- package/dist/integrations/express/media-url-generator.js +107 -0
- package/dist/integrations/express/media-url-generator.js.map +1 -0
- package/dist/integrations/express/middleware.d.ts +25 -0
- package/dist/integrations/express/middleware.d.ts.map +1 -0
- package/dist/integrations/express/middleware.js +130 -0
- package/dist/integrations/express/middleware.js.map +1 -0
- package/dist/integrations/express/server.d.ts +99 -0
- package/dist/integrations/express/server.d.ts.map +1 -0
- package/dist/integrations/express/server.js +597 -0
- package/dist/integrations/express/server.js.map +1 -0
- package/dist/integrations/express/types.d.ts +106 -0
- package/dist/integrations/express/types.d.ts.map +1 -0
- package/dist/integrations/express/types.js +2 -0
- package/dist/integrations/express/types.js.map +1 -0
- package/dist/mail/adapters/console.d.ts +30 -0
- package/dist/mail/adapters/console.d.ts.map +1 -0
- package/dist/mail/adapters/console.js +169 -0
- package/dist/mail/adapters/console.js.map +1 -0
- package/dist/mail/adapters/resend.d.ts +18 -0
- package/dist/mail/adapters/resend.d.ts.map +1 -0
- package/dist/mail/adapters/resend.js +148 -0
- package/dist/mail/adapters/resend.js.map +1 -0
- package/dist/mail/adapters/smtp.d.ts +22 -0
- package/dist/mail/adapters/smtp.d.ts.map +1 -0
- package/dist/mail/adapters/smtp.js +180 -0
- package/dist/mail/adapters/smtp.js.map +1 -0
- package/dist/mail/index.d.ts +15 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +13 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/mail/mail-service.d.ts +180 -0
- package/dist/mail/mail-service.d.ts.map +1 -0
- package/dist/mail/mail-service.js +370 -0
- package/dist/mail/mail-service.js.map +1 -0
- package/dist/mail/notification-service.d.ts +82 -0
- package/dist/mail/notification-service.d.ts.map +1 -0
- package/dist/mail/notification-service.js +262 -0
- package/dist/mail/notification-service.js.map +1 -0
- package/dist/mail/templates/built-in-templates.d.ts +47 -0
- package/dist/mail/templates/built-in-templates.d.ts.map +1 -0
- package/dist/mail/templates/built-in-templates.js +416 -0
- package/dist/mail/templates/built-in-templates.js.map +1 -0
- package/dist/mail/templates/custom-template-renderer.d.ts +115 -0
- package/dist/mail/templates/custom-template-renderer.d.ts.map +1 -0
- package/dist/mail/templates/custom-template-renderer.js +225 -0
- package/dist/mail/templates/custom-template-renderer.js.map +1 -0
- package/dist/mail/types.d.ts +7 -0
- package/dist/mail/types.d.ts.map +1 -0
- package/dist/mail/types.js +7 -0
- package/dist/mail/types.js.map +1 -0
- package/dist/routes/auth/captcha.d.ts +33 -0
- package/dist/routes/auth/captcha.d.ts.map +1 -0
- package/dist/routes/auth/captcha.js +102 -0
- package/dist/routes/auth/captcha.js.map +1 -0
- package/dist/routes/auth/change-password.d.ts +17 -0
- package/dist/routes/auth/change-password.d.ts.map +1 -0
- package/dist/routes/auth/change-password.js +121 -0
- package/dist/routes/auth/change-password.js.map +1 -0
- package/dist/routes/auth/index.d.ts +13 -0
- package/dist/routes/auth/index.d.ts.map +1 -0
- package/dist/routes/auth/index.js +35 -0
- package/dist/routes/auth/index.js.map +1 -0
- package/dist/routes/auth/mfa.d.ts +121 -0
- package/dist/routes/auth/mfa.d.ts.map +1 -0
- package/dist/routes/auth/mfa.js +1143 -0
- package/dist/routes/auth/mfa.js.map +1 -0
- package/dist/routes/auth/oauth.d.ts +37 -0
- package/dist/routes/auth/oauth.d.ts.map +1 -0
- package/dist/routes/auth/oauth.js +420 -0
- package/dist/routes/auth/oauth.js.map +1 -0
- package/dist/routes/auth/oauth2-server.d.ts +70 -0
- package/dist/routes/auth/oauth2-server.d.ts.map +1 -0
- package/dist/routes/auth/oauth2-server.js +775 -0
- package/dist/routes/auth/oauth2-server.js.map +1 -0
- package/dist/routes/auth/passkey.d.ts +65 -0
- package/dist/routes/auth/passkey.d.ts.map +1 -0
- package/dist/routes/auth/passkey.js +910 -0
- package/dist/routes/auth/passkey.js.map +1 -0
- package/dist/routes/auth/password-reset.d.ts +23 -0
- package/dist/routes/auth/password-reset.d.ts.map +1 -0
- package/dist/routes/auth/password-reset.js +336 -0
- package/dist/routes/auth/password-reset.js.map +1 -0
- package/dist/routes/handlers/audit.d.ts +21 -0
- package/dist/routes/handlers/audit.d.ts.map +1 -0
- package/dist/routes/handlers/audit.js +124 -0
- package/dist/routes/handlers/audit.js.map +1 -0
- package/dist/routes/handlers/auth.d.ts +150 -0
- package/dist/routes/handlers/auth.d.ts.map +1 -0
- package/dist/routes/handlers/auth.js +512 -0
- package/dist/routes/handlers/auth.js.map +1 -0
- package/dist/routes/handlers/base.d.ts +34 -0
- package/dist/routes/handlers/base.d.ts.map +1 -0
- package/dist/routes/handlers/base.js +366 -0
- package/dist/routes/handlers/base.js.map +1 -0
- package/dist/routes/handlers/config.d.ts +31 -0
- package/dist/routes/handlers/config.d.ts.map +1 -0
- package/dist/routes/handlers/config.js +483 -0
- package/dist/routes/handlers/config.js.map +1 -0
- package/dist/routes/handlers/documents.d.ts +50 -0
- package/dist/routes/handlers/documents.d.ts.map +1 -0
- package/dist/routes/handlers/documents.js +708 -0
- package/dist/routes/handlers/documents.js.map +1 -0
- package/dist/routes/handlers/index.d.ts +12 -0
- package/dist/routes/handlers/index.d.ts.map +1 -0
- package/dist/routes/handlers/index.js +11 -0
- package/dist/routes/handlers/index.js.map +1 -0
- package/dist/routes/handlers/media.d.ts +24 -0
- package/dist/routes/handlers/media.d.ts.map +1 -0
- package/dist/routes/handlers/media.js +432 -0
- package/dist/routes/handlers/media.js.map +1 -0
- package/dist/routes/handlers/search.d.ts +10 -0
- package/dist/routes/handlers/search.d.ts.map +1 -0
- package/dist/routes/handlers/search.js +153 -0
- package/dist/routes/handlers/search.js.map +1 -0
- package/dist/routes/handlers/tokens.d.ts +14 -0
- package/dist/routes/handlers/tokens.d.ts.map +1 -0
- package/dist/routes/handlers/tokens.js +109 -0
- package/dist/routes/handlers/tokens.js.map +1 -0
- package/dist/routes/handlers/types.d.ts +13 -0
- package/dist/routes/handlers/types.d.ts.map +1 -0
- package/dist/routes/handlers/types.js +5 -0
- package/dist/routes/handlers/types.js.map +1 -0
- package/dist/routes/handlers/users.d.ts +16 -0
- package/dist/routes/handlers/users.d.ts.map +1 -0
- package/dist/routes/handlers/users.js +198 -0
- package/dist/routes/handlers/users.js.map +1 -0
- package/dist/routes/handlers/webhooks.d.ts +37 -0
- package/dist/routes/handlers/webhooks.d.ts.map +1 -0
- package/dist/routes/handlers/webhooks.js +343 -0
- package/dist/routes/handlers/webhooks.js.map +1 -0
- package/dist/routes/index.d.ts +5 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +5 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/routes.d.ts +29 -0
- package/dist/routes/routes.d.ts.map +1 -0
- package/dist/routes/routes.js +531 -0
- package/dist/routes/routes.js.map +1 -0
- package/dist/routes/slug-processor.d.ts +32 -0
- package/dist/routes/slug-processor.d.ts.map +1 -0
- package/dist/routes/slug-processor.js +328 -0
- package/dist/routes/slug-processor.js.map +1 -0
- package/dist/routes/types.d.ts +31 -0
- package/dist/routes/types.d.ts.map +1 -0
- package/dist/routes/types.js +7 -0
- package/dist/routes/types.js.map +1 -0
- package/dist/routes/users/index.d.ts +7 -0
- package/dist/routes/users/index.d.ts.map +1 -0
- package/dist/routes/users/index.js +7 -0
- package/dist/routes/users/index.js.map +1 -0
- package/dist/structure/builder/StructureBuilder.d.ts +209 -0
- package/dist/structure/builder/StructureBuilder.d.ts.map +1 -0
- package/dist/structure/builder/StructureBuilder.js +425 -0
- package/dist/structure/builder/StructureBuilder.js.map +1 -0
- package/dist/structure/builder/index.d.ts +8 -0
- package/dist/structure/builder/index.d.ts.map +1 -0
- package/dist/structure/builder/index.js +6 -0
- package/dist/structure/builder/index.js.map +1 -0
- package/dist/structure/builder/navigation-tree-builder.d.ts +33 -0
- package/dist/structure/builder/navigation-tree-builder.d.ts.map +1 -0
- package/dist/structure/builder/navigation-tree-builder.js +284 -0
- package/dist/structure/builder/navigation-tree-builder.js.map +1 -0
- package/dist/structure/errors/index.d.ts +72 -0
- package/dist/structure/errors/index.d.ts.map +1 -0
- package/dist/structure/errors/index.js +136 -0
- package/dist/structure/errors/index.js.map +1 -0
- package/dist/structure/index.d.ts +14 -0
- package/dist/structure/index.d.ts.map +1 -0
- package/dist/structure/index.js +16 -0
- package/dist/structure/index.js.map +1 -0
- package/dist/structure/types/filters.d.ts +167 -0
- package/dist/structure/types/filters.d.ts.map +1 -0
- package/dist/structure/types/filters.js +38 -0
- package/dist/structure/types/filters.js.map +1 -0
- package/dist/structure/types/index.d.ts +11 -0
- package/dist/structure/types/index.d.ts.map +1 -0
- package/dist/structure/types/index.js +7 -0
- package/dist/structure/types/index.js.map +1 -0
- package/dist/structure/types/permissions.d.ts +159 -0
- package/dist/structure/types/permissions.d.ts.map +1 -0
- package/dist/structure/types/permissions.js +49 -0
- package/dist/structure/types/permissions.js.map +1 -0
- package/dist/structure/types/structure.d.ts +342 -0
- package/dist/structure/types/structure.d.ts.map +1 -0
- package/dist/structure/types/structure.js +6 -0
- package/dist/structure/types/structure.js.map +1 -0
- package/dist/structure/types/views.d.ts +278 -0
- package/dist/structure/types/views.d.ts.map +1 -0
- package/dist/structure/types/views.js +6 -0
- package/dist/structure/types/views.js.map +1 -0
- package/dist/structure/utils/hash.d.ts +61 -0
- package/dist/structure/utils/hash.d.ts.map +1 -0
- package/dist/structure/utils/hash.js +118 -0
- package/dist/structure/utils/hash.js.map +1 -0
- package/dist/structure/utils/index.d.ts +10 -0
- package/dist/structure/utils/index.d.ts.map +1 -0
- package/dist/structure/utils/index.js +7 -0
- package/dist/structure/utils/index.js.map +1 -0
- package/dist/structure/utils/permission-checker.d.ts +57 -0
- package/dist/structure/utils/permission-checker.d.ts.map +1 -0
- package/dist/structure/utils/permission-checker.js +286 -0
- package/dist/structure/utils/permission-checker.js.map +1 -0
- package/dist/structure/utils/query-builder.d.ts +82 -0
- package/dist/structure/utils/query-builder.d.ts.map +1 -0
- package/dist/structure/utils/query-builder.js +489 -0
- package/dist/structure/utils/query-builder.js.map +1 -0
- package/dist/structure/utils/structure-merger.d.ts +91 -0
- package/dist/structure/utils/structure-merger.d.ts.map +1 -0
- package/dist/structure/utils/structure-merger.js +445 -0
- package/dist/structure/utils/structure-merger.js.map +1 -0
- package/dist/structure/validation/schemas.d.ts +3107 -0
- package/dist/structure/validation/schemas.d.ts.map +1 -0
- package/dist/structure/validation/schemas.js +436 -0
- package/dist/structure/validation/schemas.js.map +1 -0
- package/dist/types/api-requests.d.ts +334 -0
- package/dist/types/api-requests.d.ts.map +1 -0
- package/dist/types/api-requests.js +8 -0
- package/dist/types/api-requests.js.map +1 -0
- package/dist/types/auth.d.ts +394 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +8 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/document.d.ts +49 -0
- package/dist/types/document.d.ts.map +1 -0
- package/dist/types/document.js +6 -0
- package/dist/types/document.js.map +1 -0
- package/dist/types/field-system.d.ts +197 -0
- package/dist/types/field-system.d.ts.map +1 -0
- package/dist/types/field-system.js +8 -0
- package/dist/types/field-system.js.map +1 -0
- package/dist/types/fields.d.ts +17 -0
- package/dist/types/fields.d.ts.map +1 -0
- package/dist/types/fields.js +21 -0
- package/dist/types/fields.js.map +1 -0
- package/dist/types/http.d.ts +162 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +8 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/i18n.d.ts +56 -0
- package/dist/types/i18n.d.ts.map +1 -0
- package/dist/types/i18n.js +25 -0
- package/dist/types/i18n.js.map +1 -0
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mail.d.ts +224 -0
- package/dist/types/mail.d.ts.map +1 -0
- package/dist/types/mail.js +8 -0
- package/dist/types/mail.js.map +1 -0
- package/dist/types/media.d.ts +56 -0
- package/dist/types/media.d.ts.map +1 -0
- package/dist/types/media.js +6 -0
- package/dist/types/media.js.map +1 -0
- package/dist/types/oauth2.d.ts +287 -0
- package/dist/types/oauth2.d.ts.map +1 -0
- package/dist/types/oauth2.js +43 -0
- package/dist/types/oauth2.js.map +1 -0
- package/dist/types/passkey.d.ts +217 -0
- package/dist/types/passkey.d.ts.map +1 -0
- package/dist/types/passkey.js +8 -0
- package/dist/types/passkey.js.map +1 -0
- package/dist/types/slug.d.ts +99 -0
- package/dist/types/slug.d.ts.map +1 -0
- package/dist/types/slug.js +8 -0
- package/dist/types/slug.js.map +1 -0
- package/package.json +183 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOTP (Time-based One-Time Password) Service
|
|
3
|
+
*
|
|
4
|
+
* Implements RFC 6238 TOTP for authenticator app-based MFA.
|
|
5
|
+
* Uses the otpauth library for TOTP generation/verification.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
8
|
+
import { createLogger } from '../../utils/logger.js';
|
|
9
|
+
const logger = createLogger('security', 'TOTP');
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// CONSTANTS
|
|
12
|
+
// =============================================================================
|
|
13
|
+
const DEFAULT_ALGORITHM = 'SHA1';
|
|
14
|
+
const DEFAULT_DIGITS = 6;
|
|
15
|
+
const DEFAULT_PERIOD = 30;
|
|
16
|
+
const SECRET_LENGTH = 20; // 160 bits, recommended for SHA1
|
|
17
|
+
const BACKUP_CODE_LENGTH = 8; // 8 character backup codes
|
|
18
|
+
const BACKUP_CODE_COUNT = 10; // Number of backup codes to generate
|
|
19
|
+
// Base32 alphabet for secret encoding
|
|
20
|
+
const BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// TOTP SERVICE
|
|
23
|
+
// =============================================================================
|
|
24
|
+
export class TOTPService {
|
|
25
|
+
config;
|
|
26
|
+
constructor(config) {
|
|
27
|
+
this.config = {
|
|
28
|
+
issuer: config.issuer,
|
|
29
|
+
algorithm: config.algorithm || DEFAULT_ALGORITHM,
|
|
30
|
+
digits: config.digits || DEFAULT_DIGITS,
|
|
31
|
+
period: config.period || DEFAULT_PERIOD,
|
|
32
|
+
};
|
|
33
|
+
logger.debug('TOTPService initialized', { issuer: config.issuer });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generate a new TOTP secret for a user
|
|
37
|
+
* Returns the secret, URI for QR code generation, and a data URL for the QR code
|
|
38
|
+
*/
|
|
39
|
+
async generateSecret(accountName) {
|
|
40
|
+
// Generate cryptographically secure random bytes
|
|
41
|
+
const secretBytes = randomBytes(SECRET_LENGTH);
|
|
42
|
+
// Encode as base32
|
|
43
|
+
const secret = this.base32Encode(secretBytes);
|
|
44
|
+
// Build otpauth URI
|
|
45
|
+
const uri = this.buildTOTPUri(secret, accountName);
|
|
46
|
+
// Generate QR code data URL
|
|
47
|
+
const qrCodeDataUrl = await this.generateQRCode(uri);
|
|
48
|
+
// Format secret for manual entry (groups of 4 for readability)
|
|
49
|
+
const manualEntryKey = secret.match(/.{1,4}/g)?.join(' ') || secret;
|
|
50
|
+
logger.info('Generated TOTP secret', { accountName });
|
|
51
|
+
return {
|
|
52
|
+
secret,
|
|
53
|
+
uri,
|
|
54
|
+
qrCodeDataUrl,
|
|
55
|
+
manualEntryKey,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Verify a TOTP code against a secret
|
|
60
|
+
* Allows for time drift by checking adjacent time windows
|
|
61
|
+
*/
|
|
62
|
+
verifyCode(secret, code, window = 1) {
|
|
63
|
+
if (!code || code.length !== this.config.digits) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// Clean the code (remove spaces, ensure digits only)
|
|
67
|
+
const cleanCode = code.replace(/\s/g, '');
|
|
68
|
+
if (!/^\d+$/.test(cleanCode)) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
72
|
+
// Check current time step and adjacent windows
|
|
73
|
+
for (let i = -window; i <= window; i++) {
|
|
74
|
+
const timeStep = Math.floor((currentTime + i * this.config.period) / this.config.period);
|
|
75
|
+
const expectedCode = this.generateTOTP(secret, timeStep);
|
|
76
|
+
if (this.timingSafeCompare(cleanCode, expectedCode)) {
|
|
77
|
+
logger.debug('TOTP code verified', { window: i });
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
logger.debug('TOTP code verification failed');
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Generate backup codes for account recovery
|
|
86
|
+
* These are one-time use codes stored hashed
|
|
87
|
+
*/
|
|
88
|
+
generateBackupCodes(count = BACKUP_CODE_COUNT) {
|
|
89
|
+
const codes = [];
|
|
90
|
+
for (let i = 0; i < count; i++) {
|
|
91
|
+
// Generate random bytes and convert to alphanumeric
|
|
92
|
+
const bytes = randomBytes(BACKUP_CODE_LENGTH);
|
|
93
|
+
let code = '';
|
|
94
|
+
for (const byte of bytes) {
|
|
95
|
+
// Map to alphanumeric (0-9, A-Z)
|
|
96
|
+
const char = byte % 36;
|
|
97
|
+
code += char < 10 ? char.toString() : String.fromCharCode(55 + char); // A=65, but we start at 10
|
|
98
|
+
}
|
|
99
|
+
// Format with dash for readability: XXXX-XXXX
|
|
100
|
+
codes.push(`${code.slice(0, 4)}-${code.slice(4, 8)}`);
|
|
101
|
+
}
|
|
102
|
+
logger.info('Generated backup codes', { count });
|
|
103
|
+
return codes;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Hash a backup code for secure storage
|
|
107
|
+
* Uses SHA-256 for fast comparison while still being secure
|
|
108
|
+
*/
|
|
109
|
+
hashBackupCode(code) {
|
|
110
|
+
// Normalize: remove dashes, uppercase
|
|
111
|
+
const normalized = code.replace(/-/g, '').toUpperCase();
|
|
112
|
+
return createHash('sha256').update(normalized).digest('hex');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Verify a backup code against stored hashed codes
|
|
116
|
+
* Returns the updated list with the used code removed (consumed)
|
|
117
|
+
*/
|
|
118
|
+
verifyBackupCode(hashedCodes, code) {
|
|
119
|
+
// Hash the provided code
|
|
120
|
+
const hashedInput = this.hashBackupCode(code);
|
|
121
|
+
// Find and remove matching code
|
|
122
|
+
const index = hashedCodes.findIndex((stored) => this.timingSafeCompareHex(stored, hashedInput));
|
|
123
|
+
if (index === -1) {
|
|
124
|
+
logger.debug('Backup code verification failed');
|
|
125
|
+
return {
|
|
126
|
+
valid: false,
|
|
127
|
+
remainingCodes: hashedCodes,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Remove the used code
|
|
131
|
+
const remainingCodes = [...hashedCodes];
|
|
132
|
+
remainingCodes.splice(index, 1);
|
|
133
|
+
logger.info('Backup code verified and consumed', {
|
|
134
|
+
remainingCount: remainingCodes.length,
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
valid: true,
|
|
138
|
+
remainingCodes,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// ===========================================================================
|
|
142
|
+
// PRIVATE METHODS
|
|
143
|
+
// ===========================================================================
|
|
144
|
+
/**
|
|
145
|
+
* Build otpauth:// URI for QR code
|
|
146
|
+
*/
|
|
147
|
+
buildTOTPUri(secret, accountName) {
|
|
148
|
+
const params = new URLSearchParams({
|
|
149
|
+
secret,
|
|
150
|
+
issuer: this.config.issuer,
|
|
151
|
+
algorithm: this.config.algorithm,
|
|
152
|
+
digits: this.config.digits.toString(),
|
|
153
|
+
period: this.config.period.toString(),
|
|
154
|
+
});
|
|
155
|
+
// Encode account name and issuer for the label
|
|
156
|
+
const label = encodeURIComponent(`${this.config.issuer}:${accountName}`);
|
|
157
|
+
return `otpauth://totp/${label}?${params.toString()}`;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Generate QR code as data URL
|
|
161
|
+
* Uses dynamic import to handle optional qrcode dependency
|
|
162
|
+
* If qrcode is not installed, returns the URI as base64 for client-side QR generation
|
|
163
|
+
*/
|
|
164
|
+
async generateQRCode(data) {
|
|
165
|
+
try {
|
|
166
|
+
// Dynamic import to handle optional dependency
|
|
167
|
+
const QRCode = await import('qrcode').catch(() => null);
|
|
168
|
+
if (QRCode && typeof QRCode.toDataURL === 'function') {
|
|
169
|
+
return await QRCode.toDataURL(data, {
|
|
170
|
+
width: 256,
|
|
171
|
+
margin: 2,
|
|
172
|
+
color: {
|
|
173
|
+
dark: '#000000',
|
|
174
|
+
light: '#FFFFFF',
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// Fallback: return URI as base64 encoded data URL
|
|
179
|
+
// The frontend can generate the QR code using a client-side library
|
|
180
|
+
logger.debug('QR code package not available, returning URI as fallback');
|
|
181
|
+
return `data:text/plain;base64,${Buffer.from(data).toString('base64')}`;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
// If qrcode package is not available, return the URI
|
|
185
|
+
logger.debug('QR code generation failed, returning URI as fallback', { error });
|
|
186
|
+
return `data:text/plain;base64,${Buffer.from(data).toString('base64')}`;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Generate TOTP code for a given time step
|
|
191
|
+
* Implements RFC 6238
|
|
192
|
+
*/
|
|
193
|
+
generateTOTP(secret, timeStep) {
|
|
194
|
+
// Decode base32 secret
|
|
195
|
+
const secretBytes = this.base32Decode(secret);
|
|
196
|
+
// Convert time step to 8-byte big-endian buffer
|
|
197
|
+
const timeBuffer = Buffer.alloc(8);
|
|
198
|
+
timeBuffer.writeBigInt64BE(BigInt(timeStep));
|
|
199
|
+
// Generate HMAC using the configured algorithm
|
|
200
|
+
const algorithm = this.config.algorithm.toLowerCase();
|
|
201
|
+
const hmacResult = createHmac(algorithm, secretBytes)
|
|
202
|
+
.update(timeBuffer)
|
|
203
|
+
.digest();
|
|
204
|
+
// Dynamic truncation (RFC 4226)
|
|
205
|
+
const offset = hmacResult[hmacResult.length - 1] & 0x0f;
|
|
206
|
+
const binary = ((hmacResult[offset] & 0x7f) << 24) |
|
|
207
|
+
((hmacResult[offset + 1] & 0xff) << 16) |
|
|
208
|
+
((hmacResult[offset + 2] & 0xff) << 8) |
|
|
209
|
+
(hmacResult[offset + 3] & 0xff);
|
|
210
|
+
// Generate code with specified number of digits
|
|
211
|
+
const code = binary % Math.pow(10, this.config.digits);
|
|
212
|
+
return code.toString().padStart(this.config.digits, '0');
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Base32 encode bytes
|
|
216
|
+
*/
|
|
217
|
+
base32Encode(buffer) {
|
|
218
|
+
let result = '';
|
|
219
|
+
let bits = 0;
|
|
220
|
+
let value = 0;
|
|
221
|
+
for (const byte of buffer) {
|
|
222
|
+
value = (value << 8) | byte;
|
|
223
|
+
bits += 8;
|
|
224
|
+
while (bits >= 5) {
|
|
225
|
+
result += BASE32_ALPHABET[(value >>> (bits - 5)) & 31];
|
|
226
|
+
bits -= 5;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (bits > 0) {
|
|
230
|
+
result += BASE32_ALPHABET[(value << (5 - bits)) & 31];
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Base32 decode string to bytes
|
|
236
|
+
*/
|
|
237
|
+
base32Decode(encoded) {
|
|
238
|
+
// Remove padding and convert to uppercase
|
|
239
|
+
const input = encoded.replace(/=+$/, '').toUpperCase();
|
|
240
|
+
const bytes = [];
|
|
241
|
+
let bits = 0;
|
|
242
|
+
let value = 0;
|
|
243
|
+
for (const char of input) {
|
|
244
|
+
const index = BASE32_ALPHABET.indexOf(char);
|
|
245
|
+
if (index === -1)
|
|
246
|
+
continue;
|
|
247
|
+
value = (value << 5) | index;
|
|
248
|
+
bits += 5;
|
|
249
|
+
if (bits >= 8) {
|
|
250
|
+
bytes.push((value >>> (bits - 8)) & 255);
|
|
251
|
+
bits -= 8;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return Buffer.from(bytes);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Timing-safe string comparison
|
|
258
|
+
*/
|
|
259
|
+
timingSafeCompare(a, b) {
|
|
260
|
+
if (a.length !== b.length) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
const bufA = Buffer.from(a);
|
|
264
|
+
const bufB = Buffer.from(b);
|
|
265
|
+
return timingSafeEqual(bufA, bufB);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Timing-safe hex string comparison
|
|
269
|
+
*/
|
|
270
|
+
timingSafeCompareHex(a, b) {
|
|
271
|
+
if (a.length !== b.length) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const bufA = Buffer.from(a, 'hex');
|
|
276
|
+
const bufB = Buffer.from(b, 'hex');
|
|
277
|
+
return timingSafeEqual(bufA, bufB);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// =============================================================================
|
|
285
|
+
// FACTORY FUNCTION
|
|
286
|
+
// =============================================================================
|
|
287
|
+
/**
|
|
288
|
+
* Create a new TOTP service instance
|
|
289
|
+
*/
|
|
290
|
+
export function createTOTPService(config) {
|
|
291
|
+
return new TOTPService(config);
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=totp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totp.js","sourceRoot":"","sources":["../../../../src/core/security/mfa/totp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication and Authorization Middleware
|
|
3
|
+
*
|
|
4
|
+
* Provides Express middleware for protecting routes with authentication
|
|
5
|
+
* and permission-based authorization.
|
|
6
|
+
*/
|
|
7
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
8
|
+
import type { AuthContext, Permission } from '../types/user.js';
|
|
9
|
+
import type { AuthenticationService } from './auth.js';
|
|
10
|
+
declare global {
|
|
11
|
+
namespace Express {
|
|
12
|
+
interface Request {
|
|
13
|
+
auth?: AuthContext;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export interface AuthMiddlewareConfig {
|
|
18
|
+
authService: AuthenticationService;
|
|
19
|
+
getUserById?: (id: string) => Promise<any>;
|
|
20
|
+
getAppTokenByHash?: (hash: string) => Promise<any>;
|
|
21
|
+
}
|
|
22
|
+
export declare class AuthMiddleware {
|
|
23
|
+
private authService;
|
|
24
|
+
private getUserById?;
|
|
25
|
+
private getAppTokenByHash?;
|
|
26
|
+
constructor(config: AuthMiddlewareConfig);
|
|
27
|
+
/**
|
|
28
|
+
* Middleware to authenticate requests
|
|
29
|
+
* Supports both JWT tokens (Authorization: Bearer) and App tokens (X-API-Token)
|
|
30
|
+
*/
|
|
31
|
+
authenticate(): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
32
|
+
/**
|
|
33
|
+
* Middleware to require authentication
|
|
34
|
+
*/
|
|
35
|
+
requireAuth(): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Middleware to require specific permissions
|
|
38
|
+
*/
|
|
39
|
+
requirePermission(permission: Permission): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Middleware to require any of the specified permissions
|
|
42
|
+
*/
|
|
43
|
+
requireAnyPermission(permissions: Permission[]): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Middleware to require all of the specified permissions
|
|
46
|
+
*/
|
|
47
|
+
requireAllPermissions(permissions: Permission[]): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Middleware to require admin role (user authentication only)
|
|
50
|
+
*/
|
|
51
|
+
requireAdmin(): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Middleware to require Studio access
|
|
54
|
+
*/
|
|
55
|
+
requireStudioAccess(): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Middleware for optional authentication (sets context but doesn't require it)
|
|
58
|
+
*/
|
|
59
|
+
optionalAuth(): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Get current authentication context from request
|
|
62
|
+
*/
|
|
63
|
+
static getAuthContext(req: Request): AuthContext;
|
|
64
|
+
/**
|
|
65
|
+
* Check if current request is from an authenticated user
|
|
66
|
+
*/
|
|
67
|
+
static isAuthenticatedUser(req: Request): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Check if current request is from an app token
|
|
70
|
+
*/
|
|
71
|
+
static isAppToken(req: Request): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Get user ID from authenticated request (if user auth)
|
|
74
|
+
*/
|
|
75
|
+
static getUserId(req: Request): string | null;
|
|
76
|
+
/**
|
|
77
|
+
* Get app token ID from authenticated request (if app token auth)
|
|
78
|
+
*/
|
|
79
|
+
static getAppTokenId(req: Request): string | null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Helper function to create common middleware combinations
|
|
83
|
+
*/
|
|
84
|
+
export declare function createAuthMiddleware(config: AuthMiddlewareConfig): {
|
|
85
|
+
authenticate: (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
86
|
+
requireAuth: (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
87
|
+
optionalAuth: (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
88
|
+
requirePermission: (permission: Permission) => (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
89
|
+
requireAnyPermission: (permissions: Permission[]) => (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
90
|
+
requireAllPermissions: (permissions: Permission[]) => (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
91
|
+
requireAdmin: (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
92
|
+
requireStudioAccess: (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
|
|
93
|
+
authAndPermission: (permission: Permission) => (((req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>) | ((req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined))[];
|
|
94
|
+
studioAuth: () => (((req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>) | ((req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined))[];
|
|
95
|
+
adminAuth: () => (((req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>) | ((req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined))[];
|
|
96
|
+
getAuthContext: typeof AuthMiddleware.getAuthContext;
|
|
97
|
+
isAuthenticatedUser: typeof AuthMiddleware.isAuthenticatedUser;
|
|
98
|
+
isAppToken: typeof AuthMiddleware.isAppToken;
|
|
99
|
+
getUserId: typeof AuthMiddleware.getUserId;
|
|
100
|
+
getAppTokenId: typeof AuthMiddleware.getAppTokenId;
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/core/security/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication and Authorization Middleware
|
|
3
|
+
*
|
|
4
|
+
* Provides Express middleware for protecting routes with authentication
|
|
5
|
+
* and permission-based authorization.
|
|
6
|
+
*/
|
|
7
|
+
export class AuthMiddleware {
|
|
8
|
+
authService;
|
|
9
|
+
getUserById;
|
|
10
|
+
getAppTokenByHash;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.authService = config.authService;
|
|
13
|
+
this.getUserById = config.getUserById;
|
|
14
|
+
this.getAppTokenByHash = config.getAppTokenByHash;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Middleware to authenticate requests
|
|
18
|
+
* Supports both JWT tokens (Authorization: Bearer) and App tokens (X-API-Token)
|
|
19
|
+
*/
|
|
20
|
+
authenticate() {
|
|
21
|
+
return async (req, res, next) => {
|
|
22
|
+
try {
|
|
23
|
+
// Try JWT authentication first (Authorization header)
|
|
24
|
+
const authHeader = req.headers.authorization;
|
|
25
|
+
if (authHeader?.startsWith('Bearer ')) {
|
|
26
|
+
const token = authHeader.substring(7);
|
|
27
|
+
const result = await this.authService.validateToken(token);
|
|
28
|
+
if (result.valid && result.context) {
|
|
29
|
+
// For user tokens, verify user still exists and is active
|
|
30
|
+
if (result.context.type === 'user' && this.getUserById) {
|
|
31
|
+
const user = await this.getUserById(result.context.user.id);
|
|
32
|
+
if (!user || !user.isActive) {
|
|
33
|
+
return res.status(401).json({ error: 'User account is inactive' });
|
|
34
|
+
}
|
|
35
|
+
// Update context with fresh user data
|
|
36
|
+
result.context.user = {
|
|
37
|
+
...result.context.user,
|
|
38
|
+
email: user.email,
|
|
39
|
+
firstName: user.firstName,
|
|
40
|
+
lastName: user.lastName,
|
|
41
|
+
isActive: user.isActive
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
req.auth = result.context;
|
|
45
|
+
return next();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Try app token authentication (X-API-Token header)
|
|
49
|
+
const apiToken = req.headers['x-api-token'];
|
|
50
|
+
if (apiToken && this.getAppTokenByHash) {
|
|
51
|
+
const validation = await this.authService.validateAppToken(apiToken);
|
|
52
|
+
if (validation.valid && validation.hash) {
|
|
53
|
+
const appToken = await this.getAppTokenByHash(validation.hash);
|
|
54
|
+
if (appToken && appToken.isActive) {
|
|
55
|
+
// Check expiration
|
|
56
|
+
if (appToken.expiresAt && new Date() > new Date(appToken.expiresAt)) {
|
|
57
|
+
return res.status(401).json({ error: 'App token has expired' });
|
|
58
|
+
}
|
|
59
|
+
// Update usage tracking
|
|
60
|
+
appToken.lastUsedAt = new Date().toISOString();
|
|
61
|
+
appToken.usageCount = (appToken.usageCount || 0) + 1;
|
|
62
|
+
req.auth = {
|
|
63
|
+
type: 'app_token',
|
|
64
|
+
token: {
|
|
65
|
+
id: appToken.id,
|
|
66
|
+
name: appToken.name,
|
|
67
|
+
permissions: appToken.permissions,
|
|
68
|
+
createdBy: appToken.createdBy,
|
|
69
|
+
isActive: appToken.isActive
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
return next();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// No valid authentication found
|
|
77
|
+
req.auth = { type: 'anonymous' };
|
|
78
|
+
next();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('Authentication error:', error);
|
|
82
|
+
return res.status(500).json({ error: 'Authentication service error' });
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Middleware to require authentication
|
|
88
|
+
*/
|
|
89
|
+
requireAuth() {
|
|
90
|
+
return (req, res, next) => {
|
|
91
|
+
if (!req.auth || req.auth.type === 'anonymous') {
|
|
92
|
+
return res.status(401).json({
|
|
93
|
+
error: 'Authentication required',
|
|
94
|
+
message: 'Please provide a valid Bearer token or X-API-Token header'
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
next();
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Middleware to require specific permissions
|
|
102
|
+
*/
|
|
103
|
+
requirePermission(permission) {
|
|
104
|
+
return (req, res, next) => {
|
|
105
|
+
if (!req.auth || req.auth.type === 'anonymous') {
|
|
106
|
+
return res.status(401).json({ error: 'Authentication required' });
|
|
107
|
+
}
|
|
108
|
+
if (!this.authService.hasPermission(req.auth, permission)) {
|
|
109
|
+
return res.status(403).json({
|
|
110
|
+
error: 'Insufficient permissions',
|
|
111
|
+
required: permission
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
next();
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Middleware to require any of the specified permissions
|
|
119
|
+
*/
|
|
120
|
+
requireAnyPermission(permissions) {
|
|
121
|
+
return (req, res, next) => {
|
|
122
|
+
if (!req.auth || req.auth.type === 'anonymous') {
|
|
123
|
+
return res.status(401).json({ error: 'Authentication required' });
|
|
124
|
+
}
|
|
125
|
+
if (!this.authService.hasAnyPermission(req.auth, permissions)) {
|
|
126
|
+
return res.status(403).json({
|
|
127
|
+
error: 'Insufficient permissions',
|
|
128
|
+
required: `One of: ${permissions.join(', ')}`
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
next();
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Middleware to require all of the specified permissions
|
|
136
|
+
*/
|
|
137
|
+
requireAllPermissions(permissions) {
|
|
138
|
+
return (req, res, next) => {
|
|
139
|
+
if (!req.auth || req.auth.type === 'anonymous') {
|
|
140
|
+
return res.status(401).json({ error: 'Authentication required' });
|
|
141
|
+
}
|
|
142
|
+
if (!this.authService.hasAllPermissions(req.auth, permissions)) {
|
|
143
|
+
return res.status(403).json({
|
|
144
|
+
error: 'Insufficient permissions',
|
|
145
|
+
required: `All of: ${permissions.join(', ')}`
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
next();
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Middleware to require admin role (user authentication only)
|
|
153
|
+
*/
|
|
154
|
+
requireAdmin() {
|
|
155
|
+
return (req, res, next) => {
|
|
156
|
+
if (!req.auth || req.auth.type !== 'user') {
|
|
157
|
+
return res.status(401).json({ error: 'User authentication required' });
|
|
158
|
+
}
|
|
159
|
+
if (req.auth.user.role !== 'admin') {
|
|
160
|
+
return res.status(403).json({
|
|
161
|
+
error: 'Admin access required',
|
|
162
|
+
currentRole: req.auth.user.role
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
next();
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Middleware to require Studio access
|
|
170
|
+
*/
|
|
171
|
+
requireStudioAccess() {
|
|
172
|
+
return this.requirePermission('studio:access');
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Middleware for optional authentication (sets context but doesn't require it)
|
|
176
|
+
*/
|
|
177
|
+
optionalAuth() {
|
|
178
|
+
return async (req, res, next) => {
|
|
179
|
+
// Use the authenticate middleware but don't fail on anonymous
|
|
180
|
+
await this.authenticate()(req, res, (error) => {
|
|
181
|
+
// Always continue, even if authentication failed
|
|
182
|
+
if (!req.auth) {
|
|
183
|
+
req.auth = { type: 'anonymous' };
|
|
184
|
+
}
|
|
185
|
+
next(error);
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get current authentication context from request
|
|
191
|
+
*/
|
|
192
|
+
static getAuthContext(req) {
|
|
193
|
+
return req.auth || { type: 'anonymous' };
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Check if current request is from an authenticated user
|
|
197
|
+
*/
|
|
198
|
+
static isAuthenticatedUser(req) {
|
|
199
|
+
return req.auth?.type === 'user';
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Check if current request is from an app token
|
|
203
|
+
*/
|
|
204
|
+
static isAppToken(req) {
|
|
205
|
+
return req.auth?.type === 'app_token';
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get user ID from authenticated request (if user auth)
|
|
209
|
+
*/
|
|
210
|
+
static getUserId(req) {
|
|
211
|
+
return req.auth?.type === 'user' ? req.auth.user.id : null;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get app token ID from authenticated request (if app token auth)
|
|
215
|
+
*/
|
|
216
|
+
static getAppTokenId(req) {
|
|
217
|
+
return req.auth?.type === 'app_token' ? req.auth.token.id : null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Helper function to create common middleware combinations
|
|
222
|
+
*/
|
|
223
|
+
export function createAuthMiddleware(config) {
|
|
224
|
+
const middleware = new AuthMiddleware(config);
|
|
225
|
+
return {
|
|
226
|
+
// Core middleware
|
|
227
|
+
authenticate: middleware.authenticate(),
|
|
228
|
+
requireAuth: middleware.requireAuth(),
|
|
229
|
+
optionalAuth: middleware.optionalAuth(),
|
|
230
|
+
// Permission-based middleware
|
|
231
|
+
requirePermission: (permission) => middleware.requirePermission(permission),
|
|
232
|
+
requireAnyPermission: (permissions) => middleware.requireAnyPermission(permissions),
|
|
233
|
+
requireAllPermissions: (permissions) => middleware.requireAllPermissions(permissions),
|
|
234
|
+
// Role-based middleware
|
|
235
|
+
requireAdmin: middleware.requireAdmin(),
|
|
236
|
+
requireStudioAccess: middleware.requireStudioAccess(),
|
|
237
|
+
// Common combinations
|
|
238
|
+
authAndPermission: (permission) => [
|
|
239
|
+
middleware.authenticate(),
|
|
240
|
+
middleware.requireAuth(),
|
|
241
|
+
middleware.requirePermission(permission)
|
|
242
|
+
],
|
|
243
|
+
studioAuth: () => [
|
|
244
|
+
middleware.authenticate(),
|
|
245
|
+
middleware.requireAuth(),
|
|
246
|
+
middleware.requireStudioAccess()
|
|
247
|
+
],
|
|
248
|
+
adminAuth: () => [
|
|
249
|
+
middleware.authenticate(),
|
|
250
|
+
middleware.requireAuth(),
|
|
251
|
+
middleware.requireAdmin()
|
|
252
|
+
],
|
|
253
|
+
// Utility functions
|
|
254
|
+
getAuthContext: AuthMiddleware.getAuthContext,
|
|
255
|
+
isAuthenticatedUser: AuthMiddleware.isAuthenticatedUser,
|
|
256
|
+
isAppToken: AuthMiddleware.isAppToken,
|
|
257
|
+
getUserId: AuthMiddleware.getUserId,
|
|
258
|
+
getAppTokenId: AuthMiddleware.getAppTokenId
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=middleware.js.map
|