Files
MikrotikManager/backend/src/services/server-probe-retired-source.fixture.ts
T

51 lines
4.8 KiB
TypeScript

import { randomUUID } from "node:crypto"
import { encryptSecret,fingerprint,privateSecretFingerprint,redact } from "../modules/mcp/security.js"
import { serverProbeReceiptMetadata } from "../modules/mcp/server-probe-actions.js"
import type { ServerProbeReceipt } from "./server-probe-execution.js"
import type { ServerProbeHistoryBinding } from "./server-probe-journal-history.js"
export async function serverProbeRetiredFixture(twoSides=false, identity?:{connectionId:string;credentialId:string;ownerId:string},
historical={base:Date.parse("2025-01-02T00:00:00Z"),retentionDays:365}){
const operationId=randomUUID(),receiptId=randomUUID(),connectionId=identity?.connectionId??randomUUID(),credentialId=identity?.credentialId??randomUUID(),ownerId=identity?.ownerId??randomUUID()
const {base,retentionDays}=historical,stamp=(ms:number)=>new Date(base+ms).toISOString()
const originalTimes={issuedAt:base,authorityExpiresAt:base+15000}
const tool=twoSides?"bandwidth":"ping",sourceServerId=9,destination=twoSides?{destinationServerId:11}:{}
const prepared={receiptId,tool,serverId:sourceServerId,...destination,expiresAt:stamp(15000),bindingCiphertext:"inert-private-inner-binding"}
const binding={version:1,operation:"servers.probes.run",principal:{connectionId,credentialId,credentialExpiresAt:stamp(30000)},
ownerId,...originalTimes,prepared,bindingProof:"a".repeat(64),stageBudget:twoSides?1:2}
const proof=(domain:string,value:unknown)=>privateSecretFingerprint(fingerprint(value),domain)
const input={serverId:sourceServerId,receiptId,inputDigest:await proof("server-probe-mcp-binding-v1",binding),
bindingCiphertext:await encryptSecret(JSON.stringify(binding))}
const step={kind:"service",service:binding.operation,input}
const serverIds=twoSides?[9,11]:[9]
const evidence={steps:[step],requiresHuman:true,verificationScope:"acknowledgement",mutationCost:binding.stageBudget,
target:{scope:"servers",serverIds},validUntil:prepared.expiresAt}
const context:ServerProbeHistoryBinding["context"]={identity:{kind:"mcp",operationName:"servers.probes.run",ownerId,
connectionId,credentialId,executionId:operationId,issuedAt:base,expiresAt:base+15000},sourceServerId,...destination,tool}
const receipt:ServerProbeReceipt={receiptId,serverId:sourceServerId,...destination,tool,state:"completed",httpStatus:200,
attemptedStages:1,completedStages:1,output:"INERT_RESULT_ONLY_IN_ORIGINAL_PAYLOAD",data:{kind:tool},automaticReplay:false,forwardingVerified:false}
const metadata=serverProbeReceiptMetadata(receipt,operationId,binding.stageBudget)
const plaintext=JSON.stringify({version:1,context,bindingProof:binding.bindingProof,receipt})
const payload={receipt_id:receiptId,receipt_proof:await proof("server-probe-journal-v1:receipt",plaintext),receipt_ciphertext:await encryptSecret(plaintext)}
const anchor={receipt_id:receiptId,binding_proof:binding.bindingProof,identity_kind:"mcp",execution_id:operationId,
actor_id:ownerId,authentication:"mcp",mcp_connection_id:connectionId,mcp_credential_id:credentialId,request_id:null,
authority_issued_at:String(base),authority_expires_at:stamp(15000),source_server_id:sourceServerId,
destination_server_id:destination.destinationServerId??null,tool,state:"completed",receipt_proof:payload.receipt_proof,
attempted_stages:1,completed_stages:1,created_at:stamp(500),finished_at:stamp(1000)}
const raw={
original:{operation_id:operationId,connection_id:connectionId,owner_id:ownerId,plan_id:randomUUID(),
operation_name:binding.operation,operation_version:1,operation_state:"applied",operation_verification:"inconclusive",operation_error_code:null,
operation_result:{confirmedWrites:0,verificationScope:"acknowledgement",completedServiceSteps:1,diagnosticReceipt:metadata},
plan_state:"completed",approved_by:ownerId,evidence:{sealed:await encryptSecret(JSON.stringify(evidence))},
step_index:0,step_state:"acknowledged",intended_state:redact(step),step_result:metadata,
operation_created_at:stamp(100),operation_finished_at:stamp(1500),plan_created_at:stamp(10),plan_approved_at:stamp(50),
plan_expires_at:stamp(16000),step_created_at:stamp(200),step_finished_at:stamp(1400)},
admission:{receipt_id:receiptId,owner_id:ownerId,identity_kind:"mcp",execution_id:operationId,binding_proof:binding.bindingProof,
authority_expires_at:stamp(15000),claim_token:null,claim_attempted_at:stamp(400),purged_at:null,cancelled_at:null,created_at:stamp(300),
retention_days:retentionDays,safety_ms:60000,gc_not_before:stamp(15000+retentionDays*86400000+60000)},
anchor,payload,stages:[{receipt_id:receiptId,stage_index:1,kind:twoSides?"native-bandwidth":"native-ping",timeout_ms:1000,
state:"received",outcome:"received",created_at:stamp(600),received_at:stamp(900)}],quarantineCount:0,cancellationCount:0,
}
return {raw,context,receipt,serverIds,stamp}
}