2026-10-13 10:33:31 +02:00
// Finite, isolated administrator workflow proof using actual UI and HTTP routes.
import assert from 'node:assert/strict' ;
import { createRequire } from 'node:module' ;
import { mkdtempSync , mkdirSync , rmSync , writeFileSync } from 'node:fs' ;
import { tmpdir } from 'node:os' ;
import { join , resolve , sep , basename } from 'node:path' ;
import { spawn } from 'node:child_process' ;
import { randomBytes } from 'node:crypto' ;
import { digest } from '../apps/server/store.mjs' ;
import { openStore } from '../apps/server/store.mjs' ;
import { createApp } from '../apps/server/app.mjs' ;
const require = createRequire ( import . meta . url ), directory = mkdtempSync ( join ( tmpdir (), 'safetynet-incident-admin-smoke-' ));
let store , server , child ;
try {
store = openStore ( join ( directory , 'management' )); const adminToken = randomBytes ( 32 ). toString ( 'base64url' ), config = { adminToken , publicUrl : 'http://127.0.0.1' , secure : false };
store . event ( 'synthetic-device' , 'dlp.blocked' ,{ decision : 'block' , ruleId : 'synthetic-rule' , policyVersion : 1 , prompt : 'NEVER_SHOW_DOCUMENT_CONTENT' });
const auditorToken = randomBytes ( 32 ). toString ( 'base64url' ); store . db . prepare ( 'INSERT INTO sessions VALUES(?,?,?)' ). run ( digest ( auditorToken ), Date . now () + 60000 , JSON . stringify ({ sub : 'incident-auditor' , role : 'auditor' }));
server = createApp ( store , config ). listen ( 0 , '127.0.0.1' ); await new Promise ( r => server . once ( 'listening' , r )); config . publicUrl = `http://127.0.0.1: ${ server . address (). port } ` ;
const env = {... process . env , SAFETYNET_ADMIN_SMOKE_PROFILE : join ( directory , 'browser' ), SAFETYNET_ADMIN_SMOKE_URL : config . publicUrl , SAFETYNET_ADMIN_SMOKE_TOKEN : adminToken , SAFETYNET_INCIDENT_AUDITOR_TOKEN : auditorToken }; delete env . ELECTRON_RUN_AS_NODE ;
child = spawn ( require ( 'electron' ),[ 'scripts/incident-admin-smoke.cjs' ],{ env , windowsHide : true , stdio : [ 'ignore' , 'pipe' , 'pipe' ]}); child . stdout . on ( 'data' , data =>{ if ( String ( data ). includes ( 'INCIDENT_ADMIN_PROOF_OK' )) console . log ( 'Incident administrator interface workflow passed.' );}); child . stderr . on ( 'data' , data =>{ if ( String ( data ). includes ( 'INCIDENT_ADMIN_PROOF_' )) console . error ( String ( data ). trim ());});
const timer = setTimeout (()=> child . kill (), 60000 ), code = await new Promise ( r =>{ child . once ( 'exit' , code => r ( code ?? 1 )); child . once ( 'error' ,()=> r ( 1 ));}); clearTimeout ( timer ); assert . equal ( code , 0 , 'Incident administrator interface proof failed' );
const row = store . db . prepare ( 'SELECT * FROM incident_cases' ). get (); assert . equal ( row . revision , 3 ); assert . equal ( row . status , 'resolved' ); assert . equal ( row . assignee , 'Synthetic SOC' );
const report = { actualAdministratorUi : true , createFromSecurityEvent : true , statusSeverityAssignment : true , revisionConflictPreservesEdits : true , historyShown : true , adversarialNotesRenderedAsText : true , filters : true , auditorReadOnly : true , rawContentExcluded : true , noNode : true , cspPreserved : true }; mkdirSync ( 'artifacts' ,{ recursive : true }); writeFileSync ( 'artifacts/incident-admin-proof.json' , JSON . stringify ( report , null , 2 )); console . log ( JSON . stringify ( report ));
} finally {
2026-10-13 23:19:22 +02:00
// eslint-disable-next-line no-unsafe-finally -- Cleanup failure must fail closed rather than report successful protected cleanup.
2026-10-13 10:33:31 +02:00
child ? . kill (); if ( server ) await new Promise ( r =>{ server . closeAllConnections ? .(); server . close ( r );}); store ? . db . close (); const target = resolve ( directory ); if ( ! target . startsWith ( resolve ( tmpdir ()) + sep ) ||! basename ( target ). startsWith ( 'safetynet-incident-admin-smoke-' )) throw Error ( 'Unsafe proof cleanup' ); rmSync ( target ,{ recursive : true , force : true , maxRetries : 10 , retryDelay : 100 });
}