From a9af9a9a436d715853c0d83bbf839cf13e87083a Mon Sep 17 00:00:00 2001 From: taherd <183945978+taherdhanera@users.noreply.github.com> Date: Sat, 23 May 2026 00:48:02 +0530 Subject: [PATCH] Add webhook payload redaction guard --- webhook-payload-redaction-guard/README.md | 34 +++ webhook-payload-redaction-guard/demo-video.js | 173 +++++++++++ webhook-payload-redaction-guard/demo.js | 18 ++ webhook-payload-redaction-guard/index.js | 282 ++++++++++++++++++ webhook-payload-redaction-guard/package.json | 14 + .../reports/demo.webm | Bin 0 -> 80997 bytes .../reports/reviewer-packet.md | 61 ++++ .../reports/summary.json | 183 ++++++++++++ .../reports/summary.svg | 16 + .../requirements-map.md | 17 ++ .../sample-data.js | 79 +++++ webhook-payload-redaction-guard/test.js | 75 +++++ 12 files changed, 952 insertions(+) create mode 100644 webhook-payload-redaction-guard/README.md create mode 100644 webhook-payload-redaction-guard/demo-video.js create mode 100644 webhook-payload-redaction-guard/demo.js create mode 100644 webhook-payload-redaction-guard/index.js create mode 100644 webhook-payload-redaction-guard/package.json create mode 100644 webhook-payload-redaction-guard/reports/demo.webm create mode 100644 webhook-payload-redaction-guard/reports/reviewer-packet.md create mode 100644 webhook-payload-redaction-guard/reports/summary.json create mode 100644 webhook-payload-redaction-guard/reports/summary.svg create mode 100644 webhook-payload-redaction-guard/requirements-map.md create mode 100644 webhook-payload-redaction-guard/sample-data.js create mode 100644 webhook-payload-redaction-guard/test.js diff --git a/webhook-payload-redaction-guard/README.md b/webhook-payload-redaction-guard/README.md new file mode 100644 index 00000000..88c14ac7 --- /dev/null +++ b/webhook-payload-redaction-guard/README.md @@ -0,0 +1,34 @@ +# Webhook Payload Redaction Guard + +Self-contained Enterprise Tooling slice for `SCIBASE-AI/SCIBASE.AI#19`. + +The guard validates outbound institutional webhook/API payloads before delivery. +It checks schema allowlists, private-project field leakage, PII and direct +identifier exposure, private storage links, data-residency routing, event +signature metadata, and dataset access safety. It emits deterministic event +decisions so unsafe payloads are blocked or redacted before institutional sync. + +This is intentionally separate from webhook replay ledgers, admin notification +escalation, connector certification, API change governance, data export approval, +deposit reconciliation, SCIM/HRIS deprovisioning, LMS roster passback, usage +cost allocation, incident response, data residency policy, and secret rotation +slices. Its job is outbound payload minimization and redaction before delivery. + +## Run + +```bash +npm run check +npm test +npm run demo +npm run demo:video +``` + +## Outputs + +- `reports/summary.json` +- `reports/reviewer-packet.md` +- `reports/summary.svg` +- `reports/demo.webm` + +All data is synthetic. The module does not call live webhook delivery, +repository sync, LMS sync, identity, storage, or external provider systems. diff --git a/webhook-payload-redaction-guard/demo-video.js b/webhook-payload-redaction-guard/demo-video.js new file mode 100644 index 00000000..1346a1f8 --- /dev/null +++ b/webhook-payload-redaction-guard/demo-video.js @@ -0,0 +1,173 @@ +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const { execFileSync } = require("child_process"); + +const reportDir = path.join(__dirname, "reports"); +const outputPath = path.join(reportDir, "demo.webm"); + +const chromeCandidates = [ + process.env.CHROME_PATH, + "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe", + "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe" +].filter(Boolean); + +function findBrowser() { + const found = chromeCandidates.find((candidate) => fs.existsSync(candidate)); + if (!found) { + throw new Error("Chrome or Edge was not found. Set CHROME_PATH to generate reports/demo.webm."); + } + return found; +} + +function fileUrl(filePath) { + return `file:///${filePath.replace(/\\/g, "/")}`; +} + +const html = String.raw` + + + + Webhook payload redaction guard demo + + + + +
recording
+ + +`; + +fs.mkdirSync(reportDir, { recursive: true }); + +const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "webhook-redaction-demo-")); +const htmlPath = path.join(tempDir, "demo.html"); +const profileDir = path.join(tempDir, "profile"); +fs.writeFileSync(htmlPath, html, "utf8"); + +const stdout = execFileSync( + findBrowser(), + [ + "--headless=new", + "--disable-gpu", + "--disable-dev-shm-usage", + "--autoplay-policy=no-user-gesture-required", + "--run-all-compositor-stages-before-draw", + "--virtual-time-budget=7500", + `--user-data-dir=${profileDir}`, + "--dump-dom", + fileUrl(htmlPath) + ], + { encoding: "utf8", maxBuffer: 30 * 1024 * 1024 } +); + +const match = stdout.match(/data:video\/webm;base64,([A-Za-z0-9+/=]+)/); +if (!match) { + throw new Error(`Demo video generation failed. Browser output ended with: ${stdout.slice(-600)}`); +} + +fs.writeFileSync(outputPath, Buffer.from(match[1], "base64")); +console.log(`Generated ${path.relative(process.cwd(), outputPath)}`); diff --git a/webhook-payload-redaction-guard/demo.js b/webhook-payload-redaction-guard/demo.js new file mode 100644 index 00000000..97c3730c --- /dev/null +++ b/webhook-payload-redaction-guard/demo.js @@ -0,0 +1,18 @@ +const fs = require("fs"); +const path = require("path"); +const { project } = require("./sample-data"); +const { buildReviewPacket, renderMarkdownReport, renderSvgSummary } = require("./index"); + +const reportDir = path.join(__dirname, "reports"); +fs.mkdirSync(reportDir, { recursive: true }); + +const packet = buildReviewPacket(project); + +fs.writeFileSync(path.join(reportDir, "summary.json"), `${JSON.stringify(packet, null, 2)}\n`, "utf8"); +fs.writeFileSync(path.join(reportDir, "reviewer-packet.md"), renderMarkdownReport(packet), "utf8"); +fs.writeFileSync(path.join(reportDir, "summary.svg"), renderSvgSummary(packet), "utf8"); + +console.log(`Generated reports for ${packet.guard}`); +console.log(`Decision: ${packet.decision}`); +console.log(`Score: ${packet.score}`); +console.log(`Findings: ${packet.findings.length}`); diff --git a/webhook-payload-redaction-guard/index.js b/webhook-payload-redaction-guard/index.js new file mode 100644 index 00000000..157fa913 --- /dev/null +++ b/webhook-payload-redaction-guard/index.js @@ -0,0 +1,282 @@ +const SEVERITY_WEIGHTS = { + critical: 34, + high: 20, + medium: 10, + low: 4 +}; + +function addFinding(findings, severity, rule, message, action, refs = []) { + findings.push({ severity, rule, message, action, refs }); +} + +function isPlainObject(value) { + return value && typeof value === "object" && !Array.isArray(value); +} + +function walkObject(value, visitor, path = []) { + if (!isPlainObject(value) && !Array.isArray(value)) { + return; + } + const entries = Array.isArray(value) ? value.entries() : Object.entries(value); + for (const [key, child] of entries) { + const nextPath = path.concat(String(key)); + visitor(String(key), child, nextPath); + walkObject(child, visitor, nextPath); + } +} + +function pathString(path) { + return path.join("."); +} + +function evaluateEvent(event, project, findings) { + if (!project.policy.allowedEventTypes.includes(event.eventType)) { + addFinding( + findings, + "critical", + "webhook-event-type-not-allowlisted", + `${event.eventId} uses non-allowlisted event type ${event.eventType}.`, + "Block delivery until the event type is approved for the destination connector.", + [event.eventId, event.eventType] + ); + } + + for (const field of Object.keys(event)) { + if (!project.policy.allowedTopLevelFields.includes(field) && field !== "destination") { + addFinding( + findings, + "medium", + "webhook-top-level-field-not-allowlisted", + `${event.eventId} includes non-allowlisted top-level field ${field}.`, + "Drop non-contract fields before webhook delivery.", + [event.eventId, field] + ); + } + } + + if (!project.policy.allowedRegions.includes(event.destination.region)) { + addFinding( + findings, + "high", + "webhook-region-not-allowed", + `${event.eventId} targets region ${event.destination.region}.`, + "Hold delivery until data-residency routing is approved.", + [event.eventId, event.destination.region] + ); + } + + const signature = event.signature || {}; + for (const field of project.policy.requiredSignatureFields) { + if (!signature[field]) { + addFinding( + findings, + "high", + "webhook-signature-metadata-incomplete", + `${event.eventId} is missing signature field ${field}.`, + "Regenerate signed event metadata before delivery.", + [event.eventId, field] + ); + } + } + if (signature.algorithm && signature.algorithm !== "HMAC-SHA256") { + addFinding( + findings, + "critical", + "webhook-signature-algorithm-unsafe", + `${event.eventId} uses unsafe signature algorithm ${signature.algorithm}.`, + "Block delivery until a production signing algorithm is used.", + [event.eventId, signature.algorithm] + ); + } + + walkObject(event, (key, value, path) => { + if (project.policy.piiFieldNames.includes(key)) { + addFinding( + findings, + "critical", + "webhook-pii-field-present", + `${event.eventId} includes PII field ${pathString(path)}.`, + "Redact direct identifiers before institutional webhook delivery.", + [event.eventId, pathString(path)] + ); + } + if (project.policy.blockedProjectFields.includes(key)) { + addFinding( + findings, + "high", + "webhook-private-project-field-present", + `${event.eventId} includes private project field ${pathString(path)}.`, + "Remove private workspace fields from outbound payloads.", + [event.eventId, pathString(path)] + ); + } + if (typeof value === "string" && value.includes("storage.example/private")) { + addFinding( + findings, + "critical", + "webhook-private-storage-link-present", + `${event.eventId} exposes a private storage URL at ${pathString(path)}.`, + "Replace private URLs with DOI/metadata links or suppress the field.", + [event.eventId, pathString(path)] + ); + } + }); + + if (event.project && event.project.visibility !== "public" && event.destination.purpose === "public-metadata") { + addFinding( + findings, + "high", + "private-project-routed-to-public-metadata", + `${event.eventId} routes ${event.project.visibility} project metadata to a public destination.`, + "Hold delivery until the workspace visibility and payload purpose agree.", + [event.eventId, event.project.id] + ); + } + + if (event.dataset) { + if (!project.policy.publicDatasetAccess.includes(event.dataset.access)) { + addFinding( + findings, + "critical", + "webhook-dataset-access-not-public-safe", + `${event.eventId} includes dataset ${event.dataset.id} with access ${event.dataset.access}.`, + "Suppress dataset delivery or emit metadata-only redacted payload.", + [event.eventId, event.dataset.id, event.dataset.access] + ); + } + if (event.dataset.access === "embargoed-metadata-only" && event.dataset.downloadUrl) { + addFinding( + findings, + "high", + "embargoed-dataset-download-url-present", + `${event.eventId} includes a download URL for embargoed dataset ${event.dataset.id}.`, + "Remove download links while preserving DOI and metadata.", + [event.eventId, event.dataset.id] + ); + } + } +} + +function evaluateWebhookPayloads(project) { + const findings = []; + for (const event of project.outboundEvents) { + evaluateEvent(event, project, findings); + } + + const eventDecisions = project.outboundEvents.map((event) => { + const eventFindings = findings.filter((finding) => finding.refs.includes(event.eventId)); + const hasCritical = eventFindings.some((finding) => finding.severity === "critical"); + const hasHigh = eventFindings.some((finding) => finding.severity === "high"); + return { + eventId: event.eventId, + decision: hasCritical ? "block-delivery" : hasHigh ? "redact-and-review" : "deliver", + rules: eventFindings.map((finding) => finding.rule) + }; + }); + + const severitySummary = findings.reduce( + (summary, finding) => { + summary[finding.severity] += 1; + return summary; + }, + { critical: 0, high: 0, medium: 0, low: 0 } + ); + const score = Math.max(0, 100 - findings.reduce((sum, finding) => sum + SEVERITY_WEIGHTS[finding.severity], 0)); + + return { findings, eventDecisions, severitySummary, score }; +} + +function decisionFromEvaluation(evaluation) { + if (evaluation.severitySummary.critical > 0) { + return "block-unsafe-webhook-delivery"; + } + if (evaluation.severitySummary.high > 0 || evaluation.score < 75) { + return "redact-and-review-before-delivery"; + } + if (evaluation.score < 90) { + return "manual-webhook-payload-review"; + } + return "webhook-payload-ready"; +} + +function buildReviewPacket(project) { + const evaluation = evaluateWebhookPayloads(project); + return { + guard: "webhook-payload-redaction-guard", + issue: "SCIBASE-AI/SCIBASE.AI#19", + asOfDate: project.asOfDate, + decision: decisionFromEvaluation(evaluation), + score: evaluation.score, + severitySummary: evaluation.severitySummary, + findings: evaluation.findings, + eventDecisions: evaluation.eventDecisions, + safety: [ + "Synthetic webhook, project, dataset, review, and connector data only", + "No live webhook delivery, repository sync, LMS sync, identity, storage, or external provider calls", + "No private institutional payloads, credentials, secrets, real users, or live admin mutations" + ] + }; +} + +function renderMarkdownReport(packet) { + const lines = [ + "# Webhook Payload Redaction Guard", + "", + `Issue: ${packet.issue}`, + `Decision: ${packet.decision}`, + `Score: ${packet.score}`, + "", + "## Event Decisions", + "" + ]; + + for (const decision of packet.eventDecisions) { + lines.push(`- ${decision.eventId}: ${decision.decision}`); + if (decision.rules.length > 0) { + lines.push(` - Rules: ${decision.rules.join(", ")}`); + } + } + + lines.push("", "## Findings", ""); + for (const finding of packet.findings) { + lines.push(`- **${finding.severity} / ${finding.rule}**: ${finding.message}`); + lines.push(` - Action: ${finding.action}`); + lines.push(` - Refs: ${finding.refs.join(", ") || "none"}`); + } + + lines.push("", "## Safety", ""); + for (const item of packet.safety) { + lines.push(`- ${item}`); + } + + return `${lines.join("\n")}\n`; +} + +function renderSvgSummary(packet) { + const scoreWidth = Math.max(44, Math.min(760, packet.score * 7.6)); + return ` + + Webhook Payload Redaction Guard + SCIBASE #19 enterprise outbound payload review + + ${packet.decision} + Critical ${packet.severitySummary.critical} | High ${packet.severitySummary.high} | Findings ${packet.findings.length} + + Payload readiness score + + + ${packet.score}/100 + + Block unsafe institutional delivery + Checks schema allowlists, PII, private fields, storage links, residency, signatures, and dataset access. + +`; +} + +module.exports = { + buildReviewPacket, + decisionFromEvaluation, + evaluateWebhookPayloads, + renderMarkdownReport, + renderSvgSummary +}; diff --git a/webhook-payload-redaction-guard/package.json b/webhook-payload-redaction-guard/package.json new file mode 100644 index 00000000..32c8cbec --- /dev/null +++ b/webhook-payload-redaction-guard/package.json @@ -0,0 +1,14 @@ +{ + "name": "webhook-payload-redaction-guard", + "version": "1.0.0", + "description": "Deterministic enterprise guard for webhook payload redaction and minimization.", + "main": "index.js", + "private": true, + "type": "commonjs", + "scripts": { + "check": "node --check index.js && node --check sample-data.js && node --check demo.js && node --check demo-video.js && node --check test.js", + "test": "node test.js", + "demo": "node demo.js", + "demo:video": "node demo-video.js" + } +} diff --git a/webhook-payload-redaction-guard/reports/demo.webm b/webhook-payload-redaction-guard/reports/demo.webm new file mode 100644 index 0000000000000000000000000000000000000000..6c4ca731d3a988f1dc51b5d60c650f0faa96b9cb GIT binary patch literal 80997 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

