@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
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* Live test of b.dsr.dbTicketStore against the docker MySQL container.
|
|
6
|
+
*
|
|
7
|
+
* Same intent as dsr-cluster-pg.test.js: the ticket store composes every
|
|
8
|
+
* statement through b.sql (`?` placeholders + double-quoted identifiers)
|
|
9
|
+
* and drives an operator-supplied b.db-shaped handle ({ runSql,
|
|
10
|
+
* prepare }); layer-0 only ever runs it on node:sqlite. Here the SAME
|
|
11
|
+
* store runs over a docker-exec mysql shim shaped like that handle, so
|
|
12
|
+
* every statement the store emits PREPARES and RUNS on real MySQL:
|
|
13
|
+
*
|
|
14
|
+
* - insert + get: the sealed-at-rest row (payload / subject_* AEAD-
|
|
15
|
+
* sealed, bound to the ticket id) physically lands on MySQL with the
|
|
16
|
+
* derived subject_email_hash / subject_id_hash lookup columns
|
|
17
|
+
* populated, and get() unseals the round-trip.
|
|
18
|
+
* - list({ subject }): an indexable subject key (email / subjectId)
|
|
19
|
+
* matches ONLY its own tickets via the dual-hash whereIn.
|
|
20
|
+
* - FAIL-CLOSED subject filter: a subject with NO indexable key
|
|
21
|
+
* (phone-only, or empty) matches ZERO tickets — never the whole
|
|
22
|
+
* table. The same predicate guards a DESTRUCTIVE path: the
|
|
23
|
+
* erasure-completion purge lists the subject's tickets and DELETES
|
|
24
|
+
* them, so a fail-open filter here would delete every OTHER
|
|
25
|
+
* subject's tickets too.
|
|
26
|
+
* - erasure-completion purge: completing an erasure removes exactly
|
|
27
|
+
* the subject's own prior tickets (the erasure ticket itself and
|
|
28
|
+
* other subjects' tickets survive), and an erasure whose subject has
|
|
29
|
+
* no indexable key purges NOTHING.
|
|
30
|
+
* - purgeExpired: the terminal-status whereIn sweep removes only the
|
|
31
|
+
* ticket whose retentionUntil has passed.
|
|
32
|
+
*
|
|
33
|
+
* Handle-boundary notes (operator-adapter concerns, mirroring
|
|
34
|
+
* db-layer-mysql.test.js):
|
|
35
|
+
* - b.sql emits double-quoted identifiers; MySQL's default sql_mode
|
|
36
|
+
* reads those as STRING literals, so every statement batch is
|
|
37
|
+
* prefixed with `SET SESSION sql_mode=...,ANSI_QUOTES` (each
|
|
38
|
+
* docker-exec is a fresh connection).
|
|
39
|
+
* - `?` placeholders fold into the SQL as quoted literals at the
|
|
40
|
+
* handle boundary (the mysql CLI has no bind protocol).
|
|
41
|
+
* - run() reports { changes } from ROW_COUNT() issued in the SAME
|
|
42
|
+
* mysql invocation as the write (ROW_COUNT is connection-scoped).
|
|
43
|
+
* - the store's schema probe is `PRAGMA table_info(...)` (a
|
|
44
|
+
* SQLite-ism); the handle answers it from information_schema.columns.
|
|
45
|
+
* - MySQL has no CREATE INDEX IF NOT EXISTS; the handle strips the
|
|
46
|
+
* clause and swallows a duplicate-key-name error (1061) so the
|
|
47
|
+
* store's idempotent index DDL stays idempotent.
|
|
48
|
+
* - the physical table is operator-provisioned: VARCHAR key/indexed
|
|
49
|
+
* columns (MySQL refuses an unbounded TEXT column in a key, error
|
|
50
|
+
* 1170), BIGINT ms-epoch columns (MySQL INTEGER is 32-bit), LONGTEXT
|
|
51
|
+
* payload. The store's own CREATE TABLE IF NOT EXISTS then no-ops
|
|
52
|
+
* against the existing table.
|
|
53
|
+
*
|
|
54
|
+
* RUN: node scripts/test-integration.js --skip-service-check dsr-cluster-mysql
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
var execFileSync = require("node:child_process").execFileSync;
|
|
58
|
+
var fs = require("node:fs");
|
|
59
|
+
var os = require("node:os");
|
|
60
|
+
var path = require("node:path");
|
|
61
|
+
var helpers = require("../helpers");
|
|
62
|
+
var check = helpers.check;
|
|
63
|
+
var services = require("../helpers/services");
|
|
64
|
+
var b = require("../../");
|
|
65
|
+
|
|
66
|
+
var CONTAINER = "blamejs-test-mysql";
|
|
67
|
+
var DB_NAME = "blamejs_test";
|
|
68
|
+
var TABLE = "bjdsr_my_tickets";
|
|
69
|
+
// ANSI_QUOTES makes MySQL honor the b.sql double-quoted identifiers;
|
|
70
|
+
// without it every "col" parses as a string literal. Prefixed to every
|
|
71
|
+
// statement batch since each docker-exec is a fresh connection.
|
|
72
|
+
var SQLMODE = "SET SESSION sql_mode=CONCAT(@@sql_mode,',ANSI_QUOTES');\n";
|
|
73
|
+
|
|
74
|
+
// Soft assertion: records pass/fail without throwing so every section's
|
|
75
|
+
// findings are collected even when an earlier check fails. All findings
|
|
76
|
+
// are replayed through the hard `check` at the end of run() so the file
|
|
77
|
+
// still FAILS when any contract is unmet.
|
|
78
|
+
var _findings = [];
|
|
79
|
+
function softCheck(label, condition) {
|
|
80
|
+
_findings.push({ label: label, ok: !!condition });
|
|
81
|
+
console.log((condition ? " ok " : " FAIL ") + label);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ---- shared synchronous docker-exec mysql ----
|
|
85
|
+
// SQL travels on stdin (never argv). --batch gives TAB-separated,
|
|
86
|
+
// header-bearing output; --raw disables escaping so a value round-trips
|
|
87
|
+
// byte-faithfully. stderr is captured so a SQL error surfaces with its
|
|
88
|
+
// message.
|
|
89
|
+
function _mysqlRaw(sql) {
|
|
90
|
+
var args = ["exec", "-i", CONTAINER, "mysql", "-uroot", "-pblamejs_test_root",
|
|
91
|
+
"--batch", "--raw", DB_NAME];
|
|
92
|
+
try {
|
|
93
|
+
var out = execFileSync("docker", args,
|
|
94
|
+
{ input: SQLMODE + sql + "\n",
|
|
95
|
+
stdio: ["pipe", "pipe", "pipe"], maxBuffer: 64 * 1024 * 1024 });
|
|
96
|
+
return { ok: true, out: out.toString("utf8") };
|
|
97
|
+
} catch (e) {
|
|
98
|
+
var stderr = e.stderr ? e.stderr.toString("utf8") : "";
|
|
99
|
+
return { ok: false, out: (e.stdout ? e.stdout.toString("utf8") : ""), err: stderr || (e.message || String(e)) };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// One-shot for setup / teardown / out-of-band assertions; throws on error.
|
|
104
|
+
function _mysql(sql) {
|
|
105
|
+
var r = _mysqlRaw(sql);
|
|
106
|
+
if (!r.ok) throw new Error("mysql setup failed for [" + sql.slice(0, 120) + "]: " + _clean(r.err));
|
|
107
|
+
return r.out;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function _clean(s) {
|
|
111
|
+
return String(s || "").split(/\r?\n/)
|
|
112
|
+
.filter(function (l) { return l && l.indexOf("[Warning] Using a password") === -1; })
|
|
113
|
+
.join(" ").slice(0, 220);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Inline `?` binding. Every value the store binds is operator-controlled
|
|
117
|
+
// (ids / sealed cells / hashes / numbers / null). MySQL treats backslash
|
|
118
|
+
// as a string escape by default, so escape both backslash and quote.
|
|
119
|
+
function _bindQ(sql, params) {
|
|
120
|
+
params = params || [];
|
|
121
|
+
var i = 0;
|
|
122
|
+
return sql.replace(/\?/g, function () {
|
|
123
|
+
if (i >= params.length) throw new Error("placeholder/param count mismatch in: " + sql);
|
|
124
|
+
var v = params[i++];
|
|
125
|
+
if (v === null || v === undefined) return "NULL";
|
|
126
|
+
if (typeof v === "number") return String(v);
|
|
127
|
+
if (typeof v === "boolean") return v ? "1" : "0";
|
|
128
|
+
return "'" + String(v).replace(/\\/g, "\\\\").replace(/'/g, "''") + "'";
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Parse a --batch block: header row first, then data rows. NULL prints as
|
|
133
|
+
// the literal "NULL".
|
|
134
|
+
function _parseSelect(out) {
|
|
135
|
+
var lines = out.split(/\r?\n/).filter(function (l) { return l.length > 0; });
|
|
136
|
+
if (lines.length === 0) return [];
|
|
137
|
+
var headers = lines[0].split("\t");
|
|
138
|
+
var rows = [];
|
|
139
|
+
for (var i = 1; i < lines.length; i++) {
|
|
140
|
+
var cells = lines[i].split("\t");
|
|
141
|
+
var row = {};
|
|
142
|
+
for (var c = 0; c < headers.length; c++) {
|
|
143
|
+
var v = cells[c];
|
|
144
|
+
row[headers[c]] = (v === "NULL" || v === undefined) ? null : v;
|
|
145
|
+
}
|
|
146
|
+
rows.push(row);
|
|
147
|
+
}
|
|
148
|
+
return rows;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function _isWrite(sql) {
|
|
152
|
+
return /^\s*(INSERT|UPDATE|DELETE|REPLACE|MERGE)\b/i.test(sql);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Out-of-band raw read (bypasses the store's unseal) for at-rest asserts.
|
|
156
|
+
function _selectDirect(sqlText) {
|
|
157
|
+
return _parseSelect(_mysql(sqlText));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ---- b.db-shaped handle ({ runSql, prepare }) over real MySQL ----
|
|
161
|
+
function _makeMysqlDbHandle() {
|
|
162
|
+
return {
|
|
163
|
+
prepare: function (sql) {
|
|
164
|
+
// The store's schema reconcile probes columns with the SQLite
|
|
165
|
+
// `PRAGMA table_info(...)`; a MySQL operator adapter answers the
|
|
166
|
+
// same question from information_schema.columns (one row per
|
|
167
|
+
// column, named `name` like the PRAGMA's output).
|
|
168
|
+
var pragma = /^PRAGMA\s+table_info\(\s*"?([A-Za-z0-9_]+)"?\s*\)\s*$/i.exec(sql);
|
|
169
|
+
if (pragma) {
|
|
170
|
+
sql = "SELECT column_name AS name FROM information_schema.columns " +
|
|
171
|
+
"WHERE table_schema = '" + DB_NAME + "' AND table_name = '" + pragma[1] + "'";
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
get: function () {
|
|
175
|
+
var params = Array.prototype.slice.call(arguments);
|
|
176
|
+
var r = _mysqlRaw(_bindQ(sql, params));
|
|
177
|
+
if (!r.ok) throw new Error("MySQL error: " + _clean(r.err));
|
|
178
|
+
var rows = _parseSelect(r.out);
|
|
179
|
+
return rows.length ? rows[0] : undefined;
|
|
180
|
+
},
|
|
181
|
+
all: function () {
|
|
182
|
+
var params = Array.prototype.slice.call(arguments);
|
|
183
|
+
var r = _mysqlRaw(_bindQ(sql, params));
|
|
184
|
+
if (!r.ok) throw new Error("MySQL error: " + _clean(r.err));
|
|
185
|
+
return _parseSelect(r.out);
|
|
186
|
+
},
|
|
187
|
+
run: function () {
|
|
188
|
+
var params = Array.prototype.slice.call(arguments);
|
|
189
|
+
var bound = _bindQ(sql, params);
|
|
190
|
+
// ROW_COUNT() in the SAME connection/batch as the write reports
|
|
191
|
+
// affectedRows (it is connection-scoped).
|
|
192
|
+
var r = _mysqlRaw(bound + ";\nSELECT ROW_COUNT() AS rc;");
|
|
193
|
+
if (!r.ok) throw new Error("MySQL error: " + _clean(r.err));
|
|
194
|
+
var changes = 0;
|
|
195
|
+
if (_isWrite(sql)) {
|
|
196
|
+
var rows = _parseSelect(r.out);
|
|
197
|
+
var last = rows.length ? rows[rows.length - 1] : null;
|
|
198
|
+
if (last && last.rc !== undefined && last.rc !== null) changes = Number(last.rc);
|
|
199
|
+
}
|
|
200
|
+
return { changes: changes, lastInsertRowid: 0 };
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
},
|
|
204
|
+
runSql: function (sql) {
|
|
205
|
+
var t = sql;
|
|
206
|
+
// The physical table is operator-provisioned (VARCHAR key columns),
|
|
207
|
+
// so the store's convenience CREATE TABLE IF NOT EXISTS is a no-op;
|
|
208
|
+
// patch its TEXT PRIMARY KEY anyway so the statement would stay
|
|
209
|
+
// valid on MySQL even against an absent table (error 1170 refuses
|
|
210
|
+
// an unbounded TEXT key).
|
|
211
|
+
t = t.replace("id TEXT PRIMARY KEY", "id VARCHAR(190) PRIMARY KEY");
|
|
212
|
+
// MySQL has no CREATE INDEX IF NOT EXISTS: strip the clause and
|
|
213
|
+
// swallow the duplicate-key-name error (1061) so the store's
|
|
214
|
+
// idempotent index DDL stays idempotent.
|
|
215
|
+
var isIdempotentIndex = /^CREATE INDEX IF NOT EXISTS\b/i.test(t);
|
|
216
|
+
if (isIdempotentIndex) t = t.replace(/^CREATE INDEX IF NOT EXISTS\b/i, "CREATE INDEX");
|
|
217
|
+
var r = _mysqlRaw(t);
|
|
218
|
+
if (!r.ok) {
|
|
219
|
+
if (isIdempotentIndex && /Duplicate key name|error 1061/i.test(r.err)) return "";
|
|
220
|
+
throw new Error("MySQL error: " + _clean(r.err));
|
|
221
|
+
}
|
|
222
|
+
return r.out;
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function _dropAll() {
|
|
228
|
+
_mysql('DROP TABLE IF EXISTS "' + TABLE + '";');
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Operator-provisioned physical table: the canonical dbTicketStore column
|
|
232
|
+
// set, with VARCHAR key/indexed columns (MySQL cannot key or index an
|
|
233
|
+
// unbounded TEXT column), BIGINT ms-epoch columns (MySQL INTEGER is
|
|
234
|
+
// 32-bit and cannot hold a Date.now() value; the store's convenience DDL
|
|
235
|
+
// sizes INTEGER for SQLite where it is 64-bit), and a LONGTEXT payload.
|
|
236
|
+
// The store's own CREATE TABLE IF NOT EXISTS no-ops against this table
|
|
237
|
+
// and its column reconcile finds every column present.
|
|
238
|
+
function _provision() {
|
|
239
|
+
_mysql('CREATE TABLE "' + TABLE + '" (' +
|
|
240
|
+
'"id" VARCHAR(190) PRIMARY KEY, ' +
|
|
241
|
+
'"type" VARCHAR(64) NOT NULL, ' +
|
|
242
|
+
'"status" VARCHAR(64) NOT NULL, ' +
|
|
243
|
+
'"subject_id" TEXT, ' +
|
|
244
|
+
'"subject_email" TEXT, ' +
|
|
245
|
+
'"subject_phone" TEXT, ' +
|
|
246
|
+
'"subject_email_hash" VARCHAR(190), ' +
|
|
247
|
+
'"subject_id_hash" VARCHAR(190), ' +
|
|
248
|
+
'"submitted_at" BIGINT NOT NULL, ' +
|
|
249
|
+
'"deadline_at" BIGINT NOT NULL, ' +
|
|
250
|
+
'"processed_at" BIGINT, ' +
|
|
251
|
+
'"verification_level" VARCHAR(64), ' +
|
|
252
|
+
'"posture" VARCHAR(64), ' +
|
|
253
|
+
'"payload" LONGTEXT NOT NULL);');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Run one stage; a thrown error becomes a single FAILED finding so an
|
|
257
|
+
// unexpected MySQL error in one stage doesn't hide the others.
|
|
258
|
+
async function _section(label, fn) {
|
|
259
|
+
try {
|
|
260
|
+
await fn();
|
|
261
|
+
} catch (e) {
|
|
262
|
+
softCheck(label + "(mysql): stage completed without an unexpected error " +
|
|
263
|
+
"— DETAIL: " + (((e && e.message) || String(e)).split(/\r?\n/)[0]), false);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async function run() {
|
|
268
|
+
var mysqlSvc = await services.requireService("mysql");
|
|
269
|
+
if (!mysqlSvc.ok) throw new Error("mysql unreachable: " + mysqlSvc.reason);
|
|
270
|
+
|
|
271
|
+
_dropAll();
|
|
272
|
+
_provision();
|
|
273
|
+
|
|
274
|
+
// Vault + local-db bring-up: the store seals subject PII + payload via
|
|
275
|
+
// b.cryptoField only when a vault is initialized, and that sealed mode
|
|
276
|
+
// is exactly what the dual-hash lookup + fail-closed filter guard.
|
|
277
|
+
var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-dsr-mysql-"));
|
|
278
|
+
await helpers.setupTestDb(tmpDir);
|
|
279
|
+
|
|
280
|
+
var handle = _makeMysqlDbHandle();
|
|
281
|
+
|
|
282
|
+
var SUBJECTS = {
|
|
283
|
+
"alice@example.com": { subjectId: "u-alice", email: "alice@example.com", phone: "+15550001111" },
|
|
284
|
+
"bob@example.com": { subjectId: "u-bob", email: "bob@example.com", phone: "+15550002222" },
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
var store, dsr;
|
|
288
|
+
var t1, t2, tb, erasure, ghostErasure;
|
|
289
|
+
|
|
290
|
+
try {
|
|
291
|
+
// Constructing the store runs its ensureSchema against real MySQL
|
|
292
|
+
// (CREATE TABLE IF NOT EXISTS no-op, information_schema column probe,
|
|
293
|
+
// the emulated idempotent CREATE INDEX on the hash + status columns).
|
|
294
|
+
store = b.dsr.dbTicketStore({ db: handle, table: TABLE });
|
|
295
|
+
softCheck("store(mysql): dbTicketStore construction ran ensureSchema on real MySQL", true);
|
|
296
|
+
|
|
297
|
+
dsr = b.dsr.create({
|
|
298
|
+
ticketStore: store,
|
|
299
|
+
posture: "gdpr",
|
|
300
|
+
identityResolver: async function (input) {
|
|
301
|
+
if (input && input.email && SUBJECTS[input.email]) return SUBJECTS[input.email];
|
|
302
|
+
if (input && input.phone === "+15550003333") {
|
|
303
|
+
// A subject the operator can only identify by phone — no email,
|
|
304
|
+
// no subjectId, so the ticket store has NO indexable key for it.
|
|
305
|
+
return { phone: "+15550003333" };
|
|
306
|
+
}
|
|
307
|
+
return null;
|
|
308
|
+
},
|
|
309
|
+
sources: [{
|
|
310
|
+
name: "users",
|
|
311
|
+
query: async function () { return [{ id: 1 }]; },
|
|
312
|
+
erase: async function () { return { deletedIds: [1] }; },
|
|
313
|
+
}],
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
await _section("sealed-insert", async function () {
|
|
317
|
+
t1 = await dsr.submit({
|
|
318
|
+
type: "access",
|
|
319
|
+
subject: { email: "alice@example.com" },
|
|
320
|
+
reason: "export request one",
|
|
321
|
+
});
|
|
322
|
+
var raw = _selectDirect(
|
|
323
|
+
'SELECT "subject_email", "subject_phone", "subject_email_hash", ' +
|
|
324
|
+
'"subject_id_hash", "payload" FROM "' + TABLE + "\" WHERE \"id\" = '" + t1.id + "';");
|
|
325
|
+
softCheck("sealed-insert(mysql): the ticket row physically landed on MySQL",
|
|
326
|
+
raw.length === 1);
|
|
327
|
+
softCheck("sealed-insert(mysql): subject_email is sealed at rest (not plaintext)",
|
|
328
|
+
raw.length === 1 && typeof raw[0].subject_email === "string" &&
|
|
329
|
+
raw[0].subject_email.indexOf("alice@example.com") === -1);
|
|
330
|
+
softCheck("sealed-insert(mysql): payload is sealed at rest (no plaintext email leak)",
|
|
331
|
+
raw.length === 1 && typeof raw[0].payload === "string" &&
|
|
332
|
+
raw[0].payload.indexOf("alice@example.com") === -1);
|
|
333
|
+
softCheck("sealed-insert(mysql): derived subject_email_hash populated for lookup",
|
|
334
|
+
raw.length === 1 && typeof raw[0].subject_email_hash === "string" &&
|
|
335
|
+
raw[0].subject_email_hash.length > 0);
|
|
336
|
+
softCheck("sealed-insert(mysql): derived subject_id_hash populated for lookup",
|
|
337
|
+
raw.length === 1 && typeof raw[0].subject_id_hash === "string" &&
|
|
338
|
+
raw[0].subject_id_hash.length > 0);
|
|
339
|
+
|
|
340
|
+
var got = await store.get(t1.id);
|
|
341
|
+
softCheck("sealed-insert(mysql): get() unseals the payload back to cleartext",
|
|
342
|
+
got !== null && got.subject && got.subject.email === "alice@example.com" &&
|
|
343
|
+
got.type === "access" && got.status === "pending");
|
|
344
|
+
softCheck("sealed-insert(mysql): get() of an unknown id returns null",
|
|
345
|
+
(await store.get("DSR-0000000-NOPE")) === null);
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
await _section("list-by-subject", async function () {
|
|
349
|
+
t2 = await dsr.submit({
|
|
350
|
+
type: "access",
|
|
351
|
+
subject: { email: "alice@example.com" },
|
|
352
|
+
reason: "export request two",
|
|
353
|
+
});
|
|
354
|
+
tb = await dsr.submit({
|
|
355
|
+
type: "access",
|
|
356
|
+
subject: { email: "bob@example.com" },
|
|
357
|
+
reason: "bob export",
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
var aliceList = await store.list({ subject: { email: "alice@example.com" } });
|
|
361
|
+
var aliceIds = aliceList.map(function (t) { return t.id; }).sort();
|
|
362
|
+
softCheck("list(mysql): alice's email matches exactly her two tickets via the " +
|
|
363
|
+
"dual-hash whereIn (not bob's)",
|
|
364
|
+
aliceList.length === 2 &&
|
|
365
|
+
JSON.stringify(aliceIds) === JSON.stringify([t1.id, t2.id].sort()));
|
|
366
|
+
|
|
367
|
+
var bobList = await store.list({ subject: { subjectId: "u-bob" } });
|
|
368
|
+
softCheck("list(mysql): bob's subjectId matches exactly his ticket via subject_id_hash",
|
|
369
|
+
bobList.length === 1 && bobList[0].id === tb.id);
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
await _section("fail-closed-filter", async function () {
|
|
373
|
+
var all = await store.list({});
|
|
374
|
+
softCheck("fail-closed(mysql): baseline — a no-subject list sees every ticket (3)",
|
|
375
|
+
all.length === 3);
|
|
376
|
+
|
|
377
|
+
// Alice's phone IS on her tickets' sealed payloads, but phone is not
|
|
378
|
+
// an indexable subject key — the filter must produce a
|
|
379
|
+
// matches-nothing predicate, NOT degrade to a full-table scan.
|
|
380
|
+
var phoneOnly = await store.list({ subject: { phone: "+15550001111" } });
|
|
381
|
+
softCheck("fail-closed(mysql): a phone-only subject matches ZERO tickets on real " +
|
|
382
|
+
"MySQL (never all " + all.length + ")",
|
|
383
|
+
phoneOnly.length === 0);
|
|
384
|
+
|
|
385
|
+
var emptySubject = await store.list({ subject: {} });
|
|
386
|
+
softCheck("fail-closed(mysql): an empty subject matches ZERO tickets (never all)",
|
|
387
|
+
emptySubject.length === 0);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
await _section("erasure-purge", async function () {
|
|
391
|
+
erasure = await dsr.submit({
|
|
392
|
+
type: "erasure",
|
|
393
|
+
subject: { email: "alice@example.com" },
|
|
394
|
+
reason: "right to erasure",
|
|
395
|
+
verificationLevel: "secondary",
|
|
396
|
+
});
|
|
397
|
+
var processed = await dsr.process(erasure.id,
|
|
398
|
+
{ actor: "compliance@example.com", verificationLevel: "secondary" });
|
|
399
|
+
softCheck("erasure(mysql): the erasure ticket completed on real MySQL",
|
|
400
|
+
processed && processed.status === "completed");
|
|
401
|
+
|
|
402
|
+
softCheck("erasure(mysql): alice's prior ticket one was purged",
|
|
403
|
+
(await store.get(t1.id)) === null);
|
|
404
|
+
softCheck("erasure(mysql): alice's prior ticket two was purged",
|
|
405
|
+
(await store.get(t2.id)) === null);
|
|
406
|
+
softCheck("erasure(mysql): the erasure ticket itself survives (audit/receipt trail)",
|
|
407
|
+
(await store.get(erasure.id)) !== null);
|
|
408
|
+
softCheck("erasure(mysql): bob's ticket is untouched by alice's erasure purge",
|
|
409
|
+
(await store.get(tb.id)) !== null);
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
await _section("erasure-no-key-purges-nothing", async function () {
|
|
413
|
+
// The DESTRUCTIVE fail-closed proof: an erasure whose subject has NO
|
|
414
|
+
// indexable key must purge NOTHING. A fail-open subject filter would
|
|
415
|
+
// list every row here and delete every other subject's tickets.
|
|
416
|
+
ghostErasure = await dsr.submit({
|
|
417
|
+
type: "erasure",
|
|
418
|
+
subject: { phone: "+15550003333" },
|
|
419
|
+
reason: "erasure for a subject with no indexable key",
|
|
420
|
+
verificationLevel: "secondary",
|
|
421
|
+
});
|
|
422
|
+
var done = await dsr.process(ghostErasure.id, { verificationLevel: "secondary" });
|
|
423
|
+
softCheck("erasure-no-key(mysql): the no-indexable-key erasure still completes",
|
|
424
|
+
done && done.status === "completed");
|
|
425
|
+
softCheck("erasure-no-key(mysql): bob's ticket SURVIVES the no-key purge " +
|
|
426
|
+
"(a fail-open filter would have deleted it)",
|
|
427
|
+
(await store.get(tb.id)) !== null);
|
|
428
|
+
softCheck("erasure-no-key(mysql): alice's completed erasure ticket SURVIVES the no-key purge",
|
|
429
|
+
(await store.get(erasure.id)) !== null);
|
|
430
|
+
softCheck("erasure-no-key(mysql): the no-key erasure ticket itself survives",
|
|
431
|
+
(await store.get(ghostErasure.id)) !== null);
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
await _section("purge-expired", async function () {
|
|
435
|
+
var now = Date.now();
|
|
436
|
+
await store.insert({
|
|
437
|
+
id: "DSR-0000000-RETIRED1",
|
|
438
|
+
type: "access",
|
|
439
|
+
status: "completed",
|
|
440
|
+
subject: { subjectId: "u-old", email: "old@example.com" },
|
|
441
|
+
submittedAt: now - b.constants.TIME.days(60),
|
|
442
|
+
deadlineAt: now - b.constants.TIME.days(30),
|
|
443
|
+
processedAt: now - b.constants.TIME.days(45),
|
|
444
|
+
verificationLevel: "primary",
|
|
445
|
+
posture: "gdpr",
|
|
446
|
+
retentionUntil: now - b.constants.TIME.days(1),
|
|
447
|
+
});
|
|
448
|
+
var purged = await store.purgeExpired();
|
|
449
|
+
softCheck("purge-expired(mysql): the aged terminal ticket was purged (exactly 1)",
|
|
450
|
+
purged === 1);
|
|
451
|
+
softCheck("purge-expired(mysql): the aged ticket row is gone",
|
|
452
|
+
(await store.get("DSR-0000000-RETIRED1")) === null);
|
|
453
|
+
softCheck("purge-expired(mysql): a completed ticket inside its retention floor survives",
|
|
454
|
+
(await store.get(erasure.id)) !== null);
|
|
455
|
+
});
|
|
456
|
+
} finally {
|
|
457
|
+
try { await helpers.teardownTestDb(tmpDir); } catch (_e) {}
|
|
458
|
+
_dropAll();
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Replay every recorded finding through the hard `check` so the file
|
|
462
|
+
// FAILS (and the runner reports it) when any contract is unmet.
|
|
463
|
+
var failures = _findings.filter(function (f) { return !f.ok; });
|
|
464
|
+
console.log("");
|
|
465
|
+
console.log("[dsr-cluster-mysql] " + (_findings.length - failures.length) + "/" +
|
|
466
|
+
_findings.length + " checks ok; " + failures.length + " failing");
|
|
467
|
+
for (var i = 0; i < _findings.length; i++) {
|
|
468
|
+
check(_findings[i].label, _findings[i].ok);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
module.exports = { run: run };
|
|
473
|
+
|
|
474
|
+
if (require.main === module) {
|
|
475
|
+
run().then(
|
|
476
|
+
function () { console.log("OK — " + helpers.getChecks() + " checks passed"); process.exit(0); },
|
|
477
|
+
function (e) { console.error("FAIL:", e.stack || e); process.exit(1); }
|
|
478
|
+
);
|
|
479
|
+
}
|