@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
|
@@ -39,6 +39,16 @@ function _baseConfig(port, overrides) {
|
|
|
39
39
|
function _fakeS3(behavior) {
|
|
40
40
|
behavior = behavior || {};
|
|
41
41
|
var requests = [];
|
|
42
|
+
// Emit an S3-style <Error> body with a chosen status/code. Used by the
|
|
43
|
+
// failure-path tests so every PUT-based bucket op can be driven into its
|
|
44
|
+
// error/audit-failure branch without hand-rolling the XML per call site.
|
|
45
|
+
function sendXmlErr(res, spec) {
|
|
46
|
+
res.writeHead(spec.status, { "Content-Type": "application/xml" });
|
|
47
|
+
res.end(
|
|
48
|
+
"<Error><Code>" + spec.code + "</Code>" +
|
|
49
|
+
"<Message>" + (spec.message || spec.code) + "</Message></Error>"
|
|
50
|
+
);
|
|
51
|
+
}
|
|
42
52
|
var server = http.createServer(function (req, res) {
|
|
43
53
|
var chunks = [];
|
|
44
54
|
req.on("data", function (c) { chunks.push(c); });
|
|
@@ -52,6 +62,12 @@ function _fakeS3(behavior) {
|
|
|
52
62
|
|
|
53
63
|
// ListBuckets — GET / on the service URL.
|
|
54
64
|
if (req.method === "GET" && path === "/" && !req.headers.host.startsWith("test-bucket")) {
|
|
65
|
+
if (behavior.onList) {
|
|
66
|
+
var lr = behavior.onList();
|
|
67
|
+
res.writeHead(lr.statusCode || 200, lr.headers || { "Content-Type": "application/xml" });
|
|
68
|
+
res.end(lr.body || "");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
55
71
|
res.writeHead(200, { "Content-Type": "application/xml" });
|
|
56
72
|
res.end(
|
|
57
73
|
"<?xml version='1.0' encoding='UTF-8'?>" +
|
|
@@ -77,6 +93,7 @@ function _fakeS3(behavior) {
|
|
|
77
93
|
return;
|
|
78
94
|
}
|
|
79
95
|
if (req.method === "PUT" && parsed.searchParams.has("cors")) {
|
|
96
|
+
if (behavior.corsErr) { sendXmlErr(res, behavior.corsErr); return; }
|
|
80
97
|
res.writeHead(200);
|
|
81
98
|
res.end();
|
|
82
99
|
return;
|
|
@@ -89,6 +106,10 @@ function _fakeS3(behavior) {
|
|
|
89
106
|
res.end(ol.body || "");
|
|
90
107
|
return;
|
|
91
108
|
}
|
|
109
|
+
if (req.method === "PUT" && behavior.objectLockPutErr) {
|
|
110
|
+
sendXmlErr(res, behavior.objectLockPutErr);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
92
113
|
// PUT just acks
|
|
93
114
|
res.writeHead(200);
|
|
94
115
|
res.end();
|
|
@@ -102,6 +123,10 @@ function _fakeS3(behavior) {
|
|
|
102
123
|
res.end(ret.body || "");
|
|
103
124
|
return;
|
|
104
125
|
}
|
|
126
|
+
if (req.method === "PUT" && behavior.retentionPutErr) {
|
|
127
|
+
sendXmlErr(res, behavior.retentionPutErr);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
105
130
|
res.writeHead(200);
|
|
106
131
|
res.end();
|
|
107
132
|
return;
|
|
@@ -114,6 +139,10 @@ function _fakeS3(behavior) {
|
|
|
114
139
|
res.end(lh.body || "");
|
|
115
140
|
return;
|
|
116
141
|
}
|
|
142
|
+
if (req.method === "PUT" && behavior.legalHoldPutErr) {
|
|
143
|
+
sendXmlErr(res, behavior.legalHoldPutErr);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
117
146
|
res.writeHead(200);
|
|
118
147
|
res.end();
|
|
119
148
|
return;
|
|
@@ -231,6 +260,8 @@ function testBucketNameValidation() {
|
|
|
231
260
|
shouldThrow("rejects trailing hyphen", "bucket-");
|
|
232
261
|
shouldThrow("rejects underscore", "my_bucket");
|
|
233
262
|
shouldThrow("rejects consecutive dots", "my..bucket");
|
|
263
|
+
shouldThrow("rejects non-string name", 123);
|
|
264
|
+
shouldThrow("rejects null name", null);
|
|
234
265
|
// Valid names should not throw.
|
|
235
266
|
v("valid-bucket-name");
|
|
236
267
|
v("vbn1");
|
|
@@ -649,6 +680,8 @@ async function testSetObjectRetentionValidation() {
|
|
|
649
680
|
check("retention validation: " + label,
|
|
650
681
|
threw && codeRe.test(threw.code || ""));
|
|
651
682
|
}
|
|
683
|
+
await shouldThrow("rejects null opts",
|
|
684
|
+
null, /INVALID_RETENTION/);
|
|
652
685
|
await shouldThrow("rejects missing mode",
|
|
653
686
|
{ retainUntil: new Date(Date.now() + 1000) }, /INVALID_RETENTION/);
|
|
654
687
|
await shouldThrow("rejects bad mode",
|
|
@@ -1019,6 +1052,594 @@ function testCanonicalPathSingleEncodeForS3() {
|
|
|
1019
1052
|
sigv4.awsUriEncode("photo-\u{1F600}.jpg", true) === "photo-%F0%9F%98%80.jpg");
|
|
1020
1053
|
}
|
|
1021
1054
|
|
|
1055
|
+
// ---- Factory default-resolution branches ----
|
|
1056
|
+
|
|
1057
|
+
function testFactoryDefaultsAndTrailingSlash() {
|
|
1058
|
+
// Missing secretAccessKey — the third required-credential guard (region +
|
|
1059
|
+
// accessKeyId are already covered; this closes the trio).
|
|
1060
|
+
var threwSecret = null;
|
|
1061
|
+
try {
|
|
1062
|
+
bucketOps.create({ region: "us-east-1", accessKeyId: "x" });
|
|
1063
|
+
} catch (e) { threwSecret = e; }
|
|
1064
|
+
check("factory: missing secretAccessKey rejected",
|
|
1065
|
+
threwSecret && /INVALID_CONFIG/.test(threwSecret.code || ""));
|
|
1066
|
+
|
|
1067
|
+
// No endpoint / allowedProtocols / allowInternal supplied — the factory
|
|
1068
|
+
// must fill each default (endpoint → https://s3.<region>.amazonaws.com,
|
|
1069
|
+
// allowedProtocols → ALLOW_HTTP_TLS, allowInternal → null) and still
|
|
1070
|
+
// return a usable ops object. No request is made here so no network is hit.
|
|
1071
|
+
var opsDefault = bucketOps.create({
|
|
1072
|
+
region: "us-east-1",
|
|
1073
|
+
accessKeyId: "AKIAIOSFODNN7EXAMPLE",
|
|
1074
|
+
secretAccessKey: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
|
|
1075
|
+
});
|
|
1076
|
+
check("factory: defaults resolve to a usable ops object (protocol sigv4)",
|
|
1077
|
+
opsDefault && opsDefault.protocol === "sigv4");
|
|
1078
|
+
check("factory: default ops exposes create()",
|
|
1079
|
+
typeof opsDefault.create === "function");
|
|
1080
|
+
|
|
1081
|
+
// Trailing slash on the endpoint is trimmed so the derived bucket URLs
|
|
1082
|
+
// don't grow a double slash.
|
|
1083
|
+
var opsSlash = bucketOps.create({
|
|
1084
|
+
region: "us-east-1",
|
|
1085
|
+
accessKeyId: "x",
|
|
1086
|
+
secretAccessKey: "y",
|
|
1087
|
+
endpoint: "http://127.0.0.1:1/",
|
|
1088
|
+
allowedProtocols: b.safeUrl.ALLOW_HTTP_ALL,
|
|
1089
|
+
allowInternal: true,
|
|
1090
|
+
});
|
|
1091
|
+
check("factory: trailing-slash endpoint accepted (slash trimmed)",
|
|
1092
|
+
opsSlash && opsSlash.protocol === "sigv4");
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
// ---- Lifecycle XML builder — adversarial / optional-field branches ----
|
|
1096
|
+
|
|
1097
|
+
function testLifecycleXmlAdversarial() {
|
|
1098
|
+
function shouldThrow(label, rules, codeRe) {
|
|
1099
|
+
var threw = null;
|
|
1100
|
+
try { bucketOps._buildLifecycleXmlForTest(rules); } catch (e) { threw = e; }
|
|
1101
|
+
check("lifecycle-adv: " + label, threw && codeRe.test(threw.code || ""));
|
|
1102
|
+
}
|
|
1103
|
+
// Length cap fires before the per-rule loop, so the rule contents are
|
|
1104
|
+
// irrelevant — a 1001-length array trips the S3 1000-rule ceiling.
|
|
1105
|
+
var tooMany = [];
|
|
1106
|
+
for (var i = 0; i < 1001; i++) tooMany.push({ expiration: { days: 1 } });
|
|
1107
|
+
shouldThrow("rejects > 1000 rules", tooMany, /INVALID_LIFECYCLE/);
|
|
1108
|
+
shouldThrow("rejects non-object rule", [null], /INVALID_LIFECYCLE/);
|
|
1109
|
+
shouldThrow("rejects empty-string id",
|
|
1110
|
+
[{ id: "", status: "Enabled", expiration: { days: 1 } }], /INVALID_LIFECYCLE/);
|
|
1111
|
+
shouldThrow("rejects non-string id",
|
|
1112
|
+
[{ id: 5, status: "Enabled", expiration: { days: 1 } }], /INVALID_LIFECYCLE/);
|
|
1113
|
+
shouldThrow("rejects abortIncompleteMultipartUpload.daysAfterInitiation = 0",
|
|
1114
|
+
[{ status: "Enabled",
|
|
1115
|
+
abortIncompleteMultipartUpload: { daysAfterInitiation: 0 } }],
|
|
1116
|
+
/INVALID_LIFECYCLE/);
|
|
1117
|
+
|
|
1118
|
+
// Optional expiration sub-fields (date + expiredObjectDeleteMarker) and
|
|
1119
|
+
// transition.date each emit their own element.
|
|
1120
|
+
var xml = bucketOps._buildLifecycleXmlForTest([{
|
|
1121
|
+
status: "Enabled",
|
|
1122
|
+
expiration: { date: "2030-01-01T00:00:00.000Z", expiredObjectDeleteMarker: true },
|
|
1123
|
+
transition: { date: "2029-01-01T00:00:00.000Z", storageClass: "GLACIER" },
|
|
1124
|
+
}]);
|
|
1125
|
+
check("lifecycle-adv: Expiration Date element emitted",
|
|
1126
|
+
/<Date>2030-01-01T00:00:00\.000Z<\/Date>/.test(xml));
|
|
1127
|
+
check("lifecycle-adv: ExpiredObjectDeleteMarker element emitted",
|
|
1128
|
+
/<ExpiredObjectDeleteMarker>true<\/ExpiredObjectDeleteMarker>/.test(xml));
|
|
1129
|
+
check("lifecycle-adv: Transition Date element emitted",
|
|
1130
|
+
/<Transition><Date>2029-01-01T00:00:00\.000Z<\/Date>/.test(xml));
|
|
1131
|
+
|
|
1132
|
+
// expiredObjectDeleteMarker:false takes the falsy ternary arm.
|
|
1133
|
+
var xmlFalse = bucketOps._buildLifecycleXmlForTest([{
|
|
1134
|
+
status: "Enabled",
|
|
1135
|
+
expiration: { days: 5, expiredObjectDeleteMarker: false },
|
|
1136
|
+
}]);
|
|
1137
|
+
check("lifecycle-adv: ExpiredObjectDeleteMarker false arm emitted",
|
|
1138
|
+
/<ExpiredObjectDeleteMarker>false<\/ExpiredObjectDeleteMarker>/.test(xmlFalse));
|
|
1139
|
+
|
|
1140
|
+
// Omitting status defaults it to Enabled (the `rule.status || "Enabled"` arm).
|
|
1141
|
+
var xmlNoStatus = bucketOps._buildLifecycleXmlForTest([{
|
|
1142
|
+
expiration: { days: 1 },
|
|
1143
|
+
}]);
|
|
1144
|
+
check("lifecycle-adv: omitted status defaults to Enabled",
|
|
1145
|
+
/<Status>Enabled<\/Status>/.test(xmlNoStatus));
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
// ---- CORS XML builder — adversarial / optional-field / size-cap branches ----
|
|
1149
|
+
|
|
1150
|
+
function testCorsXmlAdversarial() {
|
|
1151
|
+
function shouldThrow(label, rules, codeRe) {
|
|
1152
|
+
var threw = null;
|
|
1153
|
+
try { bucketOps._buildCorsXmlForTest(rules); } catch (e) { threw = e; }
|
|
1154
|
+
check("cors-adv: " + label, threw && codeRe.test(threw.code || ""));
|
|
1155
|
+
}
|
|
1156
|
+
var tooMany = [];
|
|
1157
|
+
for (var i = 0; i < 101; i++) {
|
|
1158
|
+
tooMany.push({ allowedOrigins: ["*"], allowedMethods: ["GET"] });
|
|
1159
|
+
}
|
|
1160
|
+
shouldThrow("rejects > 100 rules", tooMany, /INVALID_CORS_RULE/);
|
|
1161
|
+
shouldThrow("rejects non-object rule", [null], /INVALID_CORS_RULE/);
|
|
1162
|
+
|
|
1163
|
+
// A rule with an id emits <ID>; the escaped-content path is exercised too.
|
|
1164
|
+
var xml = bucketOps._buildCorsXmlForTest([{
|
|
1165
|
+
id: "rule-1",
|
|
1166
|
+
allowedOrigins: ["https://a.example.com"],
|
|
1167
|
+
allowedMethods: ["GET"],
|
|
1168
|
+
}]);
|
|
1169
|
+
check("cors-adv: rule ID element emitted", /<ID>rule-1<\/ID>/.test(xml));
|
|
1170
|
+
|
|
1171
|
+
// Size cap: a single valid rule with thousands of allowed headers pushes the
|
|
1172
|
+
// serialized body past the 64 KB S3 ceiling.
|
|
1173
|
+
var bigHeaders = [];
|
|
1174
|
+
for (var h = 0; h < 3000; h++) bigHeaders.push("x-custom-header-" + h);
|
|
1175
|
+
var threwBig = null;
|
|
1176
|
+
try {
|
|
1177
|
+
bucketOps._buildCorsXmlForTest([{
|
|
1178
|
+
allowedOrigins: ["*"],
|
|
1179
|
+
allowedMethods: ["GET"],
|
|
1180
|
+
allowedHeaders: bigHeaders,
|
|
1181
|
+
}]);
|
|
1182
|
+
} catch (e) { threwBig = e; }
|
|
1183
|
+
check("cors-adv: > 64 KB configuration rejected",
|
|
1184
|
+
threwBig && /INVALID_CORS_RULE/.test(threwBig.code || "") &&
|
|
1185
|
+
/64 KB/.test(threwBig.message || ""));
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
// ---- Object-key length guard ----
|
|
1189
|
+
|
|
1190
|
+
async function testObjectKeyTooLong() {
|
|
1191
|
+
var fake = _fakeS3();
|
|
1192
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1193
|
+
try {
|
|
1194
|
+
var ops = bucketOps.create(_baseConfig(port));
|
|
1195
|
+
var longKey = new Array(1100).join("k"); // 1099 bytes > 1 KiB S3 limit
|
|
1196
|
+
var threw = null;
|
|
1197
|
+
try { await ops.getObjectRetention("my-bucket", longKey); }
|
|
1198
|
+
catch (e) { threw = e; }
|
|
1199
|
+
check("object-key: > 1024 bytes rejected with INVALID_KEY",
|
|
1200
|
+
threw && /INVALID_KEY/.test(threw.code || ""));
|
|
1201
|
+
} finally {
|
|
1202
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
// ---- ListBuckets XML-shape branches: empty + single ----
|
|
1207
|
+
|
|
1208
|
+
async function testListBucketsEmptyAndSingle() {
|
|
1209
|
+
var fakeEmpty = _fakeS3({
|
|
1210
|
+
onList: function () {
|
|
1211
|
+
return { statusCode: 200, body:
|
|
1212
|
+
"<?xml version='1.0'?><ListAllMyBucketsResult><Buckets></Buckets>" +
|
|
1213
|
+
"<Owner><ID>op</ID></Owner></ListAllMyBucketsResult>" };
|
|
1214
|
+
},
|
|
1215
|
+
});
|
|
1216
|
+
var portE = await listenOnRandomPort(fakeEmpty.server);
|
|
1217
|
+
try {
|
|
1218
|
+
var opsE = bucketOps.create(_baseConfig(portE));
|
|
1219
|
+
var none = await opsE.list();
|
|
1220
|
+
check("list: empty Buckets container yields []", Array.isArray(none) && none.length === 0);
|
|
1221
|
+
} finally {
|
|
1222
|
+
await new Promise(function (r) { fakeEmpty.server.close(function () { r(); }); });
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
// A 200 whose body lacks the ListAllMyBucketsResult root (unexpected
|
|
1226
|
+
// backend response) degrades to [] via the `doc.<Root> || {}` default arm
|
|
1227
|
+
// rather than throwing.
|
|
1228
|
+
var fakeGarbage = _fakeS3({
|
|
1229
|
+
onList: function () {
|
|
1230
|
+
return { statusCode: 200, body: "<?xml version='1.0'?><Unexpected/>" };
|
|
1231
|
+
},
|
|
1232
|
+
});
|
|
1233
|
+
var portG = await listenOnRandomPort(fakeGarbage.server);
|
|
1234
|
+
try {
|
|
1235
|
+
var opsG = bucketOps.create(_baseConfig(portG));
|
|
1236
|
+
var garbage = await opsG.list();
|
|
1237
|
+
check("list: body without ListAllMyBucketsResult root yields []",
|
|
1238
|
+
Array.isArray(garbage) && garbage.length === 0);
|
|
1239
|
+
} finally {
|
|
1240
|
+
await new Promise(function (r) { fakeGarbage.server.close(function () { r(); }); });
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
// A single <Bucket> is surfaced by the XML parser as an object, not an
|
|
1244
|
+
// array — the wrap-in-array branch must still produce a one-element list.
|
|
1245
|
+
// The bucket omits CreationDate + BucketRegion so the null-default arms of
|
|
1246
|
+
// both fields are exercised.
|
|
1247
|
+
var fakeOne = _fakeS3({
|
|
1248
|
+
onList: function () {
|
|
1249
|
+
return { statusCode: 200, body:
|
|
1250
|
+
"<?xml version='1.0'?><ListAllMyBucketsResult><Buckets>" +
|
|
1251
|
+
"<Bucket><Name>solo</Name></Bucket>" +
|
|
1252
|
+
"</Buckets></ListAllMyBucketsResult>" };
|
|
1253
|
+
},
|
|
1254
|
+
});
|
|
1255
|
+
var portO = await listenOnRandomPort(fakeOne.server);
|
|
1256
|
+
try {
|
|
1257
|
+
var opsO = bucketOps.create(_baseConfig(portO));
|
|
1258
|
+
var one = await opsO.list();
|
|
1259
|
+
check("list: single Bucket wrapped into a one-element array",
|
|
1260
|
+
one.length === 1 && one[0].name === "solo");
|
|
1261
|
+
check("list: single-bucket region defaults to null when absent",
|
|
1262
|
+
one[0].region === null);
|
|
1263
|
+
check("list: single-bucket creationDate defaults to null when absent",
|
|
1264
|
+
one[0].creationDate === null);
|
|
1265
|
+
} finally {
|
|
1266
|
+
await new Promise(function (r) { fakeOne.server.close(function () { r(); }); });
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
// ---- Object-lock config: years path + adversarial validation ----
|
|
1271
|
+
|
|
1272
|
+
async function testObjectLockYearsAndValidation() {
|
|
1273
|
+
var fake = _fakeS3({
|
|
1274
|
+
onGetObjectLock: function () {
|
|
1275
|
+
return { statusCode: 200, body:
|
|
1276
|
+
'<?xml version="1.0"?><ObjectLockConfiguration>' +
|
|
1277
|
+
'<ObjectLockEnabled>Enabled</ObjectLockEnabled>' +
|
|
1278
|
+
'<Rule><DefaultRetention><Mode>GOVERNANCE</Mode><Days>10</Days></DefaultRetention></Rule>' +
|
|
1279
|
+
'</ObjectLockConfiguration>' };
|
|
1280
|
+
},
|
|
1281
|
+
});
|
|
1282
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1283
|
+
try {
|
|
1284
|
+
var ops = bucketOps.create(_baseConfig(port));
|
|
1285
|
+
|
|
1286
|
+
// years-based config: exercises the <Years> XML arm + the years echo
|
|
1287
|
+
// in the success result (days stays null).
|
|
1288
|
+
var rv = await ops.setObjectLockConfiguration("my-bucket",
|
|
1289
|
+
{ mode: "COMPLIANCE", years: 3 });
|
|
1290
|
+
check("object-lock years: applied", rv.applied === true);
|
|
1291
|
+
check("object-lock years: years echoed, days null",
|
|
1292
|
+
rv.years === 3 && rv.days === null);
|
|
1293
|
+
var putReq = fake.requests[fake.requests.length - 1];
|
|
1294
|
+
check("object-lock years: body carries <Years>3</Years>",
|
|
1295
|
+
/<Years>3<\/Years>/.test(putReq.body.toString("utf8")));
|
|
1296
|
+
|
|
1297
|
+
// getObjectLockConfiguration returning Days (not Years) drives the
|
|
1298
|
+
// Number(def.Days) parse arm.
|
|
1299
|
+
var got = await ops.getObjectLockConfiguration("my-bucket");
|
|
1300
|
+
check("object-lock get: Days parsed as number",
|
|
1301
|
+
got.days === 10 && got.years === null && got.mode === "GOVERNANCE");
|
|
1302
|
+
|
|
1303
|
+
async function shouldThrow(label, opts, codeRe) {
|
|
1304
|
+
var threw = null;
|
|
1305
|
+
try { await ops.setObjectLockConfiguration("my-bucket", opts); }
|
|
1306
|
+
catch (e) { threw = e; }
|
|
1307
|
+
check("object-lock validation: " + label, threw && codeRe.test(threw.code || ""));
|
|
1308
|
+
}
|
|
1309
|
+
await shouldThrow("rejects non-object cfg", null, /INVALID_OBJECT_LOCK/);
|
|
1310
|
+
await shouldThrow("rejects neither days nor years",
|
|
1311
|
+
{ mode: "GOVERNANCE" }, /INVALID_OBJECT_LOCK/);
|
|
1312
|
+
await shouldThrow("rejects negative years",
|
|
1313
|
+
{ mode: "GOVERNANCE", years: -1 }, /INVALID_OBJECT_LOCK/);
|
|
1314
|
+
await shouldThrow("rejects fractional years",
|
|
1315
|
+
{ mode: "GOVERNANCE", years: 1.5 }, /INVALID_OBJECT_LOCK/);
|
|
1316
|
+
} finally {
|
|
1317
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
// ---- PUT-op failure branches: throws + failure-audit emission ----
|
|
1322
|
+
|
|
1323
|
+
async function testPutOpFailurePaths() {
|
|
1324
|
+
var auditCap = _captureAudit();
|
|
1325
|
+
var obsCap = _captureObs();
|
|
1326
|
+
var fake = _fakeS3({
|
|
1327
|
+
lifecycleErr: { status: 500, code: "InternalError" },
|
|
1328
|
+
corsErr: { status: 500, code: "InternalError" },
|
|
1329
|
+
objectLockPutErr:{ status: 500, code: "InternalError" },
|
|
1330
|
+
retentionPutErr: { status: 500, code: "InternalError" },
|
|
1331
|
+
legalHoldPutErr: { status: 500, code: "InternalError" },
|
|
1332
|
+
// GET-before-PUT in setObjectRetention must resolve to "not configured"
|
|
1333
|
+
// so the flow falls through to the failing PUT.
|
|
1334
|
+
onGetObjectRetention: function () {
|
|
1335
|
+
return { statusCode: 400, body:
|
|
1336
|
+
'<?xml version="1.0"?><Error><Code>NoSuchObjectLockConfiguration</Code>' +
|
|
1337
|
+
'<Message>no retention</Message></Error>' };
|
|
1338
|
+
},
|
|
1339
|
+
});
|
|
1340
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1341
|
+
try {
|
|
1342
|
+
var ops = bucketOps.create(Object.assign({}, _baseConfig(port), {
|
|
1343
|
+
audit: auditCap,
|
|
1344
|
+
observability: obsCap,
|
|
1345
|
+
}));
|
|
1346
|
+
|
|
1347
|
+
async function expectFailure(label, action, fn) {
|
|
1348
|
+
var threw = null;
|
|
1349
|
+
try { await fn(); } catch (e) { threw = e; }
|
|
1350
|
+
check("put-fail: " + label + " throws on 5xx", threw !== null);
|
|
1351
|
+
var rows = auditCap.byAction(action).filter(function (r) { return r.outcome === "failure"; });
|
|
1352
|
+
check("put-fail: " + label + " emits failure audit row", rows.length >= 1);
|
|
1353
|
+
check("put-fail: " + label + " emits failure obs counter",
|
|
1354
|
+
obsCap.byName(action).some(function (e) {
|
|
1355
|
+
return e.labels && e.labels.outcome === "failure";
|
|
1356
|
+
}));
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
await expectFailure("setLifecycle", "objectstore.bucket.setLifecycle", function () {
|
|
1360
|
+
return ops.setLifecycle("logs", [{ status: "Enabled",
|
|
1361
|
+
abortIncompleteMultipartUpload: { daysAfterInitiation: 7 } }]);
|
|
1362
|
+
});
|
|
1363
|
+
await expectFailure("setCorsRules", "objectstore.bucket.setCorsRules", function () {
|
|
1364
|
+
return ops.setCorsRules("public", [{
|
|
1365
|
+
allowedOrigins: ["https://a.example.com"], allowedMethods: ["GET"] }]);
|
|
1366
|
+
});
|
|
1367
|
+
await expectFailure("setObjectLockConfiguration",
|
|
1368
|
+
"objectstore.bucket.setObjectLockConfiguration", function () {
|
|
1369
|
+
return ops.setObjectLockConfiguration("my-bucket", { mode: "GOVERNANCE", days: 30 });
|
|
1370
|
+
});
|
|
1371
|
+
await expectFailure("setObjectRetention", "objectstore.object.setRetention", function () {
|
|
1372
|
+
return ops.setObjectRetention("my-bucket", "k",
|
|
1373
|
+
{ mode: "GOVERNANCE", retainUntil: new Date(Date.now() + 60000) });
|
|
1374
|
+
});
|
|
1375
|
+
await expectFailure("setObjectLegalHold", "objectstore.object.setLegalHold", function () {
|
|
1376
|
+
return ops.setObjectLegalHold("my-bucket", "k", "ON");
|
|
1377
|
+
});
|
|
1378
|
+
} finally {
|
|
1379
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
// ---- GET-op re-throw when the error is NOT a "not configured" state ----
|
|
1384
|
+
|
|
1385
|
+
async function testGetOpsRethrowRealError() {
|
|
1386
|
+
function realErr() {
|
|
1387
|
+
return { statusCode: 500, body:
|
|
1388
|
+
'<?xml version="1.0"?><Error><Code>InternalError</Code>' +
|
|
1389
|
+
'<Message>backend exploded</Message></Error>' };
|
|
1390
|
+
}
|
|
1391
|
+
var fake = _fakeS3({
|
|
1392
|
+
onGetObjectLock: realErr,
|
|
1393
|
+
onGetObjectRetention: realErr,
|
|
1394
|
+
onGetLegalHold: realErr,
|
|
1395
|
+
});
|
|
1396
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1397
|
+
try {
|
|
1398
|
+
var ops = bucketOps.create(_baseConfig(port));
|
|
1399
|
+
|
|
1400
|
+
var threwLock = null;
|
|
1401
|
+
try { await ops.getObjectLockConfiguration("my-bucket"); }
|
|
1402
|
+
catch (e) { threwLock = e; }
|
|
1403
|
+
check("get-rethrow: getObjectLockConfiguration re-throws a 500 (not swallowed)",
|
|
1404
|
+
threwLock && threwLock.statusCode === 500);
|
|
1405
|
+
|
|
1406
|
+
var threwRet = null;
|
|
1407
|
+
try { await ops.getObjectRetention("my-bucket", "k"); }
|
|
1408
|
+
catch (e) { threwRet = e; }
|
|
1409
|
+
check("get-rethrow: getObjectRetention re-throws a 500 (not swallowed)",
|
|
1410
|
+
threwRet && threwRet.statusCode === 500);
|
|
1411
|
+
|
|
1412
|
+
var threwLh = null;
|
|
1413
|
+
try { await ops.getObjectLegalHold("my-bucket", "k"); }
|
|
1414
|
+
catch (e) { threwLh = e; }
|
|
1415
|
+
check("get-rethrow: getObjectLegalHold re-throws a 500 (not swallowed)",
|
|
1416
|
+
threwLh && threwLh.statusCode === 500);
|
|
1417
|
+
} finally {
|
|
1418
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
// ---- get* defensive parse defaults (unexpected / empty backend document) ----
|
|
1423
|
+
|
|
1424
|
+
async function testGetOpsParseDefaults() {
|
|
1425
|
+
// A 200 whose body lacks the expected root element (a quirk of some
|
|
1426
|
+
// S3-compatible stores) must degrade to clean nulls, not throw — exercising
|
|
1427
|
+
// the `doc.<Root> || {}` and `<field> || null` default arms.
|
|
1428
|
+
function otherDoc() {
|
|
1429
|
+
return { statusCode: 200, body: '<?xml version="1.0"?><Unexpected/>' };
|
|
1430
|
+
}
|
|
1431
|
+
var fake = _fakeS3({
|
|
1432
|
+
onGetObjectLock: otherDoc,
|
|
1433
|
+
onGetObjectRetention: otherDoc,
|
|
1434
|
+
onGetLegalHold: otherDoc,
|
|
1435
|
+
});
|
|
1436
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1437
|
+
try {
|
|
1438
|
+
var ops = bucketOps.create(_baseConfig(port));
|
|
1439
|
+
|
|
1440
|
+
var lock = await ops.getObjectLockConfiguration("my-bucket");
|
|
1441
|
+
check("parse-defaults: object-lock unexpected doc → enabled:false + null fields",
|
|
1442
|
+
lock.enabled === false && lock.mode === null &&
|
|
1443
|
+
lock.days === null && lock.years === null);
|
|
1444
|
+
|
|
1445
|
+
var ret = await ops.getObjectRetention("my-bucket", "k");
|
|
1446
|
+
check("parse-defaults: retention unexpected doc → mode:null, retainUntil:null",
|
|
1447
|
+
ret.mode === null && ret.retainUntil === null);
|
|
1448
|
+
|
|
1449
|
+
var lh = await ops.getObjectLegalHold("my-bucket", "k");
|
|
1450
|
+
check("parse-defaults: legal-hold unexpected doc → status:null",
|
|
1451
|
+
lh.status === null);
|
|
1452
|
+
} finally {
|
|
1453
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
// ---- createBucket generic (non-409) failure + auditFailures:false ----
|
|
1458
|
+
|
|
1459
|
+
async function testCreateGenericFailureAndAuditFailuresOff() {
|
|
1460
|
+
// A non-409 failure is NOT remapped to a BUCKET_* code — the raw HTTP
|
|
1461
|
+
// error surfaces, and the failure-audit row carries its code.
|
|
1462
|
+
var auditCap = _captureAudit();
|
|
1463
|
+
var fake = _fakeS3({ createErr: { status: 500, code: "InternalError" } });
|
|
1464
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1465
|
+
try {
|
|
1466
|
+
var ops = bucketOps.create(Object.assign({}, _baseConfig(port), { audit: auditCap }));
|
|
1467
|
+
var threw = null;
|
|
1468
|
+
try { await ops.create("boom"); } catch (e) { threw = e; }
|
|
1469
|
+
check("create-generic-fail: non-409 error surfaces raw (HTTP_ERROR)",
|
|
1470
|
+
threw && threw.statusCode === 500 &&
|
|
1471
|
+
!/BUCKET_ALREADY_OWNED|BUCKET_NAME_TAKEN/.test(threw.code || ""));
|
|
1472
|
+
var rows = auditCap.byAction("objectstore.bucket.create")
|
|
1473
|
+
.filter(function (r) { return r.outcome === "failure"; });
|
|
1474
|
+
check("create-generic-fail: failure audit row emitted", rows.length === 1);
|
|
1475
|
+
} finally {
|
|
1476
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
// auditFailures:false suppresses the failure audit row while the op still
|
|
1480
|
+
// throws and the observability counter still fires.
|
|
1481
|
+
var auditCap2 = _captureAudit();
|
|
1482
|
+
var obsCap2 = _captureObs();
|
|
1483
|
+
var fake2 = _fakeS3({ createErr: { status: 500, code: "InternalError" } });
|
|
1484
|
+
var port2 = await listenOnRandomPort(fake2.server);
|
|
1485
|
+
try {
|
|
1486
|
+
var ops2 = bucketOps.create(Object.assign({}, _baseConfig(port2), {
|
|
1487
|
+
audit: auditCap2,
|
|
1488
|
+
observability: obsCap2,
|
|
1489
|
+
auditFailures: false,
|
|
1490
|
+
}));
|
|
1491
|
+
var threw2 = null;
|
|
1492
|
+
try { await ops2.create("boom2"); } catch (e) { threw2 = e; }
|
|
1493
|
+
check("auditFailures:false: op still throws", threw2 !== null);
|
|
1494
|
+
check("auditFailures:false: no failure audit row emitted",
|
|
1495
|
+
auditCap2.byAction("objectstore.bucket.create").length === 0);
|
|
1496
|
+
check("auditFailures:false: obs failure counter still fires",
|
|
1497
|
+
obsCap2.byName("objectstore.bucket.create").some(function (e) {
|
|
1498
|
+
return e.labels && e.labels.outcome === "failure";
|
|
1499
|
+
}));
|
|
1500
|
+
} finally {
|
|
1501
|
+
await new Promise(function (r) { fake2.server.close(function () { r(); }); });
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
// ---- deleteBucket generic (non-404, non-409) failure ----
|
|
1506
|
+
|
|
1507
|
+
async function testDeleteGenericFailure() {
|
|
1508
|
+
var auditCap = _captureAudit();
|
|
1509
|
+
var fake = _fakeS3({ deleteErr: { status: 500, code: "InternalError" } });
|
|
1510
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1511
|
+
try {
|
|
1512
|
+
var ops = bucketOps.create(Object.assign({}, _baseConfig(port), { audit: auditCap }));
|
|
1513
|
+
var threw = null;
|
|
1514
|
+
try { await ops.delete("boom"); } catch (e) { threw = e; }
|
|
1515
|
+
check("delete-generic-fail: non-404/409 error surfaces + throws",
|
|
1516
|
+
threw && threw.statusCode === 500);
|
|
1517
|
+
var rows = auditCap.byAction("objectstore.bucket.delete")
|
|
1518
|
+
.filter(function (r) { return r.outcome === "failure"; });
|
|
1519
|
+
check("delete-generic-fail: failure audit row emitted", rows.length === 1);
|
|
1520
|
+
} finally {
|
|
1521
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1525
|
+
// ---- setObjectRetention COMPLIANCE pre-check (WORM defense-in-depth) ----
|
|
1526
|
+
|
|
1527
|
+
async function testSetObjectRetentionComplianceGuards() {
|
|
1528
|
+
// Existing retention on the object is COMPLIANCE, 30 days out. The client-
|
|
1529
|
+
// side pre-check (GET-before-PUT) must refuse a bypass and refuse any
|
|
1530
|
+
// shortening — even before the backend gets the PUT.
|
|
1531
|
+
var existingUntil = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000);
|
|
1532
|
+
var fake = _fakeS3({
|
|
1533
|
+
onGetObjectRetention: function () {
|
|
1534
|
+
return { statusCode: 200, body:
|
|
1535
|
+
'<?xml version="1.0"?><Retention><Mode>COMPLIANCE</Mode>' +
|
|
1536
|
+
'<RetainUntilDate>' + existingUntil.toISOString() + '</RetainUntilDate></Retention>' };
|
|
1537
|
+
},
|
|
1538
|
+
});
|
|
1539
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1540
|
+
try {
|
|
1541
|
+
var ops = bucketOps.create(_baseConfig(port));
|
|
1542
|
+
|
|
1543
|
+
// bypassGovernance against a COMPLIANCE lock — refused client-side.
|
|
1544
|
+
var threwBypass = null;
|
|
1545
|
+
try {
|
|
1546
|
+
await ops.setObjectRetention("my-bucket", "k", {
|
|
1547
|
+
mode: "COMPLIANCE",
|
|
1548
|
+
retainUntil: new Date(Date.now() + 60 * 24 * 60 * 60 * 1000),
|
|
1549
|
+
bypassGovernance: true,
|
|
1550
|
+
});
|
|
1551
|
+
} catch (e) { threwBypass = e; }
|
|
1552
|
+
check("compliance-guard: bypassGovernance on COMPLIANCE is refused",
|
|
1553
|
+
threwBypass && /compliance-bypass-refused/.test(threwBypass.code || ""));
|
|
1554
|
+
|
|
1555
|
+
// Proposing an EARLIER retainUntil (shortening) — refused client-side.
|
|
1556
|
+
var threwShort = null;
|
|
1557
|
+
try {
|
|
1558
|
+
await ops.setObjectRetention("my-bucket", "k", {
|
|
1559
|
+
mode: "COMPLIANCE",
|
|
1560
|
+
retainUntil: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
|
|
1561
|
+
});
|
|
1562
|
+
} catch (e) { threwShort = e; }
|
|
1563
|
+
check("compliance-guard: shortening a COMPLIANCE retention is refused",
|
|
1564
|
+
threwShort && /compliance-shortening-refused/.test(threwShort.code || ""));
|
|
1565
|
+
|
|
1566
|
+
// EXTENDING (later retainUntil, no bypass) is allowed — the pre-check
|
|
1567
|
+
// passes and the PUT proceeds.
|
|
1568
|
+
var extended = await ops.setObjectRetention("my-bucket", "k", {
|
|
1569
|
+
mode: "COMPLIANCE",
|
|
1570
|
+
retainUntil: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000),
|
|
1571
|
+
});
|
|
1572
|
+
check("compliance-guard: extending a COMPLIANCE retention proceeds to PUT",
|
|
1573
|
+
extended.applied === true);
|
|
1574
|
+
} finally {
|
|
1575
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
// The pre-check GET is value-add, NOT load-bearing: when it fails with a
|
|
1580
|
+
// non-compliance error the flow falls through to the PUT so the backend's own
|
|
1581
|
+
// enforcement is authoritative.
|
|
1582
|
+
async function testSetObjectRetentionPreCheckFallsThrough() {
|
|
1583
|
+
var fake = _fakeS3({
|
|
1584
|
+
onGetObjectRetention: function () {
|
|
1585
|
+
return { statusCode: 500, body:
|
|
1586
|
+
'<?xml version="1.0"?><Error><Code>InternalError</Code>' +
|
|
1587
|
+
'<Message>pre-check backend error</Message></Error>' };
|
|
1588
|
+
},
|
|
1589
|
+
// No retentionPutErr → the PUT itself succeeds.
|
|
1590
|
+
});
|
|
1591
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1592
|
+
try {
|
|
1593
|
+
var ops = bucketOps.create(_baseConfig(port));
|
|
1594
|
+
var rv = await ops.setObjectRetention("my-bucket", "k", {
|
|
1595
|
+
mode: "GOVERNANCE",
|
|
1596
|
+
retainUntil: new Date(Date.now() + 60000),
|
|
1597
|
+
});
|
|
1598
|
+
check("pre-check-fallthrough: a failed GET pre-check still lets the PUT proceed",
|
|
1599
|
+
rv.applied === true && rv.mode === "GOVERNANCE");
|
|
1600
|
+
} finally {
|
|
1601
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1602
|
+
}
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
// ---- Virtual-hosted-style URL construction (pathStyle:false) ----
|
|
1606
|
+
|
|
1607
|
+
async function testVirtualHostStyleUrlConstruction() {
|
|
1608
|
+
// With pathStyle:false the bucket name is prepended as a subdomain of the
|
|
1609
|
+
// endpoint host (`<bucket>.<host>`) for both bucket-level and object-level
|
|
1610
|
+
// URLs — the else arm of _bucketUrl / _objectUrl. Against an IPv4 endpoint
|
|
1611
|
+
// the WHATWG URL host-setter refuses the subdomain prefix (you cannot make
|
|
1612
|
+
// an IP literal into a domain), so the constructed URL keeps the IP host and
|
|
1613
|
+
// the request still lands on the fake server. The subresource query + path
|
|
1614
|
+
// are what we assert; the branch under test is exercised either way.
|
|
1615
|
+
var fake = _fakeS3();
|
|
1616
|
+
var port = await listenOnRandomPort(fake.server);
|
|
1617
|
+
try {
|
|
1618
|
+
var ops = bucketOps.create(_baseConfig(port, { pathStyle: false }));
|
|
1619
|
+
|
|
1620
|
+
// Bucket-level: virtual-host addressing sets pathname "/" (no /<bucket>/
|
|
1621
|
+
// prefix). Against the IP endpoint the create still completes.
|
|
1622
|
+
var created = await ops.create("vh-bucket");
|
|
1623
|
+
check("vhost: bucket-level create completes via the else-arm URL builder",
|
|
1624
|
+
created.created === true);
|
|
1625
|
+
var createReq = fake.requests[fake.requests.length - 1];
|
|
1626
|
+
check("vhost: bucket-level URL uses root path (no path-style /<bucket>/ prefix)",
|
|
1627
|
+
createReq.url === "/" && createReq.method === "PUT");
|
|
1628
|
+
|
|
1629
|
+
// Object-level: pathname is "/<key>" (no /<bucket>/ prefix). The
|
|
1630
|
+
// legal-hold subresource query survives the virtual-host code path.
|
|
1631
|
+
fake.requests.length = 0;
|
|
1632
|
+
var held = await ops.setObjectLegalHold("vh-bucket", "some-key", "ON");
|
|
1633
|
+
check("vhost: object-level legal-hold completes via the else-arm URL builder",
|
|
1634
|
+
held.applied === true && held.status === "ON");
|
|
1635
|
+
var objReq = fake.requests[fake.requests.length - 1];
|
|
1636
|
+
check("vhost: object-level URL is /<key> (no /<bucket>/ prefix) + carries ?legal-hold",
|
|
1637
|
+
objReq.url.indexOf("/some-key") === 0 && objReq.url.indexOf("legal-hold") !== -1);
|
|
1638
|
+
} finally {
|
|
1639
|
+
await new Promise(function (r) { fake.server.close(function () { r(); }); });
|
|
1640
|
+
}
|
|
1641
|
+
}
|
|
1642
|
+
|
|
1022
1643
|
// bucketOps dispatches every request through the shared httpClient keep-alive
|
|
1023
1644
|
// transport pool; a cached client socket finalizes its destroy on a later
|
|
1024
1645
|
// event-loop turn, past the forked worker's grace window. Reset the pool, then
|
|
@@ -1068,6 +1689,21 @@ async function run() {
|
|
|
1068
1689
|
await testAuditObservabilityWiring();
|
|
1069
1690
|
await testAuditSuccessFalseDisablesSuccessAudit();
|
|
1070
1691
|
await testPerCallActorOverrideHonored();
|
|
1692
|
+
// Uncovered error / adversarial / defensive / option-default branches.
|
|
1693
|
+
testFactoryDefaultsAndTrailingSlash();
|
|
1694
|
+
testLifecycleXmlAdversarial();
|
|
1695
|
+
testCorsXmlAdversarial();
|
|
1696
|
+
await testObjectKeyTooLong();
|
|
1697
|
+
await testListBucketsEmptyAndSingle();
|
|
1698
|
+
await testObjectLockYearsAndValidation();
|
|
1699
|
+
await testPutOpFailurePaths();
|
|
1700
|
+
await testGetOpsRethrowRealError();
|
|
1701
|
+
await testGetOpsParseDefaults();
|
|
1702
|
+
await testCreateGenericFailureAndAuditFailuresOff();
|
|
1703
|
+
await testDeleteGenericFailure();
|
|
1704
|
+
await testSetObjectRetentionComplianceGuards();
|
|
1705
|
+
await testSetObjectRetentionPreCheckFallsThrough();
|
|
1706
|
+
await testVirtualHostStyleUrlConstruction();
|
|
1071
1707
|
} finally {
|
|
1072
1708
|
await _drainTcpHandles();
|
|
1073
1709
|
}
|