Add protected interaction evidence and measured debugging phases
This commit is contained in:
1 parent
ea448de2d4
commit
244f01630b
42 files changed
+640
-87
No files matched your search
@@ -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};
|
||||
Reference in new issue
Block a user