Add protected interaction evidence and measured debugging phases

This commit is contained in:
Karl committed 2026-10-13 18:04:02 +02:00
1 parent ea448de2d4
commit 244f01630b
42 files changed
+640 -87

No files matched your search

+20 -1
View File
@@ -19,4 +19,23 @@ function buildDownloadEvidence({url,name,mime,facts,decision,ruleId},policy){
if(typeof ruleId==='string'&&ruleId.length<=100&&!/[\x00-\x1f\x7f]/.test(ruleId))result.ruleId=ruleId;
return validateDownloadEvidence(result)?result:null;
}
module.exports={buildDownloadEvidence,validateDownloadEvidence};
const {InteractionEvidenceSchema}=require('../../packages/core/evidence-payload.cjs');
function validateInteractionEvidence(value){
if(!InteractionEvidenceSchema.safeParse(value).success)return false;
try{const u=new URL(value.pageUrl);return !credentialPatterns.some(p=>p.test(value.pageUrl)||p.test(decodeURIComponent(u.pathname)));}catch{return false;}
}
function buildInteractionEvidence({action,sessionId,url,target,sensitiveField,outcome,bytes,captureSource},policy){
if(policy?.evidence?.enabled!==true||policy.evidence.captureInteractions!==true||sensitiveField!==false||outcome!=='completed')return null;
let page;try{page=new URL(url);if(!['http:','https:'].includes(page.protocol))return null;}catch{return null;}
if(target!==undefined){
if(!target||typeof target!=='object'||Array.isArray(target)||Object.keys(target).some(key=>!['tag','role','x','y'].includes(key))||typeof target.tag!=='string')return null;
// Native adapters expose bounded lowercase tags. Preserve their meaning in
// the canonical evidence representation without accepting arbitrary DOM text.
target={...target,tag:target.tag.toUpperCase()};
}
// Paths can carry identifiers or credentials. Automatic metadata uses origin
// only; detailed evidence remains an explicitly governed separate workflow.
const payload={pageUrl:page.origin+'/',action,sessionId,outcome:'completed',sensitiveField:false,captureSource,...(target===undefined?{}:{target}),...(bytes===undefined?{}:{bytes})};
return validateInteractionEvidence(payload)?structuredClone(payload):null;
}
module.exports={buildDownloadEvidence,validateDownloadEvidence,buildInteractionEvidence,validateInteractionEvidence};