@estifanos-sh/convex-auth 0.0.2 → 0.0.4
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/README.md +29 -6
- package/dist/bin.js +2 -34
- package/dist/browser/index.d.ts +2 -2
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +15 -9
- package/dist/browser/index.js.map +1 -1
- package/dist/client/core/types.d.ts +68 -97
- package/dist/client/core/types.d.ts.map +1 -1
- package/dist/client/core/types.js.map +1 -1
- package/dist/client/errors.d.ts +15 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +8 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/factors/device.js +4 -4
- package/dist/client/factors/device.js.map +1 -1
- package/dist/client/factors/totp.js +20 -12
- package/dist/client/factors/totp.js.map +1 -1
- package/dist/client/factors/webauthn.js +6 -2
- package/dist/client/factors/webauthn.js.map +1 -1
- package/dist/client/index.d.ts +6 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +13 -10
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +13 -3
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +365 -74
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/_generated/dataModel.d.ts +2 -2
- package/dist/component/_generated/dataModel.d.ts.map +1 -1
- package/dist/component/_generated/server.d.ts +13 -2
- package/dist/component/_generated/server.d.ts.map +1 -1
- package/dist/component/_generated/server.js +2 -1
- package/dist/component/_generated/server.js.map +1 -1
- package/dist/component/account.d.ts +52 -38
- package/dist/component/account.d.ts.map +1 -1
- package/dist/component/account.js +42 -23
- package/dist/component/account.js.map +1 -1
- package/dist/component/batch.d.ts +3 -0
- package/dist/component/batch.d.ts.map +1 -0
- package/dist/component/batch.js +17 -0
- package/dist/component/batch.js.map +1 -0
- package/dist/component/connection/audit.d.ts +30 -27
- package/dist/component/connection/audit.d.ts.map +1 -1
- package/dist/component/connection/audit.js +16 -23
- package/dist/component/connection/audit.js.map +1 -1
- package/dist/component/connection/cache.d.ts +6 -6
- package/dist/component/connection/cache.js +0 -1
- package/dist/component/connection/cache.js.map +1 -1
- package/dist/component/connection/domain/verification.d.ts +19 -19
- package/dist/component/connection/domain/verification.js +1 -2
- package/dist/component/connection/domain/verification.js.map +1 -1
- package/dist/component/connection/domain.d.ts +20 -20
- package/dist/component/connection/domain.js +1 -2
- package/dist/component/connection/domain.js.map +1 -1
- package/dist/component/connection/saml/assertion.d.ts +4 -4
- package/dist/component/connection/saml/assertion.js +0 -1
- package/dist/component/connection/saml/assertion.js.map +1 -1
- package/dist/component/connection/saml/request.d.ts +8 -9
- package/dist/component/connection/saml/request.d.ts.map +1 -1
- package/dist/component/connection/saml/request.js +0 -2
- package/dist/component/connection/saml/request.js.map +1 -1
- package/dist/component/connection/scim/config.d.ts +13 -13
- package/dist/component/connection/scim/config.d.ts.map +1 -1
- package/dist/component/connection/scim/config.js +2 -2
- package/dist/component/connection/scim/config.js.map +1 -1
- package/dist/component/connection/scim/identity.d.ts +122 -61
- package/dist/component/connection/scim/identity.d.ts.map +1 -1
- package/dist/component/connection/scim/identity.js +408 -60
- package/dist/component/connection/scim/identity.js.map +1 -1
- package/dist/component/connection/secret.d.ts +15 -15
- package/dist/component/connection/secret.d.ts.map +1 -1
- package/dist/component/connection/secret.js +2 -2
- package/dist/component/connection/secret.js.map +1 -1
- package/dist/component/connection/webhook/delivery.d.ts +69 -53
- package/dist/component/connection/webhook/delivery.d.ts.map +1 -1
- package/dist/component/connection/webhook/delivery.js +129 -172
- package/dist/component/connection/webhook/delivery.js.map +1 -1
- package/dist/component/connection/webhook/endpoint.d.ts +21 -21
- package/dist/component/connection/webhook/endpoint.d.ts.map +1 -1
- package/dist/component/connection/webhook/endpoint.js +2 -2
- package/dist/component/connection/webhook/endpoint.js.map +1 -1
- package/dist/component/connection/webhook/events.d.ts +26 -0
- package/dist/component/connection/webhook/events.d.ts.map +1 -0
- package/dist/component/connection/webhook/events.js +39 -0
- package/dist/component/connection/webhook/events.js.map +1 -0
- package/dist/component/connection.d.ts +39 -39
- package/dist/component/connection.d.ts.map +1 -1
- package/dist/component/connection.js +9 -9
- package/dist/component/connection.js.map +1 -1
- package/dist/component/context.d.ts +115 -0
- package/dist/component/context.d.ts.map +1 -0
- package/dist/component/context.js +49 -0
- package/dist/component/context.js.map +1 -0
- package/dist/component/convex.config.d.ts +2 -2
- package/dist/component/crons.d.ts +2 -2
- package/dist/component/documents.d.ts +1244 -0
- package/dist/component/documents.d.ts.map +1 -0
- package/dist/component/documents.js +44 -0
- package/dist/component/documents.js.map +1 -0
- package/dist/component/event.d.ts +142 -141
- package/dist/component/event.d.ts.map +1 -1
- package/dist/component/event.js +90 -119
- package/dist/component/event.js.map +1 -1
- package/dist/component/eventstream.d.ts +30 -0
- package/dist/component/eventstream.d.ts.map +1 -0
- package/dist/component/eventstream.js +60 -0
- package/dist/component/eventstream.js.map +1 -0
- package/dist/component/factor/device.d.ts +25 -24
- package/dist/component/factor/device.d.ts.map +1 -1
- package/dist/component/factor/device.js +7 -4
- package/dist/component/factor/device.js.map +1 -1
- package/dist/component/factor/passkey.d.ts +173 -85
- package/dist/component/factor/passkey.d.ts.map +1 -1
- package/dist/component/factor/passkey.js +138 -27
- package/dist/component/factor/passkey.js.map +1 -1
- package/dist/component/factor/totp.d.ts +56 -50
- package/dist/component/factor/totp.d.ts.map +1 -1
- package/dist/component/factor/totp.js +6 -5
- package/dist/component/factor/totp.js.map +1 -1
- package/dist/component/group/active.d.ts +326 -22
- package/dist/component/group/active.d.ts.map +1 -1
- package/dist/component/group/active.js +22 -13
- package/dist/component/group/active.js.map +1 -1
- package/dist/component/group/invite.d.ts +30 -30
- package/dist/component/group/invite.d.ts.map +1 -1
- package/dist/component/group/invite.js +2 -2
- package/dist/component/group/invite.js.map +1 -1
- package/dist/component/group/member.d.ts +36 -36
- package/dist/component/group/member.d.ts.map +1 -1
- package/dist/component/group/member.js +5 -3
- package/dist/component/group/member.js.map +1 -1
- package/dist/component/group.d.ts +49 -64
- package/dist/component/group.d.ts.map +1 -1
- package/dist/component/group.js +5 -3
- package/dist/component/group.js.map +1 -1
- package/dist/component/http.d.ts +2 -2
- package/dist/component/index.d.ts +0 -10
- package/dist/component/index.js +1 -3
- package/dist/component/limits.d.ts +5 -4
- package/dist/component/limits.d.ts.map +1 -1
- package/dist/component/limits.js +7 -4
- package/dist/component/limits.js.map +1 -1
- package/dist/component/maintenance.d.ts +6 -3
- package/dist/component/maintenance.d.ts.map +1 -1
- package/dist/component/maintenance.js +45 -6
- package/dist/component/maintenance.js.map +1 -1
- package/dist/component/model.d.ts +847 -1723
- package/dist/component/model.d.ts.map +1 -1
- package/dist/component/model.js +28 -317
- package/dist/component/model.js.map +1 -1
- package/dist/component/modules.d.ts +11 -5
- package/dist/component/modules.d.ts.map +1 -1
- package/dist/component/modules.js +4 -1
- package/dist/component/modules.js.map +1 -1
- package/dist/component/oauth/client.d.ts +20 -20
- package/dist/component/oauth/client.d.ts.map +1 -1
- package/dist/component/oauth/client.js +2 -2
- package/dist/component/oauth/client.js.map +1 -1
- package/dist/component/oauth/code.d.ts +14 -14
- package/dist/component/oauth/code.js +1 -2
- package/dist/component/oauth/code.js.map +1 -1
- package/dist/component/oauth/refresh.d.ts +20 -20
- package/dist/component/oauth/refresh.js +1 -2
- package/dist/component/oauth/refresh.js.map +1 -1
- package/dist/component/schema.d.ts +1148 -607
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +43 -15
- package/dist/component/schema.js.map +1 -1
- package/dist/component/session.d.ts +68 -32
- package/dist/component/session.d.ts.map +1 -1
- package/dist/component/session.js +118 -34
- package/dist/component/session.js.map +1 -1
- package/dist/component/token/continuation.d.ts +47 -18
- package/dist/component/token/continuation.d.ts.map +1 -1
- package/dist/component/token/continuation.js +76 -18
- package/dist/component/token/continuation.js.map +1 -1
- package/dist/component/token/enrollment.d.ts +42 -0
- package/dist/component/token/enrollment.d.ts.map +1 -0
- package/dist/component/token/enrollment.js +57 -0
- package/dist/component/token/enrollment.js.map +1 -0
- package/dist/component/token/pkce.d.ts +31 -24
- package/dist/component/token/pkce.d.ts.map +1 -1
- package/dist/component/token/pkce.js +15 -20
- package/dist/component/token/pkce.js.map +1 -1
- package/dist/component/token/refresh.d.ts +42 -35
- package/dist/component/token/refresh.d.ts.map +1 -1
- package/dist/component/token/refresh.js +16 -8
- package/dist/component/token/refresh.js.map +1 -1
- package/dist/component/token/verification.d.ts +34 -30
- package/dist/component/token/verification.d.ts.map +1 -1
- package/dist/component/token/verification.js +7 -6
- package/dist/component/token/verification.js.map +1 -1
- package/dist/component/user/email.d.ts +21 -21
- package/dist/component/user/email.d.ts.map +1 -1
- package/dist/component/user/email.js +2 -2
- package/dist/component/user/email.js.map +1 -1
- package/dist/component/user/key.d.ts +36 -36
- package/dist/component/user/key.d.ts.map +1 -1
- package/dist/component/user/key.js +2 -2
- package/dist/component/user/key.js.map +1 -1
- package/dist/component/user.d.ts +52 -48
- package/dist/component/user.d.ts.map +1 -1
- package/dist/component/user.js +157 -36
- package/dist/component/user.js.map +1 -1
- package/dist/expo/index.d.ts +4 -4
- package/dist/expo/index.d.ts.map +1 -1
- package/dist/expo/index.js +20 -13
- package/dist/expo/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ReadableLogRecord.d.ts +2 -2
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SdkLogRecord.d.ts +1 -1
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/MeterProvider.d.ts +2 -2
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricData.d.ts +1 -1
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/Span.d.ts +1 -1
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/ReadableSpan.d.ts +1 -1
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts +1 -1
- package/dist/otel.d.ts +1 -1
- package/dist/providers/anonymous.d.ts +11 -5
- package/dist/providers/anonymous.d.ts.map +1 -1
- package/dist/providers/anonymous.js +4 -1
- package/dist/providers/anonymous.js.map +1 -1
- package/dist/providers/apple.d.ts +1 -1
- package/dist/providers/apple.js +19 -4
- package/dist/providers/apple.js.map +1 -1
- package/dist/providers/credentials.d.ts +22 -14
- package/dist/providers/credentials.d.ts.map +1 -1
- package/dist/providers/credentials.js +2 -0
- package/dist/providers/credentials.js.map +1 -1
- package/dist/providers/custom.d.ts +3 -3
- package/dist/providers/custom.d.ts.map +1 -1
- package/dist/providers/custom.js.map +1 -1
- package/dist/providers/email.d.ts +3 -3
- package/dist/providers/email.d.ts.map +1 -1
- package/dist/providers/email.js.map +1 -1
- package/dist/providers/github.d.ts +1 -1
- package/dist/providers/github.d.ts.map +1 -1
- package/dist/providers/github.js +9 -4
- package/dist/providers/github.js.map +1 -1
- package/dist/providers/google.d.ts +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +9 -4
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/microsoft.d.ts +1 -1
- package/dist/providers/microsoft.d.ts.map +1 -1
- package/dist/providers/microsoft.js +12 -4
- package/dist/providers/microsoft.js.map +1 -1
- package/dist/providers/password.d.ts +117 -15
- package/dist/providers/password.d.ts.map +1 -1
- package/dist/providers/password.js +71 -26
- package/dist/providers/password.js.map +1 -1
- package/dist/providers/phone.d.ts +4 -3
- package/dist/providers/phone.d.ts.map +1 -1
- package/dist/providers/phone.js.map +1 -1
- package/dist/providers/webauthn.d.ts.map +1 -1
- package/dist/providers/webauthn.js +6 -0
- package/dist/providers/webauthn.js.map +1 -1
- package/dist/react/index.d.ts +40 -41
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +27 -52
- package/dist/react/index.js.map +1 -1
- package/dist/server/auth.d.ts +224 -126
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +44 -25
- package/dist/server/auth.js.map +1 -1
- package/dist/server/component/factor/db.js +13 -6
- package/dist/server/component/factor/db.js.map +1 -1
- package/dist/server/config.d.ts +2 -1
- package/dist/server/connection/domain.d.ts +4 -65
- package/dist/server/connection/domain.d.ts.map +1 -1
- package/dist/server/connection/domain.js +29 -5
- package/dist/server/connection/domain.js.map +1 -1
- package/dist/server/connection/group/service.js +7 -5
- package/dist/server/connection/group/service.js.map +1 -1
- package/dist/server/connection/http.js +136 -291
- package/dist/server/connection/http.js.map +1 -1
- package/dist/server/connection/oidc.js +8 -17
- package/dist/server/connection/oidc.js.map +1 -1
- package/dist/server/connection/policy/domain.js +4 -1
- package/dist/server/connection/policy/domain.js.map +1 -1
- package/dist/server/connection/policy.js +14 -13
- package/dist/server/connection/policy.js.map +1 -1
- package/dist/server/connection/provision.js +5 -19
- package/dist/server/connection/provision.js.map +1 -1
- package/dist/server/connection/saml/encoding.js +2 -6
- package/dist/server/connection/saml/encoding.js.map +1 -1
- package/dist/server/connection/saml/signature.js +2 -2
- package/dist/server/connection/saml/signature.js.map +1 -1
- package/dist/server/connection/saml/xmldsig.js +1 -1
- package/dist/server/connection/saml/xmldsig.js.map +1 -1
- package/dist/server/connection/webhook.js +4 -36
- package/dist/server/connection/webhook.js.map +1 -1
- package/dist/server/context.d.ts +2 -2
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +35 -24
- package/dist/server/context.js.map +1 -1
- package/dist/server/contract.d.ts.map +1 -1
- package/dist/server/contract.js +6 -14
- package/dist/server/contract.js.map +1 -1
- package/dist/server/core.js +46 -1
- package/dist/server/core.js.map +1 -1
- package/dist/server/cors.d.ts +2 -2
- package/dist/server/cors.d.ts.map +1 -1
- package/dist/server/crypto.js.map +1 -1
- package/dist/server/db.js +6 -2
- package/dist/server/db.js.map +1 -1
- package/dist/server/device.js +1 -1
- package/dist/server/domains/account.d.ts +9 -1
- package/dist/server/domains/account.d.ts.map +1 -1
- package/dist/server/domains/account.js +21 -9
- package/dist/server/domains/account.js.map +1 -1
- package/dist/server/domains/context.js +34 -0
- package/dist/server/domains/context.js.map +1 -0
- package/dist/server/domains/factor.d.ts +3 -2
- package/dist/server/domains/factor.d.ts.map +1 -1
- package/dist/server/domains/factor.js.map +1 -1
- package/dist/server/domains/group.js.map +1 -1
- package/dist/server/domains/invite.js.map +1 -1
- package/dist/server/domains/key.js.map +1 -1
- package/dist/server/domains/member.js.map +1 -1
- package/dist/server/domains/session.js.map +1 -1
- package/dist/server/domains/user.js.map +1 -1
- package/dist/server/env.js +2 -22
- package/dist/server/env.js.map +1 -1
- package/dist/server/events.d.ts +3 -1
- package/dist/server/events.d.ts.map +1 -1
- package/dist/server/events.js +6 -6
- package/dist/server/events.js.map +1 -1
- package/dist/server/facade.d.ts +1 -33
- package/dist/server/facade.d.ts.map +1 -1
- package/dist/server/facade.js +1 -2
- package/dist/server/facade.js.map +1 -1
- package/dist/server/http.d.ts +1 -0
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +4 -4
- package/dist/server/http.js.map +1 -1
- package/dist/server/identity/claims.js +1 -1
- package/dist/server/identity/convex.d.ts +2 -0
- package/dist/server/identity/convex.d.ts.map +1 -1
- package/dist/server/index.d.ts +6 -9
- package/dist/server/index.js +2 -4
- package/dist/server/limits.js +23 -2
- package/dist/server/limits.js.map +1 -1
- package/dist/server/mutations/calls.js +3 -2
- package/dist/server/mutations/credentials/signin.js +7 -3
- package/dist/server/mutations/credentials/signin.js.map +1 -1
- package/dist/server/mutations/enrollment.js +87 -0
- package/dist/server/mutations/enrollment.js.map +1 -0
- package/dist/server/mutations/invalidate.js +5 -10
- package/dist/server/mutations/invalidate.js.map +1 -1
- package/dist/server/mutations/oauth.js +3 -3
- package/dist/server/mutations/oauth.js.map +1 -1
- package/dist/server/mutations/refresh.js +1 -0
- package/dist/server/mutations/refresh.js.map +1 -1
- package/dist/server/mutations/register.js +52 -21
- package/dist/server/mutations/register.js.map +1 -1
- package/dist/server/mutations/retrieve.js +4 -1
- package/dist/server/mutations/retrieve.js.map +1 -1
- package/dist/server/mutations/signin.js +2 -2
- package/dist/server/mutations/signin.js.map +1 -1
- package/dist/server/mutations/store.js +6 -1
- package/dist/server/mutations/store.js.map +1 -1
- package/dist/server/mutations/verify.js +6 -4
- package/dist/server/mutations/verify.js.map +1 -1
- package/dist/server/oauth/client.d.ts +1 -1
- package/dist/server/oauth/client.js.map +1 -1
- package/dist/server/oauth/code.d.ts +1 -1
- package/dist/server/oauth/code.js.map +1 -1
- package/dist/server/oauth/factory.js +89 -13
- package/dist/server/oauth/factory.js.map +1 -1
- package/dist/server/oauth/handlers.js +2 -2
- package/dist/server/oauth/runtime.js +24 -9
- package/dist/server/oauth/runtime.js.map +1 -1
- package/dist/server/preload.d.ts.map +1 -1
- package/dist/server/preload.js +14 -11
- package/dist/server/preload.js.map +1 -1
- package/dist/server/runtime.d.ts +236 -148
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/server/runtime.js +92 -44
- package/dist/server/runtime.js.map +1 -1
- package/dist/server/session/lifecycle.d.ts +2 -1
- package/dist/server/session/lifecycle.d.ts.map +1 -1
- package/dist/server/session/lifecycle.js +29 -10
- package/dist/server/session/lifecycle.js.map +1 -1
- package/dist/server/signin/flow.js +2 -2
- package/dist/server/signin/flow.js.map +1 -1
- package/dist/server/telemetry.js +1 -1
- package/dist/server/tokens.js +6 -3
- package/dist/server/tokens.js.map +1 -1
- package/dist/server/totp.js +4 -3
- package/dist/server/totp.js.map +1 -1
- package/dist/server/types.d.ts +131 -45
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/user/account.js +0 -1
- package/dist/server/user/account.js.map +1 -1
- package/dist/server/validators.d.ts +930 -944
- package/dist/server/validators.d.ts.map +1 -1
- package/dist/server/validators.js +66 -39
- package/dist/server/validators.js.map +1 -1
- package/dist/server/webauthn.js +60 -29
- package/dist/server/webauthn.js.map +1 -1
- package/dist/shared/brand.d.ts +3 -7
- package/dist/shared/brand.d.ts.map +1 -1
- package/dist/shared/params.d.ts +78 -0
- package/dist/shared/params.d.ts.map +1 -0
- package/dist/shared/results.d.ts +13 -1
- package/dist/shared/results.d.ts.map +1 -1
- package/dist/svelte/context.svelte.d.ts +23 -12
- package/dist/svelte/context.svelte.d.ts.map +1 -1
- package/dist/svelte/context.svelte.js +20 -13
- package/dist/svelte/index.d.ts +1 -4
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +1 -4
- package/dist/test.d.ts +1204 -611
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +50 -1
- package/dist/test.js.map +1 -1
- package/package.json +5 -14
- package/dist/_generated/component.d.ts +0 -3074
- package/dist/_generated/component.d.ts.map +0 -1
- package/dist/component/functions.d.ts +0 -9
- package/dist/component/functions.d.ts.map +0 -1
- package/dist/component/functions.js +0 -3
- package/dist/core/index.d.ts +0 -533
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -86
- package/dist/core/index.js.map +0 -1
- package/dist/model.js.map +0 -1
- package/dist/server/env.d.ts +0 -28
- package/dist/server/env.d.ts.map +0 -1
- package/dist/svelte/AuthLoading.svelte +0 -13
- package/dist/svelte/AuthLoading.svelte.d.ts +0 -8
- package/dist/svelte/AuthLoading.svelte.d.ts.map +0 -1
- package/dist/svelte/SignedIn.svelte +0 -14
- package/dist/svelte/SignedIn.svelte.d.ts +0 -8
- package/dist/svelte/SignedIn.svelte.d.ts.map +0 -1
- package/dist/svelte/SignedOut.svelte +0 -13
- package/dist/svelte/SignedOut.svelte.d.ts +0 -8
- package/dist/svelte/SignedOut.svelte.d.ts.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { ErrorCode } from "../../shared/codes.js";
|
|
2
2
|
import { log } from "../log.js";
|
|
3
3
|
import { convexError } from "../errors.js";
|
|
4
|
-
import {
|
|
4
|
+
import { addConnectionRoutes, convertErrorsToResponse, getCookies } from "../http.js";
|
|
5
|
+
import { redirectToParamCookie, useRedirectToParam } from "../cookies.js";
|
|
6
|
+
import { getScimIdentityByConnectionAndUser, getScimIdentityByMappedGroup, listScimIdentitiesByConnection, provisionScimGroup, provisionScimUser, revokeScimGroup, revokeScimUser, updateScimGroup, updateScimUser } from "../contract.js";
|
|
5
7
|
import { finalizeNormalizedProfile, normalizeStringArray } from "./profile.js";
|
|
6
|
-
import { SCIM_GROUP_SCHEMA_ID, SCIM_USER_SCHEMA_ID, decodeGroupOidcState, encodeGroupOidcState,
|
|
8
|
+
import { SCIM_GROUP_SCHEMA_ID, SCIM_USER_SCHEMA_ID, decodeGroupOidcState, encodeGroupOidcState, groupSamlProviderId } from "./shared.js";
|
|
7
9
|
import { createGroupConnectionOidcRuntime } from "./oidc.js";
|
|
8
10
|
import { resolveProvisionedRoleIds } from "./policy.js";
|
|
9
|
-
import { addConnectionRoutes, convertErrorsToResponse, getCookies } from "../http.js";
|
|
10
|
-
import { redirectToParamCookie, useRedirectToParam } from "../cookies.js";
|
|
11
11
|
import { redirectAbsoluteUrl, setURLSearchParam } from "../redirects.js";
|
|
12
12
|
import { createOAuthAuthorizationURL, handleOAuthCallback } from "../oauth/runtime.js";
|
|
13
13
|
import { parseScimListRequest, scimError, scimJson, serializeScimGroup, serializeScimUser } from "./scim.js";
|
|
@@ -35,6 +35,8 @@ async function getOidcCallbackParams(request) {
|
|
|
35
35
|
* warning is logged rather than silently returning a partial first page.
|
|
36
36
|
*/
|
|
37
37
|
const SCIM_COLLECT_LIMIT = 5e3;
|
|
38
|
+
/** Maximum members accepted by one authoritative SCIM group replacement. */
|
|
39
|
+
const SCIM_GROUP_MEMBERSHIP_BATCH_SIZE = 100;
|
|
38
40
|
/**
|
|
39
41
|
* Lifetime of a persisted pending SAML AuthnRequest. Bounds how long an ACS
|
|
40
42
|
* response can accept the request; comfortably covers IdP round-trips and the
|
|
@@ -53,6 +55,14 @@ const SCIM_FILTER_OPERATORS = {
|
|
|
53
55
|
sw: (values, filterValue) => values.some((value) => value.startsWith(filterValue)),
|
|
54
56
|
ew: (values, filterValue) => values.some((value) => value.endsWith(filterValue))
|
|
55
57
|
};
|
|
58
|
+
/** @internal Post-commit SCIM notifications must never make a committed write retryable. */
|
|
59
|
+
async function notifyScimAfterProvision(notify) {
|
|
60
|
+
try {
|
|
61
|
+
await notify?.();
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.error("[auth] SCIM afterProvision hook failed after commit", error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
56
66
|
function addGroupHttpRuntime(deps) {
|
|
57
67
|
if (!deps.hasConnection) return;
|
|
58
68
|
const { http, auth, config, requireEnv, loadActiveConnectionSamlOrThrow, loadConnectionOidcOrThrow, getGroupConnectionScimContext, loadGroupPolicyOrThrow, emitGroupAuthEvent, generateRandomString, inviteTokenAlphabet: INVITE_TOKEN_ALPHABET, callUserOAuth, callVerifierSignature, sharedOidcRedirectURI } = deps;
|
|
@@ -252,16 +262,6 @@ function addGroupHttpRuntime(deps) {
|
|
|
252
262
|
if (typeof value === "boolean") return [String(value)];
|
|
253
263
|
return [];
|
|
254
264
|
};
|
|
255
|
-
const applyUserProvisioningPatch = (args) => {
|
|
256
|
-
const mode = args.policy.updateProfileFromScim ?? "always";
|
|
257
|
-
if (mode === "never") return {};
|
|
258
|
-
if (mode === "always") return args.nextUser;
|
|
259
|
-
return Object.fromEntries(Object.entries(args.nextUser).filter(([key, value]) => {
|
|
260
|
-
if (value === void 0) return false;
|
|
261
|
-
const current = args.currentUser[key];
|
|
262
|
-
return current === void 0 || current === null || current === "";
|
|
263
|
-
}));
|
|
264
|
-
};
|
|
265
265
|
const filterScimCollection = (items, filter, filters) => {
|
|
266
266
|
if (!filter) return items;
|
|
267
267
|
const accessor = filters[filter.attribute];
|
|
@@ -510,40 +510,35 @@ function addGroupHttpRuntime(deps) {
|
|
|
510
510
|
});
|
|
511
511
|
return out;
|
|
512
512
|
};
|
|
513
|
-
/**
|
|
514
|
-
* Fully enumerate a group's active members for an authoritative
|
|
515
|
-
* (destructive) membership replace. Unlike {@link collectMembers}, this
|
|
516
|
-
* refuses to truncate: a `replace` diffs the incoming set against the
|
|
517
|
-
* current set and removes the difference, so a partial read would
|
|
518
|
-
* silently drop overflow members. Throws {@link scimCollectOverflow} past
|
|
519
|
-
* the collect limit so the caller fails the reconcile (413) rather than
|
|
520
|
-
* completing a partial authoritative replace.
|
|
521
|
-
*/
|
|
513
|
+
/** Read a bounded complete snapshot for an authoritative membership replace. */
|
|
522
514
|
const collectMembersForReplace = async (ctx$1, where) => {
|
|
523
|
-
const
|
|
515
|
+
const result = await auth.member.list(ctx$1, {
|
|
524
516
|
where,
|
|
525
517
|
paginationOpts: {
|
|
526
|
-
numItems:
|
|
518
|
+
numItems: SCIM_GROUP_MEMBERSHIP_BATCH_SIZE,
|
|
527
519
|
cursor: null
|
|
528
520
|
}
|
|
529
521
|
});
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
522
|
+
if (!result.isDone) throw scimCollectOverflow();
|
|
523
|
+
return result.page;
|
|
524
|
+
};
|
|
525
|
+
const assertScimMembershipBatchSize = (memberIds) => {
|
|
526
|
+
let count = 0;
|
|
527
|
+
for (const _memberId of memberIds) {
|
|
528
|
+
count += 1;
|
|
529
|
+
if (count > SCIM_GROUP_MEMBERSHIP_BATCH_SIZE) throw scimCollectOverflow();
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
const completeScimGroupReplacement = async (state$1, args) => {
|
|
533
|
+
let cursor;
|
|
534
|
+
for (;;) {
|
|
535
|
+
const result = await updateScimGroup(state$1.ctx, config.component.connection, {
|
|
536
|
+
...args,
|
|
537
|
+
cursor
|
|
541
538
|
});
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
cursor = next.continueCursor;
|
|
539
|
+
if (result.isDone) return;
|
|
540
|
+
cursor = result.continueCursor;
|
|
545
541
|
}
|
|
546
|
-
return out;
|
|
547
542
|
};
|
|
548
543
|
const collectGroups = async (ctx$1, where) => {
|
|
549
544
|
const first = await auth.group.list(ctx$1, {
|
|
@@ -574,26 +569,6 @@ function addGroupHttpRuntime(deps) {
|
|
|
574
569
|
});
|
|
575
570
|
return out;
|
|
576
571
|
};
|
|
577
|
-
const userInConnectionScope = async (state$1, userId) => {
|
|
578
|
-
if (await getScimIdentityByConnectionAndUser(state$1.ctx, config.component.connection, {
|
|
579
|
-
connectionId: state$1.connection._id,
|
|
580
|
-
userId
|
|
581
|
-
})) return true;
|
|
582
|
-
return (await auth.member.list(state$1.ctx, {
|
|
583
|
-
where: {
|
|
584
|
-
groupId: state$1.connection.groupId,
|
|
585
|
-
userId
|
|
586
|
-
},
|
|
587
|
-
paginationOpts: {
|
|
588
|
-
numItems: 1,
|
|
589
|
-
cursor: null
|
|
590
|
-
}
|
|
591
|
-
})).page[0] !== void 0;
|
|
592
|
-
};
|
|
593
|
-
const firstInvalidScimMember = async (state$1, userIds) => {
|
|
594
|
-
for (const userId of userIds) if (!await auth.user.get(state$1.ctx, { id: userId }) || !await userInConnectionScope(state$1, userId)) return userId;
|
|
595
|
-
return null;
|
|
596
|
-
};
|
|
597
572
|
const handleUsersGet = async (state$1) => {
|
|
598
573
|
if (state$1.parsedPath.resourceId) {
|
|
599
574
|
const userId = state$1.parsedPath.resourceId;
|
|
@@ -693,7 +668,6 @@ function addGroupHttpRuntime(deps) {
|
|
|
693
668
|
profile: extracted
|
|
694
669
|
}) ?? extracted;
|
|
695
670
|
const externalId = provisionProfile.externalId;
|
|
696
|
-
const providerId = state$1.connection.protocol === "oidc" ? groupOidcProviderId(state$1.connection._id) : groupSamlProviderId(state$1.connection._id);
|
|
697
671
|
const provisionedRoleIds = resolveProvisionedRoleIds({
|
|
698
672
|
policy: state$1.policy,
|
|
699
673
|
groups: provisionProfile.groups,
|
|
@@ -709,71 +683,27 @@ function addGroupHttpRuntime(deps) {
|
|
|
709
683
|
...typeof provisionProfile.phone === "string" ? { phoneVerificationTime: Date.now() } : {},
|
|
710
684
|
...provisionProfile.extend ? { extend: provisionProfile.extend } : {}
|
|
711
685
|
};
|
|
712
|
-
const { userId, created } =
|
|
686
|
+
const { userId, created } = await provisionScimUser(state$1.ctx, config.component.connection, {
|
|
713
687
|
connectionId: state$1.connection._id,
|
|
714
|
-
groupId: state$1.connection.groupId,
|
|
715
688
|
externalId,
|
|
716
|
-
provider: providerId,
|
|
717
689
|
userData,
|
|
690
|
+
profileUpdate: state$1.policy.provisioning.user.updateProfileFromScim,
|
|
691
|
+
roleIds: provisionedRoleIds,
|
|
718
692
|
active: provisionProfile.active !== false,
|
|
719
693
|
raw: body,
|
|
720
694
|
lastProvisionedAt: Date.now()
|
|
721
|
-
}) : {
|
|
722
|
-
userId: await insertUser(state$1.ctx, config.component.user, userData),
|
|
723
|
-
created: true
|
|
724
|
-
};
|
|
725
|
-
const existingUser = created ? null : await auth.user.get(state$1.ctx, { id: userId });
|
|
726
|
-
if (!created && existingUser === null) throw new ConvexError({
|
|
727
|
-
code: ErrorCode.ACCOUNT_NOT_FOUND,
|
|
728
|
-
message: "The SCIM identity references a user that no longer exists."
|
|
729
695
|
});
|
|
730
|
-
if (existingUser) {
|
|
731
|
-
const nextUserData = {
|
|
732
|
-
name: provisionProfile.name,
|
|
733
|
-
firstName: provisionProfile.firstName,
|
|
734
|
-
lastName: provisionProfile.lastName,
|
|
735
|
-
email: provisionProfile.email,
|
|
736
|
-
phone: provisionProfile.phone,
|
|
737
|
-
...provisionProfile.extend ? { extend: provisionProfile.extend } : {}
|
|
738
|
-
};
|
|
739
|
-
if (typeof provisionProfile.email === "string") nextUserData.emailVerificationTime = Date.now();
|
|
740
|
-
if (typeof provisionProfile.phone === "string") nextUserData.phoneVerificationTime = Date.now();
|
|
741
|
-
const patchData = applyUserProvisioningPatch({
|
|
742
|
-
currentUser: existingUser,
|
|
743
|
-
nextUser: nextUserData,
|
|
744
|
-
policy: state$1.policy.provisioning.user,
|
|
745
|
-
source: "scim"
|
|
746
|
-
});
|
|
747
|
-
if (Object.keys(patchData).length > 0) await updateUser(state$1.ctx, config.component.user, {
|
|
748
|
-
userId,
|
|
749
|
-
patch: patchData
|
|
750
|
-
});
|
|
751
|
-
}
|
|
752
|
-
const resolution = await auth.member.get(state$1.ctx, {
|
|
753
|
-
groupId: state$1.connection.groupId,
|
|
754
|
-
userId
|
|
755
|
-
});
|
|
756
|
-
if (resolution.membership) await auth.member.update(state$1.ctx, {
|
|
757
|
-
id: resolution.membership._id,
|
|
758
|
-
patch: { status: body.active === false ? "inactive" : "active" }
|
|
759
|
-
});
|
|
760
|
-
else await auth.member.create(state$1.ctx, { data: {
|
|
761
|
-
groupId: state$1.connection.groupId,
|
|
762
|
-
userId,
|
|
763
|
-
roleIds: provisionedRoleIds,
|
|
764
|
-
status: provisionProfile.active === false ? "inactive" : "active"
|
|
765
|
-
} });
|
|
766
696
|
await state$1.recordScimEvent(created ? "connection.scim.user.provisioned" : "connection.scim.user.updated", "success", {
|
|
767
697
|
type: "user",
|
|
768
698
|
id: userId
|
|
769
699
|
});
|
|
770
700
|
const createdUser = await auth.user.get(state$1.ctx, { id: userId });
|
|
771
|
-
await config.connection?.hooks?.afterProvision?.({
|
|
701
|
+
await notifyScimAfterProvision(async () => config.connection?.hooks?.afterProvision?.({
|
|
772
702
|
protocol: "scim",
|
|
773
703
|
connectionId: state$1.connection._id,
|
|
774
704
|
profile: provisionProfile,
|
|
775
705
|
userId
|
|
776
|
-
});
|
|
706
|
+
}));
|
|
777
707
|
const location = `${state$1.url.origin}${state$1.url.pathname}/${userId}`;
|
|
778
708
|
return scimJson(serializeScimUser({
|
|
779
709
|
id: userId,
|
|
@@ -793,11 +723,7 @@ function addGroupHttpRuntime(deps) {
|
|
|
793
723
|
connectionId: state$1.connection._id,
|
|
794
724
|
userId
|
|
795
725
|
});
|
|
796
|
-
|
|
797
|
-
groupId: state$1.connection.groupId,
|
|
798
|
-
userId
|
|
799
|
-
});
|
|
800
|
-
if (!existingIdentity && !existingMembership.membership) return scimError(404, "notFound", "User not found.");
|
|
726
|
+
if (!existingIdentity) return scimError(404, "notFound", "User not found.");
|
|
801
727
|
const body = await readScimJson(state$1.request);
|
|
802
728
|
const extractedBase = extractScimProfile(state$1.scimConfig, body);
|
|
803
729
|
const extracted = await config.connection?.hooks?.profileResolved?.({
|
|
@@ -866,34 +792,18 @@ function addGroupHttpRuntime(deps) {
|
|
|
866
792
|
unsupportedScimPatch();
|
|
867
793
|
}
|
|
868
794
|
}
|
|
869
|
-
const
|
|
870
|
-
|
|
871
|
-
nextUser: patchData,
|
|
872
|
-
policy: state$1.policy.provisioning.user,
|
|
873
|
-
source: "scim"
|
|
874
|
-
});
|
|
875
|
-
if (Object.keys(nextPatchData).length > 0) await updateUser(state$1.ctx, config.component.user, {
|
|
876
|
-
userId,
|
|
877
|
-
patch: nextPatchData
|
|
878
|
-
});
|
|
879
|
-
const resolution = existingMembership;
|
|
880
|
-
if (resolution.membership) await auth.member.update(state$1.ctx, {
|
|
881
|
-
id: resolution.membership._id,
|
|
882
|
-
patch: {
|
|
883
|
-
roleIds: resolveProvisionedRoleIds({
|
|
884
|
-
policy: state$1.policy,
|
|
885
|
-
groups: provisionProfile.groups,
|
|
886
|
-
roles: provisionProfile.roles
|
|
887
|
-
}),
|
|
888
|
-
status: provisionProfile.active === false || nextActive === false ? "inactive" : "active"
|
|
889
|
-
}
|
|
890
|
-
});
|
|
891
|
-
await upsertScimIdentity(state$1.ctx, config.component.connection, {
|
|
795
|
+
const resolvedExternalId = externalId ?? existingIdentity.externalId;
|
|
796
|
+
await updateScimUser(state$1.ctx, config.component.connection, {
|
|
892
797
|
connectionId: state$1.connection._id,
|
|
893
|
-
groupId: state$1.connection.groupId,
|
|
894
|
-
resourceType: "user",
|
|
895
|
-
externalId: externalId ?? existingIdentity?.externalId ?? userId,
|
|
896
798
|
userId,
|
|
799
|
+
externalId: resolvedExternalId,
|
|
800
|
+
userData: patchData,
|
|
801
|
+
profileUpdate: state$1.policy.provisioning.user.updateProfileFromScim,
|
|
802
|
+
roleIds: resolveProvisionedRoleIds({
|
|
803
|
+
policy: state$1.policy,
|
|
804
|
+
groups: provisionProfile.groups,
|
|
805
|
+
roles: provisionProfile.roles
|
|
806
|
+
}),
|
|
897
807
|
active: provisionProfile.active !== false && nextActive !== false,
|
|
898
808
|
raw: body,
|
|
899
809
|
lastProvisionedAt: Date.now()
|
|
@@ -903,12 +813,12 @@ function addGroupHttpRuntime(deps) {
|
|
|
903
813
|
id: userId
|
|
904
814
|
});
|
|
905
815
|
const updatedUser = await auth.user.get(state$1.ctx, { id: userId });
|
|
906
|
-
await config.connection?.hooks?.afterProvision?.({
|
|
816
|
+
await notifyScimAfterProvision(async () => config.connection?.hooks?.afterProvision?.({
|
|
907
817
|
protocol: "scim",
|
|
908
818
|
connectionId: state$1.connection._id,
|
|
909
819
|
profile: provisionProfile,
|
|
910
820
|
userId
|
|
911
|
-
});
|
|
821
|
+
}));
|
|
912
822
|
const location = `${state$1.url.origin}${state$1.url.pathname}`;
|
|
913
823
|
return scimJson(serializeScimUser({
|
|
914
824
|
id: userId,
|
|
@@ -922,35 +832,22 @@ function addGroupHttpRuntime(deps) {
|
|
|
922
832
|
const missing = requireScimResourceId(state$1.parsedPath.resourceId, "User");
|
|
923
833
|
if (missing) return missing;
|
|
924
834
|
const userId = state$1.parsedPath.resourceId;
|
|
925
|
-
|
|
835
|
+
if (!await getScimIdentityByConnectionAndUser(state$1.ctx, config.component.connection, {
|
|
926
836
|
connectionId: state$1.connection._id,
|
|
927
837
|
userId
|
|
838
|
+
})) return scimError(404, "notFound", "User not found.");
|
|
839
|
+
const { cleanupPending } = await revokeScimUser(state$1.ctx, config.component.connection, {
|
|
840
|
+
connectionId: state$1.connection._id,
|
|
841
|
+
userId,
|
|
842
|
+
mode: state$1.policy.provisioning.deprovision.mode
|
|
928
843
|
});
|
|
929
|
-
|
|
930
|
-
const resolution = await auth.member.get(state$1.ctx, {
|
|
931
|
-
groupId: state$1.connection.groupId,
|
|
932
|
-
userId
|
|
933
|
-
});
|
|
934
|
-
if (resolution.membership) await auth.member.remove(state$1.ctx, { id: resolution.membership._id });
|
|
935
|
-
const { revoked } = await state$1.ctx.runMutation(config.component.session.revokeForUser, { userId });
|
|
936
|
-
if (revoked > 0) await state$1.recordScimEvent("session.invalidated", "success", {
|
|
844
|
+
await state$1.recordScimEvent("session.invalidated", "success", {
|
|
937
845
|
type: "user",
|
|
938
846
|
id: userId
|
|
939
847
|
}, {
|
|
940
848
|
userId,
|
|
941
|
-
reason: "connection_deprovision"
|
|
942
|
-
|
|
943
|
-
if (state$1.policy.provisioning.deprovision.mode === "hard") await removeScimIdentity(state$1.ctx, config.component.connection, identity._id);
|
|
944
|
-
else await upsertScimIdentity(state$1.ctx, config.component.connection, {
|
|
945
|
-
connectionId: identity.connectionId,
|
|
946
|
-
groupId: identity.groupId,
|
|
947
|
-
resourceType: identity.resourceType,
|
|
948
|
-
externalId: identity.externalId,
|
|
949
|
-
userId: identity.userId,
|
|
950
|
-
mappedGroupId: identity.mappedGroupId,
|
|
951
|
-
active: false,
|
|
952
|
-
raw: identity.raw,
|
|
953
|
-
lastProvisionedAt: Date.now()
|
|
849
|
+
reason: "connection_deprovision",
|
|
850
|
+
cleanupPending
|
|
954
851
|
});
|
|
955
852
|
await state$1.recordScimEvent("connection.scim.user.deactivated", "success", {
|
|
956
853
|
type: "user",
|
|
@@ -1031,78 +928,41 @@ function addGroupHttpRuntime(deps) {
|
|
|
1031
928
|
};
|
|
1032
929
|
const handleGroupsPost = async (state$1) => {
|
|
1033
930
|
const body = await readScimJson(state$1.request);
|
|
1034
|
-
const
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
externalId,
|
|
1058
|
-
location: location$1,
|
|
1059
|
-
members: (await collectMembers(state$1.ctx, {
|
|
1060
|
-
groupId,
|
|
1061
|
-
status: "active"
|
|
1062
|
-
})).map((member) => ({ value: member.userId }))
|
|
1063
|
-
}), 200, { Location: location$1 });
|
|
1064
|
-
}
|
|
1065
|
-
await upsertScimIdentity(state$1.ctx, config.component.connection, {
|
|
1066
|
-
connectionId: state$1.connection._id,
|
|
1067
|
-
groupId: state$1.connection.groupId,
|
|
1068
|
-
resourceType: "group",
|
|
1069
|
-
externalId: externalId ?? groupId,
|
|
1070
|
-
mappedGroupId: groupId,
|
|
1071
|
-
active: true,
|
|
1072
|
-
raw: body,
|
|
1073
|
-
lastProvisionedAt: Date.now()
|
|
1074
|
-
});
|
|
1075
|
-
const currentMembers = await collectMembersForReplace(state$1.ctx, {
|
|
1076
|
-
groupId,
|
|
1077
|
-
status: "active"
|
|
1078
|
-
});
|
|
1079
|
-
const currentByUserId = new Map(currentMembers.map((member) => [member.userId, member]));
|
|
1080
|
-
const nextUserIds = new Set((Array.isArray(body.members) ? body.members : []).map((member) => String(member.value)));
|
|
1081
|
-
const toAddUserIds = [...nextUserIds].filter((userId) => !currentByUserId.has(userId));
|
|
1082
|
-
const invalidMember = await firstInvalidScimMember(state$1, toAddUserIds);
|
|
1083
|
-
if (invalidMember !== null) return scimError(400, "invalidValue", `Group member user not found: ${invalidMember}`);
|
|
1084
|
-
for (const member of currentMembers) if (!nextUserIds.has(member.userId)) await auth.member.remove(state$1.ctx, { id: member._id });
|
|
1085
|
-
for (const userId of toAddUserIds) await auth.member.create(state$1.ctx, { data: {
|
|
1086
|
-
groupId,
|
|
1087
|
-
userId,
|
|
1088
|
-
roleIds: provisionedRoleIds,
|
|
1089
|
-
status: "active"
|
|
1090
|
-
} });
|
|
931
|
+
const memberIds = (Array.isArray(body.members) ? body.members : []).map((member) => String(member.value));
|
|
932
|
+
assertScimMembershipBatchSize(memberIds);
|
|
933
|
+
const externalIdForGroup = typeof body.externalId === "string" ? body.externalId : void 0;
|
|
934
|
+
let cursor;
|
|
935
|
+
let provisioned;
|
|
936
|
+
let created = false;
|
|
937
|
+
do {
|
|
938
|
+
provisioned = await provisionScimGroup(state$1.ctx, config.component.connection, {
|
|
939
|
+
connectionId: state$1.connection._id,
|
|
940
|
+
externalId: externalIdForGroup,
|
|
941
|
+
name: typeof body.displayName === "string" ? body.displayName : "Group",
|
|
942
|
+
memberIds,
|
|
943
|
+
roleIds: resolveProvisionedRoleIds({
|
|
944
|
+
policy: state$1.policy,
|
|
945
|
+
groups: typeof body.displayName === "string" ? [body.displayName] : void 0,
|
|
946
|
+
roles: pickStringArray(body.roles)
|
|
947
|
+
}),
|
|
948
|
+
raw: body,
|
|
949
|
+
cursor
|
|
950
|
+
});
|
|
951
|
+
created ||= provisioned.created;
|
|
952
|
+
cursor = provisioned.continueCursor;
|
|
953
|
+
} while (!provisioned.isDone);
|
|
1091
954
|
await state$1.recordScimEvent(created ? "connection.scim.group.provisioned" : "connection.scim.group.updated", "success", {
|
|
1092
955
|
type: "group",
|
|
1093
|
-
id: groupId
|
|
956
|
+
id: provisioned.groupId
|
|
1094
957
|
});
|
|
1095
|
-
const group = await auth.group.get(state$1.ctx, { id: groupId });
|
|
1096
|
-
const location = `${state$1.url.origin}${state$1.url.pathname}/${groupId}`;
|
|
958
|
+
const group = await auth.group.get(state$1.ctx, { id: provisioned.groupId });
|
|
959
|
+
const location = `${state$1.url.origin}${state$1.url.pathname}/${provisioned.groupId}`;
|
|
1097
960
|
return scimJson(serializeScimGroup({
|
|
1098
|
-
id: groupId,
|
|
961
|
+
id: provisioned.groupId,
|
|
1099
962
|
group: group ?? {},
|
|
1100
|
-
externalId,
|
|
963
|
+
externalId: externalIdForGroup,
|
|
1101
964
|
location,
|
|
1102
|
-
members: (
|
|
1103
|
-
groupId,
|
|
1104
|
-
status: "active"
|
|
1105
|
-
})).map((member) => ({ value: member.userId }))
|
|
965
|
+
members: memberIds.map((value) => ({ value }))
|
|
1106
966
|
}), created ? 201 : 200, { Location: location });
|
|
1107
967
|
};
|
|
1108
968
|
const handleGroupsPatch = async (state$1) => {
|
|
@@ -1111,96 +971,74 @@ function addGroupHttpRuntime(deps) {
|
|
|
1111
971
|
const groupId = state$1.parsedPath.resourceId;
|
|
1112
972
|
const identity = await getScimIdentityByMappedGroup(state$1.ctx, config.component.connection, groupId);
|
|
1113
973
|
if (!identity || identity.connectionId !== state$1.connection._id) return scimError(404, "notFound", "Group not found.");
|
|
974
|
+
const group = await auth.group.get(state$1.ctx, { id: groupId });
|
|
975
|
+
if (!group) return scimError(404, "notFound", "Group not found.");
|
|
976
|
+
const currentMembers = await collectMembersForReplace(state$1.ctx, { groupId });
|
|
977
|
+
const nextMemberIds = new Set(currentMembers.map((member) => member.userId));
|
|
978
|
+
let name = typeof group.name === "string" ? group.name : "Group";
|
|
1114
979
|
const body = await readScimJson(state$1.request);
|
|
1115
980
|
const operations = Array.isArray(body.Operations) ? body.Operations : unsupportedScimPatch();
|
|
1116
981
|
for (const operation of operations) {
|
|
1117
982
|
const op = typeof operation.op === "string" ? operation.op.toLowerCase() : "replace";
|
|
1118
983
|
if (operation.path === void 0 && op === "replace" && typeof operation.value === "object" && operation.value !== null) {
|
|
1119
984
|
const value = operation.value;
|
|
1120
|
-
if (typeof value.displayName === "string")
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
985
|
+
if (typeof value.displayName === "string") name = value.displayName;
|
|
986
|
+
if (Array.isArray(value.members)) {
|
|
987
|
+
nextMemberIds.clear();
|
|
988
|
+
for (const member of value.members) nextMemberIds.add(String(member.value));
|
|
989
|
+
}
|
|
1124
990
|
continue;
|
|
1125
991
|
}
|
|
1126
992
|
if (operation.path === "displayName") {
|
|
1127
993
|
if (op !== "replace" && op !== "add") unsupportedScimPatch();
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
patch: { name: operation.value }
|
|
1131
|
-
});
|
|
994
|
+
if (typeof operation.value === "string") name = operation.value;
|
|
995
|
+
else unsupportedScimPatch();
|
|
1132
996
|
continue;
|
|
1133
997
|
}
|
|
1134
998
|
if (operation.path === "members" && op === "add") {
|
|
1135
999
|
const addUserIds = (Array.isArray(operation.value) ? operation.value : []).map((member) => String(member.value));
|
|
1136
|
-
const
|
|
1137
|
-
if (invalidMember !== null) return scimError(400, "invalidValue", `Group member user not found: ${invalidMember}`);
|
|
1138
|
-
for (const userId of addUserIds) if (!(await auth.member.get(state$1.ctx, {
|
|
1139
|
-
groupId,
|
|
1140
|
-
userId
|
|
1141
|
-
})).membership) await auth.member.create(state$1.ctx, { data: {
|
|
1142
|
-
groupId,
|
|
1143
|
-
userId,
|
|
1144
|
-
roleIds: resolveProvisionedRoleIds({
|
|
1145
|
-
policy: state$1.policy,
|
|
1146
|
-
groups: typeof body.displayName === "string" ? [body.displayName] : void 0,
|
|
1147
|
-
roles: pickStringArray(body.roles)
|
|
1148
|
-
}),
|
|
1149
|
-
status: "active"
|
|
1150
|
-
} });
|
|
1000
|
+
for (const userId of addUserIds) nextMemberIds.add(userId);
|
|
1151
1001
|
continue;
|
|
1152
1002
|
}
|
|
1153
1003
|
if (operation.path === "members" && op === "replace") {
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
status: "active"
|
|
1157
|
-
});
|
|
1158
|
-
const currentUserIds = new Set(currentMembers.map((member) => member.userId));
|
|
1159
|
-
const nextUserIds = new Set((Array.isArray(operation.value) ? operation.value : []).map((member) => String(member.value)));
|
|
1160
|
-
const toAddUserIds = [...nextUserIds].filter((userId) => !currentUserIds.has(userId));
|
|
1161
|
-
const invalidMember = await firstInvalidScimMember(state$1, toAddUserIds);
|
|
1162
|
-
if (invalidMember !== null) return scimError(400, "invalidValue", `Group member user not found: ${invalidMember}`);
|
|
1163
|
-
for (const member of currentMembers) if (!nextUserIds.has(member.userId)) await auth.member.remove(state$1.ctx, { id: member._id });
|
|
1164
|
-
for (const userId of toAddUserIds) await auth.member.create(state$1.ctx, { data: {
|
|
1165
|
-
groupId,
|
|
1166
|
-
userId,
|
|
1167
|
-
roleIds: resolveProvisionedRoleIds({
|
|
1168
|
-
policy: state$1.policy,
|
|
1169
|
-
groups: typeof body.displayName === "string" ? [body.displayName] : void 0,
|
|
1170
|
-
roles: pickStringArray(body.roles)
|
|
1171
|
-
}),
|
|
1172
|
-
status: "active"
|
|
1173
|
-
} });
|
|
1004
|
+
nextMemberIds.clear();
|
|
1005
|
+
for (const member of Array.isArray(operation.value) ? operation.value : []) nextMemberIds.add(String(member.value));
|
|
1174
1006
|
continue;
|
|
1175
1007
|
}
|
|
1176
1008
|
if (typeof operation.path === "string" && op === "remove" && operation.path.startsWith("members[")) {
|
|
1177
1009
|
const userId = operation.path.match(/^members\[value eq "([^"]+)"\]$/)?.[1];
|
|
1178
|
-
if (userId)
|
|
1179
|
-
const resolution = await auth.member.get(state$1.ctx, {
|
|
1180
|
-
groupId,
|
|
1181
|
-
userId
|
|
1182
|
-
});
|
|
1183
|
-
if (resolution.membership) await auth.member.remove(state$1.ctx, { id: resolution.membership._id });
|
|
1184
|
-
}
|
|
1010
|
+
if (userId) nextMemberIds.delete(userId);
|
|
1185
1011
|
continue;
|
|
1186
1012
|
}
|
|
1187
1013
|
unsupportedScimPatch();
|
|
1188
1014
|
}
|
|
1015
|
+
assertScimMembershipBatchSize(nextMemberIds);
|
|
1016
|
+
await completeScimGroupReplacement(state$1, {
|
|
1017
|
+
connectionId: state$1.connection._id,
|
|
1018
|
+
groupId,
|
|
1019
|
+
name,
|
|
1020
|
+
memberIds: [...nextMemberIds],
|
|
1021
|
+
roleIds: resolveProvisionedRoleIds({
|
|
1022
|
+
policy: state$1.policy,
|
|
1023
|
+
groups: [name],
|
|
1024
|
+
roles: pickStringArray(body.roles)
|
|
1025
|
+
}),
|
|
1026
|
+
raw: body
|
|
1027
|
+
});
|
|
1189
1028
|
await state$1.recordScimEvent("connection.scim.group.updated", "success", {
|
|
1190
1029
|
type: "group",
|
|
1191
1030
|
id: groupId
|
|
1192
1031
|
});
|
|
1193
|
-
const group = await auth.group.get(state$1.ctx, { id: groupId });
|
|
1194
1032
|
const location = `${state$1.url.origin}${state$1.url.pathname}`;
|
|
1195
|
-
const members = await collectMembers(state$1.ctx, {
|
|
1196
|
-
groupId,
|
|
1197
|
-
status: "active"
|
|
1198
|
-
});
|
|
1199
1033
|
return scimJson(serializeScimGroup({
|
|
1200
1034
|
id: groupId,
|
|
1201
|
-
group:
|
|
1035
|
+
group: {
|
|
1036
|
+
...group,
|
|
1037
|
+
name
|
|
1038
|
+
},
|
|
1039
|
+
externalId: identity.externalId,
|
|
1202
1040
|
location,
|
|
1203
|
-
members:
|
|
1041
|
+
members: [...nextMemberIds].map((value) => ({ value }))
|
|
1204
1042
|
}), 200, { Location: location });
|
|
1205
1043
|
};
|
|
1206
1044
|
const handleGroupsDelete = async (state$1) => {
|
|
@@ -1209,8 +1047,16 @@ function addGroupHttpRuntime(deps) {
|
|
|
1209
1047
|
const groupId = state$1.parsedPath.resourceId;
|
|
1210
1048
|
const identity = await getScimIdentityByMappedGroup(state$1.ctx, config.component.connection, groupId);
|
|
1211
1049
|
if (!identity || identity.connectionId !== state$1.connection._id) return scimError(404, "notFound", "Group not found.");
|
|
1212
|
-
|
|
1213
|
-
|
|
1050
|
+
let cursor;
|
|
1051
|
+
for (;;) {
|
|
1052
|
+
const result = await revokeScimGroup(state$1.ctx, config.component.connection, {
|
|
1053
|
+
connectionId: state$1.connection._id,
|
|
1054
|
+
groupId,
|
|
1055
|
+
cursor
|
|
1056
|
+
});
|
|
1057
|
+
if (result.isDone) break;
|
|
1058
|
+
cursor = result.continueCursor;
|
|
1059
|
+
}
|
|
1214
1060
|
await state$1.recordScimEvent("connection.scim.group.deactivated", "success", {
|
|
1215
1061
|
type: "group",
|
|
1216
1062
|
id: groupId
|
|
@@ -1396,7 +1242,6 @@ function addGroupHttpRuntime(deps) {
|
|
|
1396
1242
|
await ctx.runMutation(config.component.connection.saml.request.create, {
|
|
1397
1243
|
connectionId: connection._id,
|
|
1398
1244
|
requestId: signInRequest.requestId,
|
|
1399
|
-
createdAt: nowMs,
|
|
1400
1245
|
expiresAt: nowMs + SAML_LOGIN_REQUEST_TTL_MS
|
|
1401
1246
|
});
|
|
1402
1247
|
const redirectTo = url.searchParams.get("redirectTo");
|