iKtI 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 + + Webhook Payload Redaction Guard + SCIBASE #19 enterprise outbound payload review + + block-unsafe-webhook-delivery + Critical 7 | High 5 | Findings 13 + + Payload readiness score + + + 0/100 + + Block unsafe institutional delivery + Checks schema allowlists, PII, private fields, storage links, residency, signatures, and dataset access. + diff --git a/webhook-payload-redaction-guard/requirements-map.md b/webhook-payload-redaction-guard/requirements-map.md new file mode 100644 index 00000000..51ae5281 --- /dev/null +++ b/webhook-payload-redaction-guard/requirements-map.md @@ -0,0 +1,17 @@ +# Requirements Map + +Issue: `SCIBASE-AI/SCIBASE.AI#19` + +| Issue requirement | Implementation | +| --- | --- | +| Enterprise API and webhooks | Validates outbound webhook/API event payloads before institutional delivery. | +| Secure integrations | Checks event type allowlists, payload schema, signing metadata, data-residency region, and connector destination. | +| Project and dataset governance | Blocks private project fields, direct identifiers, private storage URLs, and non-public-safe dataset access in outgoing payloads. | +| Admin oversight | Emits deterministic event decisions and reviewer packets for delivery, redaction, or blocking. | +| Safe local validation | Includes dependency-free tests and demo generation from synthetic enterprise event metadata only. | + +## Non-goals + +- No live webhook delivery, repository sync, LMS sync, identity, storage, or provider calls. +- No private institutional payloads, credentials, secrets, real users, or live admin mutations. +- No replacement for replay, alerting, connector certification, API-change, SCIM, LMS, deposit, or cost-allocation workflows. diff --git a/webhook-payload-redaction-guard/sample-data.js b/webhook-payload-redaction-guard/sample-data.js new file mode 100644 index 00000000..828a2448 --- /dev/null +++ b/webhook-payload-redaction-guard/sample-data.js @@ -0,0 +1,79 @@ +const project = { + asOfDate: "2026-05-23", + policy: { + allowedEventTypes: ["project.published", "dataset.deposited", "review.completed"], + allowedTopLevelFields: ["eventId", "eventType", "occurredAt", "institutionId", "project", "dataset", "review", "signature"], + piiFieldNames: ["email", "phone", "address", "fullName", "studentId", "employeeId"], + blockedProjectFields: ["privateNotes", "internalReviewerComments", "billingAccountId"], + requiredSignatureFields: ["algorithm", "keyId", "digest"], + allowedRegions: ["US", "EU"], + publicDatasetAccess: ["public", "embargoed-metadata-only"] + }, + outboundEvents: [ + { + eventId: "evt-001", + eventType: "dataset.deposited", + occurredAt: "2026-05-22T18:20:00Z", + institutionId: "inst-northbridge", + destination: { connector: "Invenio", region: "EU", purpose: "repository-sync" }, + project: { + id: "proj-101", + title: "Synthetic Proteomics Collaboration", + visibility: "private", + privateNotes: "IRB reviewer asked for delay", + owner: { fullName: "Maya Chen", email: "maya@example.edu", orcid: "0000-0002-1111-2222" } + }, + dataset: { + id: "data-raw", + access: "restricted", + embargoUntil: "2026-08-01", + downloadUrl: "https://storage.example/private/raw.csv", + doi: "" + }, + signature: { algorithm: "HMAC-SHA256", keyId: "", digest: "sha256:abc" }, + debugTrace: "internal-router-17" + }, + { + eventId: "evt-002", + eventType: "project.published", + occurredAt: "2026-05-22T18:25:00Z", + institutionId: "inst-northbridge", + destination: { connector: "DSpace", region: "US", purpose: "public-metadata" }, + project: { + id: "proj-202", + title: "Open Climate Notebook", + visibility: "public", + owner: { orcid: "0000-0003-3333-4444" } + }, + dataset: { + id: "data-open", + access: "public", + embargoUntil: null, + downloadUrl: "https://doi.org/10.5281/zenodo.20260523", + doi: "10.5281/zenodo.20260523" + }, + signature: { algorithm: "HMAC-SHA256", keyId: "enterprise-prod-2026", digest: "sha256:def" } + }, + { + eventId: "evt-003", + eventType: "review.completed", + occurredAt: "2026-05-22T18:30:00Z", + institutionId: "inst-northbridge", + destination: { connector: "Moodle", region: "APAC", purpose: "course-sync" }, + project: { + id: "proj-303", + title: "Doctoral Research Review", + visibility: "institutional-only", + internalReviewerComments: "Reviewer identity must remain blinded" + }, + review: { + id: "rev-900", + outcome: "approved", + reviewer: { fullName: "Anonymous Reviewer", employeeId: "E-991" } + }, + signature: { algorithm: "none", keyId: "test", digest: "" } + } + ] +}; + +module.exports = { project }; diff --git a/webhook-payload-redaction-guard/test.js b/webhook-payload-redaction-guard/test.js new file mode 100644 index 00000000..a5acd4f8 --- /dev/null +++ b/webhook-payload-redaction-guard/test.js @@ -0,0 +1,75 @@ +const assert = require("assert"); +const { project } = require("./sample-data"); +const { buildReviewPacket, evaluateWebhookPayloads, renderMarkdownReport, renderSvgSummary } = require("./index"); + +const evaluation = evaluateWebhookPayloads(project); +const packet = buildReviewPacket(project); + +assert.strictEqual(packet.guard, "webhook-payload-redaction-guard"); +assert.strictEqual(packet.issue, "SCIBASE-AI/SCIBASE.AI#19"); +assert.strictEqual(packet.decision, "block-unsafe-webhook-delivery"); + +assert.ok( + evaluation.findings.some((finding) => finding.rule === "webhook-pii-field-present"), + "expected PII field finding" +); +assert.ok( + evaluation.findings.some((finding) => finding.rule === "webhook-private-project-field-present"), + "expected private field finding" +); +assert.ok( + evaluation.findings.some((finding) => finding.rule === "webhook-private-storage-link-present"), + "expected private storage link finding" +); +assert.ok( + evaluation.findings.some((finding) => finding.rule === "webhook-region-not-allowed"), + "expected region finding" +); +assert.ok( + evaluation.findings.some((finding) => finding.rule === "webhook-signature-algorithm-unsafe"), + "expected signature algorithm finding" +); + +const decisionByEvent = new Map(evaluation.eventDecisions.map((decision) => [decision.eventId, decision.decision])); +assert.strictEqual(decisionByEvent.get("evt-001"), "block-delivery"); +assert.strictEqual(decisionByEvent.get("evt-002"), "deliver"); +assert.strictEqual(decisionByEvent.get("evt-003"), "block-delivery"); + +const cleanProject = JSON.parse(JSON.stringify(project)); +cleanProject.outboundEvents = [ + { + eventId: "evt-clean", + eventType: "project.published", + occurredAt: "2026-05-22T18:25:00Z", + institutionId: "inst-northbridge", + destination: { connector: "DSpace", region: "US", purpose: "public-metadata" }, + project: { + id: "proj-202", + title: "Open Climate Notebook", + visibility: "public", + owner: { orcid: "0000-0003-3333-4444" } + }, + dataset: { + id: "data-open", + access: "public", + embargoUntil: null, + downloadUrl: "https://doi.org/10.5281/zenodo.20260523", + doi: "10.5281/zenodo.20260523" + }, + signature: { algorithm: "HMAC-SHA256", keyId: "enterprise-prod-2026", digest: "sha256:def" } + } +]; + +const cleanPacket = buildReviewPacket(cleanProject); +assert.strictEqual(cleanPacket.decision, "webhook-payload-ready"); +assert.strictEqual(cleanPacket.findings.length, 0); + +const markdown = renderMarkdownReport(packet); +assert.ok(markdown.includes("## Event Decisions")); +assert.ok(markdown.includes("webhook-pii-field-present")); + +const svg = renderSvgSummary(packet); +assert.ok(svg.includes("