@blamejs/blamejs-shop 0.4.30 → 0.4.32
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 +4 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/checkout.js +8 -0
- package/lib/order.js +71 -11
- package/lib/vendor/MANIFEST.json +392 -278
- package/lib/vendor/blamejs/.github/workflows/ci.yml +34 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +21 -4
- package/lib/vendor/blamejs/.gitignore +6 -0
- package/lib/vendor/blamejs/CHANGELOG.md +26 -0
- package/lib/vendor/blamejs/MIGRATING.md +43 -0
- package/lib/vendor/blamejs/README.md +8 -6
- package/lib/vendor/blamejs/SECURITY.md +19 -3
- package/lib/vendor/blamejs/api-snapshot.json +2190 -664
- package/lib/vendor/blamejs/docker/caddy/localstack.Caddyfile +19 -0
- package/lib/vendor/blamejs/docker/init/generate-certs.sh +1 -1
- package/lib/vendor/blamejs/docker/otel/config.yaml +42 -0
- package/lib/vendor/blamejs/docker/otel/export/.gitkeep +0 -0
- package/lib/vendor/blamejs/docker/postgres/initdb/10-replication.sh +15 -0
- package/lib/vendor/blamejs/docker/postgres/replica-entrypoint.sh +38 -0
- package/lib/vendor/blamejs/docker/toxiproxy/toxiproxy.json +14 -0
- package/lib/vendor/blamejs/docker-compose.test.yml +209 -0
- package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +132 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +221 -61
- package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +144 -9
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +99 -0
- package/lib/vendor/blamejs/fuzz/guard-sql.fuzz.js +36 -0
- package/lib/vendor/blamejs/index.js +4 -0
- package/lib/vendor/blamejs/lib/agent-envelope-mac.js +104 -0
- package/lib/vendor/blamejs/lib/agent-event-bus.js +105 -4
- package/lib/vendor/blamejs/lib/agent-posture-chain.js +8 -42
- package/lib/vendor/blamejs/lib/ai-content-detect.js +9 -10
- package/lib/vendor/blamejs/lib/api-key.js +158 -77
- package/lib/vendor/blamejs/lib/atomic-file.js +62 -4
- package/lib/vendor/blamejs/lib/audit-chain.js +47 -11
- package/lib/vendor/blamejs/lib/audit-sign.js +77 -2
- package/lib/vendor/blamejs/lib/audit-tools.js +79 -51
- package/lib/vendor/blamejs/lib/audit.js +259 -123
- package/lib/vendor/blamejs/lib/auth/oauth.js +53 -9
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +108 -47
- package/lib/vendor/blamejs/lib/auth/saml.js +6 -8
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +31 -5
- package/lib/vendor/blamejs/lib/backup/index.js +45 -10
- package/lib/vendor/blamejs/lib/break-glass.js +355 -147
- package/lib/vendor/blamejs/lib/cache.js +174 -105
- package/lib/vendor/blamejs/lib/chain-writer.js +38 -16
- package/lib/vendor/blamejs/lib/cli.js +19 -14
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +130 -104
- package/lib/vendor/blamejs/lib/cluster-storage.js +119 -22
- package/lib/vendor/blamejs/lib/cluster.js +119 -71
- package/lib/vendor/blamejs/lib/codepoint-class.js +23 -0
- package/lib/vendor/blamejs/lib/compliance.js +206 -4
- package/lib/vendor/blamejs/lib/consent.js +82 -29
- package/lib/vendor/blamejs/lib/constants.js +27 -11
- package/lib/vendor/blamejs/lib/crypto-field.js +916 -156
- package/lib/vendor/blamejs/lib/db-declare-row-policy.js +35 -22
- package/lib/vendor/blamejs/lib/db-file-lifecycle.js +3 -2
- package/lib/vendor/blamejs/lib/db-query.js +882 -260
- package/lib/vendor/blamejs/lib/db-schema.js +228 -44
- package/lib/vendor/blamejs/lib/db.js +249 -99
- package/lib/vendor/blamejs/lib/dsr.js +385 -55
- package/lib/vendor/blamejs/lib/error-page.js +14 -1
- package/lib/vendor/blamejs/lib/external-db-migrate.js +239 -137
- package/lib/vendor/blamejs/lib/external-db.js +549 -34
- package/lib/vendor/blamejs/lib/file-upload.js +52 -7
- package/lib/vendor/blamejs/lib/framework-error.js +20 -1
- package/lib/vendor/blamejs/lib/framework-files.js +73 -0
- package/lib/vendor/blamejs/lib/framework-schema.js +695 -394
- package/lib/vendor/blamejs/lib/gate-contract.js +659 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +26 -44
- package/lib/vendor/blamejs/lib/guard-all.js +1 -0
- package/lib/vendor/blamejs/lib/guard-auth.js +42 -112
- package/lib/vendor/blamejs/lib/guard-cidr.js +33 -154
- package/lib/vendor/blamejs/lib/guard-csv.js +46 -113
- package/lib/vendor/blamejs/lib/guard-domain.js +34 -157
- package/lib/vendor/blamejs/lib/guard-dsn.js +27 -43
- package/lib/vendor/blamejs/lib/guard-email.js +47 -69
- package/lib/vendor/blamejs/lib/guard-envelope.js +19 -32
- package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +24 -42
- package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +25 -43
- package/lib/vendor/blamejs/lib/guard-filename.js +42 -106
- package/lib/vendor/blamejs/lib/guard-graphql.js +42 -123
- package/lib/vendor/blamejs/lib/guard-html.js +53 -108
- package/lib/vendor/blamejs/lib/guard-idempotency-key.js +24 -42
- package/lib/vendor/blamejs/lib/guard-image.js +46 -103
- package/lib/vendor/blamejs/lib/guard-imap-command.js +18 -32
- package/lib/vendor/blamejs/lib/guard-jmap.js +16 -30
- package/lib/vendor/blamejs/lib/guard-json.js +38 -108
- package/lib/vendor/blamejs/lib/guard-jsonpath.js +38 -171
- package/lib/vendor/blamejs/lib/guard-jwt.js +49 -179
- package/lib/vendor/blamejs/lib/guard-list-id.js +25 -41
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +27 -43
- package/lib/vendor/blamejs/lib/guard-mail-compose.js +24 -42
- package/lib/vendor/blamejs/lib/guard-mail-move.js +26 -44
- package/lib/vendor/blamejs/lib/guard-mail-query.js +28 -46
- package/lib/vendor/blamejs/lib/guard-mail-reply.js +24 -42
- package/lib/vendor/blamejs/lib/guard-mail-sieve.js +24 -42
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +17 -31
- package/lib/vendor/blamejs/lib/guard-markdown.js +37 -104
- package/lib/vendor/blamejs/lib/guard-message-id.js +26 -45
- package/lib/vendor/blamejs/lib/guard-mime.js +39 -151
- package/lib/vendor/blamejs/lib/guard-oauth.js +54 -135
- package/lib/vendor/blamejs/lib/guard-pdf.js +45 -101
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +21 -31
- package/lib/vendor/blamejs/lib/guard-posture-chain.js +24 -42
- package/lib/vendor/blamejs/lib/guard-regex.js +33 -107
- package/lib/vendor/blamejs/lib/guard-saga-config.js +24 -42
- package/lib/vendor/blamejs/lib/guard-shell.js +42 -172
- package/lib/vendor/blamejs/lib/guard-smtp-command.js +48 -54
- package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +24 -42
- package/lib/vendor/blamejs/lib/guard-sql.js +1491 -0
- package/lib/vendor/blamejs/lib/guard-stream-args.js +24 -43
- package/lib/vendor/blamejs/lib/guard-svg.js +47 -65
- package/lib/vendor/blamejs/lib/guard-template.js +35 -172
- package/lib/vendor/blamejs/lib/guard-tenant-id.js +26 -45
- package/lib/vendor/blamejs/lib/guard-time.js +32 -154
- package/lib/vendor/blamejs/lib/guard-trace-context.js +25 -44
- package/lib/vendor/blamejs/lib/guard-uuid.js +32 -153
- package/lib/vendor/blamejs/lib/guard-xml.js +38 -113
- package/lib/vendor/blamejs/lib/guard-yaml.js +51 -163
- package/lib/vendor/blamejs/lib/http-client.js +37 -9
- package/lib/vendor/blamejs/lib/inbox.js +120 -107
- package/lib/vendor/blamejs/lib/legal-hold.js +121 -50
- package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +47 -31
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +32 -18
- package/lib/vendor/blamejs/lib/mail-auth.js +236 -0
- package/lib/vendor/blamejs/lib/mail-crypto-smime.js +2 -6
- package/lib/vendor/blamejs/lib/mail-dkim.js +1 -0
- package/lib/vendor/blamejs/lib/mail-greylist.js +2 -6
- package/lib/vendor/blamejs/lib/mail-helo.js +2 -6
- package/lib/vendor/blamejs/lib/mail-journal.js +85 -64
- package/lib/vendor/blamejs/lib/mail-rbl.js +2 -6
- package/lib/vendor/blamejs/lib/mail-scan.js +2 -6
- package/lib/vendor/blamejs/lib/mail-server-jmap.js +117 -12
- package/lib/vendor/blamejs/lib/mail-server-mx.js +276 -7
- package/lib/vendor/blamejs/lib/mail-spam-score.js +2 -6
- package/lib/vendor/blamejs/lib/mail-store.js +293 -154
- package/lib/vendor/blamejs/lib/mail.js +8 -4
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +71 -25
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +19 -8
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -1
- package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +17 -7
- package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +75 -51
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +102 -32
- package/lib/vendor/blamejs/lib/middleware/security-headers.js +21 -5
- package/lib/vendor/blamejs/lib/migrations.js +108 -66
- package/lib/vendor/blamejs/lib/network-heartbeat.js +7 -0
- package/lib/vendor/blamejs/lib/network-proxy.js +24 -1
- package/lib/vendor/blamejs/lib/nonce-store.js +31 -9
- package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +9 -4
- package/lib/vendor/blamejs/lib/object-store/azure-blob.js +57 -3
- package/lib/vendor/blamejs/lib/object-store/gcs.js +4 -1
- package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +5 -2
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +38 -6
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +9 -1
- package/lib/vendor/blamejs/lib/observability.js +124 -0
- package/lib/vendor/blamejs/lib/otel-export.js +12 -3
- package/lib/vendor/blamejs/lib/outbox.js +184 -83
- package/lib/vendor/blamejs/lib/parsers/safe-xml.js +47 -7
- package/lib/vendor/blamejs/lib/pqc-agent.js +44 -0
- package/lib/vendor/blamejs/lib/pubsub-cluster.js +42 -20
- package/lib/vendor/blamejs/lib/queue-local.js +225 -140
- package/lib/vendor/blamejs/lib/queue-redis.js +9 -1
- package/lib/vendor/blamejs/lib/queue-sqs.js +6 -0
- package/lib/vendor/blamejs/lib/queue.js +7 -0
- package/lib/vendor/blamejs/lib/redact.js +68 -11
- package/lib/vendor/blamejs/lib/redis-client.js +160 -31
- package/lib/vendor/blamejs/lib/request-helpers.js +7 -0
- package/lib/vendor/blamejs/lib/retention.js +101 -40
- package/lib/vendor/blamejs/lib/router.js +212 -5
- package/lib/vendor/blamejs/lib/safe-dns.js +29 -45
- package/lib/vendor/blamejs/lib/safe-ical.js +18 -33
- package/lib/vendor/blamejs/lib/safe-icap.js +27 -43
- package/lib/vendor/blamejs/lib/safe-sieve.js +21 -40
- package/lib/vendor/blamejs/lib/safe-sql.js +212 -3
- package/lib/vendor/blamejs/lib/safe-url.js +170 -3
- package/lib/vendor/blamejs/lib/safe-vcard.js +18 -33
- package/lib/vendor/blamejs/lib/scheduler.js +35 -12
- package/lib/vendor/blamejs/lib/seeders.js +122 -74
- package/lib/vendor/blamejs/lib/session-stores.js +42 -14
- package/lib/vendor/blamejs/lib/session.js +175 -77
- package/lib/vendor/blamejs/lib/sql.js +3842 -0
- package/lib/vendor/blamejs/lib/sse.js +26 -0
- package/lib/vendor/blamejs/lib/ssrf-guard.js +151 -4
- package/lib/vendor/blamejs/lib/static.js +177 -34
- package/lib/vendor/blamejs/lib/subject.js +96 -49
- package/lib/vendor/blamejs/lib/vault/index.js +3 -2
- package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +3 -2
- package/lib/vendor/blamejs/lib/vault/rotate.js +168 -108
- package/lib/vendor/blamejs/lib/vault-aad.js +6 -0
- package/lib/vendor/blamejs/lib/vendor-data.js +2 -0
- package/lib/vendor/blamejs/lib/websocket.js +35 -5
- package/lib/vendor/blamejs/lib/worker-pool.js +11 -0
- package/lib/vendor/blamejs/package.json +2 -2
- package/lib/vendor/blamejs/release-notes/v0.14.x.json +1503 -0
- package/lib/vendor/blamejs/release-notes/v0.15.0.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.15.1.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.15.2.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.15.3.json +39 -0
- package/lib/vendor/blamejs/release-notes/v0.15.4.json +39 -0
- package/lib/vendor/blamejs/release-notes/v0.15.5.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.15.6.json +59 -0
- package/lib/vendor/blamejs/scripts/check-services.js +21 -0
- package/lib/vendor/blamejs/scripts/gen-migrating.js +51 -0
- package/lib/vendor/blamejs/scripts/release.js +398 -38
- package/lib/vendor/blamejs/test/00-primitives.js +117 -0
- package/lib/vendor/blamejs/test/10-state.js +140 -14
- package/lib/vendor/blamejs/test/20-db.js +65 -2
- package/lib/vendor/blamejs/test/helpers/db.js +9 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +27 -15
- package/lib/vendor/blamejs/test/helpers/services.js +21 -0
- package/lib/vendor/blamejs/test/integration/audit-actor-binding-pg.test.js +246 -0
- package/lib/vendor/blamejs/test/integration/audit-chain-external-db.test.js +517 -0
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +639 -0
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +832 -0
- package/lib/vendor/blamejs/test/integration/backup-restore-objectstore.test.js +453 -0
- package/lib/vendor/blamejs/test/integration/data-layer-cluster-mysql.test.js +649 -0
- package/lib/vendor/blamejs/test/integration/data-layer-cluster-pg.test.js +770 -0
- package/lib/vendor/blamejs/test/integration/data-layer-mysql-privacy.test.js +630 -0
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +610 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +577 -0
- package/lib/vendor/blamejs/test/integration/data-layer-postgres.test.js +771 -0
- package/lib/vendor/blamejs/test/integration/db-layer-mysql.test.js +549 -0
- package/lib/vendor/blamejs/test/integration/db-layer-postgres.test.js +598 -0
- package/lib/vendor/blamejs/test/integration/distributed-scheduler-fencing-pg.test.js +602 -0
- package/lib/vendor/blamejs/test/integration/external-db-postgres.test.js +576 -0
- package/lib/vendor/blamejs/test/integration/framework-schema-mysql.test.js +353 -0
- package/lib/vendor/blamejs/test/integration/log-stream-cloudwatch.test.js +224 -0
- package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +142 -17
- package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +25 -10
- package/lib/vendor/blamejs/test/integration/object-store-azure.test.js +101 -0
- package/lib/vendor/blamejs/test/integration/object-store-gcs.test.js +239 -0
- package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +35 -16
- package/lib/vendor/blamejs/test/integration/object-store-worm-lock.test.js +291 -0
- package/lib/vendor/blamejs/test/integration/pubsub.test.js +14 -0
- package/lib/vendor/blamejs/test/integration/queue-sqs.test.js +322 -0
- package/lib/vendor/blamejs/test/integration/redis-reconnect-toxiproxy.test.js +300 -0
- package/lib/vendor/blamejs/test/integration/sql-fts5-catalog-sqlite.test.js +154 -0
- package/lib/vendor/blamejs/test/integration/tls-classical-downgrade-audit.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +175 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-exclusive-temp.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-checkpoint-false-rollback.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-query-self-log.test.js +126 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-safeemit-redacts-secrets.test.js +196 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-signing-key-rotation.test.js +197 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-verifybundle-tamper.test.js +209 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-key-encoding.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-residency-posture.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-scheduletest-drill.test.js +318 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +233 -7
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +1120 -14
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +229 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +24 -7
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-dual-read-migrate.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-per-row-key.test.js +350 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-unseal-rate-cap.test.js +27 -9
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-upgrade-dialect.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-interop-oracles.test.js +392 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csrf-protect.test.js +159 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-column-gate.test.js +180 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +5 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-sealed-field-in.test.js +101 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-schema-drift.test.js +38 -5
- package/lib/vendor/blamejs/test/layer-0-primitives/db-schema-reconcile-emittable.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-stream-and-payload-shape.test.js +267 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/defineguard-default-gate-posture-caps.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-replaystore-required.test.js +46 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +218 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/erase-posture-vacuum.test.js +210 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +4 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +48 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +237 -5
- package/lib/vendor/blamejs/test/layer-0-primitives/fetch-metadata.test.js +20 -9
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +193 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +90 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +10 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +15 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +189 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +3 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +123 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +207 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +43 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/otlp-attr-redaction.test.js +101 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox-inflight-reaper.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey-real-vectors.test.js +429 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +21 -11
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-byo-db.test.js +40 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention-dryrun-no-vacuum.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-use-path-scope.test.js +255 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-canonicalize.test.js +309 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-xml.test.js +143 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/saml-subjectconfirmation-notonorafter.test.js +287 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc-ecdsa-p1363.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +31 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +49 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +595 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sse-backpressure.test.js +91 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +194 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket-extension-header.test.js +88 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool-recycle-race.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +84 -0
- package/lib/vendor/blamejs/test/layer-5-integration/external-db-residency.test.js +638 -0
- package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +21 -0
- package/lib/vendor/blamejs/test/smoke.js +79 -21
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.14.0.json +0 -43
- package/lib/vendor/blamejs/release-notes/v0.14.1.json +0 -60
- package/lib/vendor/blamejs/release-notes/v0.14.10.json +0 -54
- package/lib/vendor/blamejs/release-notes/v0.14.11.json +0 -72
- package/lib/vendor/blamejs/release-notes/v0.14.12.json +0 -95
- package/lib/vendor/blamejs/release-notes/v0.14.13.json +0 -52
- package/lib/vendor/blamejs/release-notes/v0.14.14.json +0 -31
- package/lib/vendor/blamejs/release-notes/v0.14.16.json +0 -45
- package/lib/vendor/blamejs/release-notes/v0.14.17.json +0 -57
- package/lib/vendor/blamejs/release-notes/v0.14.18.json +0 -127
- package/lib/vendor/blamejs/release-notes/v0.14.19.json +0 -61
- package/lib/vendor/blamejs/release-notes/v0.14.2.json +0 -18
- package/lib/vendor/blamejs/release-notes/v0.14.20.json +0 -73
- package/lib/vendor/blamejs/release-notes/v0.14.21.json +0 -98
- package/lib/vendor/blamejs/release-notes/v0.14.22.json +0 -91
- package/lib/vendor/blamejs/release-notes/v0.14.3.json +0 -18
- package/lib/vendor/blamejs/release-notes/v0.14.4.json +0 -18
- package/lib/vendor/blamejs/release-notes/v0.14.5.json +0 -18
- package/lib/vendor/blamejs/release-notes/v0.14.6.json +0 -60
- package/lib/vendor/blamejs/release-notes/v0.14.7.json +0 -77
- package/lib/vendor/blamejs/release-notes/v0.14.8.json +0 -27
- package/lib/vendor/blamejs/release-notes/v0.14.9.json +0 -40
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Live proof that b.audit.generateActorBindingTriggerSql() produces a
|
|
4
|
+
* Postgres BEFORE INSERT trigger that the database itself enforces —
|
|
5
|
+
* a privileged caller (migration runner, anyone with DB creds) cannot
|
|
6
|
+
* forge an audit row under a different actor.
|
|
7
|
+
*
|
|
8
|
+
* SOX §404 / SOC 2 CC1.3 segregation-of-duties: the unit test only
|
|
9
|
+
* asserts the SQL STRING contains 'current_user' / 'BEFORE INSERT'.
|
|
10
|
+
* This drives the generated DDL into a real Postgres, creates two real
|
|
11
|
+
* login roles, and proves:
|
|
12
|
+
* 1. a caller connected as alice INSERTing actorUserId='alice' SUCCEEDS;
|
|
13
|
+
* 2. a caller connected as alice INSERTing actorUserId='bob' is refused
|
|
14
|
+
* by the trigger (RAISE EXCEPTION P0001) — the INSERT fails.
|
|
15
|
+
*
|
|
16
|
+
* The "driver" is a docker-exec psql shim ({connect,query,close}) that
|
|
17
|
+
* shells psql inside the blamejs-test-postgres container via
|
|
18
|
+
* execFileSync (no shell). The framework ships no DB wire driver; this
|
|
19
|
+
* exercises the framework-generated SQL against a real server and wires
|
|
20
|
+
* the DDL application through b.externalDb so the framework's externalDb
|
|
21
|
+
* query path is the one that installs the trigger.
|
|
22
|
+
*/
|
|
23
|
+
var execFileSync = require("node:child_process").execFileSync;
|
|
24
|
+
var helpers = require("../helpers");
|
|
25
|
+
var check = helpers.check;
|
|
26
|
+
var services = require("../helpers/services");
|
|
27
|
+
var b = require("../../");
|
|
28
|
+
|
|
29
|
+
var CONTAINER = "blamejs-test-postgres";
|
|
30
|
+
var DB_USER = "blamejs";
|
|
31
|
+
var DB_NAME = "blamejs_test";
|
|
32
|
+
var TAB = "\t";
|
|
33
|
+
|
|
34
|
+
var TABLE = "_blamejs_audit_log"; // matches generator default opts.tableName
|
|
35
|
+
var COLUMN = "actorUserId"; // matches generator default opts.column
|
|
36
|
+
|
|
37
|
+
// Run one SQL string inside the container. -tA = tuples-only, unaligned;
|
|
38
|
+
// -F<tab> field separator; ON_ERROR_STOP=1 so any server error (incl. a
|
|
39
|
+
// trigger RAISE) exits non-zero and surfaces stderr. No shell is spawned
|
|
40
|
+
// (execFileSync with an argv array). On non-zero exit the server's error
|
|
41
|
+
// text (the trigger message) is captured into the thrown Error.message.
|
|
42
|
+
function _psql(sql) {
|
|
43
|
+
var out;
|
|
44
|
+
try {
|
|
45
|
+
out = execFileSync("docker",
|
|
46
|
+
["exec", "-i", CONTAINER,
|
|
47
|
+
"psql", "-U", DB_USER, "-d", DB_NAME,
|
|
48
|
+
"-tA", "-F", TAB, "-v", "ON_ERROR_STOP=1", "-c", sql],
|
|
49
|
+
{ stdio: ["pipe", "pipe", "pipe"] }
|
|
50
|
+
).toString("utf8");
|
|
51
|
+
} catch (e) {
|
|
52
|
+
var stderr = e.stderr ? e.stderr.toString("utf8") : "";
|
|
53
|
+
var stdout = e.stdout ? e.stdout.toString("utf8") : "";
|
|
54
|
+
var err = new Error((stderr || stdout || e.message || String(e)).trim());
|
|
55
|
+
err.code = "PSQL_ERROR";
|
|
56
|
+
err.stderr = stderr;
|
|
57
|
+
err.cause = e;
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Apply a multi-statement / dollar-quoted DDL script via stdin (psql
|
|
64
|
+
// reads from stdin when no -c is given). The generator's `up` script
|
|
65
|
+
// contains a $$...$$ plpgsql body + several statements — feeding it as a
|
|
66
|
+
// single -c argument is fine too, but stdin keeps the dollar-quoting and
|
|
67
|
+
// statement separation unambiguous and mirrors how a migration runner
|
|
68
|
+
// would pipe the file.
|
|
69
|
+
function _psqlScript(script) {
|
|
70
|
+
try {
|
|
71
|
+
execFileSync("docker",
|
|
72
|
+
["exec", "-i", CONTAINER,
|
|
73
|
+
"psql", "-U", DB_USER, "-d", DB_NAME, "-v", "ON_ERROR_STOP=1"],
|
|
74
|
+
{ input: script, stdio: ["pipe", "pipe", "pipe"] }
|
|
75
|
+
);
|
|
76
|
+
} catch (e) {
|
|
77
|
+
var stderr = e.stderr ? e.stderr.toString("utf8") : "";
|
|
78
|
+
var err = new Error((stderr || e.message || String(e)).trim());
|
|
79
|
+
err.code = "PSQL_ERROR";
|
|
80
|
+
err.stderr = stderr;
|
|
81
|
+
err.cause = e;
|
|
82
|
+
throw err;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Substitute Postgres $1/$2 placeholders with quoted literals. Test
|
|
87
|
+
// values are operator-controlled (role names / actor ids); a value-side
|
|
88
|
+
// single quote is doubled. Identifiers are never placeholdered here.
|
|
89
|
+
// NOTE: only used for our own parameterized INSERTs — never for the
|
|
90
|
+
// generator's DDL (which legitimately contains $$ dollar-quoting).
|
|
91
|
+
function _bind(sql, params) {
|
|
92
|
+
params = params || [];
|
|
93
|
+
return sql.replace(/\$(\d+)/g, function (_m, n) {
|
|
94
|
+
var idx = Number(n) - 1;
|
|
95
|
+
if (idx < 0 || idx >= params.length) {
|
|
96
|
+
throw new Error("placeholder $" + n + " has no param");
|
|
97
|
+
}
|
|
98
|
+
var p = params[idx];
|
|
99
|
+
if (p === null || p === undefined) return "NULL";
|
|
100
|
+
if (typeof p === "number") return String(p);
|
|
101
|
+
return "'" + String(p).replace(/'/g, "''") + "'";
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function _parseRows(out) {
|
|
106
|
+
var lines = out.split(/\r?\n/).filter(function (l) { return l.length > 0; });
|
|
107
|
+
return lines.map(function (l) { return l.split(TAB); });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// docker-exec psql driver for b.externalDb. query() binds $n params then
|
|
111
|
+
// shells one psql -c. close() is a no-op (each call is its own session).
|
|
112
|
+
function _makeDockerPgDriver() {
|
|
113
|
+
return {
|
|
114
|
+
connect: async function () { return { id: 1 }; },
|
|
115
|
+
query: async function (_client, sql, params) {
|
|
116
|
+
var bound = _bind(sql, params);
|
|
117
|
+
var out = _psql(bound);
|
|
118
|
+
return { rows: _parseRows(out) };
|
|
119
|
+
},
|
|
120
|
+
close: async function () { /* no-op — each psql -c is its own session */ },
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function run() {
|
|
125
|
+
var pg = await services.requireService("postgres");
|
|
126
|
+
if (!pg.ok) throw new Error("postgres unreachable: " + pg.reason);
|
|
127
|
+
|
|
128
|
+
// ---- clean slate (idempotent) ----
|
|
129
|
+
_psql(
|
|
130
|
+
'DROP TABLE IF EXISTS "' + TABLE + '" CASCADE; ' +
|
|
131
|
+
'DROP FUNCTION IF EXISTS "_blamejs_audit_actor_binding_check"() CASCADE; ' +
|
|
132
|
+
"DROP ROLE IF EXISTS alice; DROP ROLE IF EXISTS bob;"
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
// ---- wire the framework's externalDb over the docker-exec driver ----
|
|
136
|
+
b.externalDb._resetForTest();
|
|
137
|
+
var driver = _makeDockerPgDriver();
|
|
138
|
+
// No residencyTag on the backend — the per-row residency write gate is
|
|
139
|
+
// a separate concern; this test isolates the actor-binding trigger.
|
|
140
|
+
b.externalDb.init({
|
|
141
|
+
backends: {
|
|
142
|
+
ops: {
|
|
143
|
+
connect: driver.connect, query: driver.query, close: driver.close,
|
|
144
|
+
dialect: "postgres",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// externalDb.query(sql, params, opts) — route to the "ops" backend.
|
|
150
|
+
function q(sql, params) {
|
|
151
|
+
return b.externalDb.query(sql, params || [], { backend: "ops" });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ---- the audit table the trigger binds to (column matches generator) ----
|
|
155
|
+
// The column must be the quoted mixed-case identifier the generator
|
|
156
|
+
// emits ("actorUserId"); a folded lowercase column would never match
|
|
157
|
+
// NEW."actorUserId" and the whole test would be vacuous.
|
|
158
|
+
await q('CREATE TABLE "' + TABLE + '" (' +
|
|
159
|
+
' id serial PRIMARY KEY,' +
|
|
160
|
+
' "' + COLUMN + '" text NOT NULL,' +
|
|
161
|
+
' action text' +
|
|
162
|
+
");");
|
|
163
|
+
check("audit_log table created on real postgres", true);
|
|
164
|
+
|
|
165
|
+
// ---- apply the FRAMEWORK-GENERATED trigger DDL through externalDb ----
|
|
166
|
+
var ddl = b.audit.generateActorBindingTriggerSql();
|
|
167
|
+
// The DDL is dollar-quoted plpgsql + multi-statement. Drive it through
|
|
168
|
+
// the framework's externalDb.query (single call) — the driver pipes it
|
|
169
|
+
// to psql. (We use the script path so the $$ body is unambiguous; the
|
|
170
|
+
// SQL string is exactly what the framework emits, unmodified.)
|
|
171
|
+
_psqlScript(ddl.up);
|
|
172
|
+
check("framework actor-binding trigger DDL applied to real postgres", true);
|
|
173
|
+
|
|
174
|
+
// Confirm the trigger + function are actually present in the catalogs
|
|
175
|
+
// (not merely that the DDL string ran without error).
|
|
176
|
+
var trigRows = (await q("SELECT tgname FROM pg_trigger WHERE tgname = $1", [ddl.triggerName])).rows;
|
|
177
|
+
check("trigger row present in pg_trigger", trigRows.length === 1);
|
|
178
|
+
var fnRows = (await q("SELECT proname FROM pg_proc WHERE proname = $1", [ddl.functionName])).rows;
|
|
179
|
+
check("trigger function present in pg_proc", fnRows.length === 1);
|
|
180
|
+
|
|
181
|
+
// ---- two real login roles with INSERT grant ----
|
|
182
|
+
await q("CREATE ROLE alice LOGIN; CREATE ROLE bob LOGIN;");
|
|
183
|
+
await q('GRANT INSERT, SELECT ON "' + TABLE + '" TO alice, bob;');
|
|
184
|
+
await q('GRANT USAGE, SELECT ON SEQUENCE "' + TABLE + '_id_seq" TO alice, bob;');
|
|
185
|
+
check("roles alice/bob created with INSERT grant", true);
|
|
186
|
+
|
|
187
|
+
// ---- (1) alice INSERTing actorUserId='alice' → trigger allows it ----
|
|
188
|
+
// SET ROLE in the same statement-batch so current_user = alice when
|
|
189
|
+
// the BEFORE INSERT trigger fires.
|
|
190
|
+
var okThrew = null;
|
|
191
|
+
try {
|
|
192
|
+
await q("SET ROLE alice; " +
|
|
193
|
+
'INSERT INTO "' + TABLE + '" ("' + COLUMN + '", action) VALUES ($1, $2);',
|
|
194
|
+
["alice", "audit.read"]);
|
|
195
|
+
} catch (e) { okThrew = e; }
|
|
196
|
+
check("matching actor (alice→alice) INSERT succeeds — trigger allows",
|
|
197
|
+
okThrew === null);
|
|
198
|
+
|
|
199
|
+
// Side-effect proof: the allowed row is actually in the table.
|
|
200
|
+
var rowsAlice = (await q('SELECT "' + COLUMN + '" FROM "' + TABLE + '" WHERE "' + COLUMN + '" = $1',
|
|
201
|
+
["alice"])).rows;
|
|
202
|
+
check("allowed row is persisted (actorUserId=alice present)",
|
|
203
|
+
rowsAlice.length === 1 && rowsAlice[0][0] === "alice");
|
|
204
|
+
|
|
205
|
+
// ---- (2) alice INSERTing actorUserId='bob' → trigger REFUSES it ----
|
|
206
|
+
var forgeThrew = null;
|
|
207
|
+
try {
|
|
208
|
+
await q("SET ROLE alice; " +
|
|
209
|
+
'INSERT INTO "' + TABLE + '" ("' + COLUMN + '", action) VALUES ($1, $2);',
|
|
210
|
+
["bob", "audit.read"]);
|
|
211
|
+
} catch (e) { forgeThrew = e; }
|
|
212
|
+
check("cross-actor forge (alice→bob) is REFUSED by the DB trigger",
|
|
213
|
+
forgeThrew !== null);
|
|
214
|
+
check("refusal carries the trigger's segregation-of-duties message",
|
|
215
|
+
forgeThrew !== null &&
|
|
216
|
+
/segregation-of-duties violation/.test(forgeThrew.message) &&
|
|
217
|
+
/actor=bob/.test(forgeThrew.message) &&
|
|
218
|
+
/current_user=alice/.test(forgeThrew.message));
|
|
219
|
+
|
|
220
|
+
// Side-effect proof: the forged row did NOT land — the trigger fired
|
|
221
|
+
// BEFORE INSERT, so the table holds zero rows under actorUserId=bob.
|
|
222
|
+
var rowsBob = (await q('SELECT count(*) FROM "' + TABLE + '" WHERE "' + COLUMN + '" = $1',
|
|
223
|
+
["bob"])).rows;
|
|
224
|
+
check("forged row was NOT persisted (zero actorUserId=bob rows)",
|
|
225
|
+
rowsBob.length === 1 && Number(rowsBob[0][0]) === 0);
|
|
226
|
+
|
|
227
|
+
// ---- teardown (best-effort; leave the DB clean for re-runs) ----
|
|
228
|
+
try {
|
|
229
|
+
_psql(
|
|
230
|
+
'DROP TABLE IF EXISTS "' + TABLE + '" CASCADE; ' +
|
|
231
|
+
'DROP FUNCTION IF EXISTS "_blamejs_audit_actor_binding_check"() CASCADE; ' +
|
|
232
|
+
"DROP ROLE IF EXISTS alice; DROP ROLE IF EXISTS bob;"
|
|
233
|
+
);
|
|
234
|
+
} catch (_e) { /* teardown is best-effort */ }
|
|
235
|
+
|
|
236
|
+
await b.externalDb.shutdown();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
module.exports = { run: run };
|
|
240
|
+
|
|
241
|
+
if (require.main === module) {
|
|
242
|
+
run().then(
|
|
243
|
+
function () { console.log("OK — " + helpers.getChecks() + " checks passed"); process.exit(0); },
|
|
244
|
+
function (e) { console.error("FAIL:", e.stack || e); process.exit(1); }
|
|
245
|
+
);
|
|
246
|
+
}
|