@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -7,6 +7,22 @@ var helpers = require("../helpers");
|
|
|
7
7
|
var b = helpers.b;
|
|
8
8
|
var check = helpers.check;
|
|
9
9
|
|
|
10
|
+
var SCIM_USER = "urn:ietf:params:scim:schemas:core:2.0:User";
|
|
11
|
+
var SCIM_GROUP = "urn:ietf:params:scim:schemas:core:2.0:Group";
|
|
12
|
+
var SCIM_LIST = "urn:ietf:params:scim:api:messages:2.0:ListResponse";
|
|
13
|
+
var SCIM_BULK_REQ = "urn:ietf:params:scim:api:messages:2.0:BulkRequest";
|
|
14
|
+
|
|
15
|
+
// Build a streaming (EventEmitter) request that emits its whole body as a
|
|
16
|
+
// single chunk + `end` on the next tick — this drives the collectStream
|
|
17
|
+
// read path in _readJsonBody / _readBulkBody (the branch taken when the
|
|
18
|
+
// framework has NOT already buffered req.body). Reuses the canonical
|
|
19
|
+
// b.testing.bodyReq helper and re-targets its URL for SCIM routing.
|
|
20
|
+
function _streamReq(method, url, bodyStr) {
|
|
21
|
+
var req = b.testing.bodyReq(method, {}, bodyStr);
|
|
22
|
+
req.url = url;
|
|
23
|
+
return req;
|
|
24
|
+
}
|
|
25
|
+
|
|
10
26
|
function _mkRes() {
|
|
11
27
|
var hdrs = {};
|
|
12
28
|
var sc = null;
|
|
@@ -95,6 +111,12 @@ async function run() {
|
|
|
95
111
|
|
|
96
112
|
await _runBulkTests();
|
|
97
113
|
await _runBulkRefOrderingTests();
|
|
114
|
+
await _runBearerAuthTests();
|
|
115
|
+
await _runSingletonCrudTests();
|
|
116
|
+
await _runFilterParsingTests();
|
|
117
|
+
await _runConfigAndMetadataTests();
|
|
118
|
+
await _runBulkErrorBranchTests();
|
|
119
|
+
await _runBulkBodyShapeTests();
|
|
98
120
|
}
|
|
99
121
|
|
|
100
122
|
// RFC 7644 §3.7 — /Bulk operations.
|
|
@@ -508,6 +530,380 @@ async function _runBulkRefOrderingTests() {
|
|
|
508
530
|
check("maxPageSize negative refused at create()", threwPage2);
|
|
509
531
|
}
|
|
510
532
|
|
|
533
|
+
// Bearer authentication gate (RFC 7644 §2 / RFC 6750). The bearer
|
|
534
|
+
// callback is the single authorization seam; every failure mode must
|
|
535
|
+
// fail CLOSED — no request reaches an adapter without a resolved actor.
|
|
536
|
+
async function _runBearerAuthTests() {
|
|
537
|
+
var users = _mkUsers();
|
|
538
|
+
var bearerCalls = [];
|
|
539
|
+
var mw = b.middleware.scimServer({
|
|
540
|
+
basePath: "/scim/v2",
|
|
541
|
+
users: users,
|
|
542
|
+
bearer: async function (token) {
|
|
543
|
+
bearerCalls.push(token);
|
|
544
|
+
if (token === "good") return { id: "admin-1", token: token };
|
|
545
|
+
if (token === "boom") throw new Error("token introspection endpoint down");
|
|
546
|
+
return null; // any other token → unauthorized
|
|
547
|
+
},
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
// Discovery endpoints are served BEFORE the bearer gate — reachable
|
|
551
|
+
// without a token so clients can bootstrap.
|
|
552
|
+
var pub = await _drive(mw, { method: "GET", url: "/scim/v2/ServiceProviderConfig", headers: {} });
|
|
553
|
+
check("bearer: SPC served without a token", pub.res._sc() === 200);
|
|
554
|
+
|
|
555
|
+
// No Authorization header → 401 with a Bearer challenge.
|
|
556
|
+
var noAuth = await _drive(mw, { method: "GET", url: "/scim/v2/Users", headers: {} });
|
|
557
|
+
check("bearer: missing header → 401", noAuth.res._sc() === 401);
|
|
558
|
+
check("bearer: missing header → Bearer challenge", noAuth.res._hdrs["www-authenticate"] === "Bearer");
|
|
559
|
+
check("bearer: missing header → detail", JSON.parse(noAuth.res._body()).detail === "Missing Bearer token");
|
|
560
|
+
|
|
561
|
+
// A non-Bearer scheme is rejected the same way (regex miss).
|
|
562
|
+
var basic = await _drive(mw, { method: "GET", url: "/scim/v2/Users", headers: { authorization: "Basic dXNlcjpwYXNz" } });
|
|
563
|
+
check("bearer: non-Bearer scheme → 401 Missing",
|
|
564
|
+
basic.res._sc() === 401 && JSON.parse(basic.res._body()).detail === "Missing Bearer token");
|
|
565
|
+
|
|
566
|
+
// Oversized Authorization header (>= 8 KiB) is refused by the length
|
|
567
|
+
// cap before the regex ever runs, and the callback is NOT invoked.
|
|
568
|
+
var before = bearerCalls.length;
|
|
569
|
+
var big = await _drive(mw, { method: "GET", url: "/scim/v2/Users", headers: { authorization: "Bearer " + "a".repeat(8300) } });
|
|
570
|
+
check("bearer: oversized header → 401", big.res._sc() === 401);
|
|
571
|
+
check("bearer: oversized header skips callback", bearerCalls.length === before);
|
|
572
|
+
|
|
573
|
+
// Well-formed token the callback rejects (returns falsy) → 401 with an
|
|
574
|
+
// invalid_token challenge.
|
|
575
|
+
var unk = await _drive(mw, { method: "GET", url: "/scim/v2/Users", headers: { authorization: "Bearer nope" } });
|
|
576
|
+
check("bearer: rejected token → 401", unk.res._sc() === 401);
|
|
577
|
+
check("bearer: rejected token → invalid_token", /invalid_token/.test(unk.res._hdrs["www-authenticate"] || ""));
|
|
578
|
+
check("bearer: rejected token → detail", JSON.parse(unk.res._body()).detail === "Bearer token rejected");
|
|
579
|
+
|
|
580
|
+
// The callback THROWS — the catch must swallow and leave actor null so
|
|
581
|
+
// the request fails closed (an introspection outage never authorizes).
|
|
582
|
+
var thrown = await _drive(mw, { method: "GET", url: "/scim/v2/Users", headers: { authorization: "Bearer boom" } });
|
|
583
|
+
check("bearer: callback throw → fail-closed 401", thrown.res._sc() === 401);
|
|
584
|
+
check("bearer: callback throw → invalid_token", /invalid_token/.test(thrown.res._hdrs["www-authenticate"] || ""));
|
|
585
|
+
|
|
586
|
+
// Accepted token → the resolved actor is threaded into the adapter ctx.
|
|
587
|
+
var seenActor = [];
|
|
588
|
+
users.list = async function (q, ctx) { seenActor.push(ctx && ctx.actor); return { totalResults: 0, Resources: [] }; };
|
|
589
|
+
var ok = await _drive(mw, { method: "GET", url: "/scim/v2/Users", headers: { authorization: "Bearer good" } });
|
|
590
|
+
check("bearer: accepted token → 200", ok.res._sc() === 200);
|
|
591
|
+
check("bearer: actor threaded into adapter", seenActor.length === 1 && seenActor[0] && seenActor[0].id === "admin-1");
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// The singleton resource surface: GET (list + by-id), POST, PUT, PATCH,
|
|
595
|
+
// DELETE, plus the error/defensive branches around each.
|
|
596
|
+
async function _runSingletonCrudTests() {
|
|
597
|
+
var users = _mkUsers();
|
|
598
|
+
var mw = b.middleware.scimServer({ basePath: "/scim/v2", users: users });
|
|
599
|
+
|
|
600
|
+
// POST create (pre-buffered object body).
|
|
601
|
+
var created = await _drive(mw, { method: "POST", url: "/scim/v2/Users", headers: {},
|
|
602
|
+
body: { schemas: [SCIM_USER], userName: "alice" } });
|
|
603
|
+
check("crud: POST → 201", created.res._sc() === 201);
|
|
604
|
+
var uid = JSON.parse(created.res._body()).id;
|
|
605
|
+
check("crud: POST returns created id", typeof uid === "string");
|
|
606
|
+
|
|
607
|
+
// POST missing the required schema → 400 (routed through middleware
|
|
608
|
+
// .catch, exercising the err.statusCode branch).
|
|
609
|
+
var noSchema = await _drive(mw, { method: "POST", url: "/scim/v2/Users", headers: {}, body: { userName: "x" } });
|
|
610
|
+
check("crud: POST missing schema → 400", noSchema.res._sc() === 400);
|
|
611
|
+
check("crud: POST missing schema → invalidValue", JSON.parse(noSchema.res._body()).scimType === "invalidValue");
|
|
612
|
+
|
|
613
|
+
// POST whose body parses to a NON-object scalar → 400 (the assertSchema
|
|
614
|
+
// body-shape guard, distinct from the schemas-array check).
|
|
615
|
+
var scalar = await _drive(mw, { method: "POST", url: "/scim/v2/Users", headers: {}, body: Buffer.from('"scalar"') });
|
|
616
|
+
check("crud: POST non-object body → 400", scalar.res._sc() === 400);
|
|
617
|
+
|
|
618
|
+
// Streaming POST body (no pre-buffered req.body) → collectStream path.
|
|
619
|
+
var streamed = await _drive(mw, _streamReq("POST", "/scim/v2/Users",
|
|
620
|
+
JSON.stringify({ schemas: [SCIM_USER], userName: "streamed" })));
|
|
621
|
+
check("crud: streaming POST body → 201", streamed.res._sc() === 201);
|
|
622
|
+
|
|
623
|
+
// GET by id — found.
|
|
624
|
+
var got = await _drive(mw, { method: "GET", url: "/scim/v2/Users/" + uid, headers: {} });
|
|
625
|
+
check("crud: GET by id found → 200", got.res._sc() === 200 && JSON.parse(got.res._body()).id === uid);
|
|
626
|
+
|
|
627
|
+
// GET by id — missing → 404 notFound.
|
|
628
|
+
var missing = await _drive(mw, { method: "GET", url: "/scim/v2/Users/does-not-exist", headers: {} });
|
|
629
|
+
check("crud: GET by id missing → 404",
|
|
630
|
+
missing.res._sc() === 404 && JSON.parse(missing.res._body()).scimType === "notFound");
|
|
631
|
+
|
|
632
|
+
// PUT replace.
|
|
633
|
+
var put = await _drive(mw, { method: "PUT", url: "/scim/v2/Users/" + uid, headers: {},
|
|
634
|
+
body: { schemas: [SCIM_USER], userName: "alice-2" } });
|
|
635
|
+
check("crud: PUT → 200", put.res._sc() === 200 && JSON.parse(put.res._body()).userName === "alice-2");
|
|
636
|
+
|
|
637
|
+
// PUT missing schema → 400.
|
|
638
|
+
var putNoSchema = await _drive(mw, { method: "PUT", url: "/scim/v2/Users/" + uid, headers: {}, body: { userName: "nope" } });
|
|
639
|
+
check("crud: PUT missing schema → 400", putNoSchema.res._sc() === 400);
|
|
640
|
+
|
|
641
|
+
// PATCH with valid Operations.
|
|
642
|
+
var patch = await _drive(mw, { method: "PATCH", url: "/scim/v2/Users/" + uid, headers: {},
|
|
643
|
+
body: { Operations: [{ op: "replace", path: "active", value: false }] } });
|
|
644
|
+
check("crud: PATCH → 200", patch.res._sc() === 200);
|
|
645
|
+
|
|
646
|
+
// PATCH without Operations → 400 invalidValue.
|
|
647
|
+
var patchEmpty = await _drive(mw, { method: "PATCH", url: "/scim/v2/Users/" + uid, headers: {}, body: {} });
|
|
648
|
+
check("crud: PATCH no Operations → 400",
|
|
649
|
+
patchEmpty.res._sc() === 400 && JSON.parse(patchEmpty.res._body()).scimType === "invalidValue");
|
|
650
|
+
|
|
651
|
+
// PATCH op missing the 'op' verb → 400.
|
|
652
|
+
var patchBadOp = await _drive(mw, { method: "PATCH", url: "/scim/v2/Users/" + uid, headers: {},
|
|
653
|
+
body: { Operations: [{ path: "active", value: 1 }] } });
|
|
654
|
+
check("crud: PATCH op missing verb → 400", patchBadOp.res._sc() === 400);
|
|
655
|
+
|
|
656
|
+
// PATCH op with an unsupported verb → 400.
|
|
657
|
+
var patchBadVerb = await _drive(mw, { method: "PATCH", url: "/scim/v2/Users/" + uid, headers: {},
|
|
658
|
+
body: { Operations: [{ op: "frobnicate", path: "active" }] } });
|
|
659
|
+
check("crud: PATCH invalid verb → 400", patchBadVerb.res._sc() === 400);
|
|
660
|
+
|
|
661
|
+
// DELETE.
|
|
662
|
+
var del = await _drive(mw, { method: "DELETE", url: "/scim/v2/Users/" + uid, headers: {} });
|
|
663
|
+
check("crud: DELETE → 204", del.res._sc() === 204);
|
|
664
|
+
check("crud: DELETE removed record", users._records.get(uid) === undefined);
|
|
665
|
+
|
|
666
|
+
// An unsupported method on an existing id → 405 noTarget.
|
|
667
|
+
var opt = await _drive(mw, { method: "OPTIONS", url: "/scim/v2/Users/" + uid, headers: {} });
|
|
668
|
+
check("crud: unsupported method → 405",
|
|
669
|
+
opt.res._sc() === 405 && JSON.parse(opt.res._body()).scimType === "noTarget");
|
|
670
|
+
|
|
671
|
+
// A resource path whose adapter isn't configured → 404 "not configured".
|
|
672
|
+
var g404 = await _drive(mw, { method: "GET", url: "/scim/v2/Groups", headers: {} });
|
|
673
|
+
check("crud: unconfigured /Groups → 404", g404.res._sc() === 404);
|
|
674
|
+
|
|
675
|
+
// An adapter rejection (no statusCode) propagates to the middleware
|
|
676
|
+
// .catch → generic 500.
|
|
677
|
+
var boomUsers = _mkUsers();
|
|
678
|
+
boomUsers.read = async function () { throw new Error("db exploded"); };
|
|
679
|
+
var boomMw = b.middleware.scimServer({ basePath: "/scim/v2", users: boomUsers });
|
|
680
|
+
var boom = await _drive(boomMw, { method: "GET", url: "/scim/v2/Users/anything", headers: {} });
|
|
681
|
+
check("crud: adapter rejection → 500 via catch", boom.res._sc() === 500);
|
|
682
|
+
|
|
683
|
+
// GET list — pagination + attribute selection threaded to the adapter.
|
|
684
|
+
var listUsers = _mkUsers();
|
|
685
|
+
var listSeen = null;
|
|
686
|
+
listUsers.list = async function (q) { listSeen = q; return { totalResults: 3, Resources: [{ id: "u-1" }] }; };
|
|
687
|
+
var listMw = b.middleware.scimServer({ basePath: "/scim/v2", users: listUsers });
|
|
688
|
+
var list = await _drive(listMw, { method: "GET",
|
|
689
|
+
url: "/scim/v2/Users?count=5&startIndex=2&sortBy=userName&sortOrder=descending&attributes=userName,active&excludedAttributes=password",
|
|
690
|
+
headers: {} });
|
|
691
|
+
check("crud: GET list → 200 ListResponse",
|
|
692
|
+
list.res._sc() === 200 && JSON.parse(list.res._body()).schemas.indexOf(SCIM_LIST) !== -1);
|
|
693
|
+
check("crud: list count parsed", listSeen && listSeen.count === 5);
|
|
694
|
+
check("crud: list startIndex parsed", listSeen.startIndex === 2);
|
|
695
|
+
check("crud: list sortBy/sortOrder threaded", listSeen.sortBy === "userName" && listSeen.sortOrder === "descending");
|
|
696
|
+
check("crud: list attributes split", Array.isArray(listSeen.attributes) && listSeen.attributes.length === 2);
|
|
697
|
+
check("crud: list excludedAttributes split", Array.isArray(listSeen.excludedAttributes) && listSeen.excludedAttributes[0] === "password");
|
|
698
|
+
check("crud: list itemsPerPage from Resources", JSON.parse(list.res._body()).itemsPerPage === 1);
|
|
699
|
+
|
|
700
|
+
// count over maxPageSize is clamped down to the configured cap.
|
|
701
|
+
var capUsers = _mkUsers();
|
|
702
|
+
var capSeen = null;
|
|
703
|
+
capUsers.list = async function (q) { capSeen = q; return { totalResults: 0, Resources: [] }; };
|
|
704
|
+
var capMw = b.middleware.scimServer({ basePath: "/scim/v2", users: capUsers, maxPageSize: 25 });
|
|
705
|
+
await _drive(capMw, { method: "GET", url: "/scim/v2/Users?count=9999", headers: {} });
|
|
706
|
+
check("crud: count clamped to maxPageSize", capSeen && capSeen.count === 25);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
// RFC 7644 §3.4.2.2 — filter grammar parsing surfaced through the GET
|
|
710
|
+
// list query string (the real consumer path an IdP drives).
|
|
711
|
+
async function _runFilterParsingTests() {
|
|
712
|
+
var users = _mkUsers();
|
|
713
|
+
var mw = b.middleware.scimServer({ basePath: "/scim/v2", users: users });
|
|
714
|
+
var captured = [];
|
|
715
|
+
users.list = async function (q) { captured.push(q.filter); return { totalResults: 0, Resources: [] }; };
|
|
716
|
+
|
|
717
|
+
async function listWith(rawFilter) {
|
|
718
|
+
captured = [];
|
|
719
|
+
await _drive(mw, { method: "GET", url: "/scim/v2/Users?filter=" + encodeURIComponent(rawFilter), headers: {} });
|
|
720
|
+
return captured[0];
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
var pr = await listWith("title pr");
|
|
724
|
+
check("filter: presence op yields no value",
|
|
725
|
+
pr && pr.op === "pr" && pr.attribute === "title" && pr.value === undefined);
|
|
726
|
+
|
|
727
|
+
var quoted = await listWith('familyName eq "O\'Brien"');
|
|
728
|
+
check("filter: quoted value is unwrapped", quoted && quoted.value === "O'Brien");
|
|
729
|
+
|
|
730
|
+
var esc = await listWith('displayName eq "a\\"b"');
|
|
731
|
+
check("filter: escaped inner quote decoded", esc && esc.value === 'a"b');
|
|
732
|
+
|
|
733
|
+
var garbage = await listWith("this is not a filter");
|
|
734
|
+
check("filter: unparseable filter kept as raw",
|
|
735
|
+
garbage && typeof garbage.raw === "string" && garbage.attribute === undefined);
|
|
736
|
+
|
|
737
|
+
captured = [];
|
|
738
|
+
await _drive(mw, { method: "GET", url: "/scim/v2/Users", headers: {} });
|
|
739
|
+
check("filter: absent filter → null", captured[0] === null);
|
|
740
|
+
|
|
741
|
+
// A query pair with malformed percent-encoding is skipped by the
|
|
742
|
+
// decode guard rather than crashing the request.
|
|
743
|
+
var badPct = await _drive(mw, { method: "GET", url: "/scim/v2/Users?x=%ZZ&count=3", headers: {} });
|
|
744
|
+
check("filter: malformed percent-encoding tolerated", badPct.res._sc() === 200);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
// Config-time option handling (basePath/bulk/maxPageSize defaults +
|
|
748
|
+
// refusals) and the read-only metadata surfaces.
|
|
749
|
+
async function _runConfigAndMetadataTests() {
|
|
750
|
+
// basePath defaults when omitted.
|
|
751
|
+
var dflt = b.middleware.scimServer({ users: _mkUsers() });
|
|
752
|
+
check("config: basePath defaults to /scim/v2", dflt.basePath === "/scim/v2");
|
|
753
|
+
|
|
754
|
+
// bulk:null is treated exactly like omitted — disabled.
|
|
755
|
+
var nullBulk = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), bulk: null });
|
|
756
|
+
var nbSpc = await _drive(nullBulk, { method: "GET", url: "/scim/v2/ServiceProviderConfig", headers: {} });
|
|
757
|
+
check("config: bulk:null → SPC supported=false", JSON.parse(nbSpc.res._body()).bulk.supported === false);
|
|
758
|
+
|
|
759
|
+
// A non-object bulk value is refused at construction (config-time tier).
|
|
760
|
+
var threwBulk = false;
|
|
761
|
+
try { b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), bulk: "yes" }); }
|
|
762
|
+
catch (e) { threwBulk = /bad-bulk\b/.test(e.code || ""); }
|
|
763
|
+
check("config: non-object bulk refused", threwBulk);
|
|
764
|
+
|
|
765
|
+
// bulk:{} takes the documented defaults (maxOperations 1000, 1 MiB).
|
|
766
|
+
var defBulk = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), bulk: {} });
|
|
767
|
+
var dbSpc = JSON.parse((await _drive(defBulk, { method: "GET", url: "/scim/v2/ServiceProviderConfig", headers: {} })).res._body());
|
|
768
|
+
check("config: bulk:{} default maxOperations", dbSpc.bulk.maxOperations === 1000);
|
|
769
|
+
check("config: bulk:{} default maxPayloadSize", dbSpc.bulk.maxPayloadSize === 1048576);
|
|
770
|
+
|
|
771
|
+
// ResourceTypes advertises Group only when a groups adapter is wired.
|
|
772
|
+
var withGroups = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), groups: _mkGroups() });
|
|
773
|
+
var rt = JSON.parse((await _drive(withGroups, { method: "GET", url: "/scim/v2/ResourceTypes", headers: {} })).res._body());
|
|
774
|
+
var ids = rt.map(function (r) { return r.id; });
|
|
775
|
+
check("config: ResourceTypes includes Group when configured",
|
|
776
|
+
ids.indexOf("Group") !== -1 && ids.indexOf("User") !== -1);
|
|
777
|
+
|
|
778
|
+
// A request to the bare basePath (no resource segment) → 404.
|
|
779
|
+
var bareMw = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers() });
|
|
780
|
+
var bare = await _drive(bareMw, { method: "GET", url: "/scim/v2", headers: {} });
|
|
781
|
+
check("config: bare basePath → 404", bare.res._sc() === 404);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
// RFC 7644 §3.7 — per-operation error branches inside a /Bulk batch. A
|
|
785
|
+
// single failing operation is isolated to its own result entry; the
|
|
786
|
+
// batch envelope stays 200.
|
|
787
|
+
async function _runBulkErrorBranchTests() {
|
|
788
|
+
var mw = b.middleware.scimServer({
|
|
789
|
+
basePath: "/scim/v2", users: _mkUsers(), groups: _mkGroups(), bulk: { maxOperations: 10 },
|
|
790
|
+
});
|
|
791
|
+
|
|
792
|
+
// /Bulk with a non-POST method → 405 noTarget.
|
|
793
|
+
var getBulk = await _drive(mw, { method: "GET", url: "/scim/v2/Bulk", headers: {} });
|
|
794
|
+
check("bulk err: GET /Bulk → 405", getBulk.res._sc() === 405);
|
|
795
|
+
check("bulk err: GET /Bulk → noTarget", JSON.parse(getBulk.res._body()).scimType === "noTarget");
|
|
796
|
+
|
|
797
|
+
// BulkRequest with a wrong schemas array → 400 invalidValue.
|
|
798
|
+
var badSchemas = await _drive(mw, { method: "POST", url: "/scim/v2/Bulk", headers: {},
|
|
799
|
+
body: { schemas: ["urn:wrong"], Operations: [] } });
|
|
800
|
+
check("bulk err: wrong schemas → 400",
|
|
801
|
+
badSchemas.res._sc() === 400 && JSON.parse(badSchemas.res._body()).scimType === "invalidValue");
|
|
802
|
+
|
|
803
|
+
// BulkRequest whose Operations is not an array → 400 invalidValue.
|
|
804
|
+
var opsNotArray = await _drive(mw, { method: "POST", url: "/scim/v2/Bulk", headers: {},
|
|
805
|
+
body: { schemas: [SCIM_BULK_REQ], Operations: "nope" } });
|
|
806
|
+
check("bulk err: Operations not an array → 400", opsNotArray.res._sc() === 400);
|
|
807
|
+
|
|
808
|
+
// Assorted per-operation failures in one batch.
|
|
809
|
+
var perOp = await _bulkBody(mw, [
|
|
810
|
+
{ path: "/Users", bulkId: "nomethod", data: { schemas: [SCIM_USER], userName: "x" } }, // missing method
|
|
811
|
+
{ method: "GET", path: "/Users/u-1" }, // unsupported method
|
|
812
|
+
{ method: "POST", path: "/Widgets", bulkId: "badpath", data: { schemas: [SCIM_USER], userName: "y" } }, // unparseable path
|
|
813
|
+
{ method: "PUT", path: "/Users" }, // PUT without an id
|
|
814
|
+
{ method: "POST", path: "/Groups", bulkId: "wschema", data: { displayName: "no-schema" } }, // POST bulkId, missing schema
|
|
815
|
+
]);
|
|
816
|
+
var perOpResp = JSON.parse(perOp.res._body());
|
|
817
|
+
check("bulk err: batch envelope stays 200", perOp.res._sc() === 200);
|
|
818
|
+
check("bulk err: missing method → invalidSyntax 400",
|
|
819
|
+
perOpResp.Operations[0].status === "400" && perOpResp.Operations[0].response.scimType === "invalidSyntax");
|
|
820
|
+
check("bulk err: unsupported method → 400 invalidValue",
|
|
821
|
+
perOpResp.Operations[1].status === "400" && perOpResp.Operations[1].response.scimType === "invalidValue");
|
|
822
|
+
check("bulk err: unparseable path → 400", perOpResp.Operations[2].status === "400");
|
|
823
|
+
check("bulk err: PUT without id → 400", perOpResp.Operations[3].status === "400");
|
|
824
|
+
check("bulk err: POST bulkId missing schema → 400", perOpResp.Operations[4].status === "400");
|
|
825
|
+
|
|
826
|
+
// A bulk op targeting a resource with no configured adapter → per-op 404.
|
|
827
|
+
var usersOnly = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), bulk: { maxOperations: 5 } });
|
|
828
|
+
var noGroup = await _bulkBody(usersOnly, [
|
|
829
|
+
{ method: "POST", path: "/Groups", bulkId: "g", data: { schemas: [SCIM_GROUP], displayName: "g" } },
|
|
830
|
+
]);
|
|
831
|
+
check("bulk err: unconfigured resource → per-op 404",
|
|
832
|
+
JSON.parse(noGroup.res._body()).Operations[0].status === "404");
|
|
833
|
+
|
|
834
|
+
// An adapter that throws a PLAIN Error (no statusCode/scimType) → the
|
|
835
|
+
// op maps to a 500 with no scimType.
|
|
836
|
+
var plainErrUsers = _mkUsers();
|
|
837
|
+
plainErrUsers.update = async function () { throw new Error("adapter blew up"); };
|
|
838
|
+
var seed = await plainErrUsers.create({ userName: "seed" });
|
|
839
|
+
var plainMw = b.middleware.scimServer({ basePath: "/scim/v2", users: plainErrUsers, bulk: { maxOperations: 5 } });
|
|
840
|
+
var plain = await _bulkBody(plainMw, [
|
|
841
|
+
{ method: "PUT", path: "/Users/" + seed.id, data: { schemas: [SCIM_USER], userName: "x" } },
|
|
842
|
+
]);
|
|
843
|
+
var plainOp = JSON.parse(plain.res._body()).Operations[0];
|
|
844
|
+
check("bulk err: plain adapter error → 500", plainOp.status === "500");
|
|
845
|
+
check("bulk err: plain adapter error omits scimType", plainOp.response.scimType === undefined);
|
|
846
|
+
|
|
847
|
+
// A creating op that "succeeds" but returns no id cannot satisfy a
|
|
848
|
+
// reference; the dependent op fails 400 and no literal token is ever
|
|
849
|
+
// handed to the adapter.
|
|
850
|
+
var noIdUsers = {
|
|
851
|
+
_received: [],
|
|
852
|
+
async create(rec) { this._received.push(rec); return { meta: { resourceType: "User" } }; }, // no id assigned
|
|
853
|
+
async read() { return null; },
|
|
854
|
+
async update(id, r) { return r; },
|
|
855
|
+
async patch() { return {}; },
|
|
856
|
+
async remove() { /* no-op */ },
|
|
857
|
+
async list() { return { totalResults: 0, Resources: [] }; },
|
|
858
|
+
};
|
|
859
|
+
var noIdGroups = _mkRecordingGroups();
|
|
860
|
+
var noIdMw = b.middleware.scimServer({ basePath: "/scim/v2", users: noIdUsers, groups: noIdGroups, bulk: { maxOperations: 5 } });
|
|
861
|
+
var noId = await _bulkBody(noIdMw, [
|
|
862
|
+
{ method: "POST", path: "/Users", bulkId: "x", data: { schemas: [SCIM_USER], userName: "x" } },
|
|
863
|
+
{ method: "POST", path: "/Groups", bulkId: "g",
|
|
864
|
+
data: { schemas: [SCIM_GROUP], displayName: "g", members: [{ value: "bulkId:x" }] } },
|
|
865
|
+
]);
|
|
866
|
+
var noIdResp = JSON.parse(noId.res._body());
|
|
867
|
+
check("bulk err: no-id creator still 201", noIdResp.Operations[0].status === "201");
|
|
868
|
+
check("bulk err: dependent on no-id creator → 400", noIdResp.Operations[1].status === "400");
|
|
869
|
+
check("bulk err: no-id group never persisted", noIdGroups._records.size === 0);
|
|
870
|
+
check("bulk err: no-id group adapter never saw a token",
|
|
871
|
+
!noIdGroups._received.some(_containsBulkIdToken));
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
// The three ways a /Bulk body reaches _readBulkBody: a pre-buffered
|
|
875
|
+
// Buffer, a stream, and a stream that overflows maxPayloadSize.
|
|
876
|
+
async function _runBulkBodyShapeTests() {
|
|
877
|
+
var bulkJson = JSON.stringify({
|
|
878
|
+
schemas: [SCIM_BULK_REQ],
|
|
879
|
+
Operations: [{ method: "POST", path: "/Users", bulkId: "a", data: { schemas: [SCIM_USER], userName: "a" } }],
|
|
880
|
+
});
|
|
881
|
+
|
|
882
|
+
// req.body already a Buffer → parsed and executed.
|
|
883
|
+
var bufMw = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), bulk: { maxOperations: 5 } });
|
|
884
|
+
var buf = await _drive(bufMw, { method: "POST", url: "/scim/v2/Bulk", headers: {}, body: Buffer.from(bulkJson) });
|
|
885
|
+
check("bulk body: Buffer body parsed + run", JSON.parse(buf.res._body()).Operations[0].status === "201");
|
|
886
|
+
|
|
887
|
+
// Streaming body (no req.body) → collectStream path.
|
|
888
|
+
var streamMw = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), bulk: { maxOperations: 5 } });
|
|
889
|
+
var stream = await _drive(streamMw, _streamReq("POST", "/scim/v2/Bulk", bulkJson));
|
|
890
|
+
check("bulk body: streamed body parsed + run", JSON.parse(stream.res._body()).Operations[0].status === "201");
|
|
891
|
+
|
|
892
|
+
// Streamed body larger than maxPayloadSize → 413 tooLarge, rejected
|
|
893
|
+
// before parse.
|
|
894
|
+
var tinyMw = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), bulk: { maxOperations: 5, maxPayloadSize: 64 } });
|
|
895
|
+
var over = await _drive(tinyMw, _streamReq("POST", "/scim/v2/Bulk", bulkJson)); // bulkJson > 64 bytes
|
|
896
|
+
check("bulk body: oversize stream → 413", over.res._sc() === 413);
|
|
897
|
+
check("bulk body: oversize stream → tooLarge", JSON.parse(over.res._body()).scimType === "tooLarge");
|
|
898
|
+
|
|
899
|
+
// A body that fails to PARSE (not a size overflow) is re-thrown and
|
|
900
|
+
// surfaces as a generic 500 through the middleware .catch — distinct
|
|
901
|
+
// from the tooLarge path.
|
|
902
|
+
var badJsonMw = b.middleware.scimServer({ basePath: "/scim/v2", users: _mkUsers(), bulk: { maxOperations: 5 } });
|
|
903
|
+
var badJson = await _drive(badJsonMw, { method: "POST", url: "/scim/v2/Bulk", headers: {}, body: Buffer.from("{ not valid json") });
|
|
904
|
+
check("bulk body: unparseable JSON → 500", badJson.res._sc() === 500);
|
|
905
|
+
}
|
|
906
|
+
|
|
511
907
|
module.exports = { run: run };
|
|
512
908
|
|
|
513
909
|
if (require.main === module) {
|