@hilbras/keystone 1.6.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +625 -0
- package/README.md +198 -50
- package/dist/cli.js +25 -27
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +23 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +53 -8
- package/dist/config.js.map +1 -1
- package/dist/container.d.ts +4 -1
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js.map +1 -1
- package/dist/db/migrations/0008_flashy_firestar.sql +5 -0
- package/dist/db/migrations/0009_daffy_changeling.sql +1 -0
- package/dist/db/migrations/0010_wealthy_shadow_king.sql +37 -0
- package/dist/db/migrations/0011_overrated_vector.sql +18 -0
- package/dist/db/migrations/0012_brave_darkhawk.sql +28 -0
- package/dist/db/migrations/0013_wonderful_chimera.sql +5 -0
- package/dist/db/migrations/0014_magical_morph.sql +48 -0
- package/dist/db/migrations/0015_chief_vargas.sql +7 -0
- package/dist/db/migrations/0016_gorgeous_charles_xavier.sql +5 -0
- package/dist/db/migrations/0017_flashy_nekra.sql +1 -0
- package/{src/db/migrations/meta/0007_snapshot.json → dist/db/migrations/meta/0008_snapshot.json} +136 -32
- package/{src/db/migrations/meta/0006_snapshot.json → dist/db/migrations/meta/0009_snapshot.json} +359 -30
- package/{src/db/migrations/meta/0005_snapshot.json → dist/db/migrations/meta/0010_snapshot.json} +459 -29
- package/{src/db/migrations/meta/0004_snapshot.json → dist/db/migrations/meta/0011_snapshot.json} +594 -30
- package/dist/db/migrations/meta/0012_snapshot.json +3891 -0
- package/dist/db/migrations/meta/0013_snapshot.json +3919 -0
- package/dist/db/migrations/meta/0014_snapshot.json +4311 -0
- package/dist/db/migrations/meta/0015_snapshot.json +4340 -0
- package/dist/db/migrations/meta/0016_snapshot.json +4363 -0
- package/dist/db/migrations/meta/0017_snapshot.json +4370 -0
- package/dist/db/migrations/meta/_journal.json +70 -0
- package/dist/db/reencryptOidcSecrets.d.ts +2 -0
- package/dist/db/reencryptOidcSecrets.d.ts.map +1 -0
- package/dist/db/reencryptOidcSecrets.js +41 -0
- package/dist/db/reencryptOidcSecrets.js.map +1 -0
- package/dist/db/schema.d.ts +2693 -88
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +157 -4
- package/dist/db/schema.js.map +1 -1
- package/dist/db/seed.js +67 -40
- package/dist/db/seed.js.map +1 -1
- package/dist/di.d.ts.map +1 -1
- package/dist/di.js +11 -3
- package/dist/di.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/errors.d.ts +2 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +10 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/plugins/appContext.d.ts.map +1 -1
- package/dist/plugins/appContext.js +3 -12
- package/dist/plugins/appContext.js.map +1 -1
- package/dist/plugins/audit.d.ts.map +1 -1
- package/dist/plugins/audit.js +26 -6
- package/dist/plugins/audit.js.map +1 -1
- package/dist/plugins/auth.d.ts.map +1 -1
- package/dist/plugins/auth.js +32 -7
- package/dist/plugins/auth.js.map +1 -1
- package/dist/plugins/headerSanitization.d.ts +15 -0
- package/dist/plugins/headerSanitization.d.ts.map +1 -0
- package/dist/plugins/headerSanitization.js +39 -0
- package/dist/plugins/headerSanitization.js.map +1 -0
- package/dist/plugins/metrics.d.ts.map +1 -1
- package/dist/plugins/mtls.d.ts +21 -2
- package/dist/plugins/mtls.d.ts.map +1 -1
- package/dist/plugins/mtls.js +94 -47
- package/dist/plugins/mtls.js.map +1 -1
- package/dist/plugins/permissions.d.ts.map +1 -1
- package/dist/plugins/permissions.js +29 -9
- package/dist/plugins/permissions.js.map +1 -1
- package/dist/plugins/rateLimit.d.ts +16 -0
- package/dist/plugins/rateLimit.d.ts.map +1 -1
- package/dist/plugins/rateLimit.js +16 -3
- package/dist/plugins/rateLimit.js.map +1 -1
- package/dist/plugins/requestLogger.d.ts.map +1 -1
- package/dist/repositories/apiKey.d.ts.map +1 -1
- package/dist/repositories/application.d.ts +1 -1
- package/dist/repositories/application.d.ts.map +1 -1
- package/dist/repositories/application.js +9 -3
- package/dist/repositories/application.js.map +1 -1
- package/dist/repositories/audit.d.ts.map +1 -1
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.d.ts.map +1 -1
- package/dist/repositories/index.js +3 -0
- package/dist/repositories/index.js.map +1 -1
- package/dist/repositories/mfaChallenge.d.ts +23 -0
- package/dist/repositories/mfaChallenge.d.ts.map +1 -0
- package/dist/repositories/mfaChallenge.js +71 -0
- package/dist/repositories/mfaChallenge.js.map +1 -0
- package/dist/repositories/oidcConnection.d.ts +27 -43
- package/dist/repositories/oidcConnection.d.ts.map +1 -1
- package/dist/repositories/oidcConnection.js +15 -6
- package/dist/repositories/oidcConnection.js.map +1 -1
- package/dist/repositories/organization.d.ts +9 -9
- package/dist/repositories/organization.d.ts.map +1 -1
- package/dist/repositories/organization.js +91 -37
- package/dist/repositories/organization.js.map +1 -1
- package/dist/repositories/permission.d.ts.map +1 -1
- package/dist/repositories/permission.js +27 -5
- package/dist/repositories/permission.js.map +1 -1
- package/dist/repositories/samlConnection.d.ts +28 -28
- package/dist/repositories/samlConnection.d.ts.map +1 -1
- package/dist/repositories/samlConnection.js +12 -4
- package/dist/repositories/samlConnection.js.map +1 -1
- package/dist/repositories/scimConnection.d.ts +38 -0
- package/dist/repositories/scimConnection.d.ts.map +1 -0
- package/dist/repositories/scimConnection.js +123 -0
- package/dist/repositories/scimConnection.js.map +1 -0
- package/dist/repositories/scimGroup.d.ts +36 -0
- package/dist/repositories/scimGroup.d.ts.map +1 -0
- package/dist/repositories/scimGroup.js +113 -0
- package/dist/repositories/scimGroup.js.map +1 -0
- package/dist/repositories/session.d.ts +24 -13
- package/dist/repositories/session.d.ts.map +1 -1
- package/dist/repositories/session.js +13 -1
- package/dist/repositories/session.js.map +1 -1
- package/dist/repositories/types.d.ts +117 -6
- package/dist/repositories/types.d.ts.map +1 -1
- package/dist/repositories/types.js +7 -1
- package/dist/repositories/types.js.map +1 -1
- package/dist/repositories/user.d.ts +23 -1
- package/dist/repositories/user.d.ts.map +1 -1
- package/dist/repositories/user.js +180 -4
- package/dist/repositories/user.js.map +1 -1
- package/dist/routes/admin/billing.js +4 -4
- package/dist/routes/admin/billing.js.map +1 -1
- package/dist/routes/admin/helpers.d.ts +16 -20
- package/dist/routes/admin/helpers.d.ts.map +1 -1
- package/dist/routes/admin/helpers.js +53 -10
- package/dist/routes/admin/helpers.js.map +1 -1
- package/dist/routes/admin/organizations.d.ts.map +1 -1
- package/dist/routes/admin/organizations.js +105 -69
- package/dist/routes/admin/organizations.js.map +1 -1
- package/dist/routes/admin/permissions.d.ts.map +1 -1
- package/dist/routes/admin/permissions.js +48 -14
- package/dist/routes/admin/permissions.js.map +1 -1
- package/dist/routes/admin/platform.d.ts.map +1 -1
- package/dist/routes/admin/platform.js +86 -35
- package/dist/routes/admin/platform.js.map +1 -1
- package/dist/routes/admin/sso.d.ts.map +1 -1
- package/dist/routes/admin/sso.js +143 -12
- package/dist/routes/admin/sso.js.map +1 -1
- package/dist/routes/admin/webhooks.js +8 -8
- package/dist/routes/admin/webhooks.js.map +1 -1
- package/dist/routes/apiKeys.d.ts.map +1 -1
- package/dist/routes/apiKeys.js +23 -5
- package/dist/routes/apiKeys.js.map +1 -1
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +112 -22
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/authz.d.ts.map +1 -1
- package/dist/routes/authz.js +16 -4
- package/dist/routes/authz.js.map +1 -1
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +16 -14
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/federation.d.ts.map +1 -1
- package/dist/routes/federation.js +17 -3
- package/dist/routes/federation.js.map +1 -1
- package/dist/routes/magicLinks.d.ts.map +1 -1
- package/dist/routes/magicLinks.js +15 -3
- package/dist/routes/magicLinks.js.map +1 -1
- package/dist/routes/oauth.d.ts.map +1 -1
- package/dist/routes/oauth.js +60 -5
- package/dist/routes/oauth.js.map +1 -1
- package/dist/routes/oauth2.d.ts.map +1 -1
- package/dist/routes/oauth2.js +188 -22
- package/dist/routes/oauth2.js.map +1 -1
- package/dist/routes/oidcEnterprise.d.ts.map +1 -1
- package/dist/routes/oidcEnterprise.js +67 -21
- package/dist/routes/oidcEnterprise.js.map +1 -1
- package/dist/routes/password.d.ts.map +1 -1
- package/dist/routes/password.js.map +1 -1
- package/dist/routes/profile.js +4 -4
- package/dist/routes/profile.js.map +1 -1
- package/dist/routes/saml.d.ts +33 -0
- package/dist/routes/saml.d.ts.map +1 -1
- package/dist/routes/saml.js +217 -12
- package/dist/routes/saml.js.map +1 -1
- package/dist/routes/scim.d.ts +13 -0
- package/dist/routes/scim.d.ts.map +1 -1
- package/dist/routes/scim.js +885 -110
- package/dist/routes/scim.js.map +1 -1
- package/dist/routes/sdk.d.ts.map +1 -1
- package/dist/routes/sdk.js +24 -8
- package/dist/routes/sdk.js.map +1 -1
- package/dist/routes/serviceAccounts.d.ts.map +1 -1
- package/dist/routes/serviceAccounts.js +63 -2
- package/dist/routes/serviceAccounts.js.map +1 -1
- package/dist/routes/setup.d.ts.map +1 -1
- package/dist/routes/setup.js +15 -16
- package/dist/routes/setup.js.map +1 -1
- package/dist/routes/smsOtp.js +1 -1
- package/dist/routes/smsOtp.js.map +1 -1
- package/dist/routes/totp.d.ts.map +1 -1
- package/dist/routes/totp.js +112 -23
- package/dist/routes/totp.js.map +1 -1
- package/dist/routes/webauthn.d.ts.map +1 -1
- package/dist/routes/webauthn.js +44 -8
- package/dist/routes/webauthn.js.map +1 -1
- package/dist/routes/workflows.d.ts.map +1 -1
- package/dist/routes/workflows.js +58 -25
- package/dist/routes/workflows.js.map +1 -1
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +141 -40
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/types.d.ts +64 -30
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/services/application/authentication.d.ts +39 -1
- package/dist/services/application/authentication.d.ts.map +1 -1
- package/dist/services/application/authentication.js +43 -1
- package/dist/services/application/authentication.js.map +1 -1
- package/dist/services/application/identity.d.ts +10 -7
- package/dist/services/application/identity.d.ts.map +1 -1
- package/dist/services/application/identity.js +13 -10
- package/dist/services/application/identity.js.map +1 -1
- package/dist/services/application/organization.d.ts +16 -8
- package/dist/services/application/organization.d.ts.map +1 -1
- package/dist/services/application/organization.js +160 -12
- package/dist/services/application/organization.js.map +1 -1
- package/dist/services/applications.js +2 -2
- package/dist/services/applications.js.map +1 -1
- package/dist/services/audit.d.ts +1 -0
- package/dist/services/audit.d.ts.map +1 -1
- package/dist/services/audit.js +13 -0
- package/dist/services/audit.js.map +1 -1
- package/dist/services/cache.d.ts.map +1 -1
- package/dist/services/configuration/profiles.d.ts +4 -0
- package/dist/services/configuration/profiles.d.ts.map +1 -1
- package/dist/services/configuration/profiles.js +50 -0
- package/dist/services/configuration/profiles.js.map +1 -1
- package/dist/services/configuration.d.ts.map +1 -1
- package/dist/services/configuration.js.map +1 -1
- package/dist/services/connectors/google.d.ts +18 -1
- package/dist/services/connectors/google.d.ts.map +1 -1
- package/dist/services/connectors/google.js +27 -4
- package/dist/services/connectors/google.js.map +1 -1
- package/dist/services/connectors/oidc.d.ts +14 -2
- package/dist/services/connectors/oidc.d.ts.map +1 -1
- package/dist/services/connectors/oidc.js +35 -6
- package/dist/services/connectors/oidc.js.map +1 -1
- package/dist/services/connectors/types.d.ts +13 -1
- package/dist/services/connectors/types.d.ts.map +1 -1
- package/dist/services/connectors/zitadel.d.ts.map +1 -1
- package/dist/services/connectors/zitadel.js +4 -3
- package/dist/services/connectors/zitadel.js.map +1 -1
- package/dist/services/domain/authentication.d.ts +43 -4
- package/dist/services/domain/authentication.d.ts.map +1 -1
- package/dist/services/domain/authentication.js +119 -40
- package/dist/services/domain/authentication.js.map +1 -1
- package/dist/services/domain/authorization.d.ts +11 -0
- package/dist/services/domain/authorization.d.ts.map +1 -1
- package/dist/services/domain/authorization.js +36 -1
- package/dist/services/domain/authorization.js.map +1 -1
- package/dist/services/domain/identity.d.ts +21 -9
- package/dist/services/domain/identity.d.ts.map +1 -1
- package/dist/services/domain/identity.js +187 -10
- package/dist/services/domain/identity.js.map +1 -1
- package/dist/services/domain/organization.d.ts +11 -10
- package/dist/services/domain/organization.d.ts.map +1 -1
- package/dist/services/domain/organization.js +48 -30
- package/dist/services/domain/organization.js.map +1 -1
- package/dist/services/emailVerification.d.ts +2 -2
- package/dist/services/enterpriseSso.d.ts +13 -6
- package/dist/services/enterpriseSso.d.ts.map +1 -1
- package/dist/services/enterpriseSso.js +75 -6
- package/dist/services/enterpriseSso.js.map +1 -1
- package/dist/services/events/subscribers/auditLog.js +1 -1
- package/dist/services/events/subscribers/auditLog.js.map +1 -1
- package/dist/services/events/types.d.ts +7 -1
- package/dist/services/events/types.d.ts.map +1 -1
- package/dist/services/events/types.js.map +1 -1
- package/dist/services/events/validate.d.ts.map +1 -1
- package/dist/services/events/validate.js +33 -0
- package/dist/services/events/validate.js.map +1 -1
- package/dist/services/features.d.ts.map +1 -1
- package/dist/services/features.js.map +1 -1
- package/dist/services/federation.d.ts +6 -1
- package/dist/services/federation.d.ts.map +1 -1
- package/dist/services/federation.js +31 -4
- package/dist/services/federation.js.map +1 -1
- package/dist/services/ipControls.js +2 -2
- package/dist/services/ipControls.js.map +1 -1
- package/dist/services/magicLinks.d.ts +2 -2
- package/dist/services/magicLinks.d.ts.map +1 -1
- package/dist/services/magicLinks.js +13 -9
- package/dist/services/magicLinks.js.map +1 -1
- package/dist/services/mfa.d.ts +53 -0
- package/dist/services/mfa.d.ts.map +1 -0
- package/dist/services/mfa.js +157 -0
- package/dist/services/mfa.js.map +1 -0
- package/dist/services/oauth2.d.ts +88 -14
- package/dist/services/oauth2.d.ts.map +1 -1
- package/dist/services/oauth2.js +125 -16
- package/dist/services/oauth2.js.map +1 -1
- package/dist/services/oidcSecretFormat.d.ts +3 -0
- package/dist/services/oidcSecretFormat.d.ts.map +1 -0
- package/dist/services/oidcSecretFormat.js +5 -0
- package/dist/services/oidcSecretFormat.js.map +1 -0
- package/dist/services/organizations.d.ts +4 -16
- package/dist/services/organizations.d.ts.map +1 -1
- package/dist/services/organizations.js +0 -62
- package/dist/services/organizations.js.map +1 -1
- package/dist/services/permissions.d.ts.map +1 -1
- package/dist/services/permissions.js +9 -1
- package/dist/services/permissions.js.map +1 -1
- package/dist/services/plugins/registry.d.ts.map +1 -1
- package/dist/services/plugins/registry.js.map +1 -1
- package/dist/services/plugins/types.d.ts.map +1 -1
- package/dist/services/queue/bullmq.d.ts.map +1 -1
- package/dist/services/queue/inProcess.d.ts.map +1 -1
- package/dist/services/redirectUri.d.ts +56 -0
- package/dist/services/redirectUri.d.ts.map +1 -0
- package/dist/services/redirectUri.js +129 -0
- package/dist/services/redirectUri.js.map +1 -0
- package/dist/services/redis.d.ts +1 -1
- package/dist/services/redis.d.ts.map +1 -1
- package/dist/services/scimCredentials.d.ts +46 -0
- package/dist/services/scimCredentials.d.ts.map +1 -0
- package/dist/services/scimCredentials.js +123 -0
- package/dist/services/scimCredentials.js.map +1 -0
- package/dist/services/scimLegacyMigration.d.ts +12 -0
- package/dist/services/scimLegacyMigration.d.ts.map +1 -0
- package/dist/services/scimLegacyMigration.js +44 -0
- package/dist/services/scimLegacyMigration.js.map +1 -0
- package/dist/services/secrets/awsKms.d.ts +2 -2
- package/dist/services/secrets/awsKms.d.ts.map +1 -1
- package/dist/services/secrets/awsKms.js +3 -5
- package/dist/services/secrets/awsKms.js.map +1 -1
- package/dist/services/secrets/azureKeyVault.d.ts.map +1 -1
- package/dist/services/secrets/database.d.ts.map +1 -1
- package/dist/services/secrets/database.js.map +1 -1
- package/dist/services/secrets/environment.d.ts.map +1 -1
- package/dist/services/secrets/environment.js.map +1 -1
- package/dist/services/secrets/index.d.ts.map +1 -1
- package/dist/services/secrets/password.d.ts.map +1 -1
- package/dist/services/secrets/password.js +0 -4
- package/dist/services/secrets/password.js.map +1 -1
- package/dist/services/secrets/provider.d.ts +2 -3
- package/dist/services/secrets/provider.d.ts.map +1 -1
- package/dist/services/secrets/vault.d.ts.map +1 -1
- package/dist/services/serviceAccounts.d.ts +20 -0
- package/dist/services/serviceAccounts.d.ts.map +1 -1
- package/dist/services/serviceAccounts.js +47 -1
- package/dist/services/serviceAccounts.js.map +1 -1
- package/dist/services/sessionRevocation.d.ts +76 -0
- package/dist/services/sessionRevocation.d.ts.map +1 -0
- package/dist/services/sessionRevocation.js +86 -0
- package/dist/services/sessionRevocation.js.map +1 -0
- package/dist/services/setup/configWriter.d.ts.map +1 -1
- package/dist/services/setup/configWriter.js.map +1 -1
- package/dist/services/singleUse.d.ts +68 -0
- package/dist/services/singleUse.d.ts.map +1 -0
- package/dist/services/singleUse.js +54 -0
- package/dist/services/singleUse.js.map +1 -0
- package/dist/services/smsOtp.d.ts.map +1 -1
- package/dist/services/smsOtp.js +12 -8
- package/dist/services/smsOtp.js.map +1 -1
- package/dist/services/ssoEndpointPolicy.d.ts +8 -0
- package/dist/services/ssoEndpointPolicy.d.ts.map +1 -0
- package/dist/services/ssoEndpointPolicy.js +136 -0
- package/dist/services/ssoEndpointPolicy.js.map +1 -0
- package/dist/services/stepUp.d.ts +35 -0
- package/dist/services/stepUp.d.ts.map +1 -0
- package/dist/services/stepUp.js +65 -0
- package/dist/services/stepUp.js.map +1 -0
- package/dist/services/tokens.d.ts +39 -11
- package/dist/services/tokens.d.ts.map +1 -1
- package/dist/services/tokens.js +80 -14
- package/dist/services/tokens.js.map +1 -1
- package/dist/services/totp.d.ts +46 -0
- package/dist/services/totp.d.ts.map +1 -1
- package/dist/services/totp.js +178 -41
- package/dist/services/totp.js.map +1 -1
- package/dist/services/trustedProxies.d.ts +90 -0
- package/dist/services/trustedProxies.d.ts.map +1 -0
- package/dist/services/trustedProxies.js +283 -0
- package/dist/services/trustedProxies.js.map +1 -0
- package/dist/services/users.d.ts +20 -12
- package/dist/services/users.d.ts.map +1 -1
- package/dist/services/users.js +24 -51
- package/dist/services/users.js.map +1 -1
- package/dist/services/webauthn.d.ts +8 -4
- package/dist/services/webauthn.d.ts.map +1 -1
- package/dist/services/webauthn.js +4 -4
- package/dist/services/webauthn.js.map +1 -1
- package/dist/services/webhooks.d.ts +20 -20
- package/dist/services/workflows/engine.d.ts +4 -2
- package/dist/services/workflows/engine.d.ts.map +1 -1
- package/dist/services/workflows/engine.js +181 -12
- package/dist/services/workflows/engine.js.map +1 -1
- package/dist/services/workflows/steps.d.ts +2 -0
- package/dist/services/workflows/steps.d.ts.map +1 -1
- package/dist/services/workflows/steps.js +8 -75
- package/dist/services/workflows/steps.js.map +1 -1
- package/dist/setup-server.js +2 -1
- package/dist/setup-server.js.map +1 -1
- package/dist/types.d.ts +33 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +26 -2
- package/dist/types.js.map +1 -1
- package/package.json +25 -3
- package/dist/tests/errors.test.d.ts +0 -2
- package/dist/tests/errors.test.d.ts.map +0 -1
- package/dist/tests/errors.test.js +0 -64
- package/dist/tests/errors.test.js.map +0 -1
- package/dist/tests/events.test.d.ts +0 -2
- package/dist/tests/events.test.d.ts.map +0 -1
- package/dist/tests/events.test.js +0 -45
- package/dist/tests/events.test.js.map +0 -1
- package/dist/tests/featureFlags.test.d.ts +0 -2
- package/dist/tests/featureFlags.test.d.ts.map +0 -1
- package/dist/tests/featureFlags.test.js +0 -24
- package/dist/tests/featureFlags.test.js.map +0 -1
- package/dist/tests/integration/queue.test.d.ts +0 -2
- package/dist/tests/integration/queue.test.d.ts.map +0 -1
- package/dist/tests/integration/queue.test.js +0 -49
- package/dist/tests/integration/queue.test.js.map +0 -1
- package/dist/tests/plugins.test.d.ts +0 -2
- package/dist/tests/plugins.test.d.ts.map +0 -1
- package/dist/tests/plugins.test.js +0 -56
- package/dist/tests/plugins.test.js.map +0 -1
- package/dist/tests/result.test.d.ts +0 -2
- package/dist/tests/result.test.d.ts.map +0 -1
- package/dist/tests/result.test.js +0 -46
- package/dist/tests/result.test.js.map +0 -1
- package/dist/tests/setup/configWriter.test.d.ts +0 -2
- package/dist/tests/setup/configWriter.test.d.ts.map +0 -1
- package/dist/tests/setup/configWriter.test.js +0 -55
- package/dist/tests/setup/configWriter.test.js.map +0 -1
- package/dist/tests/setup/validation.test.d.ts +0 -2
- package/dist/tests/setup/validation.test.d.ts.map +0 -1
- package/dist/tests/setup/validation.test.js +0 -26
- package/dist/tests/setup/validation.test.js.map +0 -1
- package/dist/tests/smoke.test.d.ts +0 -2
- package/dist/tests/smoke.test.d.ts.map +0 -1
- package/dist/tests/smoke.test.js +0 -124
- package/dist/tests/smoke.test.js.map +0 -1
- package/src/cli.ts +0 -172
- package/src/config.ts +0 -143
- package/src/container.ts +0 -48
- package/src/db/index.ts +0 -53
- package/src/db/migrations/0000_skinny_ben_parker.sql +0 -553
- package/src/db/migrations/0001_brief_joseph.sql +0 -10
- package/src/db/migrations/0002_add_account_lockout.sql +0 -3
- package/src/db/migrations/0003_steep_rachel_grey.sql +0 -1
- package/src/db/migrations/0004_clever_bill_hollister.sql +0 -20
- package/src/db/migrations/0005_steep_the_call.sql +0 -2
- package/src/db/migrations/0006_ambitious_boomer.sql +0 -17
- package/src/db/migrations/0007_greedy_vindicator.sql +0 -40
- package/src/db/migrations/meta/0000_snapshot.json +0 -2964
- package/src/db/migrations/meta/0001_snapshot.json +0 -3031
- package/src/db/migrations/meta/0003_snapshot.json +0 -3051
- package/src/db/migrations/meta/_journal.json +0 -62
- package/src/db/schema.ts +0 -676
- package/src/db/seed.ts +0 -146
- package/src/di.ts +0 -81
- package/src/index.ts +0 -326
- package/src/lib/errors.ts +0 -139
- package/src/lib/result.ts +0 -44
- package/src/lib/webhookSignature.ts +0 -41
- package/src/plugins/appContext.ts +0 -76
- package/src/plugins/audit.ts +0 -42
- package/src/plugins/auth.ts +0 -230
- package/src/plugins/metrics.ts +0 -41
- package/src/plugins/mtls.ts +0 -94
- package/src/plugins/permissions.ts +0 -29
- package/src/plugins/rateLimit.ts +0 -133
- package/src/plugins/requestLogger.ts +0 -25
- package/src/plugins/tracing.ts +0 -22
- package/src/repositories/apiKey.ts +0 -158
- package/src/repositories/application.ts +0 -70
- package/src/repositories/audit.ts +0 -32
- package/src/repositories/index.ts +0 -9
- package/src/repositories/oidcConnection.ts +0 -111
- package/src/repositories/organization.ts +0 -167
- package/src/repositories/permission.ts +0 -153
- package/src/repositories/samlConnection.ts +0 -96
- package/src/repositories/session.ts +0 -86
- package/src/repositories/types.ts +0 -134
- package/src/repositories/user.ts +0 -161
- package/src/routes/admin/billing.ts +0 -48
- package/src/routes/admin/helpers.ts +0 -50
- package/src/routes/admin/index.ts +0 -16
- package/src/routes/admin/organizations.ts +0 -299
- package/src/routes/admin/permissions.ts +0 -80
- package/src/routes/admin/platform.ts +0 -335
- package/src/routes/admin/sso.ts +0 -138
- package/src/routes/admin/webhooks.ts +0 -73
- package/src/routes/admin.ts +0 -1
- package/src/routes/apiKeys.ts +0 -60
- package/src/routes/auth.ts +0 -214
- package/src/routes/authz.ts +0 -38
- package/src/routes/config.ts +0 -67
- package/src/routes/emailVerification.ts +0 -73
- package/src/routes/federation.ts +0 -156
- package/src/routes/helpers.ts +0 -17
- package/src/routes/magicLinks.ts +0 -107
- package/src/routes/oauth.ts +0 -167
- package/src/routes/oauth2.ts +0 -284
- package/src/routes/oidcEnterprise.ts +0 -166
- package/src/routes/password.ts +0 -90
- package/src/routes/profile.ts +0 -44
- package/src/routes/saml.ts +0 -209
- package/src/routes/scim.ts +0 -199
- package/src/routes/sdk.ts +0 -141
- package/src/routes/serviceAccounts.ts +0 -124
- package/src/routes/sessions.ts +0 -62
- package/src/routes/setup.ts +0 -315
- package/src/routes/smsOtp.ts +0 -67
- package/src/routes/totp.ts +0 -122
- package/src/routes/webauthn.ts +0 -147
- package/src/routes/workflows.ts +0 -157
- package/src/sdk/index.ts +0 -152
- package/src/sdk/types.ts +0 -54
- package/src/services/anomalyDetection.ts +0 -73
- package/src/services/application/authentication.ts +0 -75
- package/src/services/application/identity.ts +0 -56
- package/src/services/application/index.ts +0 -3
- package/src/services/application/organization.ts +0 -77
- package/src/services/applications.ts +0 -89
- package/src/services/audit.ts +0 -41
- package/src/services/auditExport.ts +0 -59
- package/src/services/billing.ts +0 -87
- package/src/services/cache.ts +0 -131
- package/src/services/configuration/profiles.ts +0 -115
- package/src/services/configuration.ts +0 -120
- package/src/services/connectors/google.ts +0 -92
- package/src/services/connectors/oidc.ts +0 -111
- package/src/services/connectors/registry.ts +0 -124
- package/src/services/connectors/types.ts +0 -38
- package/src/services/connectors/zitadel.ts +0 -77
- package/src/services/devices.ts +0 -76
- package/src/services/domain/authentication.ts +0 -279
- package/src/services/domain/authorization.ts +0 -49
- package/src/services/domain/identity.ts +0 -108
- package/src/services/domain/index.ts +0 -4
- package/src/services/domain/organization.ts +0 -114
- package/src/services/email.ts +0 -167
- package/src/services/emailVerification.ts +0 -75
- package/src/services/enterpriseSso.ts +0 -58
- package/src/services/events/bus.ts +0 -43
- package/src/services/events/subscribers/anomaly.ts +0 -13
- package/src/services/events/subscribers/auditLog.ts +0 -21
- package/src/services/events/subscribers/webhook.ts +0 -39
- package/src/services/events/subscribers/webhookDispatch.ts +0 -14
- package/src/services/events/types.ts +0 -106
- package/src/services/events/validate.ts +0 -118
- package/src/services/featureFlags.ts +0 -90
- package/src/services/features.ts +0 -22
- package/src/services/federation.ts +0 -30
- package/src/services/hibp.ts +0 -28
- package/src/services/ipControls.ts +0 -99
- package/src/services/magicLinks.ts +0 -51
- package/src/services/oauth2.ts +0 -216
- package/src/services/organizations.ts +0 -171
- package/src/services/permissions.ts +0 -146
- package/src/services/plugins/registry.ts +0 -242
- package/src/services/plugins/types.ts +0 -98
- package/src/services/queue/bullmq.ts +0 -104
- package/src/services/queue/inProcess.ts +0 -75
- package/src/services/queue/index.ts +0 -19
- package/src/services/queue/types.ts +0 -26
- package/src/services/redis.ts +0 -16
- package/src/services/secrets/awsKms.ts +0 -97
- package/src/services/secrets/azureKeyVault.ts +0 -171
- package/src/services/secrets/database.ts +0 -166
- package/src/services/secrets/environment.ts +0 -117
- package/src/services/secrets/index.ts +0 -50
- package/src/services/secrets/password.ts +0 -73
- package/src/services/secrets/provider.ts +0 -36
- package/src/services/secrets/vault.ts +0 -149
- package/src/services/secrets.ts +0 -2
- package/src/services/serviceAccounts.ts +0 -74
- package/src/services/setup/configWriter.ts +0 -200
- package/src/services/setup/diagnostics.ts +0 -76
- package/src/services/setup/token.ts +0 -42
- package/src/services/setup/types.ts +0 -40
- package/src/services/setup/validation.ts +0 -205
- package/src/services/sms.ts +0 -81
- package/src/services/smsOtp.ts +0 -74
- package/src/services/tokens.ts +0 -287
- package/src/services/totp.ts +0 -113
- package/src/services/users.ts +0 -239
- package/src/services/webauthn.ts +0 -193
- package/src/services/webhooks.ts +0 -190
- package/src/services/workflows/engine.ts +0 -125
- package/src/services/workflows/steps.ts +0 -129
- package/src/services/zitadel.ts +0 -277
- package/src/setup-server.ts +0 -71
- package/src/tests/errors.test.ts +0 -74
- package/src/tests/events.test.ts +0 -52
- package/src/tests/featureFlags.test.ts +0 -26
- package/src/tests/integration/queue.test.ts +0 -54
- package/src/tests/plugins.test.ts +0 -73
- package/src/tests/result.test.ts +0 -52
- package/src/tests/setup/configWriter.test.ts +0 -69
- package/src/tests/setup/validation.test.ts +0 -29
- package/src/tests/smoke.test.ts +0 -136
- package/src/types.ts +0 -70
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { FastifyRequest } from "fastify";
|
|
2
|
+
/**
|
|
3
|
+
* Trusted-proxy model.
|
|
4
|
+
*
|
|
5
|
+
* ```text
|
|
6
|
+
* Internet → trusted reverse proxy → Keystone
|
|
7
|
+
* ```
|
|
8
|
+
*
|
|
9
|
+
* Two rules follow from that diagram, and everything else in this module exists
|
|
10
|
+
* to enforce them:
|
|
11
|
+
*
|
|
12
|
+
* 1. Only a request whose **peer** address is a configured trusted proxy may
|
|
13
|
+
* have its forwarded headers believed. `request.ip` cannot be used for this
|
|
14
|
+
* decision, because Fastify derives it from `x-forwarded-for` when
|
|
15
|
+
* `trustProxy` is on — which is exactly the attacker-controlled value.
|
|
16
|
+
* 2. The peer address is the only value that cannot be spoofed. Forwarded
|
|
17
|
+
* headers are only consulted when (1) holds.
|
|
18
|
+
*
|
|
19
|
+
* With no trusted proxies configured, nothing is trusted: the peer address is
|
|
20
|
+
* used for rate limiting and client-certificate headers are ignored entirely.
|
|
21
|
+
* The default is therefore fail-closed.
|
|
22
|
+
*/
|
|
23
|
+
/** Headers that carry client identity and must never be believed from an untrusted peer. */
|
|
24
|
+
export declare const IDENTITY_HEADERS: readonly ["x-forwarded-client-cert", "x-client-cert-fingerprint", "x-service-account-id", "x-forwarded-client-cert-chain"];
|
|
25
|
+
/**
|
|
26
|
+
* Normalize an address so every spelling of the same host compares equal.
|
|
27
|
+
*
|
|
28
|
+
* IPv4-mapped IPv6 arrives in two forms — the dotted form `::ffff:127.0.0.1`
|
|
29
|
+
* and the hex form `::ffff:7f00:1`. Both must collapse to `127.0.0.1`,
|
|
30
|
+
* otherwise a mapped address slips past an IPv4 CIDR allowlist.
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeAddress(address: string | undefined): string;
|
|
33
|
+
/** Does `address` fall inside `cidr`? Supports IPv4 CIDR and exact IPv6. */
|
|
34
|
+
export declare function addressInCidr(address: string, cidr: string): boolean;
|
|
35
|
+
/** Reset the parse cache. Exists for tests that change configuration. */
|
|
36
|
+
export declare function resetTrustedProxyCache(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Is at least one trusted proxy configured? False means client-identity headers
|
|
39
|
+
* are stripped from every request and rate limits key on the peer address.
|
|
40
|
+
*/
|
|
41
|
+
export declare function hasTrustedProxies(): boolean;
|
|
42
|
+
export declare function isTrustedProxy(address: string | undefined): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* The socket's peer address. This is the only value a client cannot forge,
|
|
45
|
+
* because it is established by the TCP connection rather than by a header.
|
|
46
|
+
*/
|
|
47
|
+
export declare function peerAddress(request: FastifyRequest): string;
|
|
48
|
+
/** True when the immediate peer is a configured trusted proxy. */
|
|
49
|
+
export declare function isFromTrustedProxy(request: FastifyRequest): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* The client address to use for rate limiting and logging.
|
|
52
|
+
*
|
|
53
|
+
* Behind a trusted proxy this is the left-most forwarded address, because the
|
|
54
|
+
* proxy is the one that appended it. From any other peer the forwarded headers
|
|
55
|
+
* are ignored, so a client cannot rotate `x-forwarded-for` to obtain a fresh
|
|
56
|
+
* rate-limit budget.
|
|
57
|
+
*/
|
|
58
|
+
export declare function clientAddress(request: FastifyRequest): string;
|
|
59
|
+
/**
|
|
60
|
+
* Remove identity and forwarded headers from a request that did not arrive via
|
|
61
|
+
* a trusted proxy. Stripping rather than merely ignoring means no downstream
|
|
62
|
+
* route, plugin, or future feature can accidentally read them.
|
|
63
|
+
*
|
|
64
|
+
* @returns whether the request was trusted (and therefore kept its headers)
|
|
65
|
+
*/
|
|
66
|
+
export declare function stripUntrustedHeaders(request: FastifyRequest): boolean;
|
|
67
|
+
/** The value Fastify's `trustProxy` option should be given. */
|
|
68
|
+
export declare function fastifyTrustProxySetting(): boolean | string[];
|
|
69
|
+
/**
|
|
70
|
+
* Does this address look like infrastructure rather than a public client?
|
|
71
|
+
*
|
|
72
|
+
* Loopback, RFC 1918, link-local, and unique-local ranges are where reverse
|
|
73
|
+
* proxies, load balancers, and service meshes live. A request arriving from one
|
|
74
|
+
* of these while no trusted proxy is configured is the signature of a proxied
|
|
75
|
+
* deployment that forgot `KEYSTONE_TRUSTED_PROXIES` — which fails silently, as
|
|
76
|
+
* every client collapsing into a single rate-limit budget.
|
|
77
|
+
*/
|
|
78
|
+
export declare function isInfrastructureAddress(address: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Why no forwarded headers were believed, or `null` when the peer was trusted.
|
|
81
|
+
*
|
|
82
|
+
* Returned so the caller can log a warning only in the case that indicates a
|
|
83
|
+
* misconfiguration, rather than on every stripped request.
|
|
84
|
+
*/
|
|
85
|
+
export declare function describeUntrustedPeer(address: string): string | null;
|
|
86
|
+
/** A SHA-256 fingerprint, in hex or the colon-separated form AWS ALB emits. */
|
|
87
|
+
export declare function isValidFingerprint(value: string | undefined): value is string;
|
|
88
|
+
/** Canonical fingerprint form used for storage and comparison. */
|
|
89
|
+
export declare function canonicalFingerprint(value: string): string;
|
|
90
|
+
//# sourceMappingURL=trustedProxies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trustedProxies.d.ts","sourceRoot":"","sources":["../../src/services/trustedProxies.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,YAC3B,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,+BAA+B,CACvB,CAAC;AAKX;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAwBpE;AAeD,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAwCpE;AAoBD,yEAAyE;AACzE,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAMnE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAE3D;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAEnE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAW7D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAMtE;AAED,+DAA+D;AAC/D,wBAAgB,wBAAwB,IAAI,OAAO,GAAG,MAAM,EAAE,CAG7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAmBhE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASpE;AAKD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAI7E;AAED,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { config } from "../config.js";
|
|
2
|
+
/**
|
|
3
|
+
* Trusted-proxy model.
|
|
4
|
+
*
|
|
5
|
+
* ```text
|
|
6
|
+
* Internet → trusted reverse proxy → Keystone
|
|
7
|
+
* ```
|
|
8
|
+
*
|
|
9
|
+
* Two rules follow from that diagram, and everything else in this module exists
|
|
10
|
+
* to enforce them:
|
|
11
|
+
*
|
|
12
|
+
* 1. Only a request whose **peer** address is a configured trusted proxy may
|
|
13
|
+
* have its forwarded headers believed. `request.ip` cannot be used for this
|
|
14
|
+
* decision, because Fastify derives it from `x-forwarded-for` when
|
|
15
|
+
* `trustProxy` is on — which is exactly the attacker-controlled value.
|
|
16
|
+
* 2. The peer address is the only value that cannot be spoofed. Forwarded
|
|
17
|
+
* headers are only consulted when (1) holds.
|
|
18
|
+
*
|
|
19
|
+
* With no trusted proxies configured, nothing is trusted: the peer address is
|
|
20
|
+
* used for rate limiting and client-certificate headers are ignored entirely.
|
|
21
|
+
* The default is therefore fail-closed.
|
|
22
|
+
*/
|
|
23
|
+
/** Headers that carry client identity and must never be believed from an untrusted peer. */
|
|
24
|
+
export const IDENTITY_HEADERS = [
|
|
25
|
+
"x-forwarded-client-cert",
|
|
26
|
+
"x-client-cert-fingerprint",
|
|
27
|
+
"x-service-account-id",
|
|
28
|
+
"x-forwarded-client-cert-chain",
|
|
29
|
+
];
|
|
30
|
+
/** Headers that influence the apparent client address. */
|
|
31
|
+
const FORWARDED_HEADERS = ["x-forwarded-for", "x-real-ip", "forwarded"];
|
|
32
|
+
/**
|
|
33
|
+
* Normalize an address so every spelling of the same host compares equal.
|
|
34
|
+
*
|
|
35
|
+
* IPv4-mapped IPv6 arrives in two forms — the dotted form `::ffff:127.0.0.1`
|
|
36
|
+
* and the hex form `::ffff:7f00:1`. Both must collapse to `127.0.0.1`,
|
|
37
|
+
* otherwise a mapped address slips past an IPv4 CIDR allowlist.
|
|
38
|
+
*/
|
|
39
|
+
export function normalizeAddress(address) {
|
|
40
|
+
if (!address)
|
|
41
|
+
return "";
|
|
42
|
+
let value = address.trim().toLowerCase();
|
|
43
|
+
if (value.startsWith("[") && value.endsWith("]"))
|
|
44
|
+
value = value.slice(1, -1);
|
|
45
|
+
// Strip a zone index and any port suffix on bare IPv6.
|
|
46
|
+
const zone = value.indexOf("%");
|
|
47
|
+
if (zone !== -1)
|
|
48
|
+
value = value.slice(0, zone);
|
|
49
|
+
if (value.startsWith("::ffff:")) {
|
|
50
|
+
const tail = value.slice(7);
|
|
51
|
+
if (tail.includes("."))
|
|
52
|
+
return tail;
|
|
53
|
+
// Hex form: the final two hextets are the IPv4 address.
|
|
54
|
+
const hextets = tail.split(":");
|
|
55
|
+
if (hextets.length === 2 && hextets.every((h) => /^[0-9a-f]{1,4}$/.test(h))) {
|
|
56
|
+
const high = parseInt(hextets[0], 16);
|
|
57
|
+
const low = parseInt(hextets[1], 16);
|
|
58
|
+
if (Number.isInteger(high) && Number.isInteger(low)) {
|
|
59
|
+
return [high >> 8, high & 0xff, low >> 8, low & 0xff].join(".");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return tail;
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function toIPv4Octets(address) {
|
|
67
|
+
const parts = address.split(".");
|
|
68
|
+
if (parts.length !== 4)
|
|
69
|
+
return null;
|
|
70
|
+
const octets = [];
|
|
71
|
+
for (const part of parts) {
|
|
72
|
+
if (!/^\d{1,3}$/.test(part))
|
|
73
|
+
return null;
|
|
74
|
+
const n = Number(part);
|
|
75
|
+
if (n < 0 || n > 255)
|
|
76
|
+
return null;
|
|
77
|
+
octets.push(n);
|
|
78
|
+
}
|
|
79
|
+
return octets;
|
|
80
|
+
}
|
|
81
|
+
/** Does `address` fall inside `cidr`? Supports IPv4 CIDR and exact IPv6. */
|
|
82
|
+
export function addressInCidr(address, cidr) {
|
|
83
|
+
const target = normalizeAddress(address);
|
|
84
|
+
const range = cidr.trim().toLowerCase();
|
|
85
|
+
if (!target || !range)
|
|
86
|
+
return false;
|
|
87
|
+
if (!range.includes("/"))
|
|
88
|
+
return target === normalizeAddress(range);
|
|
89
|
+
const [network, bitsRaw] = range.split("/");
|
|
90
|
+
const bits = Number(bitsRaw);
|
|
91
|
+
if (!Number.isInteger(bits))
|
|
92
|
+
return false;
|
|
93
|
+
const targetOctets = toIPv4Octets(normalizeAddress(network));
|
|
94
|
+
const boundOctets = toIPv4Octets(normalizeAddress(network));
|
|
95
|
+
if (!targetOctets || !boundOctets) {
|
|
96
|
+
// IPv6: compare the leading `bits` of the hextets. Anything not an exact
|
|
97
|
+
// or prefix match is treated as outside the range.
|
|
98
|
+
if (bits < 0 || bits > 128)
|
|
99
|
+
return false;
|
|
100
|
+
const left = normalizeAddress(network).split(":");
|
|
101
|
+
const right = normalizeAddress(target).split(":");
|
|
102
|
+
if (left.length !== right.length)
|
|
103
|
+
return false;
|
|
104
|
+
const hextets = bits / 16;
|
|
105
|
+
for (let i = 0; i < Math.floor(hextets); i++) {
|
|
106
|
+
if (left[i] !== right[i])
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
if (bits < 0 || bits > 32)
|
|
112
|
+
return false;
|
|
113
|
+
const targetV4 = toIPv4Octets(normalizeAddress(target));
|
|
114
|
+
if (!targetV4)
|
|
115
|
+
return false;
|
|
116
|
+
let remaining = bits;
|
|
117
|
+
for (let i = 0; i < 4; i++) {
|
|
118
|
+
if (remaining <= 0)
|
|
119
|
+
break;
|
|
120
|
+
const take = Math.min(8, remaining);
|
|
121
|
+
const mask = take === 0 ? 0 : (0xff << (8 - take)) & 0xff;
|
|
122
|
+
if ((targetV4[i] & mask) !== (boundOctets[i] & mask))
|
|
123
|
+
return false;
|
|
124
|
+
remaining -= take;
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
let cachedConfig = null;
|
|
129
|
+
/**
|
|
130
|
+
* Read the setting at call time rather than from the `config` snapshot, which
|
|
131
|
+
* is built once at import. Cached on the raw string, so this is cheap while
|
|
132
|
+
* still picking up a reload.
|
|
133
|
+
*/
|
|
134
|
+
function trustedEntries() {
|
|
135
|
+
const raw = (process.env.KEYSTONE_TRUSTED_PROXIES ?? config.TRUSTED_PROXIES ?? "").trim();
|
|
136
|
+
if (cachedConfig?.raw === raw)
|
|
137
|
+
return cachedConfig.entries;
|
|
138
|
+
const entries = raw
|
|
139
|
+
.split(",")
|
|
140
|
+
.map((entry) => entry.trim())
|
|
141
|
+
.filter(Boolean);
|
|
142
|
+
cachedConfig = { raw, entries };
|
|
143
|
+
return entries;
|
|
144
|
+
}
|
|
145
|
+
/** Reset the parse cache. Exists for tests that change configuration. */
|
|
146
|
+
export function resetTrustedProxyCache() {
|
|
147
|
+
cachedConfig = null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Is at least one trusted proxy configured? False means client-identity headers
|
|
151
|
+
* are stripped from every request and rate limits key on the peer address.
|
|
152
|
+
*/
|
|
153
|
+
export function hasTrustedProxies() {
|
|
154
|
+
return trustedEntries().length > 0;
|
|
155
|
+
}
|
|
156
|
+
export function isTrustedProxy(address) {
|
|
157
|
+
const entries = trustedEntries();
|
|
158
|
+
if (entries.length === 0)
|
|
159
|
+
return false;
|
|
160
|
+
const target = normalizeAddress(address);
|
|
161
|
+
if (!target)
|
|
162
|
+
return false;
|
|
163
|
+
return entries.some((entry) => addressInCidr(target, entry));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The socket's peer address. This is the only value a client cannot forge,
|
|
167
|
+
* because it is established by the TCP connection rather than by a header.
|
|
168
|
+
*/
|
|
169
|
+
export function peerAddress(request) {
|
|
170
|
+
return normalizeAddress(request.socket?.remoteAddress ?? request.ip);
|
|
171
|
+
}
|
|
172
|
+
/** True when the immediate peer is a configured trusted proxy. */
|
|
173
|
+
export function isFromTrustedProxy(request) {
|
|
174
|
+
return isTrustedProxy(peerAddress(request));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* The client address to use for rate limiting and logging.
|
|
178
|
+
*
|
|
179
|
+
* Behind a trusted proxy this is the left-most forwarded address, because the
|
|
180
|
+
* proxy is the one that appended it. From any other peer the forwarded headers
|
|
181
|
+
* are ignored, so a client cannot rotate `x-forwarded-for` to obtain a fresh
|
|
182
|
+
* rate-limit budget.
|
|
183
|
+
*/
|
|
184
|
+
export function clientAddress(request) {
|
|
185
|
+
if (!isFromTrustedProxy(request))
|
|
186
|
+
return peerAddress(request);
|
|
187
|
+
const xff = request.headers["x-forwarded-for"];
|
|
188
|
+
if (typeof xff === "string" && xff.trim()) {
|
|
189
|
+
const first = xff.split(",")[0]?.trim();
|
|
190
|
+
if (first)
|
|
191
|
+
return normalizeAddress(first);
|
|
192
|
+
}
|
|
193
|
+
const realIp = request.headers["x-real-ip"];
|
|
194
|
+
if (typeof realIp === "string" && realIp.trim())
|
|
195
|
+
return normalizeAddress(realIp);
|
|
196
|
+
return peerAddress(request);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Remove identity and forwarded headers from a request that did not arrive via
|
|
200
|
+
* a trusted proxy. Stripping rather than merely ignoring means no downstream
|
|
201
|
+
* route, plugin, or future feature can accidentally read them.
|
|
202
|
+
*
|
|
203
|
+
* @returns whether the request was trusted (and therefore kept its headers)
|
|
204
|
+
*/
|
|
205
|
+
export function stripUntrustedHeaders(request) {
|
|
206
|
+
if (isFromTrustedProxy(request))
|
|
207
|
+
return true;
|
|
208
|
+
for (const header of [...IDENTITY_HEADERS, ...FORWARDED_HEADERS]) {
|
|
209
|
+
delete request.headers[header];
|
|
210
|
+
}
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
/** The value Fastify's `trustProxy` option should be given. */
|
|
214
|
+
export function fastifyTrustProxySetting() {
|
|
215
|
+
const entries = trustedEntries();
|
|
216
|
+
return entries.length > 0 ? entries : false;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Does this address look like infrastructure rather than a public client?
|
|
220
|
+
*
|
|
221
|
+
* Loopback, RFC 1918, link-local, and unique-local ranges are where reverse
|
|
222
|
+
* proxies, load balancers, and service meshes live. A request arriving from one
|
|
223
|
+
* of these while no trusted proxy is configured is the signature of a proxied
|
|
224
|
+
* deployment that forgot `KEYSTONE_TRUSTED_PROXIES` — which fails silently, as
|
|
225
|
+
* every client collapsing into a single rate-limit budget.
|
|
226
|
+
*/
|
|
227
|
+
export function isInfrastructureAddress(address) {
|
|
228
|
+
const target = normalizeAddress(address);
|
|
229
|
+
if (!target)
|
|
230
|
+
return false;
|
|
231
|
+
if (target === "127.0.0.1" || target === "::1" || target === "0.0.0.0" || target === "::") {
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
if (target.startsWith("10."))
|
|
235
|
+
return true;
|
|
236
|
+
if (/^172\.(1[6-9]|2\d|3[01])\./.test(target))
|
|
237
|
+
return true;
|
|
238
|
+
if (target.startsWith("192.168."))
|
|
239
|
+
return true;
|
|
240
|
+
if (target.startsWith("169.254."))
|
|
241
|
+
return true;
|
|
242
|
+
// IPv6: fe80::/10 link-local, fc00::/7 unique-local. Compare the first
|
|
243
|
+
// hextet regardless of how many there are, so a fully expanded address
|
|
244
|
+
// (`fe80:0000:...:0001`) is classified the same as the compressed form.
|
|
245
|
+
const first = parseInt(target.split(":")[0] ?? "", 16);
|
|
246
|
+
if (Number.isInteger(first)) {
|
|
247
|
+
if ((first & 0xffc0) === 0xfe80)
|
|
248
|
+
return true;
|
|
249
|
+
if ((first & 0xfe00) === 0xfc00)
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Why no forwarded headers were believed, or `null` when the peer was trusted.
|
|
256
|
+
*
|
|
257
|
+
* Returned so the caller can log a warning only in the case that indicates a
|
|
258
|
+
* misconfiguration, rather than on every stripped request.
|
|
259
|
+
*/
|
|
260
|
+
export function describeUntrustedPeer(address) {
|
|
261
|
+
if (hasTrustedProxies())
|
|
262
|
+
return null;
|
|
263
|
+
if (!isInfrastructureAddress(address))
|
|
264
|
+
return null;
|
|
265
|
+
return ("client-identity headers were stripped from an infrastructure address while " +
|
|
266
|
+
"KEYSTONE_TRUSTED_PROXIES is unset. If Keystone is behind a reverse proxy, " +
|
|
267
|
+
"set it to the proxy's address: until then every client shares one rate-limit " +
|
|
268
|
+
"budget and forwarded client addresses are ignored. See docs/security/proxy-security.md");
|
|
269
|
+
}
|
|
270
|
+
const FINGERPRINT_HEX = /^[0-9a-f]{64}$/i;
|
|
271
|
+
const FINGERPRINT_COLON = /^(?:[0-9a-f]{2}:){31}[0-9a-f]{2}$/i;
|
|
272
|
+
/** A SHA-256 fingerprint, in hex or the colon-separated form AWS ALB emits. */
|
|
273
|
+
export function isValidFingerprint(value) {
|
|
274
|
+
if (!value)
|
|
275
|
+
return false;
|
|
276
|
+
const normalized = value.trim();
|
|
277
|
+
return FINGERPRINT_HEX.test(normalized) || FINGERPRINT_COLON.test(normalized);
|
|
278
|
+
}
|
|
279
|
+
/** Canonical fingerprint form used for storage and comparison. */
|
|
280
|
+
export function canonicalFingerprint(value) {
|
|
281
|
+
return value.trim().replace(/:/g, "").toLowerCase();
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=trustedProxies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trustedProxies.js","sourceRoot":"","sources":["../../src/services/trustedProxies.ts"],"names":[],"mappings":"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"}
|
package/dist/services/users.d.ts
CHANGED
|
@@ -5,9 +5,29 @@ export interface OAuthClaims {
|
|
|
5
5
|
username?: string;
|
|
6
6
|
name?: string;
|
|
7
7
|
picture?: string;
|
|
8
|
+
emailVerified?: boolean;
|
|
8
9
|
email_verified?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export declare function findUserByEmail(email: string): Promise<User | undefined>;
|
|
12
|
+
export declare function findIdentityProviderByType(providerType: string): Promise<{
|
|
13
|
+
id: string;
|
|
14
|
+
orgId: string;
|
|
15
|
+
providerType: string;
|
|
16
|
+
name: string;
|
|
17
|
+
issuer: string | null;
|
|
18
|
+
authorizationEndpoint: string | null;
|
|
19
|
+
tokenEndpoint: string | null;
|
|
20
|
+
userinfoEndpoint: string | null;
|
|
21
|
+
jwksUri: string | null;
|
|
22
|
+
clientId: string | null;
|
|
23
|
+
clientSecretEncrypted: string | null;
|
|
24
|
+
scopes: string[];
|
|
25
|
+
attributeMapping: unknown;
|
|
26
|
+
isActive: boolean;
|
|
27
|
+
isFederation: boolean;
|
|
28
|
+
createdAt: Date;
|
|
29
|
+
updatedAt: Date;
|
|
30
|
+
}>;
|
|
11
31
|
export declare function findUserById(id: string): Promise<User | undefined>;
|
|
12
32
|
export declare function findUserByZitadelId(zitadelUserId: string): Promise<User | undefined>;
|
|
13
33
|
export declare function createPasswordUser(input: {
|
|
@@ -21,19 +41,7 @@ export declare function createPasswordUser(input: {
|
|
|
21
41
|
export declare function upsertOAuthUser(claims: OAuthClaims, providerType: string, providerId?: string): Promise<User>;
|
|
22
42
|
export declare function linkUserIdentity(userId: string, providerId: string, providerType: string, externalSub: string, email?: string, profile?: Record<string, unknown>): Promise<void>;
|
|
23
43
|
export declare function updateUserLastSeen(id: string): Promise<void>;
|
|
24
|
-
export declare function findOrCreateUserByEmail(input: {
|
|
25
|
-
email: string;
|
|
26
|
-
name?: string;
|
|
27
|
-
username?: string;
|
|
28
|
-
}): Promise<User>;
|
|
29
44
|
export declare function listUsersByOrg(orgId: string): Promise<User[]>;
|
|
30
|
-
export declare function updateUser(userId: string, updates: Partial<{
|
|
31
|
-
name: string;
|
|
32
|
-
username: string;
|
|
33
|
-
role: string;
|
|
34
|
-
emailVerified: boolean;
|
|
35
|
-
}>): Promise<User | undefined>;
|
|
36
|
-
export declare function deactivateUser(userId: string): Promise<void>;
|
|
37
45
|
export declare function slugifyUsername(input: string): string;
|
|
38
46
|
export declare function ensureUniqueUsername(base: string, excludeId?: string): Promise<string>;
|
|
39
47
|
//# sourceMappingURL=users.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/services/users.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4D,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEtG,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAG9E;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAGxE;AAED,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAG1F;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAchB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/services/users.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4D,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEtG,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAG9E;AAED,wBAAsB,0BAA0B,CAAC,YAAY,EAAE,MAAM;;;;;;;;;;;;;;;;;;GAOpE;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAGxE;AAED,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAG1F;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAchB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAoEf;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAOnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe5F"}
|
package/dist/services/users.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import { eq, sql } from "drizzle-orm";
|
|
1
|
+
import { and, eq, sql } from "drizzle-orm";
|
|
2
2
|
import { db } from "../db/index.js";
|
|
3
3
|
import { users, userIdentities, identityProviders, orgMemberships } from "../db/schema.js";
|
|
4
4
|
export async function findUserByEmail(email) {
|
|
5
5
|
const [user] = await db.select().from(users).where(eq(users.email, email.toLowerCase())).limit(1);
|
|
6
6
|
return user;
|
|
7
7
|
}
|
|
8
|
+
export async function findIdentityProviderByType(providerType) {
|
|
9
|
+
const [provider] = await db
|
|
10
|
+
.select()
|
|
11
|
+
.from(identityProviders)
|
|
12
|
+
.where(and(eq(identityProviders.providerType, providerType), eq(identityProviders.isActive, true)))
|
|
13
|
+
.limit(1);
|
|
14
|
+
return provider;
|
|
15
|
+
}
|
|
8
16
|
export async function findUserById(id) {
|
|
9
17
|
const [user] = await db.select().from(users).where(eq(users.id, id)).limit(1);
|
|
10
18
|
return user;
|
|
@@ -29,18 +37,24 @@ export async function createPasswordUser(input) {
|
|
|
29
37
|
return user;
|
|
30
38
|
}
|
|
31
39
|
export async function upsertOAuthUser(claims, providerType, providerId) {
|
|
40
|
+
const verified = claims.emailVerified === true || claims.email_verified === true;
|
|
41
|
+
if (!verified) {
|
|
42
|
+
throw new Error("Identity provider did not verify the email address");
|
|
43
|
+
}
|
|
32
44
|
const username = slugifyUsername(claims.username || claims.name || claims.email.split("@")[0]);
|
|
33
45
|
const email = claims.email.toLowerCase().trim();
|
|
34
|
-
//
|
|
46
|
+
// Only an explicit provider/subject link may identify an existing account.
|
|
35
47
|
if (providerId) {
|
|
36
48
|
const [existingLink] = await db
|
|
37
49
|
.select({ user: users })
|
|
38
50
|
.from(userIdentities)
|
|
39
|
-
.where(eq(userIdentities.externalSub, claims.sub))
|
|
51
|
+
.where(and(eq(userIdentities.providerId, providerId), eq(userIdentities.externalSub, claims.sub)))
|
|
40
52
|
.innerJoin(users, eq(userIdentities.userId, users.id))
|
|
41
53
|
.limit(1);
|
|
42
54
|
if (existingLink) {
|
|
43
55
|
const existing = existingLink.user;
|
|
56
|
+
if (!existing.isActive || existing.accountReviewRequired)
|
|
57
|
+
throw new Error("User account is unavailable");
|
|
44
58
|
const [updated] = await db
|
|
45
59
|
.update(users)
|
|
46
60
|
.set({
|
|
@@ -48,7 +62,7 @@ export async function upsertOAuthUser(claims, providerType, providerId) {
|
|
|
48
62
|
username: await ensureUniqueUsername(username, existing.id),
|
|
49
63
|
name: claims.name || existing.name,
|
|
50
64
|
avatarUrl: claims.picture || existing.avatarUrl,
|
|
51
|
-
emailVerified:
|
|
65
|
+
emailVerified: true,
|
|
52
66
|
provider: providerType,
|
|
53
67
|
updatedAt: sql `now()`,
|
|
54
68
|
})
|
|
@@ -57,23 +71,11 @@ export async function upsertOAuthUser(claims, providerType, providerId) {
|
|
|
57
71
|
return updated;
|
|
58
72
|
}
|
|
59
73
|
}
|
|
60
|
-
//
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
.set({
|
|
66
|
-
email,
|
|
67
|
-
username: await ensureUniqueUsername(username, existing.id),
|
|
68
|
-
name: claims.name || existing.name,
|
|
69
|
-
avatarUrl: claims.picture || existing.avatarUrl,
|
|
70
|
-
emailVerified: claims.email_verified ?? existing.emailVerified ?? true,
|
|
71
|
-
provider: providerType,
|
|
72
|
-
updatedAt: sql `now()`,
|
|
73
|
-
})
|
|
74
|
-
.where(eq(users.id, existing.id))
|
|
75
|
-
.returning();
|
|
76
|
-
return updated;
|
|
74
|
+
// Email equality alone is never proof of identity. Existing users must be
|
|
75
|
+
// linked through an explicitly provisioned provider/subject identity.
|
|
76
|
+
const existingByEmail = await findUserByEmail(email);
|
|
77
|
+
if (existingByEmail) {
|
|
78
|
+
throw new Error("Existing account requires an explicit external identity link");
|
|
77
79
|
}
|
|
78
80
|
const [user] = await db
|
|
79
81
|
.insert(users)
|
|
@@ -82,7 +84,7 @@ export async function upsertOAuthUser(claims, providerType, providerId) {
|
|
|
82
84
|
username: await ensureUniqueUsername(username),
|
|
83
85
|
name: claims.name || username,
|
|
84
86
|
avatarUrl: claims.picture,
|
|
85
|
-
emailVerified:
|
|
87
|
+
emailVerified: true,
|
|
86
88
|
provider: providerType,
|
|
87
89
|
})
|
|
88
90
|
.returning();
|
|
@@ -117,24 +119,6 @@ export async function linkUserIdentity(userId, providerId, providerType, externa
|
|
|
117
119
|
export async function updateUserLastSeen(id) {
|
|
118
120
|
await db.update(users).set({ updatedAt: sql `now()` }).where(eq(users.id, id));
|
|
119
121
|
}
|
|
120
|
-
export async function findOrCreateUserByEmail(input) {
|
|
121
|
-
const existing = await findUserByEmail(input.email);
|
|
122
|
-
if (existing)
|
|
123
|
-
return existing;
|
|
124
|
-
const baseUsername = input.username || input.email.split("@")[0];
|
|
125
|
-
const username = await ensureUniqueUsername(slugifyUsername(baseUsername));
|
|
126
|
-
const [user] = await db
|
|
127
|
-
.insert(users)
|
|
128
|
-
.values({
|
|
129
|
-
email: input.email.toLowerCase().trim(),
|
|
130
|
-
username,
|
|
131
|
-
name: input.name || username,
|
|
132
|
-
provider: "password",
|
|
133
|
-
emailVerified: false,
|
|
134
|
-
})
|
|
135
|
-
.returning();
|
|
136
|
-
return user;
|
|
137
|
-
}
|
|
138
122
|
export async function listUsersByOrg(orgId) {
|
|
139
123
|
const rows = await db
|
|
140
124
|
.select({ user: users })
|
|
@@ -143,17 +127,6 @@ export async function listUsersByOrg(orgId) {
|
|
|
143
127
|
.where(eq(orgMemberships.orgId, orgId));
|
|
144
128
|
return rows.map((r) => r.user);
|
|
145
129
|
}
|
|
146
|
-
export async function updateUser(userId, updates) {
|
|
147
|
-
const [updated] = await db
|
|
148
|
-
.update(users)
|
|
149
|
-
.set({ ...updates, updatedAt: sql `now()` })
|
|
150
|
-
.where(eq(users.id, userId))
|
|
151
|
-
.returning();
|
|
152
|
-
return updated;
|
|
153
|
-
}
|
|
154
|
-
export async function deactivateUser(userId) {
|
|
155
|
-
await db.update(users).set({ emailVerified: false, updatedAt: sql `now()` }).where(eq(users.id, userId));
|
|
156
|
-
}
|
|
157
130
|
export function slugifyUsername(input) {
|
|
158
131
|
return input
|
|
159
132
|
.toLowerCase()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/services/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/services/users.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,18 +18,18 @@ export declare function verifyAuthentication(response: AuthenticationResponseJSO
|
|
|
18
18
|
verified: boolean;
|
|
19
19
|
user: {
|
|
20
20
|
id: string;
|
|
21
|
-
name: string | null;
|
|
22
|
-
plan: string;
|
|
23
|
-
createdAt: Date;
|
|
24
|
-
updatedAt: Date;
|
|
25
21
|
zitadelUserId: string | null;
|
|
26
22
|
email: string;
|
|
27
23
|
username: string;
|
|
24
|
+
name: string | null;
|
|
28
25
|
avatarUrl: string | null;
|
|
29
26
|
emailVerified: boolean;
|
|
30
27
|
emailVerifiedToken: string | null;
|
|
31
28
|
provider: string;
|
|
29
|
+
plan: string;
|
|
32
30
|
role: string;
|
|
31
|
+
isActive: boolean;
|
|
32
|
+
accountReviewRequired: boolean;
|
|
33
33
|
defaultOrgId: string | null;
|
|
34
34
|
phoneNumber: string | null;
|
|
35
35
|
phoneVerified: boolean;
|
|
@@ -38,8 +38,12 @@ export declare function verifyAuthentication(response: AuthenticationResponseJSO
|
|
|
38
38
|
totpSecret: string | null;
|
|
39
39
|
totpEnabled: boolean;
|
|
40
40
|
totpVerifiedAt: Date | null;
|
|
41
|
+
totpLastStep: number | null;
|
|
41
42
|
failedLoginAttempts: number;
|
|
42
43
|
lockedUntil: Date | null;
|
|
44
|
+
createdAt: Date;
|
|
45
|
+
updatedAt: Date;
|
|
43
46
|
};
|
|
47
|
+
credentialRegisteredAt: Date;
|
|
44
48
|
}>;
|
|
45
49
|
//# sourceMappingURL=webauthn.d.ts.map
|