@lastshotlabs/bunshot 0.0.27 → 0.0.28
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/.oclif.manifest.json +39 -0
- package/README.md +8282 -2147
- package/dist/cli/commands/init.js +690 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli.js +4 -4
- package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
- package/dist/packages/bunshot-admin/src/index.js +11 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
- package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-admin/src/plugin.js +46 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
- package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
- package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
- package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
- package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
- package/dist/packages/bunshot-admin/src/types/config.js +37 -0
- package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
- package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
- package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
- package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
- package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
- package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
- package/dist/packages/bunshot-auth/src/index.js +23 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
- package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
- package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
- package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
- package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
- package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
- package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
- package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
- package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
- package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
- package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
- package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
- package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
- package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
- package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
- package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
- package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
- package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
- package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
- package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
- package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
- package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
- package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
- package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
- package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/plugin.js +274 -0
- package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
- package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
- package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
- package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
- package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
- package/dist/packages/bunshot-auth/src/runtime.js +11 -0
- package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
- package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
- package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
- package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
- package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
- package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
- package/dist/packages/bunshot-auth/src/testing.js +23 -0
- package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
- package/dist/packages/bunshot-auth/src/types/config.js +179 -0
- package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
- package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
- package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
- package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/types/session.js +1 -0
- package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/store.js +1 -0
- package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
- package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
- package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
- package/dist/packages/bunshot-core/src/auditLog.js +1 -0
- package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
- package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
- package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
- package/dist/packages/bunshot-core/src/authVariables.js +4 -0
- package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
- package/dist/packages/bunshot-core/src/cache.js +21 -0
- package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
- package/dist/packages/bunshot-core/src/captcha.js +1 -0
- package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
- package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
- package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
- package/dist/packages/bunshot-core/src/clientIp.js +45 -0
- package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
- package/dist/packages/bunshot-core/src/configLock.js +7 -0
- package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
- package/dist/packages/bunshot-core/src/configValidation.js +39 -0
- package/dist/packages/bunshot-core/src/constants.js +10 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
- package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
- package/dist/packages/bunshot-core/src/context/index.js +2 -0
- package/dist/packages/bunshot-core/src/context.d.ts +40 -0
- package/dist/packages/bunshot-core/src/context.js +35 -0
- package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
- package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
- package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
- package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
- package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
- package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
- package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
- package/dist/packages/bunshot-core/src/crypto.js +74 -0
- package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
- package/dist/packages/bunshot-core/src/csrf.js +1 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
- package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
- package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
- package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
- package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
- package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
- package/dist/packages/bunshot-core/src/eventBus.js +143 -0
- package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
- package/dist/packages/bunshot-core/src/idempotency.js +1 -0
- package/dist/packages/bunshot-core/src/index.d.ts +60 -0
- package/dist/packages/bunshot-core/src/index.js +34 -0
- package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
- package/dist/packages/bunshot-core/src/mail.js +8 -0
- package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
- package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
- package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
- package/dist/packages/bunshot-core/src/pagination.js +61 -0
- package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
- package/dist/packages/bunshot-core/src/permissions.js +27 -0
- package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
- package/dist/packages/bunshot-core/src/plugin.js +1 -0
- package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
- package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
- package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
- package/dist/packages/bunshot-core/src/redis.js +1 -0
- package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
- package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
- package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
- package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
- package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
- package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
- package/dist/packages/bunshot-core/src/secrets.js +8 -0
- package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
- package/dist/packages/bunshot-core/src/signing.js +1 -0
- package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
- package/dist/packages/bunshot-core/src/sse.js +1 -0
- package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
- package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
- package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
- package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
- package/dist/packages/bunshot-core/src/storeType.js +1 -0
- package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
- package/dist/packages/bunshot-core/src/testing.js +1 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
- package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
- package/dist/packages/bunshot-core/src/userResolver.js +14 -0
- package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
- package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
- package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/index.js +5 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
- package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
- package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
- package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
- package/dist/packages/bunshot-postgres/src/connection.js +16 -0
- package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
- package/dist/packages/bunshot-postgres/src/index.js +2 -0
- package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
- package/dist/packages/bunshot-postgres/src/schema.js +105 -0
- package/dist/src/app.d.ts +230 -0
- package/dist/src/app.js +182 -0
- package/dist/src/cli/commands/init.d.ts +10 -0
- package/dist/src/cli/commands/init.js +709 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +3 -0
- package/dist/src/entrypoints/mongo.d.ts +6 -0
- package/dist/src/entrypoints/mongo.js +4 -0
- package/dist/src/entrypoints/queue.d.ts +2 -0
- package/dist/src/entrypoints/queue.js +1 -0
- package/dist/src/entrypoints/redis.d.ts +1 -0
- package/dist/src/entrypoints/redis.js +1 -0
- package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
- package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
- package/dist/src/framework/adapters/memoryStorage.js +45 -0
- package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
- package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
- package/dist/src/framework/admin/bunshotAccess.js +23 -0
- package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
- package/dist/src/framework/admin/bunshotUsers.js +103 -0
- package/dist/src/framework/admin/index.d.ts +7 -0
- package/dist/src/framework/admin/index.js +21 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
- package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
- package/dist/src/framework/boundaryAdapters/index.js +1 -0
- package/dist/src/framework/boundaryAdapters.d.ts +17 -0
- package/dist/src/framework/boundaryAdapters.js +62 -0
- package/dist/src/framework/buildContext.d.ts +33 -0
- package/dist/src/framework/buildContext.js +119 -0
- package/dist/src/framework/config/schema.d.ts +447 -0
- package/dist/src/framework/config/schema.js +528 -0
- package/dist/src/framework/createInfrastructure.d.ts +76 -0
- package/dist/src/framework/createInfrastructure.js +221 -0
- package/dist/src/framework/lib/auditLog.d.ts +23 -0
- package/dist/src/framework/lib/auditLog.js +416 -0
- package/dist/src/framework/lib/captcha.d.ts +11 -0
- package/dist/{lib → src/framework/lib}/captcha.js +13 -10
- package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
- package/dist/src/framework/lib/createRoute.d.ts +1 -0
- package/dist/src/framework/lib/createRoute.js +2 -0
- package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
- package/dist/src/framework/lib/idempotency.js +74 -0
- package/dist/src/framework/lib/logger.d.ts +3 -0
- package/dist/src/framework/lib/logger.js +14 -0
- package/dist/src/framework/lib/metrics.d.ts +34 -0
- package/dist/{lib → src/framework/lib}/metrics.js +49 -57
- package/dist/src/framework/lib/pagination.d.ts +42 -0
- package/dist/src/framework/lib/pagination.js +51 -0
- package/dist/src/framework/lib/redisTransport.d.ts +38 -0
- package/dist/src/framework/lib/redisTransport.js +107 -0
- package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
- package/dist/src/framework/lib/resolveUserId.js +5 -0
- package/dist/src/framework/lib/sseCollision.d.ts +6 -0
- package/dist/src/framework/lib/sseCollision.js +26 -0
- package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
- package/dist/src/framework/lib/storageAdapter.js +1 -0
- package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
- package/dist/src/framework/lib/tenant.d.ts +21 -0
- package/dist/src/framework/lib/tenant.js +70 -0
- package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
- package/dist/src/framework/lib/upload.js +132 -0
- package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
- package/dist/src/framework/lib/uploadRegistry.js +34 -0
- package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/validate.js +2 -2
- package/dist/src/framework/lib/ws.d.ts +19 -0
- package/dist/src/framework/lib/ws.js +130 -0
- package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
- package/dist/src/framework/lib/wsHeartbeat.js +53 -0
- package/dist/src/framework/lib/wsMessages.d.ts +25 -0
- package/dist/src/framework/lib/wsMessages.js +45 -0
- package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
- package/dist/src/framework/lib/wsNamespace.js +19 -0
- package/dist/src/framework/lib/wsPresence.d.ts +17 -0
- package/dist/src/framework/lib/wsPresence.js +84 -0
- package/dist/src/framework/lib/wsTransport.d.ts +38 -0
- package/dist/src/framework/lib/wsTransport.js +9 -0
- package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
- package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
- package/dist/src/framework/middleware/auditLog.js +42 -0
- package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
- package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
- package/dist/src/framework/middleware/cacheResponse.js +126 -0
- package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
- package/dist/src/framework/middleware/index.js +1 -0
- package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
- package/dist/src/framework/middleware/metrics.d.ts +12 -0
- package/dist/src/framework/middleware/metrics.js +26 -0
- package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
- package/dist/src/framework/middleware/rateLimit.js +22 -0
- package/dist/src/framework/middleware/requestId.d.ts +3 -0
- package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
- package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
- package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
- package/dist/src/framework/middleware/tenant.d.ts +14 -0
- package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
- package/dist/src/framework/middleware/upload.d.ts +5 -0
- package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
- package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
- package/dist/src/framework/models/AuditLog.d.ts +21 -0
- package/dist/src/framework/models/AuditLog.js +31 -0
- package/dist/src/framework/mountMiddleware.d.ts +91 -0
- package/dist/src/framework/mountMiddleware.js +128 -0
- package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
- package/dist/src/framework/mountOptionalEndpoints.js +47 -0
- package/dist/src/framework/mountRoutes.d.ts +21 -0
- package/dist/src/framework/mountRoutes.js +144 -0
- package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
- package/dist/src/framework/persistence/cronRegistry.js +139 -0
- package/dist/src/framework/persistence/idempotency.d.ts +26 -0
- package/dist/src/framework/persistence/idempotency.js +178 -0
- package/dist/src/framework/persistence/index.d.ts +6 -0
- package/dist/src/framework/persistence/index.js +8 -0
- package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
- package/dist/src/framework/persistence/storeInfra.js +1 -0
- package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
- package/dist/src/framework/persistence/uploadRegistry.js +235 -0
- package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
- package/dist/src/framework/persistence/wsMessages.js +296 -0
- package/dist/src/framework/preloadSchemas.d.ts +24 -0
- package/dist/src/framework/preloadSchemas.js +42 -0
- package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
- package/dist/src/framework/registerBoundaryAdapters.js +46 -0
- package/dist/src/framework/routes/admin.d.ts +9 -0
- package/dist/src/framework/routes/admin.js +361 -0
- package/dist/src/framework/routes/health.d.ts +1 -0
- package/dist/src/framework/routes/health.js +21 -0
- package/dist/src/framework/routes/home.d.ts +1 -0
- package/dist/src/framework/routes/home.js +18 -0
- package/dist/src/framework/routes/jobs.d.ts +3 -0
- package/dist/{routes → src/framework/routes}/jobs.js +128 -103
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
- package/dist/src/framework/routes/uploads.js +262 -0
- package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
- package/dist/src/framework/runPluginLifecycle.js +121 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
- package/dist/src/framework/secrets/index.d.ts +9 -0
- package/dist/src/framework/secrets/index.js +7 -0
- package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
- package/dist/src/framework/secrets/providers/envProvider.js +18 -0
- package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
- package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
- package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
- package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
- package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
- package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
- package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
- package/dist/src/framework/secrets/resolveSecrets.js +34 -0
- package/dist/src/framework/sse/index.d.ts +21 -0
- package/dist/src/framework/sse/index.js +109 -0
- package/dist/src/framework/ws/index.d.ts +11 -0
- package/dist/src/framework/ws/index.js +8 -0
- package/dist/src/index.d.ts +87 -0
- package/dist/src/index.js +58 -0
- package/dist/src/lib/appConfig.d.ts +7 -0
- package/dist/src/lib/appConfig.js +27 -0
- package/dist/src/lib/appMeta.d.ts +7 -0
- package/dist/src/lib/appMeta.js +3 -0
- package/dist/src/lib/authConfig.d.ts +532 -0
- package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
- package/dist/{lib → src/lib}/context.d.ts +6 -12
- package/dist/{lib → src/lib}/context.js +5 -5
- package/dist/src/lib/logger.d.ts +1 -0
- package/dist/src/lib/logger.js +1 -0
- package/dist/src/lib/mongo.d.ts +58 -0
- package/dist/src/lib/mongo.js +96 -0
- package/dist/src/lib/queue.d.ts +72 -0
- package/dist/src/lib/queue.js +152 -0
- package/dist/src/lib/redis.d.ts +28 -0
- package/dist/src/lib/redis.js +72 -0
- package/dist/{lib → src/lib}/signing.d.ts +2 -2
- package/dist/src/lib/signing.js +210 -0
- package/dist/src/lib/signingConfig.d.ts +40 -0
- package/dist/src/lib/signingConfig.js +28 -0
- package/dist/src/server.d.ts +146 -0
- package/dist/src/server.js +469 -0
- package/dist/src/shared/lib/HttpError.d.ts +1 -0
- package/dist/src/shared/lib/HttpError.js +2 -0
- package/dist/src/shared/lib/constants.d.ts +10 -0
- package/dist/src/shared/lib/crypto.d.ts +43 -0
- package/dist/src/shared/lib/crypto.js +74 -0
- package/dist/src/shared/lib/signing.d.ts +52 -0
- package/dist/{lib → src/shared/lib}/signing.js +35 -8
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +60 -24
- package/dist/adapters/memoryAuth.d.ts +0 -52
- package/dist/adapters/memoryAuth.js +0 -749
- package/dist/adapters/memoryStorage.d.ts +0 -3
- package/dist/adapters/memoryStorage.js +0 -44
- package/dist/adapters/mongoAuth.d.ts +0 -2
- package/dist/adapters/mongoAuth.js +0 -403
- package/dist/adapters/sqliteAuth.d.ts +0 -72
- package/dist/adapters/sqliteAuth.js +0 -858
- package/dist/app.d.ts +0 -559
- package/dist/app.js +0 -651
- package/dist/entrypoints/mongo.d.ts +0 -5
- package/dist/entrypoints/mongo.js +0 -4
- package/dist/entrypoints/queue.d.ts +0 -2
- package/dist/entrypoints/queue.js +0 -1
- package/dist/entrypoints/redis.d.ts +0 -1
- package/dist/entrypoints/redis.js +0 -1
- package/dist/index.d.ts +0 -117
- package/dist/index.js +0 -88
- package/dist/lib/appConfig.d.ts +0 -275
- package/dist/lib/auditLog.d.ts +0 -58
- package/dist/lib/auditLog.js +0 -218
- package/dist/lib/authAdapter.d.ts +0 -246
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -117
- package/dist/lib/clientIp.d.ts +0 -14
- package/dist/lib/credentialStuffing.d.ts +0 -31
- package/dist/lib/credentialStuffing.js +0 -77
- package/dist/lib/crypto.d.ts +0 -11
- package/dist/lib/crypto.js +0 -22
- package/dist/lib/deletionCancelToken.d.ts +0 -12
- package/dist/lib/deletionCancelToken.js +0 -88
- package/dist/lib/emailVerification.d.ts +0 -19
- package/dist/lib/emailVerification.js +0 -129
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwks.d.ts +0 -25
- package/dist/lib/jwks.js +0 -51
- package/dist/lib/jwt.d.ts +0 -15
- package/dist/lib/jwt.js +0 -111
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -55
- package/dist/lib/mfaChallenge.js +0 -398
- package/dist/lib/mongo.d.ts +0 -39
- package/dist/lib/mongo.js +0 -124
- package/dist/lib/oauth.d.ts +0 -40
- package/dist/lib/oauth.js +0 -101
- package/dist/lib/oauthCode.d.ts +0 -15
- package/dist/lib/oauthCode.js +0 -95
- package/dist/lib/pagination.d.ts +0 -119
- package/dist/lib/pagination.js +0 -166
- package/dist/lib/queue.d.ts +0 -37
- package/dist/lib/queue.js +0 -117
- package/dist/lib/redis.d.ts +0 -9
- package/dist/lib/redis.js +0 -61
- package/dist/lib/resetPassword.d.ts +0 -12
- package/dist/lib/resetPassword.js +0 -93
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/saml.d.ts +0 -25
- package/dist/lib/saml.js +0 -64
- package/dist/lib/securityEvents.d.ts +0 -28
- package/dist/lib/securityEvents.js +0 -26
- package/dist/lib/session.d.ts +0 -49
- package/dist/lib/session.js +0 -597
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -112
- package/dist/lib/uploadRegistry.d.ts +0 -18
- package/dist/lib/uploadRegistry.js +0 -83
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -96
- package/dist/lib/wsHeartbeat.d.ts +0 -12
- package/dist/lib/wsHeartbeat.js +0 -57
- package/dist/lib/wsMessages.d.ts +0 -40
- package/dist/lib/wsMessages.js +0 -330
- package/dist/lib/wsPresence.d.ts +0 -25
- package/dist/lib/wsPresence.js +0 -99
- package/dist/middleware/auditLog.js +0 -39
- package/dist/middleware/bearerAuth.d.ts +0 -2
- package/dist/middleware/bearerAuth.js +0 -11
- package/dist/middleware/cacheResponse.d.ts +0 -15
- package/dist/middleware/cacheResponse.js +0 -178
- package/dist/middleware/captcha.js +0 -36
- package/dist/middleware/csrf.js +0 -129
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -122
- package/dist/middleware/index.js +0 -1
- package/dist/middleware/metrics.d.ts +0 -9
- package/dist/middleware/metrics.js +0 -26
- package/dist/middleware/rateLimit.js +0 -22
- package/dist/middleware/requestId.d.ts +0 -3
- package/dist/middleware/scimAuth.d.ts +0 -8
- package/dist/middleware/scimAuth.js +0 -29
- package/dist/middleware/tenant.d.ts +0 -5
- package/dist/middleware/upload.d.ts +0 -5
- package/dist/middleware/userAuth.d.ts +0 -3
- package/dist/middleware/userAuth.js +0 -6
- package/dist/models/AuditLog.d.ts +0 -30
- package/dist/models/AuditLog.js +0 -39
- package/dist/models/AuthUser.js +0 -55
- package/dist/models/Group.d.ts +0 -21
- package/dist/models/Group.js +0 -28
- package/dist/models/GroupMembership.js +0 -25
- package/dist/models/TenantRole.d.ts +0 -15
- package/dist/models/TenantRole.js +0 -23
- package/dist/routes/auth.d.ts +0 -12
- package/dist/routes/auth.js +0 -744
- package/dist/routes/groups.js +0 -346
- package/dist/routes/health.d.ts +0 -1
- package/dist/routes/health.js +0 -22
- package/dist/routes/home.d.ts +0 -1
- package/dist/routes/home.js +0 -16
- package/dist/routes/jobs.d.ts +0 -2
- package/dist/routes/m2m.d.ts +0 -2
- package/dist/routes/m2m.js +0 -72
- package/dist/routes/metrics.d.ts +0 -8
- package/dist/routes/metrics.js +0 -55
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -628
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -520
- package/dist/routes/oidc.d.ts +0 -2
- package/dist/routes/oidc.js +0 -29
- package/dist/routes/passkey.d.ts +0 -1
- package/dist/routes/passkey.js +0 -157
- package/dist/routes/saml.d.ts +0 -2
- package/dist/routes/saml.js +0 -86
- package/dist/routes/scim.d.ts +0 -2
- package/dist/routes/scim.js +0 -255
- package/dist/routes/uploads.js +0 -227
- package/dist/schemas/auth.js +0 -30
- package/dist/server.d.ts +0 -57
- package/dist/server.js +0 -112
- package/dist/services/auth.d.ts +0 -29
- package/dist/services/auth.js +0 -238
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -39
- package/docs/sections/adding-middleware/full.md +0 -35
- package/docs/sections/adding-models/full.md +0 -125
- package/docs/sections/adding-models/overview.md +0 -13
- package/docs/sections/adding-routes/full.md +0 -182
- package/docs/sections/adding-routes/overview.md +0 -23
- package/docs/sections/auth-flow/full.md +0 -790
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -388
- package/docs/sections/authentication/full.md +0 -130
- package/docs/sections/authentication/overview.md +0 -5
- package/docs/sections/cli/full.md +0 -42
- package/docs/sections/configuration/full.md +0 -172
- package/docs/sections/configuration/overview.md +0 -18
- package/docs/sections/configuration-example/full.md +0 -117
- package/docs/sections/configuration-example/overview.md +0 -30
- package/docs/sections/documentation/full.md +0 -171
- package/docs/sections/environment-variables/full.md +0 -55
- package/docs/sections/exports/full.md +0 -123
- package/docs/sections/extending-context/full.md +0 -59
- package/docs/sections/header.md +0 -3
- package/docs/sections/installation/full.md +0 -6
- package/docs/sections/jobs/full.md +0 -140
- package/docs/sections/jobs/overview.md +0 -15
- package/docs/sections/logging/full.md +0 -83
- package/docs/sections/metrics/full.md +0 -131
- package/docs/sections/mongodb-connections/full.md +0 -45
- package/docs/sections/mongodb-connections/overview.md +0 -7
- package/docs/sections/multi-tenancy/full.md +0 -66
- package/docs/sections/multi-tenancy/overview.md +0 -15
- package/docs/sections/oauth/full.md +0 -189
- package/docs/sections/oauth/overview.md +0 -16
- package/docs/sections/package-development/full.md +0 -7
- package/docs/sections/pagination/full.md +0 -93
- package/docs/sections/passkey-login/full.md +0 -90
- package/docs/sections/passkey-login/overview.md +0 -1
- package/docs/sections/peer-dependencies/full.md +0 -47
- package/docs/sections/quick-start/full.md +0 -43
- package/docs/sections/response-caching/full.md +0 -117
- package/docs/sections/response-caching/overview.md +0 -13
- package/docs/sections/roles/full.md +0 -225
- package/docs/sections/roles/overview.md +0 -14
- package/docs/sections/running-without-redis/full.md +0 -16
- package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
- package/docs/sections/signing/full.md +0 -203
- package/docs/sections/stack/full.md +0 -10
- package/docs/sections/uploads/full.md +0 -208
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -196
- package/docs/sections/websocket/overview.md +0 -5
- package/docs/sections/websocket-rooms/full.md +0 -102
- package/docs/sections/websocket-rooms/overview.md +0 -5
- /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
- /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
- /package/dist/{lib → src/shared/lib}/constants.js +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized store infrastructure.
|
|
3
|
+
*
|
|
4
|
+
* Add a new backing store in ONE place:
|
|
5
|
+
* 1. Add the type to `StoreType` in types/store.ts
|
|
6
|
+
* 2. Add its infra deps to `StoreInfra`
|
|
7
|
+
* 3. Add a factory entry in each repository's `factories` record
|
|
8
|
+
*
|
|
9
|
+
* Repos declare their factory maps as `Record<StoreType, (infra: StoreInfra) => T>`.
|
|
10
|
+
* `resolveRepo()` picks the right factory and calls it.
|
|
11
|
+
*/
|
|
12
|
+
import type { StoreType } from '../types/store';
|
|
13
|
+
import type { RedisLike } from '../types/redis';
|
|
14
|
+
import type { Connection } from 'mongoose';
|
|
15
|
+
import type { Database } from 'bun:sqlite';
|
|
16
|
+
export interface StoreInfra {
|
|
17
|
+
readonly appName: string;
|
|
18
|
+
readonly getRedis: () => RedisLike;
|
|
19
|
+
readonly getMongo: () => {
|
|
20
|
+
conn: Connection;
|
|
21
|
+
mg: typeof import('mongoose');
|
|
22
|
+
};
|
|
23
|
+
readonly getSqliteDb: () => Database;
|
|
24
|
+
}
|
|
25
|
+
export type RepoFactories<T> = Record<StoreType, (infra: StoreInfra) => T>;
|
|
26
|
+
export declare function resolveRepo<T>(factories: RepoFactories<T>, storeType: StoreType, infra: StoreInfra): T;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized store infrastructure.
|
|
3
|
+
*
|
|
4
|
+
* Add a new backing store in ONE place:
|
|
5
|
+
* 1. Add the type to `StoreType` in types/store.ts
|
|
6
|
+
* 2. Add its infra deps to `StoreInfra`
|
|
7
|
+
* 3. Add a factory entry in each repository's `factories` record
|
|
8
|
+
*
|
|
9
|
+
* Repos declare their factory maps as `Record<StoreType, (infra: StoreInfra) => T>`.
|
|
10
|
+
* `resolveRepo()` picks the right factory and calls it.
|
|
11
|
+
*/
|
|
12
|
+
export function resolveRepo(factories, storeType, infra) {
|
|
13
|
+
const factory = factories[storeType];
|
|
14
|
+
if (!factory) {
|
|
15
|
+
throw new Error(`[bunshot-auth] Unsupported store type: ${storeType}`);
|
|
16
|
+
}
|
|
17
|
+
return factory(infra);
|
|
18
|
+
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import type { AuthAdapter } from '../lib/authAdapter';
|
|
1
2
|
/**
|
|
2
3
|
* Suspend or unsuspend a user.
|
|
3
4
|
* No-op when the adapter does not implement setSuspended.
|
|
4
5
|
*/
|
|
5
|
-
export declare function setSuspended(userId: string, suspended: boolean, reason?: string): Promise<void>;
|
|
6
|
+
export declare function setSuspended(adapter: AuthAdapter, userId: string, suspended: boolean, reason?: string): Promise<void>;
|
|
6
7
|
/**
|
|
7
8
|
* Get the suspension status of a user.
|
|
8
9
|
* Returns { suspended: false } when the adapter does not implement getSuspended.
|
|
9
10
|
*/
|
|
10
|
-
export declare function getSuspended(userId: string): Promise<{
|
|
11
|
+
export declare function getSuspended(adapter: AuthAdapter, userId: string): Promise<{
|
|
11
12
|
suspended: boolean;
|
|
12
13
|
suspendedReason?: string;
|
|
13
14
|
}>;
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { getAuthAdapter } from "./authAdapter";
|
|
2
1
|
/**
|
|
3
2
|
* Suspend or unsuspend a user.
|
|
4
3
|
* No-op when the adapter does not implement setSuspended.
|
|
5
4
|
*/
|
|
6
|
-
export async function setSuspended(userId, suspended, reason) {
|
|
7
|
-
const adapter = getAuthAdapter();
|
|
5
|
+
export async function setSuspended(adapter, userId, suspended, reason) {
|
|
8
6
|
if (adapter.setSuspended) {
|
|
9
7
|
await adapter.setSuspended(userId, suspended, reason);
|
|
10
8
|
}
|
|
@@ -13,8 +11,7 @@ export async function setSuspended(userId, suspended, reason) {
|
|
|
13
11
|
* Get the suspension status of a user.
|
|
14
12
|
* Returns { suspended: false } when the adapter does not implement getSuspended.
|
|
15
13
|
*/
|
|
16
|
-
export async function getSuspended(userId) {
|
|
17
|
-
const adapter = getAuthAdapter();
|
|
14
|
+
export async function getSuspended(adapter, userId) {
|
|
18
15
|
if (adapter.getSuspended) {
|
|
19
16
|
const result = await adapter.getSuspended(userId);
|
|
20
17
|
return result ?? { suspended: false };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AuthAdapter } from './authAdapter';
|
|
2
|
+
export interface AdapterValidationConfig {
|
|
3
|
+
hasOAuthProviders: boolean;
|
|
4
|
+
hasMfa: boolean;
|
|
5
|
+
hasMfaWebAuthn: boolean;
|
|
6
|
+
hasRoles: boolean;
|
|
7
|
+
hasDefaultRole: boolean;
|
|
8
|
+
hasGroups: boolean;
|
|
9
|
+
hasSuspension: boolean;
|
|
10
|
+
hasM2m: boolean;
|
|
11
|
+
hasAdminApi: boolean;
|
|
12
|
+
hasPasswordReset: boolean;
|
|
13
|
+
hasPreventReuse: boolean;
|
|
14
|
+
hasScim: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function validateAdapterCapabilities(adapter: AuthAdapter, cfg: AdapterValidationConfig): void;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
export function validateAdapterCapabilities(adapter, cfg) {
|
|
2
|
+
const errors = [];
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Core — always required
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
if (!adapter.verifyPassword) {
|
|
7
|
+
errors.push('the configured auth adapter is missing the required "verifyPassword(userId, password)" method. Add verifyPassword to your adapter.');
|
|
8
|
+
}
|
|
9
|
+
if (!adapter.getIdentifier) {
|
|
10
|
+
errors.push('the configured auth adapter is missing the required "getIdentifier(userId)" method. Add getIdentifier to your adapter.');
|
|
11
|
+
}
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// passwordReset — requires setPassword
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
if (cfg.hasPasswordReset && !adapter.setPassword) {
|
|
16
|
+
errors.push('"passwordReset" is configured but the auth adapter does not implement setPassword. Add setPassword to your adapter or remove passwordReset.');
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Tier 2 — OAuth
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
if (cfg.hasOAuthProviders) {
|
|
22
|
+
const oauthMethods = ['findOrCreateByProvider', 'linkProvider', 'unlinkProvider'];
|
|
23
|
+
for (const method of oauthMethods) {
|
|
24
|
+
if (!adapter[method]) {
|
|
25
|
+
errors.push(`"oauth.providers" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Tier 3 — MFA
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
if (cfg.hasMfa) {
|
|
33
|
+
const mfaMethods = [
|
|
34
|
+
'setMfaSecret',
|
|
35
|
+
'getMfaSecret',
|
|
36
|
+
'isMfaEnabled',
|
|
37
|
+
'setMfaEnabled',
|
|
38
|
+
'setRecoveryCodes',
|
|
39
|
+
'getRecoveryCodes',
|
|
40
|
+
'removeRecoveryCode',
|
|
41
|
+
'consumeRecoveryCode',
|
|
42
|
+
];
|
|
43
|
+
for (const method of mfaMethods) {
|
|
44
|
+
if (!adapter[method]) {
|
|
45
|
+
errors.push(`"mfa" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Tier 4 — WebAuthn
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
if (cfg.hasMfaWebAuthn) {
|
|
53
|
+
const webauthnMethods = [
|
|
54
|
+
'getWebAuthnCredentials',
|
|
55
|
+
'addWebAuthnCredential',
|
|
56
|
+
'removeWebAuthnCredential',
|
|
57
|
+
'updateWebAuthnCredentialSignCount',
|
|
58
|
+
'findUserByWebAuthnCredentialId',
|
|
59
|
+
];
|
|
60
|
+
for (const method of webauthnMethods) {
|
|
61
|
+
if (!adapter[method]) {
|
|
62
|
+
errors.push(`"mfa.webauthn" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Tier 5 — Roles
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
if (cfg.hasRoles || cfg.hasDefaultRole) {
|
|
70
|
+
const roleMethods = ['getRoles', 'setRoles', 'addRole', 'removeRole'];
|
|
71
|
+
for (const method of roleMethods) {
|
|
72
|
+
if (!adapter[method]) {
|
|
73
|
+
// Backward-compat: the original error only checked setRoles and mentioned defaultRole
|
|
74
|
+
if (cfg.hasDefaultRole && method === 'setRoles' && !cfg.hasRoles) {
|
|
75
|
+
errors.push(`"defaultRole" is set but the auth adapter does not implement setRoles. Add setRoles to your adapter or remove defaultRole.`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
errors.push(`roles are configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
// Tier 6 — Groups
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
if (cfg.hasGroups) {
|
|
87
|
+
const groupMethods = [
|
|
88
|
+
'createGroup',
|
|
89
|
+
'deleteGroup',
|
|
90
|
+
'getGroup',
|
|
91
|
+
'listGroups',
|
|
92
|
+
'updateGroup',
|
|
93
|
+
'addGroupMember',
|
|
94
|
+
'updateGroupMembership',
|
|
95
|
+
'removeGroupMember',
|
|
96
|
+
'getGroupMembers',
|
|
97
|
+
'getUserGroups',
|
|
98
|
+
'getEffectiveRoles',
|
|
99
|
+
];
|
|
100
|
+
for (const method of groupMethods) {
|
|
101
|
+
if (!adapter[method]) {
|
|
102
|
+
errors.push(`"groups" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Tier 7 — Suspension
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
if (cfg.hasSuspension) {
|
|
110
|
+
const suspensionMethods = ['setSuspended', 'getSuspended'];
|
|
111
|
+
for (const method of suspensionMethods) {
|
|
112
|
+
if (!adapter[method]) {
|
|
113
|
+
errors.push(`suspension checking is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Tier 8 — Enterprise: M2M
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
if (cfg.hasM2m) {
|
|
121
|
+
const m2mMethods = [
|
|
122
|
+
'getM2MClient',
|
|
123
|
+
'createM2MClient',
|
|
124
|
+
'deleteM2MClient',
|
|
125
|
+
'listM2MClients',
|
|
126
|
+
];
|
|
127
|
+
for (const method of m2mMethods) {
|
|
128
|
+
if (!adapter[method]) {
|
|
129
|
+
errors.push(`"auth.m2m" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// Tier 8 — Enterprise: admin.api requires listUsers
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
if (cfg.hasAdminApi && !adapter.listUsers) {
|
|
137
|
+
errors.push(`"adminApi" is configured but the auth adapter does not implement listUsers. Add listUsers to your adapter.`);
|
|
138
|
+
}
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
// Tier 8 — Enterprise: password history (preventReuse)
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
if (cfg.hasPreventReuse) {
|
|
143
|
+
const historyMethods = ['getPasswordHistory', 'addPasswordToHistory'];
|
|
144
|
+
for (const method of historyMethods) {
|
|
145
|
+
if (!adapter[method]) {
|
|
146
|
+
errors.push(`"auth.passwordPolicy.preventReuse" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// SCIM — requires getUser for RFC 7644 §3.6 DELETE 404 compliance
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
if (cfg.hasScim && !adapter.getUser) {
|
|
154
|
+
errors.push('"scim" is enabled but the auth adapter does not implement getUser. ' +
|
|
155
|
+
'SCIM DELETE requires getUser to return 404 for non-existent resources (RFC 7644 §3.6). ' +
|
|
156
|
+
'Add getUser to your adapter or disable SCIM.');
|
|
157
|
+
}
|
|
158
|
+
if (errors.length > 0) {
|
|
159
|
+
throw new Error(`createApp: Adapter capability validation failed:\n${errors.map(e => ` - ${e}`).join('\n')}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { BearerAuthConfig } from '../config/authConfig';
|
|
3
|
+
/**
|
|
4
|
+
* Build a bearerAuth middleware from the given config.
|
|
5
|
+
*
|
|
6
|
+
* Supports three forms:
|
|
7
|
+
* - string: single token; no clientId
|
|
8
|
+
* - string[]: multiple tokens, any match allows; no clientId
|
|
9
|
+
* - BearerAuthClient[]: named clients with per-entry revocation; matched clientId set on context
|
|
10
|
+
*
|
|
11
|
+
* Config is required — there is no env var fallback.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createBearerAuth(config: BearerAuthConfig): MiddlewareHandler;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { timingSafeEqual } from '../../../bunshot-core/src/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a bearerAuth middleware from the given config.
|
|
4
|
+
*
|
|
5
|
+
* Supports three forms:
|
|
6
|
+
* - string: single token; no clientId
|
|
7
|
+
* - string[]: multiple tokens, any match allows; no clientId
|
|
8
|
+
* - BearerAuthClient[]: named clients with per-entry revocation; matched clientId set on context
|
|
9
|
+
*
|
|
10
|
+
* Config is required — there is no env var fallback.
|
|
11
|
+
*/
|
|
12
|
+
export function createBearerAuth(config) {
|
|
13
|
+
return async (c, next) => {
|
|
14
|
+
const header = c.req.header('Authorization');
|
|
15
|
+
const token = header?.startsWith('Bearer ') ? header.slice(7) : null;
|
|
16
|
+
if (!token) {
|
|
17
|
+
return c.json({ error: 'Unauthorized' }, 401);
|
|
18
|
+
}
|
|
19
|
+
if (typeof config === 'string') {
|
|
20
|
+
// Single string — direct comparison
|
|
21
|
+
if (!timingSafeEqual(token, config)) {
|
|
22
|
+
return c.json({ error: 'Unauthorized' }, 401);
|
|
23
|
+
}
|
|
24
|
+
await next();
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (config.length === 0) {
|
|
28
|
+
return c.json({ error: 'Unauthorized' }, 401);
|
|
29
|
+
}
|
|
30
|
+
// Determine if this is string[] or BearerAuthClient[]
|
|
31
|
+
if (typeof config[0] === 'string') {
|
|
32
|
+
// string[] — check all tokens
|
|
33
|
+
const tokens = config;
|
|
34
|
+
const matched = tokens.some(t => timingSafeEqual(token, t));
|
|
35
|
+
if (!matched) {
|
|
36
|
+
return c.json({ error: 'Unauthorized' }, 401);
|
|
37
|
+
}
|
|
38
|
+
await next();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// BearerAuthClient[] — check non-revoked clients
|
|
42
|
+
const clients = config;
|
|
43
|
+
let matchedClient = null;
|
|
44
|
+
for (const client of clients) {
|
|
45
|
+
if (client.revoked)
|
|
46
|
+
continue;
|
|
47
|
+
if (timingSafeEqual(token, client.token)) {
|
|
48
|
+
matchedClient = client;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!matchedClient) {
|
|
53
|
+
return c.json({ error: 'Unauthorized' }, 401);
|
|
54
|
+
}
|
|
55
|
+
c.set('bearerClientId', matchedClient.clientId);
|
|
56
|
+
await next();
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import type { MiddlewareHandler } from
|
|
2
|
-
import {
|
|
3
|
-
import type { AppEnv } from
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import { deleteCookie, setCookie } from 'hono/cookie';
|
|
3
|
+
import type { AppEnv, SigningConfig } from '../../../bunshot-core/src/index.js';
|
|
4
4
|
export interface CsrfMiddlewareOptions {
|
|
5
5
|
exemptPaths?: string[];
|
|
6
6
|
checkOrigin?: boolean;
|
|
7
7
|
allowedOrigins?: string | string[];
|
|
8
|
+
signing?: SigningConfig | null;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Refreshes the CSRF token cookie — call on login/register to prevent
|
|
11
12
|
* session fixation-adjacent attacks.
|
|
12
13
|
*/
|
|
13
|
-
export declare function refreshCsrfToken(c: Parameters<typeof setCookie>[0]): void;
|
|
14
|
+
export declare function refreshCsrfToken(c: Parameters<typeof setCookie>[0], signing?: SigningConfig | null): void;
|
|
14
15
|
/**
|
|
15
16
|
* Clears the CSRF token cookie — call on logout.
|
|
16
17
|
*/
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { getCsrfCookieOptions } from '../lib/cookieOptions';
|
|
2
|
+
import { isProd } from '../lib/env';
|
|
3
|
+
import { createHmac, randomBytes } from 'crypto';
|
|
4
|
+
import { deleteCookie, getCookie, setCookie } from 'hono/cookie';
|
|
5
|
+
import { COOKIE_CSRF_TOKEN, COOKIE_TOKEN, HEADER_CSRF_TOKEN, timingSafeEqual, } from '../../../bunshot-core/src/index.js';
|
|
6
|
+
import { getSigningSecret } from '../infra/signing';
|
|
7
|
+
import { getAuthRuntimeFromRequest } from '../runtime';
|
|
8
|
+
const STATE_CHANGING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
|
|
9
|
+
function getCsrfSecret(c, signing) {
|
|
10
|
+
const ctxSigning = c?.get?.('bunshotCtx');
|
|
11
|
+
const raw = getSigningSecret(ctxSigning?.signing ?? signing);
|
|
12
|
+
if (!raw)
|
|
13
|
+
throw new Error('[bunshot] CSRF middleware: no signing secret configured. Set JWT_SECRET or inject a signing config via createServer({ security: { signing: ... } }).');
|
|
14
|
+
return Array.isArray(raw) ? raw[0] : raw;
|
|
15
|
+
}
|
|
16
|
+
function generateCsrfToken(secret) {
|
|
17
|
+
const token = randomBytes(32).toString('hex');
|
|
18
|
+
const sig = createHmac('sha256', secret).update(token).digest('hex');
|
|
19
|
+
return `${token}.${sig}`;
|
|
20
|
+
}
|
|
21
|
+
function verifyCsrfSignature(cookieValue, secret) {
|
|
22
|
+
const dotIdx = cookieValue.indexOf('.');
|
|
23
|
+
if (dotIdx === -1)
|
|
24
|
+
return false;
|
|
25
|
+
const token = cookieValue.substring(0, dotIdx);
|
|
26
|
+
const sig = cookieValue.substring(dotIdx + 1);
|
|
27
|
+
const expected = createHmac('sha256', secret).update(token).digest('hex');
|
|
28
|
+
return timingSafeEqual(sig, expected);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Refreshes the CSRF token cookie — call on login/register to prevent
|
|
32
|
+
* session fixation-adjacent attacks.
|
|
33
|
+
*/
|
|
34
|
+
export function refreshCsrfToken(c, signing) {
|
|
35
|
+
const secret = getCsrfSecret(c, signing);
|
|
36
|
+
const token = generateCsrfToken(secret);
|
|
37
|
+
const authRuntime = getAuthRuntimeFromRequest(c);
|
|
38
|
+
setCookie(c, COOKIE_CSRF_TOKEN, token, getCsrfCookieOptions(isProd(), authRuntime.config));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Clears the CSRF token cookie — call on logout.
|
|
42
|
+
*/
|
|
43
|
+
export function clearCsrfToken(c) {
|
|
44
|
+
deleteCookie(c, COOKIE_CSRF_TOKEN, { path: '/' });
|
|
45
|
+
}
|
|
46
|
+
export const csrfProtection = (options = {}) => {
|
|
47
|
+
const { exemptPaths = [], checkOrigin = true, allowedOrigins, signing } = options;
|
|
48
|
+
// Normalize allowed origins for origin validation
|
|
49
|
+
const originSet = new Set();
|
|
50
|
+
if (allowedOrigins) {
|
|
51
|
+
const origins = Array.isArray(allowedOrigins) ? allowedOrigins : [allowedOrigins];
|
|
52
|
+
for (const o of origins) {
|
|
53
|
+
// "*" is intentionally excluded: validating against a wildcard would accept any origin,
|
|
54
|
+
// defeating the check. When CORS is open, origin validation is meaningless.
|
|
55
|
+
if (o !== '*')
|
|
56
|
+
originSet.add(o.replace(/\/$/, ''));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (checkOrigin && originSet.size === 0) {
|
|
60
|
+
// Warn in all environments — this is a one-time startup message, not per-request noise,
|
|
61
|
+
// and a misconfigured production deployment should surface it.
|
|
62
|
+
console.warn('[bunshot] csrfProtection: checkOrigin is enabled but no specific allowed origins are ' +
|
|
63
|
+
'configured (CORS is "*" or allowedOrigins is unset). Origin validation is disabled — ' +
|
|
64
|
+
'only the HMAC double-submit cookie check is active. Set security.cors to specific ' +
|
|
65
|
+
'origins to enable origin validation.');
|
|
66
|
+
}
|
|
67
|
+
return async (c, next) => {
|
|
68
|
+
const secret = getCsrfSecret(c, signing);
|
|
69
|
+
// Set CSRF cookie on every response if not already present
|
|
70
|
+
const existingCsrf = getCookie(c, COOKIE_CSRF_TOKEN);
|
|
71
|
+
if (!existingCsrf) {
|
|
72
|
+
const token = generateCsrfToken(secret);
|
|
73
|
+
setCookie(c, COOKIE_CSRF_TOKEN, token, getCsrfCookieOptions(isProd(), getAuthRuntimeFromRequest(c).config));
|
|
74
|
+
}
|
|
75
|
+
// Only validate state-changing methods
|
|
76
|
+
if (!STATE_CHANGING_METHODS.has(c.req.method)) {
|
|
77
|
+
return next();
|
|
78
|
+
}
|
|
79
|
+
// Skip if no auth cookie present — not vulnerable to CSRF
|
|
80
|
+
const authCookie = getCookie(c, COOKIE_TOKEN);
|
|
81
|
+
if (!authCookie) {
|
|
82
|
+
return next();
|
|
83
|
+
}
|
|
84
|
+
// Skip exempt paths
|
|
85
|
+
const path = c.req.path;
|
|
86
|
+
for (const exempt of exemptPaths) {
|
|
87
|
+
if (exempt.endsWith('*')) {
|
|
88
|
+
if (path.startsWith(exempt.slice(0, -1)))
|
|
89
|
+
return next();
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (path === exempt)
|
|
93
|
+
return next();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Origin validation (secondary layer)
|
|
97
|
+
if (checkOrigin && originSet.size > 0) {
|
|
98
|
+
const origin = c.req.header('origin');
|
|
99
|
+
if (origin) {
|
|
100
|
+
const normalized = origin.replace(/\/$/, '');
|
|
101
|
+
if (!originSet.has(normalized)) {
|
|
102
|
+
getAuthRuntimeFromRequest(c).eventBus.emit('security.csrf.failed', {
|
|
103
|
+
path: c.req.path,
|
|
104
|
+
meta: { method: c.req.method, reason: 'origin_mismatch' },
|
|
105
|
+
});
|
|
106
|
+
return c.json({ error: 'CSRF origin mismatch' }, 403);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Double submit cookie validation
|
|
111
|
+
const csrfCookie = getCookie(c, COOKIE_CSRF_TOKEN);
|
|
112
|
+
const csrfHeader = c.req.header(HEADER_CSRF_TOKEN);
|
|
113
|
+
if (!csrfCookie || !csrfHeader) {
|
|
114
|
+
getAuthRuntimeFromRequest(c).eventBus.emit('security.csrf.failed', {
|
|
115
|
+
path: c.req.path,
|
|
116
|
+
meta: { method: c.req.method, reason: 'token_missing' },
|
|
117
|
+
});
|
|
118
|
+
return c.json({ error: 'CSRF token missing' }, 403);
|
|
119
|
+
}
|
|
120
|
+
// Verify the cookie's HMAC signature (prevents cookie injection)
|
|
121
|
+
if (!verifyCsrfSignature(csrfCookie, secret)) {
|
|
122
|
+
getAuthRuntimeFromRequest(c).eventBus.emit('security.csrf.failed', {
|
|
123
|
+
path: c.req.path,
|
|
124
|
+
meta: { method: c.req.method, reason: 'token_invalid' },
|
|
125
|
+
});
|
|
126
|
+
return c.json({ error: 'CSRF token invalid' }, 403);
|
|
127
|
+
}
|
|
128
|
+
// Compare header value to cookie value
|
|
129
|
+
if (!timingSafeEqual(csrfHeader, csrfCookie)) {
|
|
130
|
+
getAuthRuntimeFromRequest(c).eventBus.emit('security.csrf.failed', {
|
|
131
|
+
path: c.req.path,
|
|
132
|
+
meta: { method: c.req.method, reason: 'token_mismatch' },
|
|
133
|
+
});
|
|
134
|
+
return c.json({ error: 'CSRF token mismatch' }, 403);
|
|
135
|
+
}
|
|
136
|
+
return next();
|
|
137
|
+
};
|
|
138
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../../../bunshot-core/src/index.js';
|
|
3
|
+
import type { AuthRuntimeContext } from '../runtime';
|
|
4
|
+
export declare const createIdentifyMiddleware: (authRuntime: AuthRuntimeContext) => MiddlewareHandler<AppEnv>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { verifyToken } from '../lib/jwt';
|
|
2
|
+
import { authTrace, log } from '../lib/logger';
|
|
3
|
+
import { getSuspended } from '../lib/suspension';
|
|
4
|
+
import { getCookie } from 'hono/cookie';
|
|
5
|
+
import { COOKIE_TOKEN, HEADER_USER_TOKEN, HttpError, sha256, timingSafeEqual, } from '../../../bunshot-core/src/index.js';
|
|
6
|
+
import { getClientIp } from '../../../bunshot-core/src/index.js';
|
|
7
|
+
function computeFingerprint(c, fields) {
|
|
8
|
+
const parts = fields.map(f => {
|
|
9
|
+
if (f === 'ip')
|
|
10
|
+
return getClientIp(c) ?? '';
|
|
11
|
+
if (f === 'ua')
|
|
12
|
+
return c.req.header('user-agent') ?? '';
|
|
13
|
+
return c.req.header('accept-language') ?? '';
|
|
14
|
+
});
|
|
15
|
+
return sha256(parts.join(':'));
|
|
16
|
+
}
|
|
17
|
+
export const createIdentifyMiddleware = (authRuntime) => async (c, next) => {
|
|
18
|
+
const authConfig = authRuntime.config;
|
|
19
|
+
const sessionRepo = authRuntime.repos.session;
|
|
20
|
+
c.set('authUserId', null);
|
|
21
|
+
c.set('roles', null);
|
|
22
|
+
c.set('sessionId', null);
|
|
23
|
+
c.set('authClientId', null);
|
|
24
|
+
c.set('tokenPayload', null);
|
|
25
|
+
// cookie for browsers, x-user-token header for non-browser clients
|
|
26
|
+
const token = getCookie(c, COOKIE_TOKEN) ?? c.req.header(HEADER_USER_TOKEN) ?? null;
|
|
27
|
+
log(`[identify] token=${token ? 'present' : 'absent'}`);
|
|
28
|
+
if (token) {
|
|
29
|
+
try {
|
|
30
|
+
const payload = await verifyToken(token, authConfig, authRuntime?.signing ?? c.get('bunshotCtx')?.signing ?? null);
|
|
31
|
+
c.set('tokenPayload', payload);
|
|
32
|
+
const sessionId = payload.sid;
|
|
33
|
+
if (!sessionId) {
|
|
34
|
+
// Check for M2M token (scope present, no sid)
|
|
35
|
+
if (payload.scope && payload.sub) {
|
|
36
|
+
c.set('authClientId', payload.sub);
|
|
37
|
+
log(`[identify] M2M token for clientId=${payload.sub}`);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
log('[identify] token missing sid claim — unauthenticated');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const stored = await sessionRepo.getSession(sessionId, authConfig);
|
|
45
|
+
log('[identify] token verified, checking session...');
|
|
46
|
+
authTrace(`[identify] authUserId=${payload.sub}`);
|
|
47
|
+
if (timingSafeEqual(stored ?? '', token)) {
|
|
48
|
+
const signingCfg = authRuntime.signing ?? c.get('bunshotCtx')?.signing ?? null;
|
|
49
|
+
const bindingCfg = signingCfg?.sessionBinding;
|
|
50
|
+
if (bindingCfg) {
|
|
51
|
+
const bindingOpts = typeof bindingCfg === 'object' ? bindingCfg : {};
|
|
52
|
+
const fields = bindingOpts.fields ?? [
|
|
53
|
+
'ip',
|
|
54
|
+
'ua',
|
|
55
|
+
];
|
|
56
|
+
const onMismatch = bindingOpts.onMismatch ?? 'unauthenticate';
|
|
57
|
+
const current = computeFingerprint(c, fields);
|
|
58
|
+
const storedFp = await sessionRepo.getSessionFingerprint(sessionId);
|
|
59
|
+
if (storedFp === null) {
|
|
60
|
+
// First authenticated request — store the fingerprint
|
|
61
|
+
sessionRepo.setSessionFingerprint(sessionId, current).catch(() => {
|
|
62
|
+
log('[identify] failed to store session fingerprint');
|
|
63
|
+
});
|
|
64
|
+
c.set('authUserId', payload.sub);
|
|
65
|
+
c.set('sessionId', sessionId);
|
|
66
|
+
}
|
|
67
|
+
else if (timingSafeEqual(storedFp, current)) {
|
|
68
|
+
c.set('authUserId', payload.sub);
|
|
69
|
+
c.set('sessionId', sessionId);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
log(`[identify] fingerprint mismatch, onMismatch=${onMismatch}`);
|
|
73
|
+
authTrace(`[identify] sessionId=${sessionId}`);
|
|
74
|
+
if (onMismatch === 'reject') {
|
|
75
|
+
throw new HttpError(401, 'Unauthorized', 'FINGERPRINT_MISMATCH');
|
|
76
|
+
}
|
|
77
|
+
else if (onMismatch === 'log-only') {
|
|
78
|
+
c.set('authUserId', payload.sub);
|
|
79
|
+
c.set('sessionId', sessionId);
|
|
80
|
+
}
|
|
81
|
+
// onMismatch === "unauthenticate" — leave authUserId null (already null)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
c.set('authUserId', payload.sub);
|
|
86
|
+
c.set('sessionId', sessionId);
|
|
87
|
+
}
|
|
88
|
+
if (c.get('authUserId')) {
|
|
89
|
+
if (authConfig.checkSuspensionOnIdentify) {
|
|
90
|
+
const suspensionStatus = await getSuspended(authRuntime.adapter, payload.sub).catch(() => ({ suspended: false }));
|
|
91
|
+
if (suspensionStatus.suspended) {
|
|
92
|
+
c.set('authUserId', null);
|
|
93
|
+
c.set('sessionId', null);
|
|
94
|
+
c.set('roles', null);
|
|
95
|
+
log(`[identify] userId=${payload.sub} is suspended — unauthenticated`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (c.get('authUserId')) {
|
|
100
|
+
authTrace(`[identify] authUserId=${payload.sub} sessionId=${sessionId}`);
|
|
101
|
+
// Auto-enable lastActiveAt tracking when idleTimeout is configured
|
|
102
|
+
if (authConfig.trackLastActive || authConfig.sessionPolicy.idleTimeout) {
|
|
103
|
+
sessionRepo.updateSessionLastActive(sessionId, authConfig).catch(() => {
|
|
104
|
+
log('[identify] failed to update session lastActiveAt');
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
log('[identify] token/session mismatch — unauthenticated');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
if (err instanceof HttpError)
|
|
116
|
+
throw err;
|
|
117
|
+
log('[identify] invalid token — unauthenticated');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
log('[identify] no token — unauthenticated');
|
|
122
|
+
}
|
|
123
|
+
await next();
|
|
124
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { MiddlewareHandler } from
|
|
2
|
-
import type { AppEnv } from
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../../../bunshot-core/src/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* Middleware that blocks authenticated users who have not completed MFA setup.
|
|
5
5
|
*
|