@wildo-ai/saas-backend-lib 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.d.ts.map +1 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js +19 -1
- package/dist/esm/applications/services/worker-remote-client-factory.backend.service.js.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.d.ts.map +1 -1
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js +4 -0
- package/dist/esm/base-classes/models/manual-controllers.backend.definition.js.map +1 -1
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts +35 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js +111 -0
- package/dist/esm/base-classes/services/batches/child-lifecycle-teardown.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts +50 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js +199 -0
- package/dist/esm/base-classes/services/batches/credential-expiry-sweep.batch.backend.service.js.map +1 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts +111 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.d.ts.map +1 -1
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js +140 -0
- package/dist/esm/base-classes/services/batches/engine-custom-batch-manifests.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts +14 -3
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js +138 -24
- package/dist/esm/base-classes/services/controllers/controller-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts +3 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js +8 -3
- package/dist/esm/base-classes/services/controllers/controllers-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js +11 -2
- package/dist/esm/base-classes/services/repositories/field-clearing-partition.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts +124 -13
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js +207 -21
- package/dist/esm/base-classes/services/repositories/http-api/http-api-provider-access.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts +60 -8
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js +174 -26
- package/dist/esm/base-classes/services/repositories/http-api/http-api-read-client.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts +48 -4
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js +102 -30
- package/dist/esm/base-classes/services/repositories/http-api/http-api-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts +55 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.d.ts.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js +114 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-rest-operation-reference.backend.js.map +1 -0
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts +89 -14
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js +84 -11
- package/dist/esm/base-classes/services/repositories/http-api/http-api-transport.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js +16 -0
- package/dist/esm/base-classes/services/repositories/http-api/odata-query-compiler.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts +20 -6
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js +96 -32
- package/dist/esm/base-classes/services/repositories/infrastructure-tier-contract.backend.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts +3 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js +32 -7
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts +8 -5
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/introspection/introspection-resource-source.backend.port.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts +80 -0
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js +298 -23
- package/dist/esm/base-classes/services/repositories/postgresql-resource-repository.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts +71 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js +85 -5
- package/dist/esm/base-classes/services/repositories/repositories-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts +21 -0
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js +146 -4
- package/dist/esm/base-classes/services/repositories/repository-resource.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts +22 -0
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-custom-implementation-base.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts +3 -26
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js +3 -68
- package/dist/esm/base-classes/services/services/resource-operation-implementation-coverage.backend.utils.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js +4 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts +11 -0
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js +39 -5
- package/dist/esm/base-classes/services/services/resource-status-transition.definitions.backend.js.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts +181 -2
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js +533 -43
- package/dist/esm/base-classes/services/services/services-registry-handler.backend.service.js.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts +36 -3
- package/dist/esm/base-classes/services/services/system-access.backend.service.d.ts.map +1 -1
- package/dist/esm/base-classes/services/services/system-access.backend.service.js +70 -8
- package/dist/esm/base-classes/services/services/system-access.backend.service.js.map +1 -1
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts +28 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js +90 -0
- package/dist/esm/billing/batches/billing-reconciliation.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts +44 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js +99 -0
- package/dist/esm/billing/batches/usage-flush.batch.backend.service.js.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts +91 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.d.ts.map +1 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js +152 -0
- package/dist/esm/billing/models/billing-provider-event-settlement.backend.schemas.js.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts +186 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.d.ts.map +1 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js +474 -0
- package/dist/esm/billing/services/back-office/billing-reconciliation.backend.service.js.map +1 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts +100 -0
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js +209 -6
- package/dist/esm/billing/services/back-office/product-catalog-sync.backend.service.js.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts +200 -4
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js +593 -64
- package/dist/esm/billing/services/back-office/usage-metering.backend.service.js.map +1 -1
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts +36 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.d.ts.map +1 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js +83 -0
- package/dist/esm/billing/services/billing-adapter-registry.backend.js.map +1 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts +9 -0
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.d.ts.map +1 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js +11 -1
- package/dist/esm/billing/services/billing-checkout-metadata.backend.utils.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js +54 -13
- package/dist/esm/billing/services/custom-impl/billing-account.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts +38 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js +67 -2
- package/dist/esm/billing/services/custom-impl/billing-custom-impl-utils.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts +30 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js +43 -1
- package/dist/esm/billing/services/custom-impl/billing-custom-implementations.backend.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts +11 -3
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js +30 -16
- package/dist/esm/billing/services/custom-impl/promotion.custom-ops.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js +104 -25
- package/dist/esm/billing/services/custom-impl/subscription.mutations.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts +18 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js +106 -2
- package/dist/esm/billing/services/stripe-standard-billing-provider.backend.service.js.map +1 -1
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts +52 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.d.ts.map +1 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js +74 -0
- package/dist/esm/billing/services/webhooks/__tests__/settlement-ledger.test-double.js.map +1 -0
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts +104 -11
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.d.ts.map +1 -1
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js +260 -26
- package/dist/esm/billing/services/webhooks/billing-webhook-event-router.backend.service.js.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts +30 -1
- package/dist/esm/billing/testing/mock-billing-provider.d.ts.map +1 -1
- package/dist/esm/billing/testing/mock-billing-provider.js +25 -0
- package/dist/esm/billing/testing/mock-billing-provider.js.map +1 -1
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js +11 -4
- package/dist/esm/compliance/audit-trails/batches/audit-logs-archive.batch.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts +263 -13
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js +376 -58
- package/dist/esm/compliance/audit-trails/services/audit-event-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts +264 -7
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js +414 -5
- package/dist/esm/compliance/audit-trails/services/audit-logs.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js +7 -1
- package/dist/esm/compliance/audit-trails/services/composite-audit-log-sink.backend.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts +16 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js +140 -0
- package/dist/esm/compliance/audit-trails/services/siem-export-config-cache-invalidation.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts +42 -0
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js +65 -6
- package/dist/esm/compliance/audit-trails/services/siem-webhook-delivery.backend.service.js.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts +110 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js +192 -0
- package/dist/esm/compliance/audit-trails/services/utils/leased-value-cache.backend.utils.js.map +1 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js +45 -0
- package/dist/esm/compliance/audit-trails/services/utils/ocsf-activity-mapping.backend.utils.js.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts +5 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.d.ts.map +1 -1
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js +6 -0
- package/dist/esm/config/bootstrap/application-runtime-profile.backend.js.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.js +7 -1
- package/dist/esm/config/custom/application-config-controller.backend.service.js.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.d.ts +146 -46
- package/dist/esm/config/models/app-config.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/app-config.backend.schemas.js +121 -12
- package/dist/esm/config/models/app-config.backend.schemas.js.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts +38 -15
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.d.ts.map +1 -1
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js +17 -2
- package/dist/esm/config/models/provider-runtime-artifact.backend.schemas.js.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts +0 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration-loader.backend.service.js +68 -76
- package/dist/esm/config/services/app-configuration-loader.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.service.js +23 -1
- package/dist/esm/config/services/app-configuration.backend.service.js.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts +43 -1
- package/dist/esm/config/services/app-configuration.backend.utils.d.ts.map +1 -1
- package/dist/esm/config/services/app-configuration.backend.utils.js +52 -3
- package/dist/esm/config/services/app-configuration.backend.utils.js.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts +25 -0
- package/dist/esm/config/services/application-startup-config-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js +41 -1
- package/dist/esm/config/services/application-startup-config-validator.backend.service.js.map +1 -1
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.d.ts +2 -2
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js +2 -2
- package/dist/esm/data-seeding/services/shared/data-seed-scope-iteration.shared.utils.js.map +1 -1
- package/dist/esm/databases/models/filter.backend.schemas.js +2 -2
- package/dist/esm/databases/models/filter.backend.schemas.js.map +1 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.d.ts.map +1 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js +20 -1
- package/dist/esm/databases/services/aggregation/aggregation-authorization.backend.service.js.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.d.ts.map +1 -1
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js +48 -0
- package/dist/esm/databases/services/postgresql-schema-plan-diff.backend.js.map +1 -1
- package/dist/esm/databases/services/redis.service.d.ts +27 -0
- package/dist/esm/databases/services/redis.service.d.ts.map +1 -1
- package/dist/esm/databases/services/redis.service.js +29 -0
- package/dist/esm/databases/services/redis.service.js.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-builder.backend.service.js +13 -1
- package/dist/esm/errors/services/error-builder.backend.service.js.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.d.ts +70 -7
- package/dist/esm/errors/services/error-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/error-handler.backend.service.js +134 -8
- package/dist/esm/errors/services/error-handler.backend.service.js.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts +66 -0
- package/dist/esm/errors/services/rate-limit.backend.service.d.ts.map +1 -1
- package/dist/esm/errors/services/rate-limit.backend.service.js +102 -25
- package/dist/esm/errors/services/rate-limit.backend.service.js.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts +5 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js +25 -0
- package/dist/esm/errors/utils/error-log-level-classification.backend.utils.js.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts +33 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.d.ts.map +1 -1
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js +40 -0
- package/dist/esm/errors/utils/rate-limit-environment-relaxation.backend.utils.js.map +1 -1
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts +41 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.d.ts.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js +40 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.contracts.js.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts +64 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.d.ts.map +1 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js +193 -0
- package/dist/esm/external-data/controllers/external-data-admin.backend.controller.js.map +1 -0
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts +72 -4
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js +60 -19
- package/dist/esm/external-data/external-data-pipeline-run.backend.service.js.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-transform.backend.js +7 -1
- package/dist/esm/external-data/external-data-transform.backend.js.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts +2 -0
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.d.ts.map +1 -1
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js +13 -0
- package/dist/esm/external-data/models/external-data-pipeline-state.backend.schemas.js.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts +4 -2
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.d.ts.map +1 -1
- package/dist/esm/external-providers/models/provider-selection-resolution-evidence.backend.definitions.js.map +1 -1
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts +256 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js +333 -0
- package/dist/esm/external-providers/operations/provider-operation-executor.backend.service.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js +211 -0
- package/dist/esm/external-providers/operations/provider-operation-request.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts +45 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js +216 -0
- package/dist/esm/external-providers/operations/provider-request-signing.backend.js.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts +56 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.d.ts.map +1 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js +78 -0
- package/dist/esm/external-providers/operations/provider-rest-call-client.backend.js.map +1 -0
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js +2 -2
- package/dist/esm/external-providers/services/__tests__/mock-external-providers-registry.service.js.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts +89 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.d.ts.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js +164 -0
- package/dist/esm/external-providers/services/backend-provider-loader.backend.service.js.map +1 -0
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts +26 -27
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js +50 -64
- package/dist/esm/external-providers/services/backend-provider-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/document-extraction.backend.service.js +3 -3
- package/dist/esm/external-providers/services/document-extraction.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/embeddings.backend.service.js +4 -4
- package/dist/esm/external-providers/services/embeddings.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts +306 -7
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js +539 -45
- package/dist/esm/external-providers/services/external-providers-registry.backend.service.js.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.d.ts.map +1 -1
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js +25 -2
- package/dist/esm/external-providers/services/frontend-bootstrap.backend.service.js.map +1 -1
- package/dist/esm/files/controllers/file.controller.d.ts +24 -1
- package/dist/esm/files/controllers/file.controller.d.ts.map +1 -1
- package/dist/esm/files/controllers/file.controller.js +83 -11
- package/dist/esm/files/controllers/file.controller.js.map +1 -1
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts +17 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.d.ts.map +1 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js +1 -0
- package/dist/esm/files/handlers/file-upload-route-locals.backend.types.js.map +1 -0
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts +5 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js +76 -13
- package/dist/esm/files/handlers/resource-file-upload-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-operation-handler.backend.service.d.ts +18 -0
- package/dist/esm/files/services/file-operation-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-operation-handler.backend.service.js +36 -28
- package/dist/esm/files/services/file-operation-handler.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.d.ts +94 -9
- package/dist/esm/files/services/file-scanning.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-scanning.backend.service.js +197 -17
- package/dist/esm/files/services/file-scanning.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts +60 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/file-text-extraction.backend.service.js +167 -8
- package/dist/esm/files/services/file-text-extraction.backend.service.js.map +1 -1
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts +214 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.d.ts.map +1 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.js +566 -0
- package/dist/esm/files/services/file-upload-grant.backend.service.js.map +1 -0
- package/dist/esm/files/services/files.backend.service.d.ts +87 -0
- package/dist/esm/files/services/files.backend.service.d.ts.map +1 -1
- package/dist/esm/files/services/files.backend.service.js +252 -19
- package/dist/esm/files/services/files.backend.service.js.map +1 -1
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts +109 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js +123 -0
- package/dist/esm/files/storage/application-storage-key.backend.utils.js.map +1 -0
- package/dist/esm/files/storage/file-storage-provider.types.d.ts +16 -10
- package/dist/esm/files/storage/file-storage-provider.types.d.ts.map +1 -1
- package/dist/esm/files/storage/file-storage-provider.types.js.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts +67 -8
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js +101 -28
- package/dist/esm/files/storage/local-directory-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.d.ts.map +1 -1
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js +8 -55
- package/dist/esm/files/storage/wildo-managed-storage-provider.backend.service.js.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js +20 -0
- package/dist/esm/files/utils/file-field-schema-path.backend.utils.js.map +1 -1
- package/dist/esm/files/utils/file-uploader.utils.d.ts.map +1 -1
- package/dist/esm/files/utils/file-uploader.utils.js +12 -0
- package/dist/esm/files/utils/file-uploader.utils.js.map +1 -1
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts +86 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.d.ts.map +1 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js +288 -0
- package/dist/esm/files/utils/office-document-text-extraction.backend.utils.js.map +1 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts +15 -0
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js +76 -5
- package/dist/esm/flows-actors/a2a/batches/a2a-abandoned-task-sweep.batch.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js +6 -1
- package/dist/esm/flows-actors/a2a/controllers/a2a.controller.js.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts +60 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js +63 -0
- package/dist/esm/flows-actors/a2a/models/a2a.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts +74 -0
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js +200 -44
- package/dist/esm/flows-actors/a2a/services/a2a-task-cancellation.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts +7 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js +53 -1
- package/dist/esm/flows-actors/a2a/services/a2a-task.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js +18 -0
- package/dist/esm/flows-actors/a2a/services/a2a-token-budget.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts +12 -7
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/a2a/services/a2a.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts +0 -13
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js +14 -22
- package/dist/esm/flows-actors/models/agent-catalogs.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts +8 -3
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js +25 -15
- package/dist/esm/flows-actors/models/core-facets.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts +13 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/flows-actors.backend.schemas.js.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts +88 -8
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js +333 -31
- package/dist/esm/flows-actors/models/function-tools.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.d.ts.map +1 -1
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js +4 -2
- package/dist/esm/flows-actors/models/market-generation.actors-system.backend.definitions.js.map +1 -1
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts +113 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.d.ts.map +1 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js +62 -0
- package/dist/esm/flows-actors/models/mcp-client.backend.definitions.js.map +1 -0
- package/dist/esm/flows-actors/services/actors-system.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/actors-system.backend.service.js +0 -2
- package/dist/esm/flows-actors/services/actors-system.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts +107 -1
- package/dist/esm/flows-actors/services/agents.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/agents.backend.service.js +519 -56
- package/dist/esm/flows-actors/services/agents.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts +5 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js +79 -16
- package/dist/esm/flows-actors/services/conversational-execution.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts +34 -5
- package/dist/esm/flows-actors/services/flows-actors-registry.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js +154 -20
- package/dist/esm/flows-actors/services/flows-actors-registry.service.js.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/flows.backend.services.js +27 -23
- package/dist/esm/flows-actors/services/flows.backend.services.js.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js +7 -1
- package/dist/esm/flows-actors/services/llm-observability-agent-call-trace-sink.backend.js.map +1 -1
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts +90 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.d.ts.map +1 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js +368 -0
- package/dist/esm/flows-actors/services/mcp-client.backend.service.js.map +1 -0
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts +9 -5
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.d.ts.map +1 -1
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js +12 -17
- package/dist/esm/flows-actors/services/prompt-compiler.backend.service.js.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts +151 -41
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js +308 -143
- package/dist/esm/flows-actors/utils/acp-session-runner.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts +0 -207
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js +8 -243
- package/dist/esm/flows-actors/utils/meta-workflow-canonical-json.backend.utils.js.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.d.ts.map +1 -1
- package/dist/esm/flows-actors/utils/meta-workflow-structured-generation-plan.backend.utils.js.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts +9 -14
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.d.ts.map +1 -1
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js +18 -89
- package/dist/esm/guidance/services/milestone-evaluator.backend.service.js.map +1 -1
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts +86 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.d.ts.map +1 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js +155 -0
- package/dist/esm/guidance/services/progression-state-store.backend.service.js.map +1 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts +10 -0
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js +55 -5
- package/dist/esm/i18n/controllers/i18n-controller.backend.service.js.map +1 -1
- package/dist/esm/index.d.ts +15 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +45 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inject/models/container.d.ts.map +1 -1
- package/dist/esm/inject/models/container.js +82 -10
- package/dist/esm/inject/models/container.js.map +1 -1
- package/dist/esm/inject/models/service-types.d.ts +20 -3
- package/dist/esm/inject/models/service-types.d.ts.map +1 -1
- package/dist/esm/inject/models/service-types.js +21 -3
- package/dist/esm/inject/models/service-types.js.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.d.ts.map +1 -1
- package/dist/esm/mcp/controllers/mcp.controller.js +32 -4
- package/dist/esm/mcp/controllers/mcp.controller.js.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts +34 -0
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.d.ts.map +1 -1
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js +42 -0
- package/dist/esm/mcp/models/mcp-tool.backend.schemas.js.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts +84 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-server.backend.service.js +235 -11
- package/dist/esm/mcp/services/mcp-server.backend.service.js.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts +64 -2
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js +152 -6
- package/dist/esm/mcp/services/mcp-tool-adapter.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js +49 -4
- package/dist/esm/monitoring/analytics/controllers/analytics.backend.controller.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts +66 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.d.ts.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js +199 -0
- package/dist/esm/monitoring/analytics/services/value-moment-definition-registry.backend.service.js.map +1 -0
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts +149 -13
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js +411 -19
- package/dist/esm/monitoring/analytics/services/value-moment-engine.backend.service.js.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts +11 -2
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/monitoring/analytics/services/value-moment-handler-registry.backend.service.js.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts +28 -9
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js +30 -10
- package/dist/esm/monitoring/logger/models/logger.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.d.ts +12 -0
- package/dist/esm/monitoring/logger/services/logger.service.d.ts.map +1 -1
- package/dist/esm/monitoring/logger/services/logger.service.js +52 -11
- package/dist/esm/monitoring/logger/services/logger.service.js.map +1 -1
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts +62 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.d.ts.map +1 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js +78 -0
- package/dist/esm/monitoring/logger/utils/log-severity-floor.backend.utils.js.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts +309 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.d.ts.map +1 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js +385 -0
- package/dist/esm/monitoring/observability/audit-observation-emission.backend.js.map +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts +1 -0
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/models/observability.backend.schemas.js.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts +21 -0
- package/dist/esm/monitoring/observability/services/metrics.service.d.ts.map +1 -1
- package/dist/esm/monitoring/observability/services/metrics.service.js +38 -0
- package/dist/esm/monitoring/observability/services/metrics.service.js.map +1 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts +0 -80
- package/dist/esm/notifications/email/models/email-context-provider.interface.d.ts.map +0 -1
- package/dist/esm/notifications/email/models/email-context-provider.interface.js +0 -25
- package/dist/esm/notifications/email/models/email-context-provider.interface.js.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts +0 -49
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js +0 -141
- package/dist/esm/notifications/email/services/email-context-provider-registry.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts +0 -37
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js +0 -121
- package/dist/esm/notifications/email/services/email-template-compiler.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts +66 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js +105 -10
- package/dist/esm/notifications/email/services/email-template-registry.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts +0 -58
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.d.ts.map +0 -1
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js +0 -223
- package/dist/esm/notifications/email/services/email-template-sandbox.backend.service.js.map +0 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js +10 -1
- package/dist/esm/notifications/email/services/email-template-validator.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.d.ts +60 -4
- package/dist/esm/notifications/email/services/email.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/email/services/email.backend.service.js +145 -43
- package/dist/esm/notifications/email/services/email.backend.service.js.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts +0 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/notifications/email/utils/color-conversion.utils.js.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts +142 -21
- package/dist/esm/notifications/services/notification-badge.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notification-badge.backend.service.js +283 -58
- package/dist/esm/notifications/services/notification-badge.backend.service.js.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts +108 -13
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js +432 -101
- package/dist/esm/notifications/services/notifications-dispatcher.backend.service.js.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts +2 -2
- package/dist/esm/notifications/sms/services/sms.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/sms/services/sms.backend.service.js +5 -5
- package/dist/esm/notifications/sms/services/sms.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts +117 -5
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js +164 -6
- package/dist/esm/notifications/webhooks/controllers/webhook-auto-controller.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts +0 -6
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js +54 -7
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts +5 -5
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js +14 -13
- package/dist/esm/notifications/webhooks/outbound/batches/m2m-webhook-delivery.batch.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts +2 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js +18 -8
- package/dist/esm/notifications/webhooks/outbound/m2m-webhook-signed-request.backend.utils.js.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js +20 -18
- package/dist/esm/notifications/webhooks/outbound/services/webhook-config-test-endpoint.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts +16 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.d.ts.map +1 -1
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js +18 -0
- package/dist/esm/notifications/webhooks/services/webhook-handler.backend.service.js.map +1 -1
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.d.ts +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js +2 -2
- package/dist/esm/organizations/batches/organization-purge.batch.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js +63 -2
- package/dist/esm/organizations/services/organization-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js +4 -1
- package/dist/esm/organizations/services/organization-unit-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts +66 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.d.ts.map +1 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js +257 -0
- package/dist/esm/queue/adapters/in-memory-queue-adapter.backend.service.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts +12 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js +47 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.binding.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts +87 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.interface.js.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts +31 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.d.ts.map +1 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js +13 -0
- package/dist/esm/queue/adapters/queue-adapter.backend.options.js.map +1 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts +19 -25
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js +33 -0
- package/dist/esm/queue/adapters/rabbitmq-adapter.backend.service.js.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/domain-queue-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/domain-queue-consumer.backend.service.js +1 -4
- package/dist/esm/queue/domain-queue-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-consumer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-consumer.backend.service.js +1 -4
- package/dist/esm/queue/job-consumer.backend.service.js.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.d.ts +2 -2
- package/dist/esm/queue/job-executor.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/job-executor.backend.service.js +1 -4
- package/dist/esm/queue/job-executor.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts +8 -4
- package/dist/esm/queue/queue-monitoring.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-monitoring.backend.service.js +25 -17
- package/dist/esm/queue/queue-monitoring.backend.service.js.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js +16 -1
- package/dist/esm/queue/queue-worker-initializer.backend.service.js.map +1 -1
- package/dist/esm/queue/queue.backend.service.d.ts +3 -3
- package/dist/esm/queue/queue.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/queue.backend.service.js +26 -4
- package/dist/esm/queue/queue.backend.service.js.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts +2 -2
- package/dist/esm/queue/worker-shutdown-manager.backend.service.d.ts.map +1 -1
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js +18 -3
- package/dist/esm/queue/worker-shutdown-manager.backend.service.js.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts +50 -25
- package/dist/esm/rag/utils/rag-chunking.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js +147 -39
- package/dist/esm/rag/utils/rag-chunking.backend.utils.js.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.d.ts.map +1 -1
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js +12 -3
- package/dist/esm/rag/utils/rag-context-assembly.backend.utils.js.map +1 -1
- package/dist/esm/requests/service/websocket.service.d.ts +9 -0
- package/dist/esm/requests/service/websocket.service.d.ts.map +1 -1
- package/dist/esm/requests/service/websocket.service.js +88 -15
- package/dist/esm/requests/service/websocket.service.js.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.d.ts.map +1 -1
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js +16 -2
- package/dist/esm/resources/models/custom-service-implementations.backend.definition.js.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-operations.backend.definitions.js +2 -0
- package/dist/esm/resources/models/resources-operations.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js +14 -0
- package/dist/esm/resources/models/resources-relationships.backend.definitions.js.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts +2 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.d.ts.map +1 -1
- package/dist/esm/resources/models/resources-types.backend.schemas.js +8 -0
- package/dist/esm/resources/models/resources-types.backend.schemas.js.map +1 -1
- package/dist/esm/resources/services/resource-id.backend.service.js +3 -3
- package/dist/esm/resources/services/resource-id.backend.service.js.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts +60 -5
- package/dist/esm/resources/services/resources-registry.backend.service.d.ts.map +1 -1
- package/dist/esm/resources/services/resources-registry.backend.service.js +91 -7
- package/dist/esm/resources/services/resources-registry.backend.service.js.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts +36 -3
- package/dist/esm/runtime/controllers/health-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/controllers/health-controller.backend.service.js +32 -10
- package/dist/esm/runtime/controllers/health-controller.backend.service.js.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.d.ts.map +1 -1
- package/dist/esm/runtime/domain-module.backend.definitions.js +24 -0
- package/dist/esm/runtime/domain-module.backend.definitions.js.map +1 -1
- package/dist/esm/runtime/services/execution-context-creator.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/execution-context-creator.backend.service.js +13 -7
- package/dist/esm/runtime/services/execution-context-creator.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts +51 -0
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.d.ts.map +1 -1
- package/dist/esm/runtime/services/health-readiness-contributor.backend.interface.js.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.d.ts +26 -0
- package/dist/esm/runtime/services/http-server.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/http-server.backend.service.js +181 -1
- package/dist/esm/runtime/services/http-server.backend.service.js.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts +47 -1
- package/dist/esm/runtime/services/start-application.backend.service.d.ts.map +1 -1
- package/dist/esm/runtime/services/start-application.backend.service.js +343 -77
- package/dist/esm/runtime/services/start-application.backend.service.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts +15 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js +28 -0
- package/dist/esm/security/api-keys/api-keys.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts +5 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js +24 -4
- package/dist/esm/security/authentications/batches/anonymous-session-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js +29 -4
- package/dist/esm/security/authentications/controllers/authentication-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts +114 -0
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js +354 -3
- package/dist/esm/security/authentications/controllers/oauth-provider-controller.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts +1 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js +22 -0
- package/dist/esm/security/authentications/models/cimd.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts +3 -23
- package/dist/esm/security/authentications/models/jwt.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/jwt.backend.schemas.js +20 -45
- package/dist/esm/security/authentications/models/jwt.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts +15 -0
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/models/oauth2-connection.backend.schemas.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts +0 -2
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js +23 -14
- package/dist/esm/security/authentications/services/admin-config/auth-organization-configuration.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts +0 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js +15 -12
- package/dist/esm/security/authentications/services/admin-config/domain-to-org-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts +113 -3
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js +207 -30
- package/dist/esm/security/authentications/services/admin-config/domain-verification.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts +95 -2
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js +153 -9
- package/dist/esm/security/authentications/services/admin-config/enterprise-user-provisioning.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts +190 -0
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js +377 -53
- package/dist/esm/security/authentications/services/anonymous-session.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts +9 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js +77 -2
- package/dist/esm/security/authentications/services/auth-methods/auth-method-management.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js +5 -3
- package/dist/esm/security/authentications/services/auth-methods/auth-mfa.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts +41 -0
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js +202 -23
- package/dist/esm/security/authentications/services/auth-methods/auth-registration.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js +42 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-authentication.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js +34 -4
- package/dist/esm/security/authentications/services/auth-methods/oauth2-connection-resolver.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts +29 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js +77 -5
- package/dist/esm/security/authentications/services/auth-methods/webauthn.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts +41 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js +87 -4
- package/dist/esm/security/authentications/services/auth-token-issuer.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts +43 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js +277 -97
- package/dist/esm/security/authentications/services/authentication-orchestrator.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts +28 -5
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js +72 -12
- package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js +3 -0
- package/dist/esm/security/authentications/services/custom-impls/auth-custom-implementations.backend.js.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts +28 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js +283 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js +4 -3
- package/dist/esm/security/authentications/services/custom-impls/sso-config.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts +35 -0
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js +111 -21
- package/dist/esm/security/authentications/services/oauth-provider-token.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts +14 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js +49 -8
- package/dist/esm/security/authentications/services/oidc-authorization-code.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js +4 -0
- package/dist/esm/security/authentications/services/utils/auth-policy-resolution.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js +6 -0
- package/dist/esm/security/authentications/services/utils/auth-user-lookup.backend.service.js.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts +37 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js +51 -0
- package/dist/esm/security/authentications/services/utils/external-turn-rate-limit.backend.utils.js.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts +41 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js +45 -0
- package/dist/esm/security/authentications/utils/enterprise-sso-enforcement.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts +116 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.d.ts.map +1 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js +162 -0
- package/dist/esm/security/authorizations/cross-tenant-read-observation.backend.js.map +1 -0
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js +24 -1
- package/dist/esm/security/authorizations/initiator-organization-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts +20 -20
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js +27 -28
- package/dist/esm/security/authorizations/organization-owner-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js +77 -3
- package/dist/esm/security/authorizations/platform-access-grant-custom-implementation.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts +117 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js +104 -0
- package/dist/esm/security/authorizations/privileged-access-review.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js +4 -0
- package/dist/esm/security/authorizations/role-ceiling.backend.utils.js.map +1 -1
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts +93 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js +95 -0
- package/dist/esm/security/authorizations/role-conferral.backend.utils.js.map +1 -0
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts +124 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.d.ts.map +1 -1
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js +142 -5
- package/dist/esm/security/authorizations/scope-root-collection-confinement.backend.js.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts +175 -14
- package/dist/esm/security/authorizations/services/authorizations.backend.service.d.ts.map +1 -1
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js +385 -49
- package/dist/esm/security/authorizations/services/authorizations.backend.service.js.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts +6 -14
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js +13 -22
- package/dist/esm/security/authorizations/super-admin-floor.backend.utils.js.map +1 -1
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts +60 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js +79 -0
- package/dist/esm/security/connected-accounts/connection-target-authorization.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts +161 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js +512 -0
- package/dist/esm/security/connected-accounts/controllers/provider-connection.controller.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts +59 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js +22 -0
- package/dist/esm/security/connected-accounts/organization-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts +44 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js +20 -0
- package/dist/esm/security/connected-accounts/provider-oauth2-refresher.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts +191 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js +385 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts +41 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js +358 -0
- package/dist/esm/security/connected-accounts/services/organization-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts +160 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js +266 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-exchange.backend.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts +111 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js +107 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-pending-authorization.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts +54 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js +153 -0
- package/dist/esm/security/connected-accounts/services/provider-oauth2-refresher.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts +195 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js +387 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credential-store.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts +45 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js +291 -0
- package/dist/esm/security/connected-accounts/services/user-provider-credentials.custom-impl.backend.service.js.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts +62 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js +29 -0
- package/dist/esm/security/connected-accounts/user-provider-credential-resolver.port.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts +127 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js +277 -0
- package/dist/esm/security/connected-accounts/utils/provider-credential-envelope.backend.utils.js.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts +66 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js +75 -0
- package/dist/esm/security/connected-accounts/utils/stored-credential-value.backend.utils.js.map +1 -0
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts +18 -1
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js +110 -74
- package/dist/esm/security/consumable-tokens/batches/consumable-tokens-cleanup.batch.backend.service.js.map +1 -1
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts +22 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.d.ts.map +1 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js +22 -0
- package/dist/esm/security/consumable-tokens/consumable-token-models.exports.js.map +1 -0
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts +17 -3
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js +12 -0
- package/dist/esm/security/consumable-tokens/models/consumable-tokens.backend.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts +41 -3
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.d.ts.map +1 -1
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js +83 -20
- package/dist/esm/security/consumable-tokens/services/consumable-token.backend.service.js.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/credential-rotation-grace.backend.utils.js +9 -4
- package/dist/esm/security/credential-rotation-grace.backend.utils.js.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.d.ts.map +1 -1
- package/dist/esm/security/jwt/services/jwt.backend.service.js +1 -18
- package/dist/esm/security/jwt/services/jwt.backend.service.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts +26 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js +43 -0
- package/dist/esm/security/oauth-clients/oauth-client-generation.backend.utils.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts +8 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js +49 -0
- package/dist/esm/security/oauth-clients/oauth-clients.custom-impl.backend.service.js.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.d.ts.map +1 -1
- package/dist/esm/security/scim/controllers/scim.backend.controller.js +17 -5
- package/dist/esm/security/scim/controllers/scim.backend.controller.js.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts +67 -29
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.d.ts.map +1 -1
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js +47 -25
- package/dist/esm/security/scim/models/scim-protocol.backend.schemas.js.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.d.ts.map +1 -1
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js +10 -2
- package/dist/esm/security/ssrf/outbound-target-guard.backend.utils.js.map +1 -1
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts +143 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.d.ts.map +1 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js +258 -0
- package/dist/esm/security/ssrf/pinned-outbound-fetch.backend.utils.js.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts +39 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.d.ts.map +1 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js +159 -0
- package/dist/esm/users/services/user-read-retained.custom-impl.backend.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +17 -9
- package/dist/esm/.builder.pid +0 -9
package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts
CHANGED
|
@@ -174,11 +174,17 @@ export declare class CimdClientMetadataBackendService {
|
|
|
174
174
|
* checked, not just the first: a hostile resolver can return one public and one private address
|
|
175
175
|
* and rely on the client picking the other.
|
|
176
176
|
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
177
|
+
* This is a check-then-fetch, and on its own it would leave DNS rebinding open — a name that
|
|
178
|
+
* answers a public address to THIS resolution and a private one to the connection. That residual
|
|
179
|
+
* is now closed one layer down rather than here: {@link fetchDocument} connects through
|
|
180
|
+
* `pinnedOutboundFetch`, which classifies inside the connection's `lookup` hook, so the address
|
|
181
|
+
* validated and the address connected to are the same value in the same event.
|
|
182
|
+
*
|
|
183
|
+
* This check is KEPT rather than folded into the pinned client, for two reasons. It refuses before
|
|
184
|
+
* anything leaves the process, which is this service's stated order of operations ("every cheap
|
|
185
|
+
* refusal happens before anything leaves the process"). And it is the only place that can tell
|
|
186
|
+
* UNRESOLVABLE from INTERNAL — the pinned client's hook sees a resolver failure as a transport
|
|
187
|
+
* failure, and collapsing the two would report a NXDOMAIN as an SSRF attempt.
|
|
182
188
|
*/
|
|
183
189
|
private refuseInternalTarget;
|
|
184
190
|
/**
|
|
@@ -188,6 +194,23 @@ export declare class CimdClientMetadataBackendService {
|
|
|
188
194
|
* lose the diagnostic the caller reports.
|
|
189
195
|
*/
|
|
190
196
|
private resolveAddresses;
|
|
197
|
+
/**
|
|
198
|
+
* The outbound request itself, isolated behind one method so a test can substitute it exactly as
|
|
199
|
+
* it substitutes {@link resolveAddresses}. Those two together are the whole external world this
|
|
200
|
+
* service touches.
|
|
201
|
+
*
|
|
202
|
+
* `pinnedOutboundFetch`, not `fetch`, and the difference is the point. It classifies inside the
|
|
203
|
+
* connection's `lookup` hook, so a `client_id` host that answers a public address to
|
|
204
|
+
* {@link refuseInternalTarget} and a private one to the connection — DNS rebinding, the residual
|
|
205
|
+
* this service documented and could not close — never gets a socket. It also cannot follow a
|
|
206
|
+
* redirect at all, which is strictly stronger than the `redirect: 'error'` this call used to pass:
|
|
207
|
+
* following one would re-point the request at a target no check ever saw.
|
|
208
|
+
*
|
|
209
|
+
* The resolver is the service's OWN {@link resolveAddresses}, so the pre-check and the connection
|
|
210
|
+
* ask the same resolver — a substituted resolver therefore drives both, which is what makes a
|
|
211
|
+
* rebinding pin expressible at all.
|
|
212
|
+
*/
|
|
213
|
+
private performOutboundRequest;
|
|
191
214
|
private fetchDocument;
|
|
192
215
|
/**
|
|
193
216
|
* Read the body with a running BYTE counter, abandoning the transfer the moment it exceeds the cap.
|
package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cimd-client-metadata.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/security/authentications/services/cimd-client-metadata.backend.service.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cimd-client-metadata.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/security/authentications/services/cimd-client-metadata.backend.service.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAM1B,OAAO,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAC;AAU7F,OAAO,EAEL,mBAAmB,EACnB,eAAe,EAQf,KAAK,kBAAkB,EACxB,MAAM,yEAAyE,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sEAAsE,CAAC;AAa/G,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,CAAC;IACxB,kGAAkG;IAClG,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAItE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBACa,gCAAgC;IAmBN,OAAO,CAAC,QAAQ,CAAC,MAAM;IACb,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAnBhF;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;gBAGL,MAAM,EAAE,aAAa,EACX,gBAAgB,EAAE,uBAAuB;IAGzG;;;;;;;;;;;;OAYG;IACI,uBAAuB,IAAI,iBAAiB;IAQnD,6FAA6F;IACtF,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAInC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,SAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAsF9G;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,YAAY;IAYpB;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,sCAAsC;IAe9C;;;;;;;;;;OAUG;IACI,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAIrF;;;;;;;;;;;;OAYG;IACI,2BAA2B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO;IAWzE;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,aAAa;IAYrB;;;;;;;;;;;;;;;;;;;;OAoBG;YACW,oBAAoB;IAalC;;;;;OAKG;YACW,gBAAgB;IAU9B;;;;;;;;;;;;;;;OAeG;YACW,sBAAsB;YAgBtB,aAAa;IAsD3B;;;;;;;;;;OAUG;YACW,eAAe;IA8B7B,2FAA2F;IAC3F,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,MAAM;CAGf"}
|
|
@@ -13,12 +13,24 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
13
13
|
import 'reflect-metadata';
|
|
14
14
|
import { injectable, inject } from 'inversify';
|
|
15
15
|
import { lookup as dnsLookup } from 'node:dns/promises';
|
|
16
|
+
import { isIP } from 'node:net';
|
|
16
17
|
import { SAAS_SERVICE_TYPES } from '../../../inject/models/service-types.js';
|
|
17
18
|
import { LoggerService } from '../../../monitoring/logger/services/logger.service.js';
|
|
18
19
|
import { projectCaughtErrorLogFields } from '../../../errors/utils/error-log-level-classification.backend.utils.js';
|
|
19
20
|
import { OutboundTargetResolution, resolvesOnlyToPublicAddresses, } from '../../../security/ssrf/outbound-target-guard.backend.utils.js';
|
|
21
|
+
import { OutboundTargetRefusedError, pinnedOutboundFetch, } from '../../../security/ssrf/pinned-outbound-fetch.backend.utils.js';
|
|
20
22
|
import { CimdClientMetadataSchema, CimdRejectionReason, CimdTrustPolicy, CIMD_CACHE_MAX_TTL_MS, CIMD_CACHE_MIN_TTL_MS, CIMD_FETCH_TIMEOUT_MS, CIMD_MAX_DOCUMENT_BYTES, CIMD_MAX_CACHE_ENTRIES, CIMD_ACCEPTED_TOKEN_ENDPOINT_AUTH_METHOD, CIMD_ASYMMETRIC_TOKEN_ENDPOINT_AUTH_METHODS, } from '../../../security/authentications/models/cimd.backend.schemas.js';
|
|
21
23
|
import { AppConfigurationService } from '../../../config/services/app-configuration.backend.service.js';
|
|
24
|
+
/**
|
|
25
|
+
* The scheme the egress client will issue on.
|
|
26
|
+
*
|
|
27
|
+
* A `client_id` that is not `https:` is already refused at shape time (`refuseMalformedClientId`),
|
|
28
|
+
* so this restates a decision rather than making a new one — deliberately. The pinned client takes
|
|
29
|
+
* the scheme policy as a required input precisely so no caller can inherit a permissive default, and
|
|
30
|
+
* a second statement at the egress point costs one line and survives a future refactor that moves
|
|
31
|
+
* the shape check.
|
|
32
|
+
*/
|
|
33
|
+
const CIMD_ADMITTED_PROTOCOLS = ['https:'];
|
|
22
34
|
/**
|
|
23
35
|
* Resolve an HTTPS `client_id` URL into validated client metadata (CIMD).
|
|
24
36
|
*
|
|
@@ -307,11 +319,17 @@ let CimdClientMetadataBackendService = class CimdClientMetadataBackendService {
|
|
|
307
319
|
* checked, not just the first: a hostile resolver can return one public and one private address
|
|
308
320
|
* and rely on the client picking the other.
|
|
309
321
|
*
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
322
|
+
* This is a check-then-fetch, and on its own it would leave DNS rebinding open — a name that
|
|
323
|
+
* answers a public address to THIS resolution and a private one to the connection. That residual
|
|
324
|
+
* is now closed one layer down rather than here: {@link fetchDocument} connects through
|
|
325
|
+
* `pinnedOutboundFetch`, which classifies inside the connection's `lookup` hook, so the address
|
|
326
|
+
* validated and the address connected to are the same value in the same event.
|
|
327
|
+
*
|
|
328
|
+
* This check is KEPT rather than folded into the pinned client, for two reasons. It refuses before
|
|
329
|
+
* anything leaves the process, which is this service's stated order of operations ("every cheap
|
|
330
|
+
* refusal happens before anything leaves the process"). And it is the only place that can tell
|
|
331
|
+
* UNRESOLVABLE from INTERNAL — the pinned client's hook sees a resolver failure as a transport
|
|
332
|
+
* failure, and collapsing the two would report a NXDOMAIN as an SSRF attempt.
|
|
315
333
|
*/
|
|
316
334
|
async refuseInternalTarget(url) {
|
|
317
335
|
const resolution = await resolvesOnlyToPublicAddresses(url.hostname, (hostname) => this.resolveAddresses(hostname));
|
|
@@ -340,15 +358,40 @@ let CimdClientMetadataBackendService = class CimdClientMetadataBackendService {
|
|
|
340
358
|
throw error;
|
|
341
359
|
}
|
|
342
360
|
}
|
|
361
|
+
/**
|
|
362
|
+
* The outbound request itself, isolated behind one method so a test can substitute it exactly as
|
|
363
|
+
* it substitutes {@link resolveAddresses}. Those two together are the whole external world this
|
|
364
|
+
* service touches.
|
|
365
|
+
*
|
|
366
|
+
* `pinnedOutboundFetch`, not `fetch`, and the difference is the point. It classifies inside the
|
|
367
|
+
* connection's `lookup` hook, so a `client_id` host that answers a public address to
|
|
368
|
+
* {@link refuseInternalTarget} and a private one to the connection — DNS rebinding, the residual
|
|
369
|
+
* this service documented and could not close — never gets a socket. It also cannot follow a
|
|
370
|
+
* redirect at all, which is strictly stronger than the `redirect: 'error'` this call used to pass:
|
|
371
|
+
* following one would re-point the request at a target no check ever saw.
|
|
372
|
+
*
|
|
373
|
+
* The resolver is the service's OWN {@link resolveAddresses}, so the pre-check and the connection
|
|
374
|
+
* ask the same resolver — a substituted resolver therefore drives both, which is what makes a
|
|
375
|
+
* rebinding pin expressible at all.
|
|
376
|
+
*/
|
|
377
|
+
async performOutboundRequest(url) {
|
|
378
|
+
return pinnedOutboundFetch(url.toString(), {
|
|
379
|
+
admittedProtocols: CIMD_ADMITTED_PROTOCOLS,
|
|
380
|
+
headers: { accept: 'application/json' },
|
|
381
|
+
signal: AbortSignal.timeout(CIMD_FETCH_TIMEOUT_MS),
|
|
382
|
+
// Never `admitPrivateAddresses` here, under any configuration. A `client_id` URL comes from an
|
|
383
|
+
// UNAUTHENTICATED stranger, so an escape on this path would be an operator declaring that
|
|
384
|
+
// strangers may address the deployment's internal network — a sentence with no legitimate
|
|
385
|
+
// reading. The escape exists only for a target class an operator authors themselves.
|
|
386
|
+
resolveAddresses: async (hostname) => {
|
|
387
|
+
const addresses = await this.resolveAddresses(hostname);
|
|
388
|
+
return addresses.map((address) => ({ address, family: isIP(address) }));
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
}
|
|
343
392
|
async fetchDocument(url) {
|
|
344
393
|
try {
|
|
345
|
-
const response = await
|
|
346
|
-
// `redirect: 'error'` on purpose: following a redirect would re-point the fetch at a target
|
|
347
|
-
// the SSRF check never saw, which is the guard's most obvious bypass.
|
|
348
|
-
redirect: 'error',
|
|
349
|
-
headers: { accept: 'application/json' },
|
|
350
|
-
signal: AbortSignal.timeout(CIMD_FETCH_TIMEOUT_MS),
|
|
351
|
-
});
|
|
394
|
+
const response = await this.performOutboundRequest(url);
|
|
352
395
|
if (!response.ok) {
|
|
353
396
|
return this.reject(CimdRejectionReason.UNREACHABLE, `client metadata document responded ${response.status}`);
|
|
354
397
|
}
|
|
@@ -379,6 +422,23 @@ let CimdClientMetadataBackendService = class CimdClientMetadataBackendService {
|
|
|
379
422
|
}
|
|
380
423
|
}
|
|
381
424
|
catch (error) {
|
|
425
|
+
/**
|
|
426
|
+
* A connect-time SSRF refusal is NOT "unreachable", and collapsing the two would lose the
|
|
427
|
+
* signal this whole guard exists to produce. `SSRF_TARGET_REFUSED` is counted and alerted on —
|
|
428
|
+
* the enum's own JSDoc says an operator watching a spike in it "is watching an attack, not a
|
|
429
|
+
* misconfiguration" — while `UNREACHABLE` is ordinary noise from strangers' broken hosts.
|
|
430
|
+
*
|
|
431
|
+
* A rebind lands HERE rather than at {@link refuseInternalTarget}, because by construction it
|
|
432
|
+
* passed that check. This branch is the only place it can be named.
|
|
433
|
+
*/
|
|
434
|
+
if (error instanceof OutboundTargetRefusedError) {
|
|
435
|
+
this.logger.debug('[cimd] outbound target refused at connect time', {
|
|
436
|
+
clientId: url.toString(),
|
|
437
|
+
rejection: error.rejection,
|
|
438
|
+
refusedAddress: error.refusedAddress,
|
|
439
|
+
});
|
|
440
|
+
return this.reject(CimdRejectionReason.SSRF_TARGET_REFUSED, 'client_id host connects to a non-public address');
|
|
441
|
+
}
|
|
382
442
|
return this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document could not be fetched');
|
|
383
443
|
}
|
|
384
444
|
}
|
package/dist/esm/security/authentications/services/cimd-client-metadata.backend.service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cimd-client-metadata.backend.service.js","sourceRoot":"","sources":["../../../../../../src/security/authentications/services/cimd-client-metadata.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport { injectable, inject } from 'inversify';\nimport { lookup as dnsLookup } from 'node:dns/promises';\n\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport {\n OutboundTargetResolution,\n resolvesOnlyToPublicAddresses,\n} from '~wildo-backend-lib/security/ssrf/outbound-target-guard.backend.utils';\nimport {\n CimdClientMetadataSchema,\n CimdRejectionReason,\n CimdTrustPolicy,\n CIMD_CACHE_MAX_TTL_MS,\n CIMD_CACHE_MIN_TTL_MS,\n CIMD_FETCH_TIMEOUT_MS,\n CIMD_MAX_DOCUMENT_BYTES,\n CIMD_MAX_CACHE_ENTRIES,\n CIMD_ACCEPTED_TOKEN_ENDPOINT_AUTH_METHOD,\n CIMD_ASYMMETRIC_TOKEN_ENDPOINT_AUTH_METHODS,\n type CimdClientMetadata,\n} from '~wildo-backend-lib/security/authentications/models/cimd.backend.schemas';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\n\n/** The deployment's CIMD posture, resolved from application config. */\nexport interface CimdConfiguration {\n policy: CimdTrustPolicy;\n /** Hosts accepted under {@link CimdTrustPolicy.ALLOWLIST}. Exact host match, case-insensitive. */\n allowedHosts?: readonly string[];\n}\n\nexport type CimdResolution =\n | { kind: 'ok'; metadata: CimdClientMetadata }\n | { kind: 'rejected'; reason: CimdRejectionReason; detail: string };\n\ninterface CachedDocument { metadata: CimdClientMetadata; expiresAtMs: number }\n\n/**\n * Resolve an HTTPS `client_id` URL into validated client metadata (CIMD).\n *\n * ## What makes this different from every other lookup in the provider\n *\n * Every other client resolution reads a row this application minted. This one takes a URL from an\n * UNAUTHENTICATED stranger and makes an outbound request to it. That inverts the usual trust\n * direction, and the draft is explicit about the consequence:\n *\n * \"The authorization server takes a URL as input from an unknown client and fetches that URL. A\n * malicious client could use this to trigger the authorization server to make requests to\n * arbitrary URLs, such as requests to private administration endpoints the authorization server\n * has access to.\"\n * spec-cite: MCP 2025-11-25 — Authorization § Client ID Metadata Document Security\n *\n * So the order of operations is itself a control: POLICY first (is this deployment even accepting\n * stranger URLs?), then SHAPE, then the SSRF target check, and only then a bounded fetch. Every\n * cheap refusal happens before anything leaves the process.\n *\n * ## What this deliberately does NOT do\n *\n * It does not decide whether the caller may have a token. It resolves an IDENTITY and the redirect\n * URIs that identity claims; consent, scope and audience remain the caller's own gates. A client\n * that resolves here is a client whose NAME the consent screen may show — nothing more.\n *\n * assurance-control: WILDO.IDENTITY.CLIENT_IDENTITY_ASSERTION — a client identity is bound to a\n * domain the client demonstrably controls\n */\n@injectable()\nexport class CimdClientMetadataBackendService {\n /**\n * In-process, per-pod. Deliberately not Redis.\n *\n * The document is public by construction — anyone can fetch it — so a shared cache buys only\n * fewer outbound requests, at the cost of a shared mutable surface keyed on attacker-supplied\n * strings. A per-pod cache cannot be poisoned across pods and disappears on restart, which is also\n * the crudest revocation path available.\n *\n * **It is bounded by {@link CIMD_MAX_CACHE_ENTRIES}, and that bound is load-bearing.** An earlier\n * revision of this comment claimed the cache was bounded when nothing bounded it: the key is an\n * attacker-supplied URL, entries were only SKIPPED when stale and never reclaimed, and there was\n * no ceiling — so the map grew for the life of the pod. Insertion order is eviction order (a Map\n * preserves it), which is the right policy here because every entry has a short, bounded TTL: the\n * oldest entry is also the closest to expiry.\n */\n private readonly cache = new Map<string, CachedDocument>();\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly appConfigService: AppConfigurationService,\n ) {}\n\n /**\n * The deployment's CIMD posture, read from `auth.cimd` in the application configuration.\n *\n * **One reader, deliberately.** Two facts must never disagree: what the discovery document\n * ADVERTISES (`client_id_metadata_document_supported`) and what the authorize path ACCEPTS. When\n * each read the config for itself, a divergence between them would be invisible — the server would\n * advertise a capability it refuses, or refuse one it advertises, and every client would blame its\n * own implementation. Both now call this.\n *\n * Defaults to `DISABLED` when unconfigured: nothing fetches a stranger's URL until an application\n * opts in. A framework that shipped `OPEN` by default would open an SSRF surface on every\n * deployment that never asked for one.\n */\n public deploymentConfiguration(): CimdConfiguration {\n const authored = (this.appConfigService.config?.auth as { cimd?: { policy?: CimdTrustPolicy; allowedClients?: string[] } } | undefined)?.cimd;\n return {\n policy: authored?.policy ?? CimdTrustPolicy.DISABLED,\n allowedHosts: authored?.allowedClients ?? [],\n };\n }\n\n /** Does this `client_id` even look like a CIMD identifier? Cheap, allocation-free triage. */\n public isCimdClientId(clientId: string): boolean {\n return clientId.startsWith('https://');\n }\n\n public async resolve(clientId: string, config: CimdConfiguration, nowMs = Date.now()): Promise<CimdResolution> {\n // 1 — POLICY, before anything else. A disabled deployment must not even parse the URL, let\n // alone resolve DNS for it: refusing later would still have leaked that this server looks.\n if (config.policy === CimdTrustPolicy.DISABLED) {\n return this.reject(CimdRejectionReason.POLICY_DISABLED, 'client id metadata documents are not enabled');\n }\n\n // 2 — SHAPE. \"The `client_id` URL MUST use the \"https\" scheme and contain a path component\".\n // spec-cite: MCP 2025-11-25 — Authorization § Client ID Metadata Documents → Implementation Requirements\n // The path requirement is not cosmetic: it stops a bare origin being an identity, so one\n // compromised host cannot claim to be every client on that host.\n let url: URL;\n try {\n url = new URL(clientId);\n } catch {\n return this.reject(CimdRejectionReason.MALFORMED_CLIENT_ID, 'client_id is not a URL');\n }\n if (url.protocol !== 'https:') {\n return this.reject(CimdRejectionReason.MALFORMED_CLIENT_ID, 'client_id must use the https scheme');\n }\n if (url.pathname === '/' || url.pathname === '') {\n return this.reject(CimdRejectionReason.MALFORMED_CLIENT_ID, 'client_id must contain a path component');\n }\n if (url.hash) {\n // A fragment is never sent to the server, so two client_ids differing only by fragment would\n // fetch the same document and then fail the identity comparison — confusing, and pointless.\n return this.reject(CimdRejectionReason.MALFORMED_CLIENT_ID, 'client_id must not contain a fragment');\n }\n\n // 3 — TRUST POLICY on the host.\n if (config.policy === CimdTrustPolicy.ALLOWLIST && !this.isAllowListed(url, config.allowedHosts ?? [])) {\n return this.reject(CimdRejectionReason.HOST_NOT_ALLOWED, 'client_id is not on this deployment allow-list');\n }\n\n // 4 — CACHE, keyed on the exact URL. Read before the SSRF check because a cached document was\n // already validated against every gate above at the time it was stored, and the policy\n // gates above have already re-run on THIS request.\n const cached = this.cache.get(url.toString());\n if (cached && cached.expiresAtMs > nowMs) {\n return { kind: 'ok', metadata: cached.metadata };\n }\n\n // 5 — SSRF. Resolved BEFORE the fetch: \"Authorization servers SHOULD avoid fetching any URLs\n // using private or loopback addresses\".\n // spec-cite: draft-ietf-oauth-client-id-metadata-document-00 § 6.5\n const ssrf = await this.refuseInternalTarget(url);\n if (ssrf) return ssrf;\n\n // 6 — Bounded fetch.\n const fetched = await this.fetchDocument(url);\n if (fetched.kind !== 'fetched') return fetched;\n\n // 7 — STRUCTURE.\n const parsed = CimdClientMetadataSchema.safeParse(fetched.body);\n if (!parsed.success) {\n // NOT cached: \"The authorization server MUST NOT cache documents which are invalid or\n // malformed.\" Caching a malformed document would let one bad deploy pin a client out for the\n // whole TTL.\n // spec-cite: draft-ietf-oauth-client-id-metadata-document-00 § 4.4\n return this.reject(CimdRejectionReason.MALFORMED_DOCUMENT, 'document is not a valid client metadata document');\n }\n\n // 8 — IDENTITY. \"The client metadata document MUST contain a `client_id` property whose value\n // MUST match the URL of the document using simple string comparison as defined in RFC 3986\n // Section 6.2.1.\"\n // spec-cite: draft-ietf-oauth-client-id-metadata-document-00 § 4.1\n //\n // This is the load-bearing check of the whole mechanism: without it, anyone who can host a\n // JSON file could claim any other client's identity by naming it.\n if (parsed.data.client_id !== url.toString()) {\n return this.reject(\n CimdRejectionReason.IDENTITY_MISMATCH,\n 'the document\\'s client_id does not match the URL it was fetched from',\n );\n }\n\n // 9 — CLIENT AUTHENTICATION. Checked BEFORE the cache write, alongside structure and identity,\n // for the same reason those are: a document this server will never accept must not occupy a\n // cache slot, and must not be re-served to a later request as though it had been validated.\n const authMethod = this.refuseUnacceptableClientAuthentication(parsed.data);\n if (authMethod) return authMethod;\n\n this.storeInCache(url.toString(), parsed.data, nowMs + this.resolveCacheTtlMs(fetched.cacheControl), nowMs);\n return { kind: 'ok', metadata: parsed.data };\n }\n\n /**\n * Write a validated document, reclaiming space first so the map cannot grow without limit.\n *\n * Two steps, in this order:\n *\n * 1. **Sweep the expired.** Reclaiming stale entries before evicting live ones means a steady\n * state of legitimate traffic never evicts anything — the TTL does the work, and eviction is\n * reserved for genuine pressure.\n * 2. **Evict the oldest** while still at the ceiling. `Map` iterates in insertion order, and\n * because every entry carries a short bounded TTL the oldest is also the nearest to expiry —\n * so insertion order is a good proxy for \"least valuable\" without tracking access times.\n *\n * There is deliberately NO delete-before-set for an existing key. A first draft had one, to move a\n * refreshed document to the end of the order — but this method is only ever reached after a cache\n * MISS: a live entry returns from `resolve` before the fetch, and an expired one is removed by the\n * sweep above. The key can never still be present, so the delete was guarding a state that cannot\n * occur, and a test written to prove it necessarily failed. Removed rather than kept as defence,\n * because dead code with a plausible comment is how the next reader is misled.\n */\n private storeInCache(key: string, metadata: CimdClientMetadata, expiresAtMs: number, nowMs: number): void {\n for (const [cachedKey, cached] of this.cache) {\n if (cached.expiresAtMs <= nowMs) this.cache.delete(cachedKey);\n }\n while (this.cache.size >= CIMD_MAX_CACHE_ENTRIES) {\n const oldest = this.cache.keys().next();\n if (oldest.done) break;\n this.cache.delete(oldest.value);\n }\n this.cache.set(key, { metadata, expiresAtMs });\n }\n\n /**\n * Refuse a document whose declared client authentication method this provider will not honour.\n *\n * Two refusals with two reasons, because they are two different facts about the world:\n *\n * - A SYMMETRIC method is the client violating the draft — \"the `token_endpoint_auth_method`\n * property MUST NOT include `client_secret_post`, `client_secret_basic`, `client_secret_jwt`, or\n * any other method based around a shared symmetric secret.\"\n * spec-cite: draft-ietf-oauth-client-id-metadata-document-00 § 4.1\n * - `private_key_jwt` is permitted by § 6.2 (\"clients MAY establish credentials at the\n * authorization server by using authentication methods that use public/private key pairs, by\n * publishing the public key in their metadata document\") and simply is not implemented here.\n *\n * Both refuse. The alternative — accept the document and treat the client as public — is a silent\n * downgrade: the client believes it authenticates, this server never checks, and neither side can\n * observe the disagreement. An absent `token_endpoint_auth_method` IS accepted as public, which is\n * what the specification's own worked example declares (`\"token_endpoint_auth_method\": \"none\"`).\n */\n private refuseUnacceptableClientAuthentication(metadata: CimdClientMetadata): CimdResolution | undefined {\n const declared = metadata.token_endpoint_auth_method;\n if (declared === undefined || declared === CIMD_ACCEPTED_TOKEN_ENDPOINT_AUTH_METHOD) return undefined;\n if (CIMD_ASYMMETRIC_TOKEN_ENDPOINT_AUTH_METHODS.includes(declared)) {\n return this.reject(\n CimdRejectionReason.UNSUPPORTED_CLIENT_AUTHENTICATION,\n `client authentication method '${declared}' is not supported by this authorization server`,\n );\n }\n return this.reject(\n CimdRejectionReason.FORBIDDEN_CLIENT_AUTHENTICATION,\n `client authentication method '${declared}' is not permitted for a client id metadata document`,\n );\n }\n\n /**\n * Is a redirect URI one this client actually claims?\n *\n * \"MUST validate redirect URIs presented in an authorization request against those in the metadata\n * document.\"\n * spec-cite: MCP 2025-11-25 — Authorization § Client ID Metadata Documents → Implementation Requirements\n *\n * EXACT string comparison, not prefix or origin matching: a prefix rule turns one claimed\n * `https://app.example/cb` into authority over `https://app.example/cb.attacker/...`, and OAuth\n * 2.1 requires exact redirect matching independently of CIMD.\n */\n public permitsRedirectUri(metadata: CimdClientMetadata, redirectUri: string): boolean {\n return metadata.redirect_uris.includes(redirectUri);\n }\n\n /**\n * Does this client's claimed redirect set consist ONLY of loopback URIs?\n *\n * Callers use this to decide whether the consent screen needs a stronger warning. CIMD \"cannot\n * prevent `localhost` URL impersonation by themselves\": an attacker presents the LEGITIMATE\n * client's metadata URL, binds any localhost port, and receives the code — while the user sees the\n * legitimate client's name.\n * spec-cite: MCP 2025-11-25 — Authorization § Client ID Metadata Document Security → Localhost Redirect URI Risks\n *\n * Reported rather than refused: loopback redirects are how every CLI and desktop MCP client works,\n * so refusing them would exclude the majority of real callers. The mitigation the spec names is\n * display, and display needs this signal.\n */\n public claimsOnlyLoopbackRedirects(metadata: CimdClientMetadata): boolean {\n return metadata.redirect_uris.every((uri) => {\n try {\n const host = new URL(uri).hostname.toLowerCase();\n return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]';\n } catch {\n return false;\n }\n });\n }\n\n /**\n * Is this `client_id` admitted by the deployment's allow-list?\n *\n * An entry is matched at ONE OF TWO precisions, decided by the entry itself:\n *\n * - **A full `https://…` URL** matches that exact `client_id` and nothing else.\n * - **A bare host** matches every `client_id` on that host.\n *\n * Both exist because they answer different questions. Clerk's CIMD admission is per-Client-ID-URL,\n * and that is the stricter and usually correct grain: a host entry admits EVERY client hosted\n * there, which is wrong the moment the domain is a shared platform hosting many vendors' metadata —\n * allow-listing one vendor would silently admit all of them. The host form is kept for the common\n * case where a deployment trusts a vendor's whole domain and does not want to re-edit config each\n * time that vendor publishes a new client.\n *\n * The first implementation offered ONLY the host form. Checking it against a shipping\n * implementation is what surfaced the shared-domain hole.\n */\n private isAllowListed(url: URL, entries: readonly string[]): boolean {\n const clientId = url.toString();\n const host = url.hostname.toLowerCase();\n return entries.some((entry) => {\n const value = entry.trim();\n if (!value) return false;\n return value.includes('://')\n ? value === clientId\n : value.toLowerCase() === host;\n });\n }\n\n /**\n * Refuse a target that resolves to an address this server can reach but the public internet\n * cannot.\n *\n * DNS is resolved HERE rather than trusting the hostname, because `internal.example.com` may be a\n * public name with a private A record — the attack the guard exists for. Every resolved address is\n * checked, not just the first: a hostile resolver can return one public and one private address\n * and rely on the client picking the other.\n *\n * ⚠️ Residual, stated rather than hidden: this is a check-then-fetch, so a DNS entry that changes\n * between the two (DNS rebinding) is not covered. Closing it needs the fetch pinned to the\n * validated address, which Node's `fetch` does not expose. The bounded timeout and size cap limit\n * what a successful rebind yields, and the identity check means a rebound internal endpoint still\n * has to return a document naming this exact URL.\n */\n private async refuseInternalTarget(url: URL): Promise<CimdResolution | undefined> {\n const resolution = await resolvesOnlyToPublicAddresses(url.hostname, (hostname) => this.resolveAddresses(hostname));\n\n switch (resolution) {\n case OutboundTargetResolution.PUBLIC:\n return undefined;\n case OutboundTargetResolution.UNRESOLVABLE:\n return this.reject(CimdRejectionReason.UNREACHABLE, 'client_id host does not resolve');\n case OutboundTargetResolution.INTERNAL:\n return this.reject(CimdRejectionReason.SSRF_TARGET_REFUSED, 'client_id host resolves to a non-public address');\n }\n }\n\n /**\n * Throws on failure rather than returning `undefined`, because the shared resolver distinguishes\n * \"the resolver refused\" (UNRESOLVABLE) from \"the resolver answered with nothing usable\"\n * (INTERNAL) — collapsing both into an empty array would turn a NXDOMAIN into an SSRF verdict and\n * lose the diagnostic the caller reports.\n */\n private async resolveAddresses(hostname: string): Promise<string[]> {\n try {\n const records = await dnsLookup(hostname, { all: true });\n return records.map((record) => record.address);\n } catch (error) {\n this.logger.debug('[cimd] client_id host did not resolve', { hostname, ...projectCaughtErrorLogFields(error) });\n throw error;\n }\n }\n\n private async fetchDocument(url: URL): Promise<{ kind: 'fetched'; body: unknown; cacheControl: string | null } | CimdResolution> {\n try {\n const response = await fetch(url.toString(), {\n // `redirect: 'error'` on purpose: following a redirect would re-point the fetch at a target\n // the SSRF check never saw, which is the guard's most obvious bypass.\n redirect: 'error',\n headers: { accept: 'application/json' },\n signal: AbortSignal.timeout(CIMD_FETCH_TIMEOUT_MS),\n });\n if (!response.ok) {\n return this.reject(CimdRejectionReason.UNREACHABLE, `client metadata document responded ${response.status}`);\n }\n\n // ── SIZE, enforced DURING the read rather than after it ─────────────────────────────────\n //\n // The previous implementation did `await response.text()` and then measured — which buffers\n // the ENTIRE body first, so a hostile URL returning a gigabyte was fully downloaded and held\n // in memory before being rejected. The cap existed and bounded nothing; the denial-of-service\n // primitive it was written to remove was still there, and the 5 s timeout does not substitute\n // because a fast server delivers a great deal inside it.\n //\n // It also measured `text.length` — UTF-16 code units — against a constant named `_BYTES`, so a\n // multi-byte document read as smaller than it is.\n const declaredLength = Number(response.headers.get('content-length'));\n if (Number.isFinite(declaredLength) && declaredLength > CIMD_MAX_DOCUMENT_BYTES) {\n // Cheapest possible refusal: the server told us, so nothing needs to be read at all. Not\n // TRUSTED — a lying or absent header just falls through to the streaming counter below.\n return this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document exceeds the permitted size');\n }\n\n const read = await this.readBoundedBody(response);\n if (read.kind !== 'read') return read;\n\n try {\n return { kind: 'fetched', body: JSON.parse(read.text), cacheControl: response.headers.get('cache-control') };\n } catch {\n return this.reject(CimdRejectionReason.MALFORMED_DOCUMENT, 'client metadata document is not valid JSON');\n }\n } catch (error) {\n return this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document could not be fetched');\n }\n }\n\n /**\n * Read the body with a running BYTE counter, abandoning the transfer the moment it exceeds the cap.\n *\n * This is the half that actually bounds memory: the counter is checked per chunk, so the most that\n * is ever retained is the cap plus one chunk, whatever the server intended to send. `reader.cancel()`\n * tears the connection down rather than politely draining a body we have already refused.\n *\n * Falls back to `response.text()` when the response exposes no stream. That is not a test\n * accommodation — `fetch` may legitimately yield a null body (a 204, or a HEAD-like response) — and\n * the byte length is still measured properly there, via `Buffer.byteLength` rather than `String.length`.\n */\n private async readBoundedBody(response: Response): Promise<{ kind: 'read'; text: string } | CimdResolution> {\n const stream = response.body;\n if (!stream || typeof (stream as ReadableStream<Uint8Array>).getReader !== 'function') {\n const text = await response.text();\n return Buffer.byteLength(text, 'utf8') > CIMD_MAX_DOCUMENT_BYTES\n ? this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document exceeds the permitted size')\n : { kind: 'read', text };\n }\n\n const reader = (stream as ReadableStream<Uint8Array>).getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!value) continue;\n total += value.byteLength;\n if (total > CIMD_MAX_DOCUMENT_BYTES) {\n await reader.cancel().catch(() => undefined);\n return this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document exceeds the permitted size');\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock?.();\n }\n return { kind: 'read', text: Buffer.concat(chunks).toString('utf8') };\n }\n\n /** Honour `max-age`, bounded at both ends. See the constants for why each bound exists. */\n private resolveCacheTtlMs(cacheControl: string | null): number {\n const maxAge = cacheControl?.match(/max-age\\s*=\\s*(\\d+)/i);\n if (!maxAge) return CIMD_CACHE_MIN_TTL_MS;\n const requested = Number(maxAge[1]) * 1000;\n if (!Number.isFinite(requested)) return CIMD_CACHE_MIN_TTL_MS;\n return Math.min(CIMD_CACHE_MAX_TTL_MS, Math.max(CIMD_CACHE_MIN_TTL_MS, requested));\n }\n\n private reject(reason: CimdRejectionReason, detail: string): CimdResolution {\n return { kind: 'rejected', reason, detail };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cimd-client-metadata.backend.service.js","sourceRoot":"","sources":["../../../../../../src/security/authentications/services/cimd-client-metadata.backend.service.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport { injectable, inject } from 'inversify';\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { isIP } from 'node:net';\n\nimport { SAAS_SERVICE_TYPES } from '~wildo-backend-lib/inject/models/service-types';\nimport { LoggerService } from '~wildo-backend-lib/monitoring/logger/services/logger.service';\nimport { projectCaughtErrorLogFields } from '~wildo-backend-lib/errors/utils/error-log-level-classification.backend.utils';\nimport {\n OutboundTargetResolution,\n resolvesOnlyToPublicAddresses,\n} from '~wildo-backend-lib/security/ssrf/outbound-target-guard.backend.utils';\nimport {\n OutboundTargetRefusedError,\n pinnedOutboundFetch,\n} from '~wildo-backend-lib/security/ssrf/pinned-outbound-fetch.backend.utils';\nimport {\n CimdClientMetadataSchema,\n CimdRejectionReason,\n CimdTrustPolicy,\n CIMD_CACHE_MAX_TTL_MS,\n CIMD_CACHE_MIN_TTL_MS,\n CIMD_FETCH_TIMEOUT_MS,\n CIMD_MAX_DOCUMENT_BYTES,\n CIMD_MAX_CACHE_ENTRIES,\n CIMD_ACCEPTED_TOKEN_ENDPOINT_AUTH_METHOD,\n CIMD_ASYMMETRIC_TOKEN_ENDPOINT_AUTH_METHODS,\n type CimdClientMetadata,\n} from '~wildo-backend-lib/security/authentications/models/cimd.backend.schemas';\nimport { AppConfigurationService } from '~wildo-backend-lib/config/services/app-configuration.backend.service';\n\n/**\n * The scheme the egress client will issue on.\n *\n * A `client_id` that is not `https:` is already refused at shape time (`refuseMalformedClientId`),\n * so this restates a decision rather than making a new one — deliberately. The pinned client takes\n * the scheme policy as a required input precisely so no caller can inherit a permissive default, and\n * a second statement at the egress point costs one line and survives a future refactor that moves\n * the shape check.\n */\nconst CIMD_ADMITTED_PROTOCOLS: readonly string[] = ['https:'];\n\n/** The deployment's CIMD posture, resolved from application config. */\nexport interface CimdConfiguration {\n policy: CimdTrustPolicy;\n /** Hosts accepted under {@link CimdTrustPolicy.ALLOWLIST}. Exact host match, case-insensitive. */\n allowedHosts?: readonly string[];\n}\n\nexport type CimdResolution =\n | { kind: 'ok'; metadata: CimdClientMetadata }\n | { kind: 'rejected'; reason: CimdRejectionReason; detail: string };\n\ninterface CachedDocument { metadata: CimdClientMetadata; expiresAtMs: number }\n\n/**\n * Resolve an HTTPS `client_id` URL into validated client metadata (CIMD).\n *\n * ## What makes this different from every other lookup in the provider\n *\n * Every other client resolution reads a row this application minted. This one takes a URL from an\n * UNAUTHENTICATED stranger and makes an outbound request to it. That inverts the usual trust\n * direction, and the draft is explicit about the consequence:\n *\n * \"The authorization server takes a URL as input from an unknown client and fetches that URL. A\n * malicious client could use this to trigger the authorization server to make requests to\n * arbitrary URLs, such as requests to private administration endpoints the authorization server\n * has access to.\"\n * spec-cite: MCP 2025-11-25 — Authorization § Client ID Metadata Document Security\n *\n * So the order of operations is itself a control: POLICY first (is this deployment even accepting\n * stranger URLs?), then SHAPE, then the SSRF target check, and only then a bounded fetch. Every\n * cheap refusal happens before anything leaves the process.\n *\n * ## What this deliberately does NOT do\n *\n * It does not decide whether the caller may have a token. It resolves an IDENTITY and the redirect\n * URIs that identity claims; consent, scope and audience remain the caller's own gates. A client\n * that resolves here is a client whose NAME the consent screen may show — nothing more.\n *\n * assurance-control: WILDO.IDENTITY.CLIENT_IDENTITY_ASSERTION — a client identity is bound to a\n * domain the client demonstrably controls\n */\n@injectable()\nexport class CimdClientMetadataBackendService {\n /**\n * In-process, per-pod. Deliberately not Redis.\n *\n * The document is public by construction — anyone can fetch it — so a shared cache buys only\n * fewer outbound requests, at the cost of a shared mutable surface keyed on attacker-supplied\n * strings. A per-pod cache cannot be poisoned across pods and disappears on restart, which is also\n * the crudest revocation path available.\n *\n * **It is bounded by {@link CIMD_MAX_CACHE_ENTRIES}, and that bound is load-bearing.** An earlier\n * revision of this comment claimed the cache was bounded when nothing bounded it: the key is an\n * attacker-supplied URL, entries were only SKIPPED when stale and never reclaimed, and there was\n * no ceiling — so the map grew for the life of the pod. Insertion order is eviction order (a Map\n * preserves it), which is the right policy here because every entry has a short, bounded TTL: the\n * oldest entry is also the closest to expiry.\n */\n private readonly cache = new Map<string, CachedDocument>();\n\n constructor(\n @inject(SAAS_SERVICE_TYPES.Logger) private readonly logger: LoggerService,\n @inject(SAAS_SERVICE_TYPES.AppConfigService) private readonly appConfigService: AppConfigurationService,\n ) {}\n\n /**\n * The deployment's CIMD posture, read from `auth.cimd` in the application configuration.\n *\n * **One reader, deliberately.** Two facts must never disagree: what the discovery document\n * ADVERTISES (`client_id_metadata_document_supported`) and what the authorize path ACCEPTS. When\n * each read the config for itself, a divergence between them would be invisible — the server would\n * advertise a capability it refuses, or refuse one it advertises, and every client would blame its\n * own implementation. Both now call this.\n *\n * Defaults to `DISABLED` when unconfigured: nothing fetches a stranger's URL until an application\n * opts in. A framework that shipped `OPEN` by default would open an SSRF surface on every\n * deployment that never asked for one.\n */\n public deploymentConfiguration(): CimdConfiguration {\n const authored = (this.appConfigService.config?.auth as { cimd?: { policy?: CimdTrustPolicy; allowedClients?: string[] } } | undefined)?.cimd;\n return {\n policy: authored?.policy ?? CimdTrustPolicy.DISABLED,\n allowedHosts: authored?.allowedClients ?? [],\n };\n }\n\n /** Does this `client_id` even look like a CIMD identifier? Cheap, allocation-free triage. */\n public isCimdClientId(clientId: string): boolean {\n return clientId.startsWith('https://');\n }\n\n public async resolve(clientId: string, config: CimdConfiguration, nowMs = Date.now()): Promise<CimdResolution> {\n // 1 — POLICY, before anything else. A disabled deployment must not even parse the URL, let\n // alone resolve DNS for it: refusing later would still have leaked that this server looks.\n if (config.policy === CimdTrustPolicy.DISABLED) {\n return this.reject(CimdRejectionReason.POLICY_DISABLED, 'client id metadata documents are not enabled');\n }\n\n // 2 — SHAPE. \"The `client_id` URL MUST use the \"https\" scheme and contain a path component\".\n // spec-cite: MCP 2025-11-25 — Authorization § Client ID Metadata Documents → Implementation Requirements\n // The path requirement is not cosmetic: it stops a bare origin being an identity, so one\n // compromised host cannot claim to be every client on that host.\n let url: URL;\n try {\n url = new URL(clientId);\n } catch {\n return this.reject(CimdRejectionReason.MALFORMED_CLIENT_ID, 'client_id is not a URL');\n }\n if (url.protocol !== 'https:') {\n return this.reject(CimdRejectionReason.MALFORMED_CLIENT_ID, 'client_id must use the https scheme');\n }\n if (url.pathname === '/' || url.pathname === '') {\n return this.reject(CimdRejectionReason.MALFORMED_CLIENT_ID, 'client_id must contain a path component');\n }\n if (url.hash) {\n // A fragment is never sent to the server, so two client_ids differing only by fragment would\n // fetch the same document and then fail the identity comparison — confusing, and pointless.\n return this.reject(CimdRejectionReason.MALFORMED_CLIENT_ID, 'client_id must not contain a fragment');\n }\n\n // 3 — TRUST POLICY on the host.\n if (config.policy === CimdTrustPolicy.ALLOWLIST && !this.isAllowListed(url, config.allowedHosts ?? [])) {\n return this.reject(CimdRejectionReason.HOST_NOT_ALLOWED, 'client_id is not on this deployment allow-list');\n }\n\n // 4 — CACHE, keyed on the exact URL. Read before the SSRF check because a cached document was\n // already validated against every gate above at the time it was stored, and the policy\n // gates above have already re-run on THIS request.\n const cached = this.cache.get(url.toString());\n if (cached && cached.expiresAtMs > nowMs) {\n return { kind: 'ok', metadata: cached.metadata };\n }\n\n // 5 — SSRF. Resolved BEFORE the fetch: \"Authorization servers SHOULD avoid fetching any URLs\n // using private or loopback addresses\".\n // spec-cite: draft-ietf-oauth-client-id-metadata-document-00 § 6.5\n const ssrf = await this.refuseInternalTarget(url);\n if (ssrf) return ssrf;\n\n // 6 — Bounded fetch.\n const fetched = await this.fetchDocument(url);\n if (fetched.kind !== 'fetched') return fetched;\n\n // 7 — STRUCTURE.\n const parsed = CimdClientMetadataSchema.safeParse(fetched.body);\n if (!parsed.success) {\n // NOT cached: \"The authorization server MUST NOT cache documents which are invalid or\n // malformed.\" Caching a malformed document would let one bad deploy pin a client out for the\n // whole TTL.\n // spec-cite: draft-ietf-oauth-client-id-metadata-document-00 § 4.4\n return this.reject(CimdRejectionReason.MALFORMED_DOCUMENT, 'document is not a valid client metadata document');\n }\n\n // 8 — IDENTITY. \"The client metadata document MUST contain a `client_id` property whose value\n // MUST match the URL of the document using simple string comparison as defined in RFC 3986\n // Section 6.2.1.\"\n // spec-cite: draft-ietf-oauth-client-id-metadata-document-00 § 4.1\n //\n // This is the load-bearing check of the whole mechanism: without it, anyone who can host a\n // JSON file could claim any other client's identity by naming it.\n if (parsed.data.client_id !== url.toString()) {\n return this.reject(\n CimdRejectionReason.IDENTITY_MISMATCH,\n 'the document\\'s client_id does not match the URL it was fetched from',\n );\n }\n\n // 9 — CLIENT AUTHENTICATION. Checked BEFORE the cache write, alongside structure and identity,\n // for the same reason those are: a document this server will never accept must not occupy a\n // cache slot, and must not be re-served to a later request as though it had been validated.\n const authMethod = this.refuseUnacceptableClientAuthentication(parsed.data);\n if (authMethod) return authMethod;\n\n this.storeInCache(url.toString(), parsed.data, nowMs + this.resolveCacheTtlMs(fetched.cacheControl), nowMs);\n return { kind: 'ok', metadata: parsed.data };\n }\n\n /**\n * Write a validated document, reclaiming space first so the map cannot grow without limit.\n *\n * Two steps, in this order:\n *\n * 1. **Sweep the expired.** Reclaiming stale entries before evicting live ones means a steady\n * state of legitimate traffic never evicts anything — the TTL does the work, and eviction is\n * reserved for genuine pressure.\n * 2. **Evict the oldest** while still at the ceiling. `Map` iterates in insertion order, and\n * because every entry carries a short bounded TTL the oldest is also the nearest to expiry —\n * so insertion order is a good proxy for \"least valuable\" without tracking access times.\n *\n * There is deliberately NO delete-before-set for an existing key. A first draft had one, to move a\n * refreshed document to the end of the order — but this method is only ever reached after a cache\n * MISS: a live entry returns from `resolve` before the fetch, and an expired one is removed by the\n * sweep above. The key can never still be present, so the delete was guarding a state that cannot\n * occur, and a test written to prove it necessarily failed. Removed rather than kept as defence,\n * because dead code with a plausible comment is how the next reader is misled.\n */\n private storeInCache(key: string, metadata: CimdClientMetadata, expiresAtMs: number, nowMs: number): void {\n for (const [cachedKey, cached] of this.cache) {\n if (cached.expiresAtMs <= nowMs) this.cache.delete(cachedKey);\n }\n while (this.cache.size >= CIMD_MAX_CACHE_ENTRIES) {\n const oldest = this.cache.keys().next();\n if (oldest.done) break;\n this.cache.delete(oldest.value);\n }\n this.cache.set(key, { metadata, expiresAtMs });\n }\n\n /**\n * Refuse a document whose declared client authentication method this provider will not honour.\n *\n * Two refusals with two reasons, because they are two different facts about the world:\n *\n * - A SYMMETRIC method is the client violating the draft — \"the `token_endpoint_auth_method`\n * property MUST NOT include `client_secret_post`, `client_secret_basic`, `client_secret_jwt`, or\n * any other method based around a shared symmetric secret.\"\n * spec-cite: draft-ietf-oauth-client-id-metadata-document-00 § 4.1\n * - `private_key_jwt` is permitted by § 6.2 (\"clients MAY establish credentials at the\n * authorization server by using authentication methods that use public/private key pairs, by\n * publishing the public key in their metadata document\") and simply is not implemented here.\n *\n * Both refuse. The alternative — accept the document and treat the client as public — is a silent\n * downgrade: the client believes it authenticates, this server never checks, and neither side can\n * observe the disagreement. An absent `token_endpoint_auth_method` IS accepted as public, which is\n * what the specification's own worked example declares (`\"token_endpoint_auth_method\": \"none\"`).\n */\n private refuseUnacceptableClientAuthentication(metadata: CimdClientMetadata): CimdResolution | undefined {\n const declared = metadata.token_endpoint_auth_method;\n if (declared === undefined || declared === CIMD_ACCEPTED_TOKEN_ENDPOINT_AUTH_METHOD) return undefined;\n if (CIMD_ASYMMETRIC_TOKEN_ENDPOINT_AUTH_METHODS.includes(declared)) {\n return this.reject(\n CimdRejectionReason.UNSUPPORTED_CLIENT_AUTHENTICATION,\n `client authentication method '${declared}' is not supported by this authorization server`,\n );\n }\n return this.reject(\n CimdRejectionReason.FORBIDDEN_CLIENT_AUTHENTICATION,\n `client authentication method '${declared}' is not permitted for a client id metadata document`,\n );\n }\n\n /**\n * Is a redirect URI one this client actually claims?\n *\n * \"MUST validate redirect URIs presented in an authorization request against those in the metadata\n * document.\"\n * spec-cite: MCP 2025-11-25 — Authorization § Client ID Metadata Documents → Implementation Requirements\n *\n * EXACT string comparison, not prefix or origin matching: a prefix rule turns one claimed\n * `https://app.example/cb` into authority over `https://app.example/cb.attacker/...`, and OAuth\n * 2.1 requires exact redirect matching independently of CIMD.\n */\n public permitsRedirectUri(metadata: CimdClientMetadata, redirectUri: string): boolean {\n return metadata.redirect_uris.includes(redirectUri);\n }\n\n /**\n * Does this client's claimed redirect set consist ONLY of loopback URIs?\n *\n * Callers use this to decide whether the consent screen needs a stronger warning. CIMD \"cannot\n * prevent `localhost` URL impersonation by themselves\": an attacker presents the LEGITIMATE\n * client's metadata URL, binds any localhost port, and receives the code — while the user sees the\n * legitimate client's name.\n * spec-cite: MCP 2025-11-25 — Authorization § Client ID Metadata Document Security → Localhost Redirect URI Risks\n *\n * Reported rather than refused: loopback redirects are how every CLI and desktop MCP client works,\n * so refusing them would exclude the majority of real callers. The mitigation the spec names is\n * display, and display needs this signal.\n */\n public claimsOnlyLoopbackRedirects(metadata: CimdClientMetadata): boolean {\n return metadata.redirect_uris.every((uri) => {\n try {\n const host = new URL(uri).hostname.toLowerCase();\n return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]';\n } catch {\n return false;\n }\n });\n }\n\n /**\n * Is this `client_id` admitted by the deployment's allow-list?\n *\n * An entry is matched at ONE OF TWO precisions, decided by the entry itself:\n *\n * - **A full `https://…` URL** matches that exact `client_id` and nothing else.\n * - **A bare host** matches every `client_id` on that host.\n *\n * Both exist because they answer different questions. Clerk's CIMD admission is per-Client-ID-URL,\n * and that is the stricter and usually correct grain: a host entry admits EVERY client hosted\n * there, which is wrong the moment the domain is a shared platform hosting many vendors' metadata —\n * allow-listing one vendor would silently admit all of them. The host form is kept for the common\n * case where a deployment trusts a vendor's whole domain and does not want to re-edit config each\n * time that vendor publishes a new client.\n *\n * The first implementation offered ONLY the host form. Checking it against a shipping\n * implementation is what surfaced the shared-domain hole.\n */\n private isAllowListed(url: URL, entries: readonly string[]): boolean {\n const clientId = url.toString();\n const host = url.hostname.toLowerCase();\n return entries.some((entry) => {\n const value = entry.trim();\n if (!value) return false;\n return value.includes('://')\n ? value === clientId\n : value.toLowerCase() === host;\n });\n }\n\n /**\n * Refuse a target that resolves to an address this server can reach but the public internet\n * cannot.\n *\n * DNS is resolved HERE rather than trusting the hostname, because `internal.example.com` may be a\n * public name with a private A record — the attack the guard exists for. Every resolved address is\n * checked, not just the first: a hostile resolver can return one public and one private address\n * and rely on the client picking the other.\n *\n * This is a check-then-fetch, and on its own it would leave DNS rebinding open — a name that\n * answers a public address to THIS resolution and a private one to the connection. That residual\n * is now closed one layer down rather than here: {@link fetchDocument} connects through\n * `pinnedOutboundFetch`, which classifies inside the connection's `lookup` hook, so the address\n * validated and the address connected to are the same value in the same event.\n *\n * This check is KEPT rather than folded into the pinned client, for two reasons. It refuses before\n * anything leaves the process, which is this service's stated order of operations (\"every cheap\n * refusal happens before anything leaves the process\"). And it is the only place that can tell\n * UNRESOLVABLE from INTERNAL — the pinned client's hook sees a resolver failure as a transport\n * failure, and collapsing the two would report a NXDOMAIN as an SSRF attempt.\n */\n private async refuseInternalTarget(url: URL): Promise<CimdResolution | undefined> {\n const resolution = await resolvesOnlyToPublicAddresses(url.hostname, (hostname) => this.resolveAddresses(hostname));\n\n switch (resolution) {\n case OutboundTargetResolution.PUBLIC:\n return undefined;\n case OutboundTargetResolution.UNRESOLVABLE:\n return this.reject(CimdRejectionReason.UNREACHABLE, 'client_id host does not resolve');\n case OutboundTargetResolution.INTERNAL:\n return this.reject(CimdRejectionReason.SSRF_TARGET_REFUSED, 'client_id host resolves to a non-public address');\n }\n }\n\n /**\n * Throws on failure rather than returning `undefined`, because the shared resolver distinguishes\n * \"the resolver refused\" (UNRESOLVABLE) from \"the resolver answered with nothing usable\"\n * (INTERNAL) — collapsing both into an empty array would turn a NXDOMAIN into an SSRF verdict and\n * lose the diagnostic the caller reports.\n */\n private async resolveAddresses(hostname: string): Promise<string[]> {\n try {\n const records = await dnsLookup(hostname, { all: true });\n return records.map((record) => record.address);\n } catch (error) {\n this.logger.debug('[cimd] client_id host did not resolve', { hostname, ...projectCaughtErrorLogFields(error) });\n throw error;\n }\n }\n\n /**\n * The outbound request itself, isolated behind one method so a test can substitute it exactly as\n * it substitutes {@link resolveAddresses}. Those two together are the whole external world this\n * service touches.\n *\n * `pinnedOutboundFetch`, not `fetch`, and the difference is the point. It classifies inside the\n * connection's `lookup` hook, so a `client_id` host that answers a public address to\n * {@link refuseInternalTarget} and a private one to the connection — DNS rebinding, the residual\n * this service documented and could not close — never gets a socket. It also cannot follow a\n * redirect at all, which is strictly stronger than the `redirect: 'error'` this call used to pass:\n * following one would re-point the request at a target no check ever saw.\n *\n * The resolver is the service's OWN {@link resolveAddresses}, so the pre-check and the connection\n * ask the same resolver — a substituted resolver therefore drives both, which is what makes a\n * rebinding pin expressible at all.\n */\n private async performOutboundRequest(url: URL): Promise<Response> {\n return pinnedOutboundFetch(url.toString(), {\n admittedProtocols: CIMD_ADMITTED_PROTOCOLS,\n headers: { accept: 'application/json' },\n signal: AbortSignal.timeout(CIMD_FETCH_TIMEOUT_MS),\n // Never `admitPrivateAddresses` here, under any configuration. A `client_id` URL comes from an\n // UNAUTHENTICATED stranger, so an escape on this path would be an operator declaring that\n // strangers may address the deployment's internal network — a sentence with no legitimate\n // reading. The escape exists only for a target class an operator authors themselves.\n resolveAddresses: async (hostname) => {\n const addresses = await this.resolveAddresses(hostname);\n return addresses.map((address) => ({ address, family: isIP(address) }));\n },\n });\n }\n\n private async fetchDocument(url: URL): Promise<{ kind: 'fetched'; body: unknown; cacheControl: string | null } | CimdResolution> {\n try {\n const response = await this.performOutboundRequest(url);\n if (!response.ok) {\n return this.reject(CimdRejectionReason.UNREACHABLE, `client metadata document responded ${response.status}`);\n }\n\n // ── SIZE, enforced DURING the read rather than after it ─────────────────────────────────\n //\n // The previous implementation did `await response.text()` and then measured — which buffers\n // the ENTIRE body first, so a hostile URL returning a gigabyte was fully downloaded and held\n // in memory before being rejected. The cap existed and bounded nothing; the denial-of-service\n // primitive it was written to remove was still there, and the 5 s timeout does not substitute\n // because a fast server delivers a great deal inside it.\n //\n // It also measured `text.length` — UTF-16 code units — against a constant named `_BYTES`, so a\n // multi-byte document read as smaller than it is.\n const declaredLength = Number(response.headers.get('content-length'));\n if (Number.isFinite(declaredLength) && declaredLength > CIMD_MAX_DOCUMENT_BYTES) {\n // Cheapest possible refusal: the server told us, so nothing needs to be read at all. Not\n // TRUSTED — a lying or absent header just falls through to the streaming counter below.\n return this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document exceeds the permitted size');\n }\n\n const read = await this.readBoundedBody(response);\n if (read.kind !== 'read') return read;\n\n try {\n return { kind: 'fetched', body: JSON.parse(read.text), cacheControl: response.headers.get('cache-control') };\n } catch {\n return this.reject(CimdRejectionReason.MALFORMED_DOCUMENT, 'client metadata document is not valid JSON');\n }\n } catch (error) {\n /**\n * A connect-time SSRF refusal is NOT \"unreachable\", and collapsing the two would lose the\n * signal this whole guard exists to produce. `SSRF_TARGET_REFUSED` is counted and alerted on —\n * the enum's own JSDoc says an operator watching a spike in it \"is watching an attack, not a\n * misconfiguration\" — while `UNREACHABLE` is ordinary noise from strangers' broken hosts.\n *\n * A rebind lands HERE rather than at {@link refuseInternalTarget}, because by construction it\n * passed that check. This branch is the only place it can be named.\n */\n if (error instanceof OutboundTargetRefusedError) {\n this.logger.debug('[cimd] outbound target refused at connect time', {\n clientId: url.toString(),\n rejection: error.rejection,\n refusedAddress: error.refusedAddress,\n });\n return this.reject(CimdRejectionReason.SSRF_TARGET_REFUSED, 'client_id host connects to a non-public address');\n }\n return this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document could not be fetched');\n }\n }\n\n /**\n * Read the body with a running BYTE counter, abandoning the transfer the moment it exceeds the cap.\n *\n * This is the half that actually bounds memory: the counter is checked per chunk, so the most that\n * is ever retained is the cap plus one chunk, whatever the server intended to send. `reader.cancel()`\n * tears the connection down rather than politely draining a body we have already refused.\n *\n * Falls back to `response.text()` when the response exposes no stream. That is not a test\n * accommodation — `fetch` may legitimately yield a null body (a 204, or a HEAD-like response) — and\n * the byte length is still measured properly there, via `Buffer.byteLength` rather than `String.length`.\n */\n private async readBoundedBody(response: Response): Promise<{ kind: 'read'; text: string } | CimdResolution> {\n const stream = response.body;\n if (!stream || typeof (stream as ReadableStream<Uint8Array>).getReader !== 'function') {\n const text = await response.text();\n return Buffer.byteLength(text, 'utf8') > CIMD_MAX_DOCUMENT_BYTES\n ? this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document exceeds the permitted size')\n : { kind: 'read', text };\n }\n\n const reader = (stream as ReadableStream<Uint8Array>).getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!value) continue;\n total += value.byteLength;\n if (total > CIMD_MAX_DOCUMENT_BYTES) {\n await reader.cancel().catch(() => undefined);\n return this.reject(CimdRejectionReason.UNREACHABLE, 'client metadata document exceeds the permitted size');\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock?.();\n }\n return { kind: 'read', text: Buffer.concat(chunks).toString('utf8') };\n }\n\n /** Honour `max-age`, bounded at both ends. See the constants for why each bound exists. */\n private resolveCacheTtlMs(cacheControl: string | null): number {\n const maxAge = cacheControl?.match(/max-age\\s*=\\s*(\\d+)/i);\n if (!maxAge) return CIMD_CACHE_MIN_TTL_MS;\n const requested = Number(maxAge[1]) * 1000;\n if (!Number.isFinite(requested)) return CIMD_CACHE_MIN_TTL_MS;\n return Math.min(CIMD_CACHE_MAX_TTL_MS, Math.max(CIMD_CACHE_MIN_TTL_MS, requested));\n }\n\n private reject(reason: CimdRejectionReason, detail: string): CimdResolution {\n return { kind: 'rejected', reason, detail };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-custom-implementations.backend.d.ts","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/custom-impls/auth-custom-implementations.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,4GAA4G,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-custom-implementations.backend.d.ts","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/custom-impls/auth-custom-implementations.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,4GAA4G,CAAC;AAuB7K,eAAO,MAAM,yBAAyB,EAAE,0CAA0C,EAqBjF,CAAC"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { createSsoConnectionCreateFactories, createSsoConnectionUpdateFactories, createSsoConnectionDeleteFactories, createSsoConnectionTestConnectionFactories, createSsoConnectionDiscoverEndpointsFactories, } from './sso-connection.custom-impl.backend.service.js';
|
|
12
12
|
import { createSsoConfigUpdateFactories } from './sso-config.custom-impl.backend.service.js';
|
|
13
|
+
import { createSsoConfigDomainVerificationFactories } from './sso-config-domain-verification.custom-impl.backend.service.js';
|
|
13
14
|
import { createSiemDlqRetrySingleFactories, createSiemDlqRetryAllFactories, createSiemDlqPurgeAllFactories, } from './siem-delivery-dlq.custom-impl.backend.service.js';
|
|
14
15
|
import { createScimTokenGenerateFactories, createScimTokenRevokeFactories, createScimTokenRotateFactories, } from './scim-tokens.custom-impl.backend.service.js';
|
|
15
16
|
// ── All auth custom implementation factories ─────────────────────────
|
|
@@ -24,6 +25,8 @@ export const authCustomImplementations = [
|
|
|
24
25
|
...createSsoConnectionDiscoverEndpointsFactories(),
|
|
25
26
|
// SSO Config operations
|
|
26
27
|
...createSsoConfigUpdateFactories(),
|
|
28
|
+
// SSO Config domain-ownership operations (claim / verify / revoke) — #424
|
|
29
|
+
...createSsoConfigDomainVerificationFactories(),
|
|
27
30
|
// SIEM Delivery DLQ operations
|
|
28
31
|
...createSiemDlqRetrySingleFactories(),
|
|
29
32
|
...createSiemDlqRetryAllFactories(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-custom-implementations.backend.js","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/custom-impls/auth-custom-implementations.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,kCAAkC,EAClC,kCAAkC,EAClC,kCAAkC,EAClC,0CAA0C,EAC1C,6CAA6C,GAC9C,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,gCAAgC,EAChC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,2CAA2C,CAAC;AAEnD,wEAAwE;AAExE,MAAM,CAAC,MAAM,yBAAyB,GAAiD;IACrF,4BAA4B;IAC5B,+EAA+E;IAC/E,iFAAiF;IACjF,GAAG,kCAAkC,EAAE;IACvC,GAAG,kCAAkC,EAAE;IACvC,GAAG,kCAAkC,EAAE;IACvC,GAAG,0CAA0C,EAAE;IAC/C,GAAG,6CAA6C,EAAE;IAClD,wBAAwB;IACxB,GAAG,8BAA8B,EAAE;IACnC,+BAA+B;IAC/B,GAAG,iCAAiC,EAAE;IACtC,GAAG,8BAA8B,EAAE;IACnC,GAAG,8BAA8B,EAAE;IACnC,wBAAwB;IACxB,GAAG,gCAAgC,EAAE;IACrC,GAAG,8BAA8B,EAAE;IACnC,GAAG,8BAA8B,EAAE;CACpC,CAAC","sourcesContent":["/**\n * Auth Custom Implementations — Aggregator\n *\n * Exports all auth resource custom implementations for registration\n * in CoreBackend_ServiceImplementationsFactories.\n *\n * Only operations with real runtime behavior are registered. Unsupported\n * integration work is absent rather than exposed through placeholder success\n * handlers. No late-binding initialization is needed yet.\n */\n\nimport type { ResourceCustomServiceImplementationFactory } from '~wildo-backend-lib/base-classes/services/services/resource-operation-custom-implementation.factory.backend';\nimport {\n createSsoConnectionCreateFactories,\n createSsoConnectionUpdateFactories,\n createSsoConnectionDeleteFactories,\n createSsoConnectionTestConnectionFactories,\n createSsoConnectionDiscoverEndpointsFactories,\n} from './sso-connection.custom-impl.backend.service';\nimport { createSsoConfigUpdateFactories } from './sso-config.custom-impl.backend.service';\nimport {\n createSiemDlqRetrySingleFactories,\n createSiemDlqRetryAllFactories,\n createSiemDlqPurgeAllFactories,\n} from './siem-delivery-dlq.custom-impl.backend.service';\nimport {\n createScimTokenGenerateFactories,\n createScimTokenRevokeFactories,\n createScimTokenRotateFactories,\n} from './scim-tokens.custom-impl.backend.service';\n\n// ── All auth custom implementation factories ─────────────────────────\n\nexport const authCustomImplementations: ResourceCustomServiceImplementationFactory[] = [\n // SSO Connection operations\n // (READ has no custom impl — oidc.clientSecret masking is framework-driven via\n // `.isWriteOnlySecret()`; the UPDATE prefix re-injects the stored nested secret)\n ...createSsoConnectionCreateFactories(),\n ...createSsoConnectionUpdateFactories(),\n ...createSsoConnectionDeleteFactories(),\n ...createSsoConnectionTestConnectionFactories(),\n ...createSsoConnectionDiscoverEndpointsFactories(),\n // SSO Config operations\n ...createSsoConfigUpdateFactories(),\n // SIEM Delivery DLQ operations\n ...createSiemDlqRetrySingleFactories(),\n ...createSiemDlqRetryAllFactories(),\n ...createSiemDlqPurgeAllFactories(),\n // SCIM Token operations\n ...createScimTokenGenerateFactories(),\n ...createScimTokenRevokeFactories(),\n ...createScimTokenRotateFactories(),\n];\n"]}
|
|
1
|
+
{"version":3,"file":"auth-custom-implementations.backend.js","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/custom-impls/auth-custom-implementations.backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,kCAAkC,EAClC,kCAAkC,EAClC,kCAAkC,EAClC,0CAA0C,EAC1C,6CAA6C,GAC9C,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAE,0CAA0C,EAAE,MAAM,8DAA8D,CAAC;AAC1H,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,gCAAgC,EAChC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,2CAA2C,CAAC;AAEnD,wEAAwE;AAExE,MAAM,CAAC,MAAM,yBAAyB,GAAiD;IACrF,4BAA4B;IAC5B,+EAA+E;IAC/E,iFAAiF;IACjF,GAAG,kCAAkC,EAAE;IACvC,GAAG,kCAAkC,EAAE;IACvC,GAAG,kCAAkC,EAAE;IACvC,GAAG,0CAA0C,EAAE;IAC/C,GAAG,6CAA6C,EAAE;IAClD,wBAAwB;IACxB,GAAG,8BAA8B,EAAE;IACnC,0EAA0E;IAC1E,GAAG,0CAA0C,EAAE;IAC/C,+BAA+B;IAC/B,GAAG,iCAAiC,EAAE;IACtC,GAAG,8BAA8B,EAAE;IACnC,GAAG,8BAA8B,EAAE;IACnC,wBAAwB;IACxB,GAAG,gCAAgC,EAAE;IACrC,GAAG,8BAA8B,EAAE;IACnC,GAAG,8BAA8B,EAAE;CACpC,CAAC","sourcesContent":["/**\n * Auth Custom Implementations — Aggregator\n *\n * Exports all auth resource custom implementations for registration\n * in CoreBackend_ServiceImplementationsFactories.\n *\n * Only operations with real runtime behavior are registered. Unsupported\n * integration work is absent rather than exposed through placeholder success\n * handlers. No late-binding initialization is needed yet.\n */\n\nimport type { ResourceCustomServiceImplementationFactory } from '~wildo-backend-lib/base-classes/services/services/resource-operation-custom-implementation.factory.backend';\nimport {\n createSsoConnectionCreateFactories,\n createSsoConnectionUpdateFactories,\n createSsoConnectionDeleteFactories,\n createSsoConnectionTestConnectionFactories,\n createSsoConnectionDiscoverEndpointsFactories,\n} from './sso-connection.custom-impl.backend.service';\nimport { createSsoConfigUpdateFactories } from './sso-config.custom-impl.backend.service';\nimport { createSsoConfigDomainVerificationFactories } from './sso-config-domain-verification.custom-impl.backend.service';\nimport {\n createSiemDlqRetrySingleFactories,\n createSiemDlqRetryAllFactories,\n createSiemDlqPurgeAllFactories,\n} from './siem-delivery-dlq.custom-impl.backend.service';\nimport {\n createScimTokenGenerateFactories,\n createScimTokenRevokeFactories,\n createScimTokenRotateFactories,\n} from './scim-tokens.custom-impl.backend.service';\n\n// ── All auth custom implementation factories ─────────────────────────\n\nexport const authCustomImplementations: ResourceCustomServiceImplementationFactory[] = [\n // SSO Connection operations\n // (READ has no custom impl — oidc.clientSecret masking is framework-driven via\n // `.isWriteOnlySecret()`; the UPDATE prefix re-injects the stored nested secret)\n ...createSsoConnectionCreateFactories(),\n ...createSsoConnectionUpdateFactories(),\n ...createSsoConnectionDeleteFactories(),\n ...createSsoConnectionTestConnectionFactories(),\n ...createSsoConnectionDiscoverEndpointsFactories(),\n // SSO Config operations\n ...createSsoConfigUpdateFactories(),\n // SSO Config domain-ownership operations (claim / verify / revoke) — #424\n ...createSsoConfigDomainVerificationFactories(),\n // SIEM Delivery DLQ operations\n ...createSiemDlqRetrySingleFactories(),\n ...createSiemDlqRetryAllFactories(),\n ...createSiemDlqPurgeAllFactories(),\n // SCIM Token operations\n ...createScimTokenGenerateFactories(),\n ...createScimTokenRevokeFactories(),\n ...createScimTokenRotateFactories(),\n];\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSO Config — domain-ownership operations (#424)
|
|
3
|
+
*
|
|
4
|
+
* Three public operations that turn enterprise domain routing from an out-of-band database write
|
|
5
|
+
* into a self-service admin flow:
|
|
6
|
+
*
|
|
7
|
+
* claimDomain → mints a DNS-TXT challenge, records the domain as `pending`, returns the record
|
|
8
|
+
* verifyDomain → resolves the record, records `verified` or `failed`
|
|
9
|
+
* revokeDomain → removes the claim, its status, its nonce and its `ssoEnabledDomains` entry
|
|
10
|
+
*
|
|
11
|
+
* ## Why PREFIX, and not OVERRIDE_ALL
|
|
12
|
+
*
|
|
13
|
+
* Each handler computes the new `domains` block and returns it; the framework's own core UPDATE
|
|
14
|
+
* persists it. `OVERRIDE_ALL` returns before the post-operation lane, so it emits NO
|
|
15
|
+
* `RESOURCE_OPERATION_PERFORMED` audit event — and the audit row is the control that makes a
|
|
16
|
+
* privileged configuration change with cross-tenant reach accountable. An operation that granted a
|
|
17
|
+
* tenant SSO routing authority and left no trail would be strictly worse than the database write it
|
|
18
|
+
* replaces, which at least happens where a DBA can see it.
|
|
19
|
+
*
|
|
20
|
+
* ## Where the domain-ownership rules live
|
|
21
|
+
*
|
|
22
|
+
* In `DomainVerificationBackendService`, as pure planners. This file is the door: it resolves the
|
|
23
|
+
* scope, enforces the refusals, and hands the plan to the framework. Nothing here re-implements
|
|
24
|
+
* what a claim or a revocation means.
|
|
25
|
+
*/
|
|
26
|
+
import { type ResourceCustomServiceImplementationFactory } from '../../../../base-classes/services/services/resource-operation-custom-implementation.factory.backend';
|
|
27
|
+
export declare function createSsoConfigDomainVerificationFactories(): ResourceCustomServiceImplementationFactory[];
|
|
28
|
+
//# sourceMappingURL=sso-config-domain-verification.custom-impl.backend.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-config-domain-verification.custom-impl.backend.service.d.ts","sourceRoot":"","sources":["../../../../../../../src/security/authentications/services/custom-impls/sso-config-domain-verification.custom-impl.backend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAaH,OAAO,EAEL,KAAK,0CAA0C,EAChD,MAAM,4GAA4G,CAAC;AA+TpH,wBAAgB,0CAA0C,IAAI,0CAA0C,EAAE,CAMzG"}
|