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