use capsec::prelude::*;
#[capsec::main]
fn main(root: CapRoot) -> Result<(), Box<dyn std::error::Error>> {
let (dual_cap, approver_a, approver_b) = DualKeyCap::new(root.fs_write());
println!("=== Dual-Key Authorization ===");
match dual_cap.try_cap() {
Ok(_) => println!("[pre] This should not happen"),
Err(e) => println!("[pre] No approvals yet: {e}"),
}
approver_a.approve();
println!("\n[approve] Approver A approved (manager)");
println!(
"[status] A approved: {}, B approved: {}",
approver_a.is_approved(),
approver_b.is_approved()
);
match dual_cap.try_cap() {
Ok(_) => println!("[partial] This should not happen"),
Err(e) => println!("[partial] Only one approval: {e}"),
}
approver_b.approve();
println!("\n[approve] Approver B approved (security officer)");
println!(
"[status] A approved: {}, B approved: {}",
approver_a.is_approved(),
approver_b.is_approved()
);
let cap = dual_cap.try_cap()?;
println!("\n[granted] Dual-key authorization complete!");
let path = std::env::temp_dir().join("capsec-dual-auth-demo.txt");
capsec::fs::write(&path, "authorized write", &cap)?;
println!("[write] Wrote to {}", path.display());
std::fs::remove_file(&path).ok();
println!("\n=== Demo Complete ===");
println!("Both authorities approved before write access was granted.");
Ok(())
}