@estifanos-sh/convex-auth 0.0.1-preview.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/README.md +52 -0
- package/dist/_generated/component.d.ts +2981 -0
- package/dist/bin.js +7194 -0
- package/dist/browser/index.d.ts +22 -0
- package/dist/browser/index.js +61 -0
- package/dist/browser/locks.js +20 -0
- package/dist/browser/navigation.js +14 -0
- package/dist/browser/runtime.js +90 -0
- package/dist/browser/webauthn.js +99 -0
- package/dist/client/core/types.d.ts +615 -0
- package/dist/client/core/types.js +23 -0
- package/dist/client/errors.js +30 -0
- package/dist/client/factors/device.js +100 -0
- package/dist/client/factors/totp.js +111 -0
- package/dist/client/factors/webauthn.js +69 -0
- package/dist/client/index.d.ts +60 -0
- package/dist/client/index.js +976 -0
- package/dist/client/runtime/invite.js +50 -0
- package/dist/client/runtime/mutex.js +25 -0
- package/dist/client/runtime/proxy.js +75 -0
- package/dist/client/runtime/storage.js +65 -0
- package/dist/component/_generated/api.js +26 -0
- package/dist/component/_generated/component.d.ts +2981 -0
- package/dist/component/_generated/component.js +1 -0
- package/dist/component/_generated/dataModel.js +1 -0
- package/dist/component/_generated/server.js +74 -0
- package/dist/component/account.js +197 -0
- package/dist/component/connection/audit.js +152 -0
- package/dist/component/connection/cache.js +205 -0
- package/dist/component/connection/domain/verification.js +63 -0
- package/dist/component/connection/domain.js +108 -0
- package/dist/component/connection/saml/assertion.js +41 -0
- package/dist/component/connection/saml/request.js +61 -0
- package/dist/component/connection/scim/config.js +55 -0
- package/dist/component/connection/scim/identity.js +162 -0
- package/dist/component/connection/secret.js +65 -0
- package/dist/component/connection/webhook/delivery.js +396 -0
- package/dist/component/connection/webhook/endpoint.js +77 -0
- package/dist/component/connection.js +204 -0
- package/dist/component/convex.config.d.ts +7 -0
- package/dist/component/convex.config.js +15 -0
- package/dist/component/crons.js +27 -0
- package/dist/component/event.js +341 -0
- package/dist/component/factor/device.js +141 -0
- package/dist/component/factor/passkey.js +385 -0
- package/dist/component/factor/totp.js +253 -0
- package/dist/component/functions.js +3 -0
- package/dist/component/group/active.js +63 -0
- package/dist/component/group/invite.js +300 -0
- package/dist/component/group/member.js +188 -0
- package/dist/component/group.js +431 -0
- package/dist/component/http.js +9 -0
- package/dist/component/index.d.ts +5 -0
- package/dist/component/index.js +3 -0
- package/dist/component/limits.js +103 -0
- package/dist/component/maintenance.js +205 -0
- package/dist/component/migrations.js +277 -0
- package/dist/component/model.d.ts +384 -0
- package/dist/component/model.js +709 -0
- package/dist/component/modules.js +53 -0
- package/dist/component/oauth/client.js +196 -0
- package/dist/component/oauth/code.js +97 -0
- package/dist/component/oauth/refresh.js +230 -0
- package/dist/component/schema.d.ts +1530 -0
- package/dist/component/schema.js +401 -0
- package/dist/component/session.js +134 -0
- package/dist/component/token/pkce.js +121 -0
- package/dist/component/token/refresh.js +189 -0
- package/dist/component/token/verification.js +155 -0
- package/dist/component/user/email.js +147 -0
- package/dist/component/user/key.js +273 -0
- package/dist/component/user.js +173 -0
- package/dist/core/index.d.ts +531 -0
- package/dist/core/index.js +81 -0
- package/dist/expo/index.d.ts +43 -0
- package/dist/expo/index.js +131 -0
- package/dist/expo/webauthn.js +88 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/NoopLogger.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/index.d.ts +7 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/AnyValue.d.ts +21 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LogRecord.d.ts +36 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/Logger.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LoggerOptions.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LoggerProvider.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/baggage/propagation/W3CBaggagePropagator.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/baggage/utils.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/attributes.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/global-error-handler.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/logging-error-handler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/time.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/types.d.ts +16 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/index.d.ts +13 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/propagation/composite.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/TraceState.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/W3CTraceContextPropagator.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/utils/configuration.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/LogRecordProcessor.d.ts +24 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/LoggerProvider.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/config/LoggerConfigurators.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/BatchLogRecordProcessorBase.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ConsoleLogRecordExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/InMemoryLogRecordExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/LogRecordExporter.d.ts +2 -0
- 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 +4 -0
- 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 +71 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SimpleLogRecordProcessor.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/index.d.ts +11 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/export/BatchLogRecordProcessor.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/types.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/InstrumentDescriptor.d.ts +3 -0
- 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 +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Drop.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/ExponentialHistogram.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Histogram.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/LastValue.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Sum.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/index.d.ts +6 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/types.d.ts +53 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationSelector.d.ts +16 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationTemporality.d.ts +11 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/CardinalitySelector.d.ts +10 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/ConsoleMetricExporter.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/InMemoryMetricExporter.d.ts +3 -0
- 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 +148 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricProducer.d.ts +27 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricReader.d.ts +138 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/PeriodicExportingMetricReader.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/index.d.ts +15 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/types.d.ts +10 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/utils.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/Aggregation.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/AggregationOption.d.ts +41 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/AttributesProcessor.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/InstrumentSelector.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/View.d.ts +5 -0
- 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/BasicTracerProvider.d.ts +2 -0
- 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/IdGenerator.d.ts +11 -0
- 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/Sampler.d.ts +74 -0
- 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 +17 -0
- 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/SpanProcessor.d.ts +43 -0
- 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/TimedEvent.d.ts +19 -0
- 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/BatchSpanProcessorBase.d.ts +6 -0
- 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/ConsoleSpanExporter.d.ts +3 -0
- 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/InMemorySpanExporter.d.ts +3 -0
- 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/NoopSpanProcessor.d.ts +4 -0
- 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 +29 -0
- 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/SimpleSpanProcessor.d.ts +5 -0
- 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/SpanExporter.d.ts +2 -0
- 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/index.d.ts +18 -0
- 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/platform/index.d.ts +1 -0
- 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/platform/node/export/BatchSpanProcessor.d.ts +2 -0
- 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/platform/node/index.d.ts +1 -0
- 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/sampler/AlwaysOffSampler.d.ts +1 -0
- 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/sampler/AlwaysOnSampler.d.ts +1 -0
- 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/sampler/ParentBasedSampler.d.ts +2 -0
- 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/sampler/TraceIdRatioBasedSampler.d.ts +1 -0
- 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 +66 -0
- package/dist/otel.d.ts +73 -0
- package/dist/otel.js +82 -0
- package/dist/permissions/index.d.ts +81 -0
- package/dist/permissions/index.js +18 -0
- package/dist/providers/anonymous.d.ts +35 -0
- package/dist/providers/anonymous.js +40 -0
- package/dist/providers/apple.d.ts +61 -0
- package/dist/providers/apple.js +57 -0
- package/dist/providers/connection.d.ts +30 -0
- package/dist/providers/connection.js +33 -0
- package/dist/providers/credentials.d.ts +78 -0
- package/dist/providers/credentials.js +31 -0
- package/dist/providers/custom.d.ts +96 -0
- package/dist/providers/custom.js +108 -0
- package/dist/providers/device.d.ts +33 -0
- package/dist/providers/device.js +30 -0
- package/dist/providers/email.d.ts +45 -0
- package/dist/providers/email.js +52 -0
- package/dist/providers/github.d.ts +56 -0
- package/dist/providers/github.js +79 -0
- package/dist/providers/google.d.ts +56 -0
- package/dist/providers/google.js +59 -0
- package/dist/providers/index.d.ts +16 -0
- package/dist/providers/index.js +16 -0
- package/dist/providers/microsoft.d.ts +59 -0
- package/dist/providers/microsoft.js +98 -0
- package/dist/providers/password.d.ts +68 -0
- package/dist/providers/password.js +348 -0
- package/dist/providers/phone.d.ts +33 -0
- package/dist/providers/phone.js +35 -0
- package/dist/providers/redirect.d.ts +1 -0
- package/dist/providers/redirect.js +11 -0
- package/dist/providers/totp.d.ts +29 -0
- package/dist/providers/totp.js +29 -0
- package/dist/providers/webauthn/attestation.d.ts +42 -0
- package/dist/providers/webauthn/attestation.js +167 -0
- package/dist/providers/webauthn.d.ts +83 -0
- package/dist/providers/webauthn.js +57 -0
- package/dist/react/index.d.ts +55 -0
- package/dist/react/index.js +80 -0
- package/dist/server/auth.d.ts +443 -0
- package/dist/server/auth.js +178 -0
- package/dist/server/cache/context.js +94 -0
- package/dist/server/component/api.d.ts +14 -0
- package/dist/server/component/api.js +13 -0
- package/dist/server/component/context.d.ts +16 -0
- package/dist/server/component/context.js +1 -0
- package/dist/server/component/factor/db.js +71 -0
- package/dist/server/config.d.ts +3 -0
- package/dist/server/config.js +78 -0
- package/dist/server/connection/config.js +101 -0
- package/dist/server/connection/domain.d.ts +878 -0
- package/dist/server/connection/domain.js +1122 -0
- package/dist/server/connection/group/service.d.ts +25 -0
- package/dist/server/connection/group/service.js +250 -0
- package/dist/server/connection/http.js +1485 -0
- package/dist/server/connection/oidc.js +366 -0
- package/dist/server/connection/policy/domain.js +59 -0
- package/dist/server/connection/policy.d.ts +1 -0
- package/dist/server/connection/policy.js +163 -0
- package/dist/server/connection/profile.js +22 -0
- package/dist/server/connection/provision.js +182 -0
- package/dist/server/connection/saml/api.js +70 -0
- package/dist/server/connection/saml/binding/post.js +140 -0
- package/dist/server/connection/saml/binding/redirect.js +139 -0
- package/dist/server/connection/saml/binding/shared.js +18 -0
- package/dist/server/connection/saml/c14n.js +224 -0
- package/dist/server/connection/saml/constants.js +100 -0
- package/dist/server/connection/saml/crypto.js +170 -0
- package/dist/server/connection/saml/dom/select.js +299 -0
- package/dist/server/connection/saml/encoding.js +93 -0
- package/dist/server/connection/saml/encryption.js +34 -0
- package/dist/server/connection/saml/entity.js +24 -0
- package/dist/server/connection/saml/extractor.js +408 -0
- package/dist/server/connection/saml/flow.js +150 -0
- package/dist/server/connection/saml/identity/provider.js +66 -0
- package/dist/server/connection/saml/index.js +5 -0
- package/dist/server/connection/saml/metadata.js +294 -0
- package/dist/server/connection/saml/service/provider.js +117 -0
- package/dist/server/connection/saml/signature.js +214 -0
- package/dist/server/connection/saml/template.js +68 -0
- package/dist/server/connection/saml/types.js +1 -0
- package/dist/server/connection/saml/validator.js +32 -0
- package/dist/server/connection/saml/xml/builder.js +68 -0
- package/dist/server/connection/saml/xmldsig.js +598 -0
- package/dist/server/connection/saml/xmlenc.js +162 -0
- package/dist/server/connection/saml.d.ts +56 -0
- package/dist/server/connection/saml.js +762 -0
- package/dist/server/connection/scim.js +115 -0
- package/dist/server/connection/shared.js +74 -0
- package/dist/server/connection/webhook.js +163 -0
- package/dist/server/context.d.ts +137 -0
- package/dist/server/context.js +108 -0
- package/dist/server/contract.d.ts +48 -0
- package/dist/server/contract.js +107 -0
- package/dist/server/cookies.js +90 -0
- package/dist/server/core.js +163 -0
- package/dist/server/cors.d.ts +22 -0
- package/dist/server/cors.js +93 -0
- package/dist/server/crypto.js +43 -0
- package/dist/server/db.js +88 -0
- package/dist/server/device.js +140 -0
- package/dist/server/domains/access.js +29 -0
- package/dist/server/domains/account.d.ts +16 -0
- package/dist/server/domains/account.js +92 -0
- package/dist/server/domains/factor.d.ts +28 -0
- package/dist/server/domains/factor.js +115 -0
- package/dist/server/domains/group.js +87 -0
- package/dist/server/domains/invite.js +76 -0
- package/dist/server/domains/key.js +253 -0
- package/dist/server/domains/member.js +149 -0
- package/dist/server/domains/session.js +29 -0
- package/dist/server/domains/user.js +119 -0
- package/dist/server/env.d.ts +46 -0
- package/dist/server/env.js +96 -0
- package/dist/server/errors.js +38 -0
- package/dist/server/events.d.ts +880 -0
- package/dist/server/events.js +406 -0
- package/dist/server/facade.d.ts +83 -0
- package/dist/server/facade.js +124 -0
- package/dist/server/http.d.ts +125 -0
- package/dist/server/http.js +566 -0
- package/dist/server/identity/claims.js +58 -0
- package/dist/server/identity/convex.d.ts +15 -0
- package/dist/server/identity/convex.js +1 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.js +11 -0
- package/dist/server/keys.js +60 -0
- package/dist/server/limits.js +41 -0
- package/dist/server/log.js +28 -0
- package/dist/server/mcp.d.ts +19 -0
- package/dist/server/mcp.js +250 -0
- package/dist/server/mutations/account.js +47 -0
- package/dist/server/mutations/calls.js +16 -0
- package/dist/server/mutations/code.js +91 -0
- package/dist/server/mutations/credentials/signin.js +210 -0
- package/dist/server/mutations/invalidate.js +60 -0
- package/dist/server/mutations/oauth.js +251 -0
- package/dist/server/mutations/refresh.js +152 -0
- package/dist/server/mutations/register.js +93 -0
- package/dist/server/mutations/retrieve.js +66 -0
- package/dist/server/mutations/signature.js +36 -0
- package/dist/server/mutations/signin.js +81 -0
- package/dist/server/mutations/signout.js +61 -0
- package/dist/server/mutations/store/refs.js +15 -0
- package/dist/server/mutations/store.js +82 -0
- package/dist/server/mutations/verifier.js +25 -0
- package/dist/server/mutations/verify.js +199 -0
- package/dist/server/oauth/authorize.js +98 -0
- package/dist/server/oauth/client.d.ts +93 -0
- package/dist/server/oauth/client.js +115 -0
- package/dist/server/oauth/code.d.ts +63 -0
- package/dist/server/oauth/code.js +124 -0
- package/dist/server/oauth/domain.d.ts +23 -0
- package/dist/server/oauth/domain.js +1 -0
- package/dist/server/oauth/factory.js +46 -0
- package/dist/server/oauth/grant.js +46 -0
- package/dist/server/oauth/handlers.js +108 -0
- package/dist/server/oauth/manage.js +121 -0
- package/dist/server/oauth/normalize.js +27 -0
- package/dist/server/oauth/refresh.d.ts +71 -0
- package/dist/server/oauth/refresh.js +132 -0
- package/dist/server/oauth/register.js +147 -0
- package/dist/server/oauth/runtime.js +280 -0
- package/dist/server/oauth/token.js +355 -0
- package/dist/server/payloads.d.ts +16 -0
- package/dist/server/payloads.js +30 -0
- package/dist/server/preload.d.ts +249 -0
- package/dist/server/preload.js +673 -0
- package/dist/server/random.js +25 -0
- package/dist/server/redirects.js +85 -0
- package/dist/server/runtime.d.ts +845 -0
- package/dist/server/runtime.js +387 -0
- package/dist/server/secret.js +46 -0
- package/dist/server/services/factors.js +117 -0
- package/dist/server/services/providers.js +23 -0
- package/dist/server/services/resolve.js +17 -0
- package/dist/server/session/lifecycle.d.ts +23 -0
- package/dist/server/session/lifecycle.js +139 -0
- package/dist/server/signin/flow.js +359 -0
- package/dist/server/telemetry.js +68 -0
- package/dist/server/templates.js +91 -0
- package/dist/server/token/refresh.js +35 -0
- package/dist/server/tokens.js +164 -0
- package/dist/server/totp.js +282 -0
- package/dist/server/types.d.ts +1154 -0
- package/dist/server/types.js +1 -0
- package/dist/server/url.js +43 -0
- package/dist/server/user/account.js +325 -0
- package/dist/server/utils/bearer.js +24 -0
- package/dist/server/utils/cache.js +51 -0
- package/dist/server/utils/retry.js +3 -0
- package/dist/server/utils/span.js +59 -0
- package/dist/server/validators.d.ts +2061 -0
- package/dist/server/validators.js +320 -0
- package/dist/server/webauthn.js +699 -0
- package/dist/server/wellknown.d.ts +74 -0
- package/dist/server/wellknown.js +195 -0
- package/dist/shared/brand.d.ts +28 -0
- package/dist/shared/brand.js +13 -0
- package/dist/shared/codes.d.ts +99 -0
- package/dist/shared/codes.js +98 -0
- package/dist/shared/compare.js +23 -0
- package/dist/shared/errors.js +24 -0
- package/dist/shared/event/kinds.d.ts +188 -0
- package/dist/shared/event/kinds.js +103 -0
- package/dist/shared/fetch/guard.js +189 -0
- package/dist/shared/log.js +62 -0
- package/dist/shared/results.d.ts +58 -0
- package/dist/shared/retry.js +27 -0
- package/dist/shared/webauthn.js +9 -0
- package/dist/svelte/AuthLoading.svelte +13 -0
- package/dist/svelte/AuthLoading.svelte.d.ts +8 -0
- package/dist/svelte/SignedIn.svelte +14 -0
- package/dist/svelte/SignedIn.svelte.d.ts +8 -0
- package/dist/svelte/SignedOut.svelte +13 -0
- package/dist/svelte/SignedOut.svelte.d.ts +8 -0
- package/dist/svelte/context.svelte.d.ts +26 -0
- package/dist/svelte/context.svelte.js +61 -0
- package/dist/svelte/index.d.ts +5 -0
- package/dist/svelte/index.js +4 -0
- package/dist/test.d.ts +48 -0
- package/dist/test.js +54 -0
- package/package.json +247 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { BINDING_URI, ElementsOrder, NameIdFormat, SamlNamespace } from "./constants.js";
|
|
2
|
+
import { extract } from "./extractor.js";
|
|
3
|
+
import { castArrayOpt, isNonEmptyArray, isString } from "./encoding.js";
|
|
4
|
+
import { createKeySection } from "./signature.js";
|
|
5
|
+
import { buildXml } from "./xml/builder.js";
|
|
6
|
+
|
|
7
|
+
//#region src/server/connection/saml/metadata.ts
|
|
8
|
+
/**
|
|
9
|
+
* SAML metadata parsing — pure functions, no classes.
|
|
10
|
+
*
|
|
11
|
+
* Replaces the `Metadata` / `IdpMetadata` / `SpMetadata` class hierarchy with
|
|
12
|
+
* two factory functions and explicit interface contracts, matching the HOF
|
|
13
|
+
* pattern used throughout the rest of the library.
|
|
14
|
+
*/
|
|
15
|
+
function isSloService(value) {
|
|
16
|
+
return typeof value === "object" && value !== null;
|
|
17
|
+
}
|
|
18
|
+
function isAcsService(value) {
|
|
19
|
+
return typeof value === "object" && value !== null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Read a parsed-metadata field as a string. The extractor yields attribute and
|
|
23
|
+
* text values as strings; this preserves the original behavior of returning the
|
|
24
|
+
* raw value (which the accessor contracts type as `string`).
|
|
25
|
+
*/
|
|
26
|
+
function metaString(meta, key) {
|
|
27
|
+
return meta[key];
|
|
28
|
+
}
|
|
29
|
+
/** Narrow an open metadata value to a record of attributes, or `undefined`. */
|
|
30
|
+
function readRecord(value) {
|
|
31
|
+
return typeof value === "object" && value !== null ? value : void 0;
|
|
32
|
+
}
|
|
33
|
+
function parseBaseFields(xml, extraParse) {
|
|
34
|
+
const xmlString = xml.toString();
|
|
35
|
+
const parsed = extract(xmlString, [
|
|
36
|
+
{
|
|
37
|
+
key: "entityDescriptor",
|
|
38
|
+
localPath: ["EntityDescriptor"],
|
|
39
|
+
attributes: [],
|
|
40
|
+
context: true
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
key: "entityID",
|
|
44
|
+
localPath: ["EntityDescriptor"],
|
|
45
|
+
attributes: ["entityID"]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
key: "sharedCertificate",
|
|
49
|
+
localPath: [
|
|
50
|
+
"EntityDescriptor",
|
|
51
|
+
"~SSODescriptor",
|
|
52
|
+
"KeyDescriptor",
|
|
53
|
+
"KeyInfo",
|
|
54
|
+
"X509Data",
|
|
55
|
+
"X509Certificate"
|
|
56
|
+
],
|
|
57
|
+
attributes: []
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
key: "certificate",
|
|
61
|
+
localPath: [
|
|
62
|
+
"EntityDescriptor",
|
|
63
|
+
"~SSODescriptor",
|
|
64
|
+
"KeyDescriptor"
|
|
65
|
+
],
|
|
66
|
+
index: ["use"],
|
|
67
|
+
attributePath: [
|
|
68
|
+
"KeyInfo",
|
|
69
|
+
"X509Data",
|
|
70
|
+
"X509Certificate"
|
|
71
|
+
],
|
|
72
|
+
attributes: []
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
key: "singleLogoutService",
|
|
76
|
+
localPath: [
|
|
77
|
+
"EntityDescriptor",
|
|
78
|
+
"~SSODescriptor",
|
|
79
|
+
"SingleLogoutService"
|
|
80
|
+
],
|
|
81
|
+
attributes: ["Binding", "Location"]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
key: "nameIDFormat",
|
|
85
|
+
localPath: [
|
|
86
|
+
"EntityDescriptor",
|
|
87
|
+
"~SSODescriptor",
|
|
88
|
+
"NameIDFormat"
|
|
89
|
+
],
|
|
90
|
+
attributes: []
|
|
91
|
+
},
|
|
92
|
+
...extraParse
|
|
93
|
+
]);
|
|
94
|
+
if (typeof parsed.sharedCertificate === "string") {
|
|
95
|
+
parsed.certificate = {
|
|
96
|
+
signing: parsed.sharedCertificate,
|
|
97
|
+
encryption: parsed.sharedCertificate
|
|
98
|
+
};
|
|
99
|
+
delete parsed.sharedCertificate;
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(parsed.entityDescriptor) && parsed.entityDescriptor.length > 1) throw new Error("ERR_MULTIPLE_METADATA_ENTITYDESCRIPTOR");
|
|
102
|
+
return {
|
|
103
|
+
xmlString,
|
|
104
|
+
meta: parsed
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function getX509Certificate(meta, use) {
|
|
108
|
+
const certificate = meta.certificate;
|
|
109
|
+
if (typeof certificate === "object" && certificate !== null) return certificate[use] ?? null;
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
function getNameIDFormat(meta) {
|
|
113
|
+
return meta.nameIDFormat ?? [];
|
|
114
|
+
}
|
|
115
|
+
function getSingleLogoutService(meta, binding) {
|
|
116
|
+
if (binding && isString(binding)) {
|
|
117
|
+
const bindType = BINDING_URI[binding];
|
|
118
|
+
const raw = meta.singleLogoutService;
|
|
119
|
+
const service = (Array.isArray(raw) ? raw : raw ? [raw] : []).find((obj) => isSloService(obj) && obj.binding === bindType);
|
|
120
|
+
if (service) return service.location;
|
|
121
|
+
}
|
|
122
|
+
return meta.singleLogoutService;
|
|
123
|
+
}
|
|
124
|
+
/** Parse IdP metadata, or build it from {@link MetadataIdpOptions} when options are given. */
|
|
125
|
+
function parseIdpMetadata(input) {
|
|
126
|
+
let xmlInput;
|
|
127
|
+
if (isString(input) || input instanceof Uint8Array) xmlInput = input;
|
|
128
|
+
else {
|
|
129
|
+
const { entityID, signingCert, encryptCert, wantAuthnRequestsSigned = false, nameIDFormat = [], singleSignOnService = [], singleLogoutService = [] } = input;
|
|
130
|
+
const IDPSSODescriptor = [{ _attr: {
|
|
131
|
+
WantAuthnRequestsSigned: String(wantAuthnRequestsSigned),
|
|
132
|
+
protocolSupportEnumeration: SamlNamespace.protocol
|
|
133
|
+
} }];
|
|
134
|
+
for (const cert of castArrayOpt(signingCert)) IDPSSODescriptor.push({ KeyDescriptor: createKeySection("signing", cert).KeyDescriptor });
|
|
135
|
+
for (const cert of castArrayOpt(encryptCert)) IDPSSODescriptor.push({ KeyDescriptor: createKeySection("encryption", cert).KeyDescriptor });
|
|
136
|
+
if (isNonEmptyArray(nameIDFormat)) nameIDFormat.forEach((f) => IDPSSODescriptor.push({ NameIDFormat: f }));
|
|
137
|
+
if (isNonEmptyArray(singleSignOnService)) singleSignOnService.forEach((a) => {
|
|
138
|
+
const attr = {
|
|
139
|
+
Binding: a.Binding,
|
|
140
|
+
Location: a.Location
|
|
141
|
+
};
|
|
142
|
+
if (a.isDefault) attr.isDefault = true;
|
|
143
|
+
IDPSSODescriptor.push({ SingleSignOnService: [{ _attr: attr }] });
|
|
144
|
+
});
|
|
145
|
+
else throw new Error("ERR_IDP_METADATA_MISSING_SINGLE_SIGN_ON_SERVICE");
|
|
146
|
+
if (isNonEmptyArray(singleLogoutService)) singleLogoutService.forEach((a) => {
|
|
147
|
+
const attr = {
|
|
148
|
+
Binding: a.Binding,
|
|
149
|
+
Location: a.Location
|
|
150
|
+
};
|
|
151
|
+
if (a.isDefault) attr.isDefault = true;
|
|
152
|
+
IDPSSODescriptor.push({ SingleLogoutService: [{ _attr: attr }] });
|
|
153
|
+
});
|
|
154
|
+
else console.warn("Construct identity provider - missing endpoint of SingleLogoutService");
|
|
155
|
+
xmlInput = buildXml([{ EntityDescriptor: [{ _attr: {
|
|
156
|
+
xmlns: SamlNamespace.metadata,
|
|
157
|
+
"xmlns:assertion": SamlNamespace.assertion,
|
|
158
|
+
"xmlns:ds": "http://www.w3.org/2000/09/xmldsig#",
|
|
159
|
+
entityID
|
|
160
|
+
} }, { IDPSSODescriptor }] }]);
|
|
161
|
+
}
|
|
162
|
+
const { xmlString, meta } = parseBaseFields(xmlInput, [{
|
|
163
|
+
key: "wantAuthnRequestsSigned",
|
|
164
|
+
localPath: ["EntityDescriptor", "IDPSSODescriptor"],
|
|
165
|
+
attributes: ["WantAuthnRequestsSigned"]
|
|
166
|
+
}, {
|
|
167
|
+
key: "singleSignOnService",
|
|
168
|
+
localPath: [
|
|
169
|
+
"EntityDescriptor",
|
|
170
|
+
"IDPSSODescriptor",
|
|
171
|
+
"SingleSignOnService"
|
|
172
|
+
],
|
|
173
|
+
index: ["Binding"],
|
|
174
|
+
attributePath: [],
|
|
175
|
+
attributes: ["Location"]
|
|
176
|
+
}]);
|
|
177
|
+
return {
|
|
178
|
+
xmlString,
|
|
179
|
+
getEntityID: () => metaString(meta, "entityID"),
|
|
180
|
+
getX509Certificate: (use) => getX509Certificate(meta, use),
|
|
181
|
+
getNameIDFormat: () => getNameIDFormat(meta),
|
|
182
|
+
getSingleLogoutService: (binding) => getSingleLogoutService(meta, binding),
|
|
183
|
+
isWantAuthnRequestsSigned: () => {
|
|
184
|
+
const v = meta.wantAuthnRequestsSigned;
|
|
185
|
+
return v === "true" || v === true;
|
|
186
|
+
},
|
|
187
|
+
getSingleSignOnService: (binding) => {
|
|
188
|
+
if (isString(binding)) {
|
|
189
|
+
const bindName = BINDING_URI[binding];
|
|
190
|
+
const map = meta.singleSignOnService;
|
|
191
|
+
if (typeof map === "object" && map !== null) {
|
|
192
|
+
const service = map[bindName];
|
|
193
|
+
if (service) return service;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return meta.singleSignOnService;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/** Parse SP metadata, or build it from {@link MetadataSpOptions} when options are given. */
|
|
201
|
+
function parseSpMetadata(input) {
|
|
202
|
+
let xmlInput;
|
|
203
|
+
if (isString(input) || input instanceof Uint8Array) xmlInput = input;
|
|
204
|
+
else {
|
|
205
|
+
const { elementsOrder = ElementsOrder.default, entityID, signingCert, encryptCert, authnRequestsSigned = false, wantAssertionsSigned = false, wantMessageSigned = false, signatureConfig, nameIDFormat = [], singleLogoutService = [], assertionConsumerService = [] } = input;
|
|
206
|
+
const descriptors = {
|
|
207
|
+
KeyDescriptor: [],
|
|
208
|
+
NameIDFormat: [],
|
|
209
|
+
SingleLogoutService: [],
|
|
210
|
+
AssertionConsumerService: [],
|
|
211
|
+
AttributeConsumingService: []
|
|
212
|
+
};
|
|
213
|
+
const SPSSODescriptor = [{ _attr: {
|
|
214
|
+
AuthnRequestsSigned: String(authnRequestsSigned),
|
|
215
|
+
WantAssertionsSigned: String(wantAssertionsSigned),
|
|
216
|
+
protocolSupportEnumeration: SamlNamespace.protocol
|
|
217
|
+
} }];
|
|
218
|
+
if (wantMessageSigned && signatureConfig === void 0) console.warn("Construct service provider - missing signatureConfig");
|
|
219
|
+
for (const cert of castArrayOpt(signingCert)) descriptors.KeyDescriptor.push(createKeySection("signing", cert).KeyDescriptor);
|
|
220
|
+
for (const cert of castArrayOpt(encryptCert)) descriptors.KeyDescriptor.push(createKeySection("encryption", cert).KeyDescriptor);
|
|
221
|
+
if (isNonEmptyArray(nameIDFormat)) nameIDFormat.forEach((f) => descriptors.NameIDFormat.push(f));
|
|
222
|
+
else descriptors.NameIDFormat.push(NameIdFormat.emailAddress);
|
|
223
|
+
if (isNonEmptyArray(singleLogoutService)) singleLogoutService.forEach((a) => {
|
|
224
|
+
const attr = {
|
|
225
|
+
Binding: a.Binding,
|
|
226
|
+
Location: a.Location
|
|
227
|
+
};
|
|
228
|
+
if (a.isDefault) attr.isDefault = true;
|
|
229
|
+
descriptors.SingleLogoutService.push([{ _attr: attr }]);
|
|
230
|
+
});
|
|
231
|
+
if (isNonEmptyArray(assertionConsumerService)) {
|
|
232
|
+
let indexCount = 0;
|
|
233
|
+
assertionConsumerService.forEach((a) => {
|
|
234
|
+
const attr = {
|
|
235
|
+
index: String(indexCount++),
|
|
236
|
+
Binding: a.Binding,
|
|
237
|
+
Location: a.Location
|
|
238
|
+
};
|
|
239
|
+
if (a.isDefault) attr.isDefault = true;
|
|
240
|
+
descriptors.AssertionConsumerService.push([{ _attr: attr }]);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
elementsOrder.filter((name) => isNonEmptyArray(descriptors[name])).forEach((name) => {
|
|
244
|
+
descriptors[name].forEach((e) => SPSSODescriptor.push({ [name]: e }));
|
|
245
|
+
});
|
|
246
|
+
xmlInput = buildXml([{ EntityDescriptor: [{ _attr: {
|
|
247
|
+
entityID,
|
|
248
|
+
xmlns: SamlNamespace.metadata,
|
|
249
|
+
"xmlns:assertion": SamlNamespace.assertion,
|
|
250
|
+
"xmlns:ds": "http://www.w3.org/2000/09/xmldsig#"
|
|
251
|
+
} }, { SPSSODescriptor }] }]);
|
|
252
|
+
}
|
|
253
|
+
const { xmlString, meta } = parseBaseFields(xmlInput, [{
|
|
254
|
+
key: "spSSODescriptor",
|
|
255
|
+
localPath: ["EntityDescriptor", "SPSSODescriptor"],
|
|
256
|
+
attributes: ["WantAssertionsSigned", "AuthnRequestsSigned"]
|
|
257
|
+
}, {
|
|
258
|
+
key: "assertionConsumerService",
|
|
259
|
+
localPath: [
|
|
260
|
+
"EntityDescriptor",
|
|
261
|
+
"SPSSODescriptor",
|
|
262
|
+
"AssertionConsumerService"
|
|
263
|
+
],
|
|
264
|
+
attributes: [
|
|
265
|
+
"Binding",
|
|
266
|
+
"Location",
|
|
267
|
+
"isDefault",
|
|
268
|
+
"index"
|
|
269
|
+
]
|
|
270
|
+
}]);
|
|
271
|
+
return {
|
|
272
|
+
xmlString,
|
|
273
|
+
getMetadata: () => xmlString,
|
|
274
|
+
getEntityID: () => metaString(meta, "entityID"),
|
|
275
|
+
getX509Certificate: (use) => getX509Certificate(meta, use),
|
|
276
|
+
getNameIDFormat: () => getNameIDFormat(meta),
|
|
277
|
+
getSingleLogoutService: (binding) => getSingleLogoutService(meta, binding),
|
|
278
|
+
isWantAssertionsSigned: () => readRecord(meta.spSSODescriptor)?.wantAssertionsSigned === "true",
|
|
279
|
+
isAuthnRequestSigned: () => readRecord(meta.spSSODescriptor)?.authnRequestsSigned === "true",
|
|
280
|
+
getAssertionConsumerService: (binding) => {
|
|
281
|
+
if (isString(binding)) {
|
|
282
|
+
const bindName = BINDING_URI[binding];
|
|
283
|
+
const services = meta.assertionConsumerService;
|
|
284
|
+
if (Array.isArray(services)) return services.find((obj) => isAcsService(obj) && obj.binding === bindName)?.location;
|
|
285
|
+
if (isAcsService(services) && services.binding === bindName) return services.location;
|
|
286
|
+
}
|
|
287
|
+
return meta.assertionConsumerService;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
//#endregion
|
|
293
|
+
export { parseIdpMetadata, parseSpMetadata };
|
|
294
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { BINDING_URI } from "../constants.js";
|
|
2
|
+
import { DEFAULT_ENTITY_SETTINGS } from "../entity.js";
|
|
3
|
+
import { parseSpMetadata } from "../metadata.js";
|
|
4
|
+
import { flow } from "../flow.js";
|
|
5
|
+
import { loginRequestRedirectURL, logoutResponseRedirectURL } from "../binding/redirect.js";
|
|
6
|
+
import { base64LoginRequest, base64LogoutResponse } from "../binding/post.js";
|
|
7
|
+
|
|
8
|
+
//#region src/server/connection/saml/service/provider.ts
|
|
9
|
+
/** Service-provider entity factory. */
|
|
10
|
+
/**
|
|
11
|
+
* The redirect bindings declare `customTagReplacement` over {@link SAMLDocumentTemplate}
|
|
12
|
+
* rather than `string`. The callback never inspects the parameter's nominal shape, so the
|
|
13
|
+
* bridge is type-only.
|
|
14
|
+
*/
|
|
15
|
+
function asDocumentTemplateReplacement(replacement) {
|
|
16
|
+
return replacement;
|
|
17
|
+
}
|
|
18
|
+
function isBindingKey(binding) {
|
|
19
|
+
return Object.prototype.hasOwnProperty.call(BINDING_URI, binding);
|
|
20
|
+
}
|
|
21
|
+
function bindingProtocol(binding) {
|
|
22
|
+
return isBindingKey(binding) ? BINDING_URI[binding] : void 0;
|
|
23
|
+
}
|
|
24
|
+
/** Build an {@link ServiceProviderEntity} from service-provider settings or metadata. */
|
|
25
|
+
function createServiceProvider(settings) {
|
|
26
|
+
const entitySetting = Object.assign(
|
|
27
|
+
{},
|
|
28
|
+
DEFAULT_ENTITY_SETTINGS,
|
|
29
|
+
{
|
|
30
|
+
authnRequestsSigned: false,
|
|
31
|
+
wantAssertionsSigned: false,
|
|
32
|
+
wantMessageSigned: false
|
|
33
|
+
},
|
|
34
|
+
settings
|
|
35
|
+
/** `Object.assign` yields a structural intersection; widen to the named, mutable SamlEntitySettings. */
|
|
36
|
+
);
|
|
37
|
+
const entityMeta = parseSpMetadata(settings.metadata ?? settings);
|
|
38
|
+
entitySetting.authnRequestsSigned = entityMeta.isAuthnRequestSigned();
|
|
39
|
+
entitySetting.wantAssertionsSigned = entityMeta.isWantAssertionsSigned();
|
|
40
|
+
entitySetting.nameIDFormat = entityMeta.getNameIDFormat() || entitySetting.nameIDFormat;
|
|
41
|
+
let sp;
|
|
42
|
+
sp = {
|
|
43
|
+
entitySetting,
|
|
44
|
+
entityMeta,
|
|
45
|
+
getMetadata: () => entityMeta.getMetadata(),
|
|
46
|
+
createLoginRequest: async (idp, binding = "redirect", customTagReplacement) => {
|
|
47
|
+
const protocol = bindingProtocol(binding);
|
|
48
|
+
if (entityMeta.isAuthnRequestSigned() !== idp.entityMeta.isWantAuthnRequestsSigned()) throw new Error("ERR_METADATA_CONFLICT_REQUEST_SIGNED_FLAG");
|
|
49
|
+
if (protocol === BINDING_URI.redirect) return loginRequestRedirectURL({
|
|
50
|
+
idp,
|
|
51
|
+
sp
|
|
52
|
+
}, asDocumentTemplateReplacement(customTagReplacement));
|
|
53
|
+
if (protocol === BINDING_URI.post) return {
|
|
54
|
+
...await base64LoginRequest("/*[local-name(.)='AuthnRequest']", {
|
|
55
|
+
idp,
|
|
56
|
+
sp
|
|
57
|
+
}, customTagReplacement),
|
|
58
|
+
relayState: entitySetting.relayState,
|
|
59
|
+
entityEndpoint: idp.entityMeta.getSingleSignOnService(binding),
|
|
60
|
+
type: "SAMLRequest"
|
|
61
|
+
};
|
|
62
|
+
throw new Error("ERR_SP_LOGIN_REQUEST_UNDEFINED_BINDING");
|
|
63
|
+
},
|
|
64
|
+
parseLoginResponse: (idp, binding, request) => flow({
|
|
65
|
+
from: idp,
|
|
66
|
+
self: sp,
|
|
67
|
+
checkSignature: true,
|
|
68
|
+
parserType: "SAMLResponse",
|
|
69
|
+
binding,
|
|
70
|
+
request
|
|
71
|
+
}),
|
|
72
|
+
parseLogoutRequest: (idp, binding, request) => flow({
|
|
73
|
+
from: idp,
|
|
74
|
+
self: sp,
|
|
75
|
+
parserType: "LogoutRequest",
|
|
76
|
+
checkSignature: entitySetting.wantLogoutRequestSigned,
|
|
77
|
+
binding,
|
|
78
|
+
request
|
|
79
|
+
}),
|
|
80
|
+
parseLogoutResponse: (idp, binding, request) => flow({
|
|
81
|
+
from: idp,
|
|
82
|
+
self: sp,
|
|
83
|
+
parserType: "LogoutResponse",
|
|
84
|
+
checkSignature: entitySetting.wantLogoutResponseSigned,
|
|
85
|
+
binding,
|
|
86
|
+
request
|
|
87
|
+
}),
|
|
88
|
+
createLogoutResponse: async (target, requestInfo, binding, relayState = "", customTagReplacement) => {
|
|
89
|
+
const protocol = bindingProtocol(binding);
|
|
90
|
+
if (protocol === BINDING_URI.redirect) return logoutResponseRedirectURL(requestInfo, {
|
|
91
|
+
init: sp,
|
|
92
|
+
target
|
|
93
|
+
}, relayState, asDocumentTemplateReplacement(customTagReplacement));
|
|
94
|
+
if (protocol === BINDING_URI.post) return {
|
|
95
|
+
...await base64LogoutResponse(
|
|
96
|
+
requestInfo,
|
|
97
|
+
{
|
|
98
|
+
init: sp,
|
|
99
|
+
target
|
|
100
|
+
},
|
|
101
|
+
/** The binding declares this parameter required; the SP contract has always
|
|
102
|
+
* forwarded it optionally, preserving the prior pass-through behavior. */
|
|
103
|
+
customTagReplacement
|
|
104
|
+
),
|
|
105
|
+
relayState,
|
|
106
|
+
entityEndpoint: target.entityMeta.getSingleLogoutService(binding),
|
|
107
|
+
type: "SAMLResponse"
|
|
108
|
+
};
|
|
109
|
+
throw new Error("ERR_CREATE_LOGOUT_RESPONSE_UNDEFINED_BINDING");
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
return sp;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//#endregion
|
|
116
|
+
export { createServiceProvider };
|
|
117
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { DIGEST_BY_SIGNATURE, SignatureAlgorithm } from "./constants.js";
|
|
2
|
+
import { getContext } from "./api.js";
|
|
3
|
+
import { isElementNode, isTextNode, selectXPath, serializeXmlNode } from "./dom/select.js";
|
|
4
|
+
import { base64Encode, flattenDeep, normalizeCerString, readPrivateKey, toUtf8String } from "./encoding.js";
|
|
5
|
+
import { getPublicKeyPemFromCert, rsaSign, rsaVerify } from "./crypto.js";
|
|
6
|
+
import { constructMessageSignature as constructMessageSignature$1, constructSamlSignature as constructSamlSignature$1, createSignedXml, schemeToHash, verifyMessageSignature as verifyMessageSignature$1 } from "./xmldsig.js";
|
|
7
|
+
import { decodeBase64, encodeBase64 } from "@oslojs/encoding";
|
|
8
|
+
|
|
9
|
+
//#region src/server/connection/saml/signature.ts
|
|
10
|
+
/** Map XML-dsig signature algorithm URIs to node-rsa signing-scheme aliases. */
|
|
11
|
+
const nrsaAliasMapping = {
|
|
12
|
+
"http://www.w3.org/2000/09/xmldsig#rsa-sha1": "pkcs1-sha1",
|
|
13
|
+
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256": "pkcs1-sha256",
|
|
14
|
+
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha512": "pkcs1-sha512"
|
|
15
|
+
};
|
|
16
|
+
const signatureAlgorithms = SignatureAlgorithm;
|
|
17
|
+
const digestAlgorithms = DIGEST_BY_SIGNATURE;
|
|
18
|
+
function getDigestMethod(sigAlg) {
|
|
19
|
+
return digestAlgorithms[sigAlg];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Read the text data of an `<X509Certificate>`'s first child, narrowing the
|
|
23
|
+
* XPath result to an element/text node. Mirrors the prior `node.firstChild.data`
|
|
24
|
+
* access; a non-text or missing child yields an empty certificate string, which
|
|
25
|
+
* downstream certificate matching rejects.
|
|
26
|
+
*/
|
|
27
|
+
function certificateNodeData(node) {
|
|
28
|
+
if (isElementNode(node)) {
|
|
29
|
+
const child = node.firstChild;
|
|
30
|
+
if (child !== null && isTextNode(child) && child.data !== null) return child.data;
|
|
31
|
+
}
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
function toPemCertificate(certificate) {
|
|
35
|
+
if (certificate.indexOf("BEGIN CERTIFICATE") >= 0) return certificate;
|
|
36
|
+
return `-----BEGIN CERTIFICATE-----\n${certificate}\n-----END CERTIFICATE-----`;
|
|
37
|
+
}
|
|
38
|
+
function bytesToBinaryString(input) {
|
|
39
|
+
let output = "";
|
|
40
|
+
for (const byte of input) output += String.fromCodePoint(byte);
|
|
41
|
+
return output;
|
|
42
|
+
}
|
|
43
|
+
/** Construct the XML signature for POST binding, returning a base64-encoded string. */
|
|
44
|
+
async function constructSamlSignature(opts) {
|
|
45
|
+
return constructSamlSignature$1({
|
|
46
|
+
...opts,
|
|
47
|
+
signatureAlgorithm: opts.signatureAlgorithm || signatureAlgorithms.RSA_SHA256,
|
|
48
|
+
getDigestMethod,
|
|
49
|
+
getKeyInfo,
|
|
50
|
+
readPrivateKey: (keyString, passphrase, isOutputString) => readPrivateKey(keyString, passphrase, isOutputString),
|
|
51
|
+
base64Encode
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Verify the XML signature.
|
|
56
|
+
*
|
|
57
|
+
* Hardened against XML Signature Wrapping (XSW): signatures are located with
|
|
58
|
+
* absolute XPaths rather than by naively fetching the first `Signature`
|
|
59
|
+
* element, and any signature/assertion smuggled inside
|
|
60
|
+
* `SubjectConfirmationData` is rejected as a potential wrapping attack.
|
|
61
|
+
*
|
|
62
|
+
* Per SAML core 5.4.2 (References): a SAML assertion or protocol message
|
|
63
|
+
* being signed MUST carry an ID on its root element, and the signature MUST
|
|
64
|
+
* contain a single `<ds:Reference>` whose URI is a same-document reference
|
|
65
|
+
* to that ID (e.g. `#foo` for ID `foo`). Only references that actually
|
|
66
|
+
* passed verification are returned, so the assertion handed back is
|
|
67
|
+
* cryptographically authenticated rather than merely present in the document.
|
|
68
|
+
*
|
|
69
|
+
* Fails closed: a failed assertion signature aborts immediately rather than
|
|
70
|
+
* falling through to another candidate. When `opts.metadata` is supplied,
|
|
71
|
+
* the response's X509 certificate is pinned to one declared in metadata
|
|
72
|
+
* (supporting rolling certificate usage). If metadata declares no signing
|
|
73
|
+
* certificate, verification is rejected (`NO_SELECTED_CERTIFICATE`) rather than
|
|
74
|
+
* trusting a certificate embedded in the assertion itself — a self-signed forgery
|
|
75
|
+
* must never be allowed to verify against its own bundled certificate.
|
|
76
|
+
*
|
|
77
|
+
* Returns a tuple where the first element is `true` if the signature is valid,
|
|
78
|
+
* and the second is the cryptographically authenticated assertion node as a
|
|
79
|
+
* string, or `null` if not found.
|
|
80
|
+
*/
|
|
81
|
+
async function verifySignature(xml, opts) {
|
|
82
|
+
const { dom } = getContext();
|
|
83
|
+
const doc = dom.parseFromString(xml);
|
|
84
|
+
const { dom: docParser } = getContext();
|
|
85
|
+
const messageSignatureXpath = "/*[contains(local-name(), 'Response') or contains(local-name(), 'Request')]/*[local-name(.)='Signature']";
|
|
86
|
+
const assertionSignatureXpath = "/*[contains(local-name(), 'Response') or contains(local-name(), 'Request')]/*[local-name(.)='Assertion']/*[local-name(.)='Signature']";
|
|
87
|
+
const wrappingElementsXPath = "/*[contains(local-name(), 'Response')]/*[local-name(.)='Assertion']/*[local-name(.)='Subject']/*[local-name(.)='SubjectConfirmation']/*[local-name(.)='SubjectConfirmationData']//*[local-name(.)='Assertion' or local-name(.)='Signature']";
|
|
88
|
+
let selection = [];
|
|
89
|
+
const messageSignatureNode = selectXPath(messageSignatureXpath, doc);
|
|
90
|
+
const assertionSignatureNode = selectXPath(assertionSignatureXpath, doc);
|
|
91
|
+
const wrappingElementNode = selectXPath(wrappingElementsXPath, doc);
|
|
92
|
+
selection = selection.concat(assertionSignatureNode);
|
|
93
|
+
selection = selection.concat(messageSignatureNode);
|
|
94
|
+
if (wrappingElementNode.length !== 0) throw new Error("ERR_POTENTIAL_WRAPPING_ATTACK");
|
|
95
|
+
if (selection.length === 0) return [false, null];
|
|
96
|
+
for (const signatureNode of selection) {
|
|
97
|
+
if (!isElementNode(signatureNode)) continue;
|
|
98
|
+
const isAssertionSignature = assertionSignatureNode.includes(signatureNode);
|
|
99
|
+
const sig = createSignedXml();
|
|
100
|
+
let verified = false;
|
|
101
|
+
sig.signatureAlgorithm = opts.signatureAlgorithm;
|
|
102
|
+
if (!opts.keyFile && !opts.metadata) throw new Error("ERR_UNDEFINED_SIGNATURE_VERIFIER_OPTIONS");
|
|
103
|
+
if (opts.keyFile) {
|
|
104
|
+
const { readFile } = getContext();
|
|
105
|
+
if (!readFile) throw new Error("ERR_FILE_IO_NOT_AVAILABLE");
|
|
106
|
+
sig.publicCert = toUtf8String(readFile(opts.keyFile));
|
|
107
|
+
}
|
|
108
|
+
if (opts.metadata) {
|
|
109
|
+
const certificateNode = selectXPath(".//*[local-name(.)='X509Certificate']", signatureNode);
|
|
110
|
+
let metadataCertList = opts.metadata.getX509Certificate("signing");
|
|
111
|
+
if (Array.isArray(metadataCertList)) metadataCertList = flattenDeep(metadataCertList);
|
|
112
|
+
else if (typeof metadataCertList === "string") metadataCertList = [metadataCertList];
|
|
113
|
+
else metadataCertList = [];
|
|
114
|
+
/**
|
|
115
|
+
* `flattenDeep` is deliberately loose (`unknown[]`); IdP metadata only ever
|
|
116
|
+
* yields PEM strings here, which `normalizeCerString` accepts. A missing
|
|
117
|
+
* (`null`) or empty list is normalized to `[]` above so the fail-closed
|
|
118
|
+
* guard below throws a clean `NO_SELECTED_CERTIFICATE` instead of a raw
|
|
119
|
+
* `TypeError`.
|
|
120
|
+
*/
|
|
121
|
+
const metadataCert = metadataCertList.map(normalizeCerString);
|
|
122
|
+
/**
|
|
123
|
+
* Fail CLOSED: without at least one pinned signing certificate from IdP
|
|
124
|
+
* metadata there is no trust anchor. NEVER fall back to an
|
|
125
|
+
* `<X509Certificate>` embedded in the assertion — trusting the assertion's
|
|
126
|
+
* own certificate lets a self-signed forgery verify against itself (auth
|
|
127
|
+
* bypass). Reject whether or not the assertion carries an embedded cert.
|
|
128
|
+
*/
|
|
129
|
+
if (metadataCert.length === 0) throw new Error("NO_SELECTED_CERTIFICATE");
|
|
130
|
+
if (certificateNode.length !== 0) {
|
|
131
|
+
const x509Certificate = normalizeCerString(certificateNodeData(certificateNode[0]));
|
|
132
|
+
if (!metadataCert.find((cert) => cert.trim() === x509Certificate.trim())) throw new Error("ERROR_UNMATCH_CERTIFICATE_DECLARATION_IN_METADATA");
|
|
133
|
+
sig.publicCert = getKeyInfo(x509Certificate).getKey();
|
|
134
|
+
} else sig.publicCert = getKeyInfo(metadataCert[0]).getKey();
|
|
135
|
+
}
|
|
136
|
+
sig.loadSignature(signatureNode);
|
|
137
|
+
verified = await sig.checkSignature(serializeXmlNode(doc));
|
|
138
|
+
if (!verified) {
|
|
139
|
+
if (isAssertionSignature) throw new Error("ERR_FAILED_TO_VERIFY_ASSERTION_SIGNATURE");
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (!(sig.getSignedReferences().length >= 1)) throw new Error("NO_SIGNATURE_REFERENCES");
|
|
143
|
+
const signedVerifiedXML = sig.getSignedReferences()[0];
|
|
144
|
+
const rootNode = docParser.parseFromString(signedVerifiedXML).documentElement;
|
|
145
|
+
if (rootNode.localName === "Response") {
|
|
146
|
+
const assertions = selectXPath("./*[local-name()='Assertion']", rootNode);
|
|
147
|
+
const encryptedAssertions = selectXPath("./*[local-name()='EncryptedAssertion']", rootNode);
|
|
148
|
+
if (assertions.length === 1) return [true, serializeXmlNode(assertions[0])];
|
|
149
|
+
else if (encryptedAssertions.length >= 1) return [true, serializeXmlNode(rootNode)];
|
|
150
|
+
else return [true, null];
|
|
151
|
+
} else if (rootNode.localName === "Assertion") return [true, serializeXmlNode(rootNode)];
|
|
152
|
+
else return [true, null];
|
|
153
|
+
}
|
|
154
|
+
return [false, null];
|
|
155
|
+
}
|
|
156
|
+
/** Create the key section in metadata (an abstraction shared by signing and encryption use). */
|
|
157
|
+
function createKeySection(use, certString) {
|
|
158
|
+
return { ["KeyDescriptor"]: [{ _attr: { use } }, { ["ds:KeyInfo"]: [{ _attr: { "xmlns:ds": "http://www.w3.org/2000/09/xmldsig#" } }, { ["ds:X509Data"]: [{ "ds:X509Certificate": normalizeCerString(certString) }] }] }] };
|
|
159
|
+
}
|
|
160
|
+
/** Construct the message signature (octet-string signature) used by the redirect binding. */
|
|
161
|
+
async function constructMessageSignature(octetString, key, passphrase, isBase64, signingAlgorithm) {
|
|
162
|
+
return constructMessageSignature$1({
|
|
163
|
+
octetString,
|
|
164
|
+
key,
|
|
165
|
+
passphrase,
|
|
166
|
+
isBase64,
|
|
167
|
+
signingAlgorithm,
|
|
168
|
+
nrsaAliasMapping,
|
|
169
|
+
defaultSignatureAlgorithm: signatureAlgorithms.RSA_SHA1,
|
|
170
|
+
readPrivateKey: (keyString, keyPassphrase, isOutputString) => readPrivateKey(keyString, keyPassphrase, isOutputString),
|
|
171
|
+
signMessage: async ({ octetString: source, privateKey, signingScheme, isBase64Output }) => {
|
|
172
|
+
const sigB64 = await rsaSign(typeof privateKey === "string" ? privateKey : new TextDecoder().decode(privateKey), source, schemeToHash(signingScheme));
|
|
173
|
+
if (isBase64Output) return sigB64;
|
|
174
|
+
return bytesToBinaryString(decodeBase64(sigB64));
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/** Verify a message signature against the identity/service provider's signing certificate. */
|
|
179
|
+
async function verifyMessageSignature(metadata, octetString, signature, verifyAlgorithm) {
|
|
180
|
+
return verifyMessageSignature$1({
|
|
181
|
+
octetString,
|
|
182
|
+
signature,
|
|
183
|
+
signCert: metadata.getX509Certificate("signing"),
|
|
184
|
+
verifyAlgorithm,
|
|
185
|
+
nrsaAliasMapping,
|
|
186
|
+
defaultSignatureAlgorithm: signatureAlgorithms.RSA_SHA1,
|
|
187
|
+
getPublicKeyPemFromCertificate: getPublicKeyPemFromCert,
|
|
188
|
+
verifyMessage: async ({ octetString: source, signature: incomingSignature, publicKey, signingScheme }) => {
|
|
189
|
+
const hash = schemeToHash(signingScheme);
|
|
190
|
+
let sigBase64;
|
|
191
|
+
if (typeof incomingSignature === "string") sigBase64 = incomingSignature;
|
|
192
|
+
else sigBase64 = encodeBase64(incomingSignature);
|
|
193
|
+
let certOrKey = publicKey;
|
|
194
|
+
if (publicKey.indexOf("BEGIN CERTIFICATE") < 0 && publicKey.indexOf("BEGIN PUBLIC KEY") < 0) certOrKey = toPemCertificate(publicKey);
|
|
195
|
+
return rsaVerify(certOrKey, source, sigBase64, hash);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/** Build the `<KeyInfo>`/public-key accessors for an X509 certificate string. */
|
|
200
|
+
function getKeyInfo(x509Certificate, signatureConfig = {}) {
|
|
201
|
+
const prefix = signatureConfig.prefix ? `${signatureConfig.prefix}:` : "";
|
|
202
|
+
return {
|
|
203
|
+
getKeyInfo: () => {
|
|
204
|
+
return `<${prefix}X509Data><${prefix}X509Certificate>${x509Certificate}</${prefix}X509Certificate></${prefix}X509Data>`;
|
|
205
|
+
},
|
|
206
|
+
getKey: () => {
|
|
207
|
+
return getPublicKeyPemFromCert(x509Certificate).toString();
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
//#endregion
|
|
213
|
+
export { constructMessageSignature, constructSamlSignature, createKeySection, verifyMessageSignature, verifySignature };
|
|
214
|
+
//# sourceMappingURL=signature.js.map
|