@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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Turnstile CAPTCHA Service
|
|
3
|
+
*
|
|
4
|
+
* Implements the CaptchaProvider interface for Cloudflare Turnstile.
|
|
5
|
+
* https://developers.cloudflare.com/turnstile/
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '../../utils/logger.js';
|
|
8
|
+
const logger = createLogger('security', 'Turnstile');
|
|
9
|
+
const TURNSTILE_VERIFY_URL = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
|
|
10
|
+
/**
|
|
11
|
+
* Cloudflare Turnstile Service
|
|
12
|
+
*/
|
|
13
|
+
export class TurnstileService {
|
|
14
|
+
name = 'turnstile';
|
|
15
|
+
config;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
logger.debug('TurnstileService initialized', { siteKey: config.siteKey });
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Verify a Turnstile token with Cloudflare's API
|
|
22
|
+
*/
|
|
23
|
+
async verify(token, remoteIp) {
|
|
24
|
+
logger.debug('Verifying Turnstile token');
|
|
25
|
+
const formData = new URLSearchParams({
|
|
26
|
+
secret: this.config.secretKey,
|
|
27
|
+
response: token,
|
|
28
|
+
});
|
|
29
|
+
if (remoteIp) {
|
|
30
|
+
formData.append('remoteip', remoteIp);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const response = await fetch(TURNSTILE_VERIFY_URL, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: {
|
|
36
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
37
|
+
},
|
|
38
|
+
body: formData,
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
logger.error('Turnstile verification request failed', { status: response.status });
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
errorCodes: ['network-error'],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const data = (await response.json());
|
|
48
|
+
const result = {
|
|
49
|
+
success: data.success,
|
|
50
|
+
challengeTimestamp: data.challenge_ts,
|
|
51
|
+
hostname: data.hostname,
|
|
52
|
+
errorCodes: data['error-codes'],
|
|
53
|
+
action: data.action,
|
|
54
|
+
};
|
|
55
|
+
if (data.success) {
|
|
56
|
+
logger.debug('Turnstile verification successful', { hostname: data.hostname });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
logger.warn('Turnstile verification failed', { errorCodes: data['error-codes'] });
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
logger.error('Turnstile verification error', error);
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
errorCodes: ['internal-error'],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if the service is properly configured
|
|
73
|
+
*/
|
|
74
|
+
isConfigured() {
|
|
75
|
+
return !!(this.config.siteKey && this.config.secretKey);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the public site key
|
|
79
|
+
*/
|
|
80
|
+
getSiteKey() {
|
|
81
|
+
return this.config.siteKey;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Factory function to create a TurnstileService
|
|
86
|
+
*/
|
|
87
|
+
export function createTurnstileService(config) {
|
|
88
|
+
return new TurnstileService(config);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=turnstile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnstile.js","sourceRoot":"","sources":["../../../../src/core/security/captcha/turnstile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CAPTCHA Provider Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the interface for CAPTCHA providers (Turnstile, hCaptcha, reCAPTCHA).
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Result of CAPTCHA verification
|
|
8
|
+
*/
|
|
9
|
+
export interface CaptchaVerificationResult {
|
|
10
|
+
/** Whether the CAPTCHA was successfully verified */
|
|
11
|
+
success: boolean;
|
|
12
|
+
/** ISO timestamp of when the challenge was solved */
|
|
13
|
+
challengeTimestamp?: string;
|
|
14
|
+
/** Hostname where the challenge was served */
|
|
15
|
+
hostname?: string;
|
|
16
|
+
/** Error codes if verification failed */
|
|
17
|
+
errorCodes?: string[];
|
|
18
|
+
/** Action name (reCAPTCHA v3) */
|
|
19
|
+
action?: string;
|
|
20
|
+
/** Bot score from 0.0 to 1.0 (reCAPTCHA v3) */
|
|
21
|
+
score?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Configuration for a CAPTCHA provider
|
|
25
|
+
*/
|
|
26
|
+
export interface CaptchaProviderConfig {
|
|
27
|
+
/** Public site key for frontend widget */
|
|
28
|
+
siteKey: string;
|
|
29
|
+
/** Secret key for backend verification */
|
|
30
|
+
secretKey: string;
|
|
31
|
+
/** Provider-specific options */
|
|
32
|
+
options?: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Supported CAPTCHA provider types
|
|
36
|
+
*/
|
|
37
|
+
export type CaptchaProviderType = 'turnstile' | 'hcaptcha' | 'recaptcha';
|
|
38
|
+
/**
|
|
39
|
+
* Protected endpoint types
|
|
40
|
+
*/
|
|
41
|
+
export type CaptchaProtectedEndpoint = 'login' | 'passwordResetRequest' | 'passwordResetVerify';
|
|
42
|
+
/**
|
|
43
|
+
* CAPTCHA Provider Interface
|
|
44
|
+
*
|
|
45
|
+
* All CAPTCHA providers must implement this interface.
|
|
46
|
+
*/
|
|
47
|
+
export interface CaptchaProvider {
|
|
48
|
+
/** Provider name identifier */
|
|
49
|
+
readonly name: CaptchaProviderType;
|
|
50
|
+
/**
|
|
51
|
+
* Verify a CAPTCHA token
|
|
52
|
+
* @param token - The token from the frontend widget
|
|
53
|
+
* @param remoteIp - Optional client IP address for verification
|
|
54
|
+
* @returns Verification result
|
|
55
|
+
*/
|
|
56
|
+
verify(token: string, remoteIp?: string): Promise<CaptchaVerificationResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Check if the provider is properly configured
|
|
59
|
+
*/
|
|
60
|
+
isConfigured(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Get the public site key for frontend use
|
|
63
|
+
*/
|
|
64
|
+
getSiteKey(): string;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/security/captcha/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAA;IAChB,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAA;AAExE;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,sBAAsB,GAAG,qBAAqB,CAAA;AAE/F;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;IAElC;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAA;IAE5E;;OAEG;IACH,YAAY,IAAI,OAAO,CAAA;IAEvB;;OAEG;IACH,UAAU,IAAI,MAAM,CAAA;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/security/captcha/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email OTP Service
|
|
3
|
+
*
|
|
4
|
+
* Implements email-based one-time password for MFA.
|
|
5
|
+
* Uses the existing Trokky mail system for email delivery.
|
|
6
|
+
*/
|
|
7
|
+
export interface EmailOTPConfig {
|
|
8
|
+
codeLength?: number;
|
|
9
|
+
expiryMinutes?: number;
|
|
10
|
+
maxAttempts?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface EmailOTPResult {
|
|
13
|
+
code: string;
|
|
14
|
+
codeHash: string;
|
|
15
|
+
expiresAt: string;
|
|
16
|
+
}
|
|
17
|
+
export interface StoredEmailOTP {
|
|
18
|
+
codeHash: string;
|
|
19
|
+
expiresAt: string;
|
|
20
|
+
attempts: number;
|
|
21
|
+
createdAt: string;
|
|
22
|
+
}
|
|
23
|
+
export interface EmailOTPVerificationResult {
|
|
24
|
+
valid: boolean;
|
|
25
|
+
expired?: boolean;
|
|
26
|
+
maxAttemptsExceeded?: boolean;
|
|
27
|
+
attemptsRemaining?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class EmailOTPService {
|
|
30
|
+
private config;
|
|
31
|
+
constructor(config?: EmailOTPConfig);
|
|
32
|
+
/**
|
|
33
|
+
* Generate a new email OTP code
|
|
34
|
+
* Returns both the plain code (for email) and hashed code (for storage)
|
|
35
|
+
*/
|
|
36
|
+
generateCode(): EmailOTPResult;
|
|
37
|
+
/**
|
|
38
|
+
* Verify an email OTP code
|
|
39
|
+
* Handles expiry and attempt counting
|
|
40
|
+
*/
|
|
41
|
+
verifyCode(inputCode: string, stored: StoredEmailOTP): EmailOTPVerificationResult;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a stored OTP has expired
|
|
44
|
+
*/
|
|
45
|
+
isExpired(stored: StoredEmailOTP): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check if max attempts have been exceeded
|
|
48
|
+
*/
|
|
49
|
+
isMaxAttemptsExceeded(stored: StoredEmailOTP): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Get the time remaining until expiry (in seconds)
|
|
52
|
+
*/
|
|
53
|
+
getTimeRemaining(stored: StoredEmailOTP): number;
|
|
54
|
+
/**
|
|
55
|
+
* Create a stored OTP object from a generated code result
|
|
56
|
+
*/
|
|
57
|
+
createStoredOTP(result: EmailOTPResult): StoredEmailOTP;
|
|
58
|
+
/**
|
|
59
|
+
* Increment attempts for a stored OTP
|
|
60
|
+
*/
|
|
61
|
+
incrementAttempts(stored: StoredEmailOTP): StoredEmailOTP;
|
|
62
|
+
/**
|
|
63
|
+
* Generate a random numeric code of specified length
|
|
64
|
+
*/
|
|
65
|
+
private generateNumericCode;
|
|
66
|
+
/**
|
|
67
|
+
* Hash a code for secure storage
|
|
68
|
+
*/
|
|
69
|
+
private hashCode;
|
|
70
|
+
/**
|
|
71
|
+
* Timing-safe hex string comparison
|
|
72
|
+
*/
|
|
73
|
+
private timingSafeCompareHex;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a new Email OTP service instance
|
|
77
|
+
*/
|
|
78
|
+
export declare function createEmailOTPService(config?: EmailOTPConfig): EmailOTPService;
|
|
79
|
+
/**
|
|
80
|
+
* Get subject line for OTP email
|
|
81
|
+
*/
|
|
82
|
+
export declare function getOTPEmailSubject(issuer: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* Get plain text body for OTP email
|
|
85
|
+
*/
|
|
86
|
+
export declare function getOTPEmailBody(code: string, issuer: string, expiryMinutes: number): string;
|
|
87
|
+
/**
|
|
88
|
+
* Get HTML body for OTP email
|
|
89
|
+
*/
|
|
90
|
+
export declare function getOTPEmailHTML(code: string, issuer: string, expiryMinutes: number): string;
|
|
91
|
+
//# sourceMappingURL=email-otp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-otp.d.ts","sourceRoot":"","sources":["../../../../src/core/security/mfa/email-otp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAcD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,GAAE,cAAmB;IAYvC;;;OAGG;IACH,YAAY,IAAI,cAAc;IAwB9B;;;OAGG;IACH,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,GACrB,0BAA0B;IA4C7B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAI1C;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAItD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAKhD;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc;IASvD;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc;IAWzD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAa7B;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,GAAE,cAAmB,GAC1B,eAAe,CAEjB;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,MAAM,CA4DR"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email OTP Service
|
|
3
|
+
*
|
|
4
|
+
* Implements email-based one-time password for MFA.
|
|
5
|
+
* Uses the existing Trokky mail system for email delivery.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
8
|
+
import { createLogger } from '../../utils/logger.js';
|
|
9
|
+
const logger = createLogger('security', 'EmailOTP');
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// CONSTANTS
|
|
12
|
+
// =============================================================================
|
|
13
|
+
const DEFAULT_CODE_LENGTH = 6;
|
|
14
|
+
const DEFAULT_EXPIRY_MINUTES = 10;
|
|
15
|
+
const DEFAULT_MAX_ATTEMPTS = 5;
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// EMAIL OTP SERVICE
|
|
18
|
+
// =============================================================================
|
|
19
|
+
export class EmailOTPService {
|
|
20
|
+
config;
|
|
21
|
+
constructor(config = {}) {
|
|
22
|
+
this.config = {
|
|
23
|
+
codeLength: config.codeLength || DEFAULT_CODE_LENGTH,
|
|
24
|
+
expiryMinutes: config.expiryMinutes || DEFAULT_EXPIRY_MINUTES,
|
|
25
|
+
maxAttempts: config.maxAttempts || DEFAULT_MAX_ATTEMPTS,
|
|
26
|
+
};
|
|
27
|
+
logger.debug('EmailOTPService initialized', {
|
|
28
|
+
codeLength: this.config.codeLength,
|
|
29
|
+
expiryMinutes: this.config.expiryMinutes,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Generate a new email OTP code
|
|
34
|
+
* Returns both the plain code (for email) and hashed code (for storage)
|
|
35
|
+
*/
|
|
36
|
+
generateCode() {
|
|
37
|
+
// Generate random numeric code
|
|
38
|
+
const code = this.generateNumericCode(this.config.codeLength);
|
|
39
|
+
// Hash the code for secure storage
|
|
40
|
+
const codeHash = this.hashCode(code);
|
|
41
|
+
// Calculate expiry time
|
|
42
|
+
const expiresAt = new Date(Date.now() + this.config.expiryMinutes * 60 * 1000).toISOString();
|
|
43
|
+
logger.info('Generated email OTP', {
|
|
44
|
+
expiresAt,
|
|
45
|
+
codeLength: this.config.codeLength,
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
code,
|
|
49
|
+
codeHash,
|
|
50
|
+
expiresAt,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Verify an email OTP code
|
|
55
|
+
* Handles expiry and attempt counting
|
|
56
|
+
*/
|
|
57
|
+
verifyCode(inputCode, stored) {
|
|
58
|
+
// Check if expired
|
|
59
|
+
if (new Date(stored.expiresAt) < new Date()) {
|
|
60
|
+
logger.debug('Email OTP expired');
|
|
61
|
+
return {
|
|
62
|
+
valid: false,
|
|
63
|
+
expired: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Check max attempts
|
|
67
|
+
if (stored.attempts >= this.config.maxAttempts) {
|
|
68
|
+
logger.debug('Email OTP max attempts exceeded');
|
|
69
|
+
return {
|
|
70
|
+
valid: false,
|
|
71
|
+
maxAttemptsExceeded: true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Clean input code (remove spaces, dashes)
|
|
75
|
+
const cleanCode = inputCode.replace(/[\s-]/g, '');
|
|
76
|
+
// Hash and compare
|
|
77
|
+
const inputHash = this.hashCode(cleanCode);
|
|
78
|
+
if (this.timingSafeCompareHex(inputHash, stored.codeHash)) {
|
|
79
|
+
logger.info('Email OTP verified successfully');
|
|
80
|
+
return {
|
|
81
|
+
valid: true,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// Invalid code
|
|
85
|
+
const attemptsRemaining = this.config.maxAttempts - (stored.attempts + 1);
|
|
86
|
+
logger.debug('Email OTP verification failed', { attemptsRemaining });
|
|
87
|
+
return {
|
|
88
|
+
valid: false,
|
|
89
|
+
attemptsRemaining,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if a stored OTP has expired
|
|
94
|
+
*/
|
|
95
|
+
isExpired(stored) {
|
|
96
|
+
return new Date(stored.expiresAt) < new Date();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if max attempts have been exceeded
|
|
100
|
+
*/
|
|
101
|
+
isMaxAttemptsExceeded(stored) {
|
|
102
|
+
return stored.attempts >= this.config.maxAttempts;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the time remaining until expiry (in seconds)
|
|
106
|
+
*/
|
|
107
|
+
getTimeRemaining(stored) {
|
|
108
|
+
const remaining = new Date(stored.expiresAt).getTime() - Date.now();
|
|
109
|
+
return Math.max(0, Math.floor(remaining / 1000));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Create a stored OTP object from a generated code result
|
|
113
|
+
*/
|
|
114
|
+
createStoredOTP(result) {
|
|
115
|
+
return {
|
|
116
|
+
codeHash: result.codeHash,
|
|
117
|
+
expiresAt: result.expiresAt,
|
|
118
|
+
attempts: 0,
|
|
119
|
+
createdAt: new Date().toISOString(),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Increment attempts for a stored OTP
|
|
124
|
+
*/
|
|
125
|
+
incrementAttempts(stored) {
|
|
126
|
+
return {
|
|
127
|
+
...stored,
|
|
128
|
+
attempts: stored.attempts + 1,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// ===========================================================================
|
|
132
|
+
// PRIVATE METHODS
|
|
133
|
+
// ===========================================================================
|
|
134
|
+
/**
|
|
135
|
+
* Generate a random numeric code of specified length
|
|
136
|
+
*/
|
|
137
|
+
generateNumericCode(length) {
|
|
138
|
+
// Generate enough random bytes
|
|
139
|
+
const bytes = randomBytes(length);
|
|
140
|
+
let code = '';
|
|
141
|
+
for (let i = 0; i < length; i++) {
|
|
142
|
+
// Map each byte to 0-9
|
|
143
|
+
code += (bytes[i] % 10).toString();
|
|
144
|
+
}
|
|
145
|
+
return code;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Hash a code for secure storage
|
|
149
|
+
*/
|
|
150
|
+
hashCode(code) {
|
|
151
|
+
return createHash('sha256').update(code).digest('hex');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Timing-safe hex string comparison
|
|
155
|
+
*/
|
|
156
|
+
timingSafeCompareHex(a, b) {
|
|
157
|
+
if (a.length !== b.length) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
const bufA = Buffer.from(a, 'hex');
|
|
162
|
+
const bufB = Buffer.from(b, 'hex');
|
|
163
|
+
return timingSafeEqual(bufA, bufB);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// =============================================================================
|
|
171
|
+
// FACTORY FUNCTION
|
|
172
|
+
// =============================================================================
|
|
173
|
+
/**
|
|
174
|
+
* Create a new Email OTP service instance
|
|
175
|
+
*/
|
|
176
|
+
export function createEmailOTPService(config = {}) {
|
|
177
|
+
return new EmailOTPService(config);
|
|
178
|
+
}
|
|
179
|
+
// =============================================================================
|
|
180
|
+
// EMAIL TEMPLATE HELPERS
|
|
181
|
+
// =============================================================================
|
|
182
|
+
/**
|
|
183
|
+
* Get subject line for OTP email
|
|
184
|
+
*/
|
|
185
|
+
export function getOTPEmailSubject(issuer) {
|
|
186
|
+
return `Your ${issuer} verification code`;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get plain text body for OTP email
|
|
190
|
+
*/
|
|
191
|
+
export function getOTPEmailBody(code, issuer, expiryMinutes) {
|
|
192
|
+
return `Your ${issuer} verification code is: ${code}
|
|
193
|
+
|
|
194
|
+
This code will expire in ${expiryMinutes} minutes.
|
|
195
|
+
|
|
196
|
+
If you didn't request this code, please ignore this email or contact support if you have concerns.
|
|
197
|
+
|
|
198
|
+
Do not share this code with anyone.`;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get HTML body for OTP email
|
|
202
|
+
*/
|
|
203
|
+
export function getOTPEmailHTML(code, issuer, expiryMinutes) {
|
|
204
|
+
return `
|
|
205
|
+
<!DOCTYPE html>
|
|
206
|
+
<html>
|
|
207
|
+
<head>
|
|
208
|
+
<meta charset="utf-8">
|
|
209
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
210
|
+
<style>
|
|
211
|
+
body {
|
|
212
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
213
|
+
line-height: 1.6;
|
|
214
|
+
color: #333;
|
|
215
|
+
max-width: 600px;
|
|
216
|
+
margin: 0 auto;
|
|
217
|
+
padding: 20px;
|
|
218
|
+
}
|
|
219
|
+
.code-container {
|
|
220
|
+
background: #f5f5f5;
|
|
221
|
+
border-radius: 8px;
|
|
222
|
+
padding: 20px;
|
|
223
|
+
text-align: center;
|
|
224
|
+
margin: 20px 0;
|
|
225
|
+
}
|
|
226
|
+
.code {
|
|
227
|
+
font-size: 32px;
|
|
228
|
+
font-weight: bold;
|
|
229
|
+
letter-spacing: 8px;
|
|
230
|
+
color: #333;
|
|
231
|
+
font-family: monospace;
|
|
232
|
+
}
|
|
233
|
+
.expiry {
|
|
234
|
+
color: #666;
|
|
235
|
+
font-size: 14px;
|
|
236
|
+
margin-top: 10px;
|
|
237
|
+
}
|
|
238
|
+
.warning {
|
|
239
|
+
color: #666;
|
|
240
|
+
font-size: 12px;
|
|
241
|
+
margin-top: 20px;
|
|
242
|
+
padding-top: 20px;
|
|
243
|
+
border-top: 1px solid #eee;
|
|
244
|
+
}
|
|
245
|
+
</style>
|
|
246
|
+
</head>
|
|
247
|
+
<body>
|
|
248
|
+
<h2>Your verification code</h2>
|
|
249
|
+
<p>Use the following code to verify your identity on ${issuer}:</p>
|
|
250
|
+
|
|
251
|
+
<div class="code-container">
|
|
252
|
+
<div class="code">${code}</div>
|
|
253
|
+
<div class="expiry">This code expires in ${expiryMinutes} minutes</div>
|
|
254
|
+
</div>
|
|
255
|
+
|
|
256
|
+
<p class="warning">
|
|
257
|
+
If you didn't request this code, please ignore this email or contact support if you have concerns.<br>
|
|
258
|
+
<strong>Do not share this code with anyone.</strong>
|
|
259
|
+
</p>
|
|
260
|
+
</body>
|
|
261
|
+
</html>
|
|
262
|
+
`;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=email-otp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-otp.js","sourceRoot":"","sources":["../../../../src/core/security/mfa/email-otp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MFA (Multi-Factor Authentication) Services
|
|
3
|
+
*
|
|
4
|
+
* Provides TOTP and Email OTP authentication methods.
|
|
5
|
+
*/
|
|
6
|
+
export { TOTPService, createTOTPService, type TOTPConfig, type TOTPSecretResult, type BackupCodeVerificationResult, } from './totp.js';
|
|
7
|
+
export { EmailOTPService, createEmailOTPService, getOTPEmailSubject, getOTPEmailBody, getOTPEmailHTML, type EmailOTPConfig, type EmailOTPResult, type StoredEmailOTP, type EmailOTPVerificationResult, } from './email-otp.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/security/mfa/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,GAClC,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,0BAA0B,GAChC,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MFA (Multi-Factor Authentication) Services
|
|
3
|
+
*
|
|
4
|
+
* Provides TOTP and Email OTP authentication methods.
|
|
5
|
+
*/
|
|
6
|
+
export { TOTPService, createTOTPService, } from './totp.js';
|
|
7
|
+
export { EmailOTPService, createEmailOTPService, getOTPEmailSubject, getOTPEmailBody, getOTPEmailHTML, } from './email-otp.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/security/mfa/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,iBAAiB,GAIlB,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAKhB,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
+
export interface TOTPConfig {
|
|
8
|
+
issuer: string;
|
|
9
|
+
algorithm?: 'SHA1' | 'SHA256' | 'SHA512';
|
|
10
|
+
digits?: number;
|
|
11
|
+
period?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface TOTPSecretResult {
|
|
14
|
+
secret: string;
|
|
15
|
+
uri: string;
|
|
16
|
+
qrCodeDataUrl: string;
|
|
17
|
+
manualEntryKey: string;
|
|
18
|
+
}
|
|
19
|
+
export interface BackupCodeVerificationResult {
|
|
20
|
+
valid: boolean;
|
|
21
|
+
remainingCodes: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare class TOTPService {
|
|
24
|
+
private config;
|
|
25
|
+
constructor(config: TOTPConfig);
|
|
26
|
+
/**
|
|
27
|
+
* Generate a new TOTP secret for a user
|
|
28
|
+
* Returns the secret, URI for QR code generation, and a data URL for the QR code
|
|
29
|
+
*/
|
|
30
|
+
generateSecret(accountName: string): Promise<TOTPSecretResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Verify a TOTP code against a secret
|
|
33
|
+
* Allows for time drift by checking adjacent time windows
|
|
34
|
+
*/
|
|
35
|
+
verifyCode(secret: string, code: string, window?: number): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Generate backup codes for account recovery
|
|
38
|
+
* These are one-time use codes stored hashed
|
|
39
|
+
*/
|
|
40
|
+
generateBackupCodes(count?: number): string[];
|
|
41
|
+
/**
|
|
42
|
+
* Hash a backup code for secure storage
|
|
43
|
+
* Uses SHA-256 for fast comparison while still being secure
|
|
44
|
+
*/
|
|
45
|
+
hashBackupCode(code: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Verify a backup code against stored hashed codes
|
|
48
|
+
* Returns the updated list with the used code removed (consumed)
|
|
49
|
+
*/
|
|
50
|
+
verifyBackupCode(hashedCodes: string[], code: string): BackupCodeVerificationResult;
|
|
51
|
+
/**
|
|
52
|
+
* Build otpauth:// URI for QR code
|
|
53
|
+
*/
|
|
54
|
+
private buildTOTPUri;
|
|
55
|
+
/**
|
|
56
|
+
* Generate QR code as data URL
|
|
57
|
+
* Uses dynamic import to handle optional qrcode dependency
|
|
58
|
+
* If qrcode is not installed, returns the URI as base64 for client-side QR generation
|
|
59
|
+
*/
|
|
60
|
+
private generateQRCode;
|
|
61
|
+
/**
|
|
62
|
+
* Generate TOTP code for a given time step
|
|
63
|
+
* Implements RFC 6238
|
|
64
|
+
*/
|
|
65
|
+
private generateTOTP;
|
|
66
|
+
/**
|
|
67
|
+
* Base32 encode bytes
|
|
68
|
+
*/
|
|
69
|
+
private base32Encode;
|
|
70
|
+
/**
|
|
71
|
+
* Base32 decode string to bytes
|
|
72
|
+
*/
|
|
73
|
+
private base32Decode;
|
|
74
|
+
/**
|
|
75
|
+
* Timing-safe string comparison
|
|
76
|
+
*/
|
|
77
|
+
private timingSafeCompare;
|
|
78
|
+
/**
|
|
79
|
+
* Timing-safe hex string comparison
|
|
80
|
+
*/
|
|
81
|
+
private timingSafeCompareHex;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Create a new TOTP service instance
|
|
85
|
+
*/
|
|
86
|
+
export declare function createTOTPService(config: TOTPConfig): TOTPService;
|
|
87
|
+
//# sourceMappingURL=totp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totp.d.ts","sourceRoot":"","sources":["../../../../src/core/security/mfa/totp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAoBD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,UAAU;IAU9B;;;OAGG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0BpE;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO;IA4BrE;;;OAGG;IACH,mBAAmB,CAAC,KAAK,GAAE,MAA0B,GAAG,MAAM,EAAE;IAsBhE;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAMpC;;;OAGG;IACH,gBAAgB,CACd,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,MAAM,GACX,4BAA4B;IAmC/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;;;OAIG;YACW,cAAc;IA2B5B;;;OAGG;IACH,OAAO,CAAC,YAAY;IA2BpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAuBpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAa7B;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAEjE"}
|