stage='ordinary fill remains DLP blocked';awaitreset();assert.equal((awaitcall(a,'vault:fill',{sessionId,credentialRef:awaitinventory()})).exit,0);awaitsubmit();assert.equal((awaitstats()).submitted,0);
stage='agent prepare does not submit';awaitreset();letref=awaitprepare();assert.equal((awaitstats()).submitted,0);assert.equal((awaitcall(a,'vault:prepare-submit',{sessionId,credentialRef:ref})).exit,1);assert.equal((awaitcall(b,'vault:prepare-submit',{sessionId,credentialRef:awaitinventory()})).exit,1);awaitsubmit();awaituntil(()=>!page.isLoading()&&page.getURL()===origin+'/signin');assert.equal((awaitstats()).submitted,1);
stage='controlled307 body blocked';awaitreset('307');awaitprepare();awaitsubmit();assert.equal((awaitstats()).submitted,3);assert.equal((awaitstats()).replayed,0);stage='slow200 completes after lease expiry';awaitreset('slow');awaitprepare();awaitsubmit();awaituntil(()=>!page.isLoading()&&page.getURL()===origin+'/signin');assert.equal((awaitstats()).submitted,4);
stage='audit and actual traces';constevents=[];letafter=0;for(letbatch=0;batch<20;batch++){constresponse=awaitfetch(base+`/api/admin/events/export?after=${after}&limit=1000&format=ecs`,{headers});assert.equal(response.status,200);constrows=(awaitresponse.text()).trim().split('\n').filter(Boolean).map(line=>JSON.parse(line));for(constrowofrows){for(constsentinelof[master,password,username,alternatePassword])assert.ok(!JSON.stringify(row).includes(sentinel));events.push({kind:row.event.action,metadata:{traceId:row.trace?.id,ruleId:row.rule?.id}});}constnext=Number(response.headers.get('x-safetynet-next-cursor'));if(rows.length<1000)break;assert.ok(next>after);after=next;}assert.ok(events.some(e=>e.kind==='dlp.block'&&e.metadata.ruleId==='controlled-residual-yara'));for(consteofevents)for(constsentinelof[master,password,username,alternatePassword])assert.ok(!JSON.stringify(e).includes(sentinel));awaitwait(1500);constcompleted=events.find(e=>e.kind==='vault.submission-completed'&&e.metadata.traceId);assert.ok(completed);consttrace=await(awaitfetch('http://127.0.0.1:4318/api/trace/'+completed.metadata.traceId)).json(),required=['credential.claim','credential.parse','credential.match','credential.residual','credential.headers','credential.header-values','credential.authorize','credential.complete'];for(constoperationofrequired)assert.ok(trace.spans.some(s=>s.name==='browser.credential'&&s.operation===operation),operation);constbyId=newMap(trace.spans.map(s=>[s.spanId,s]));for(constoperationofrequired){letspan=trace.spans.find(s=>s.name==='browser.credential'&&s.operation===operation),found=false;constseen=newSet();while(span&&!seen.has(span.spanId)){if(span.name==='browser.request'){found=true;break;}seen.add(span.spanId);span=byId.get(span.parentSpanId);}assert.ok(found,'Missing request ancestor: '+operation);}assert.ok(trace.spans.some(s=>s.name==='browser.inspect.local'));assert.ok(trace.spans.some(s=>s.name==='browser.inspect.enterprise'));for(constoperationof['audit.serialize','audit.encrypt','audit.write','audit.fsync','audit.commit'])assert.ok(trace.spans.some(s=>s.name==='browser.security'&&s.operation===operation));for(constsentinelof[master,password,username,alternatePassword])assert.ok(!JSON.stringify(trace).includes(sentinel));constproofs=[{traceId:completed.metadata.traceId,commonLifecycleTrace:true,stages:trace.spans.map(({name,operation,spanId,parentSpanId,durationMs})=>({name,operation,spanId,parentSpanId,durationMs}))}];constterminal=events.filter(e=>e.kind==='vault.submission-completed');assert.ok(terminal.length>=3);constreceiver=awaitstats(),receiverFacts={totalPosts:receiver.totalPosts,credentialPosts:receiver.submitted,publicPosts:receiver.publicPosts,replayedPosts:receiver.replayed,credentialUrlLeaks:receiver.credentialUrlLeaks,credentialHeaderLeaks:receiver.credentialHeaderLeaks};assert.equal(receiverFacts.totalPosts,4);assert.equal(receiverFacts.publicPosts,0);constscannerFacts=receiver.icap;assert.equal(scannerFacts.credentialObserved,false);consthealth=await(awaitfetch('http://127.0.0.1:4318/health')).json();assert.equal(health.rejectedWrites,0);constsummary=await(awaitfetch('http://127.0.0.1:4318/api/summary')).json();fs.writeFileSync(path.resolve('artifacts/controlled-login-native-proof.json'),JSON.stringify({actualElectron:true,exactPinnedSyntheticHTTPS:true,ordinaryFillDLPBlocked:true,agentPrepareNeverSubmits:true,approvedPOST200:true,approvedPOST302SafeGET:true,redirect307BodyBlocked:true,residualBlocked:true,duplicatePasswordBlocked:true,changedActionBlocked:true,nativeCredentialHeaderBlocked:true,unregisteredCredentialUrlBlocked:true,unregisteredSplitHeadersBlocked:true,centralPrepareControlHidden:true,vaultLockInvalidates:true,foregroundSwapInvalidates:true,centralDisableInvalidates:true,targetRevokeInvalidates:true,referenceReplayDenied:true,humanUIFieldsCleared:true,handoffDoesNotLock:true,ordinaryAuditSecretFree:true,localYaraResidualBlocked:true,icapResidualBlocked:true,icapCredentialFree:true,slowTerminalAfterExpiry:true,receiverFacts,s
}catch(error){fs.writeFileSync(path.resolve('artifacts/controlled-login-native-error.json'),JSON.stringify({stage,name:error.name,message:error.message,operation:error.operation,reason:error.reason,headerFacts},null,2));console.error('Controlled login native failed at '+stage+': '+error.name);for(constpofpages)if(!p.isDestroyed())require('../apps/browser/page-clipboard-guard.cjs').disposePageClipboardGuard(p);app.exit(1);}});