use super::*;
use newt_core::caveats::{Caveats, Scope};
use newt_core::ocap_store::{
build_store, verify_approves, Ed25519ApproveVerifier, PolicyFile, Verdict,
};
fn verified_fs_read_policy(path: &str) -> newt_core::ocap_store::PolicySet {
let key = agent_mesh_protocol::UserKey::generate();
let mut file = PolicyFile::parse(&format!("[[fs]]\npath = \"{path}\"\n")).unwrap();
let (signed, refused) = newt_core::ocap_store::sign_approves(
&mut file,
|_, _| false,
|payload| key.sign(payload).to_bytes(),
);
assert_eq!(signed, 1);
assert!(refused.is_empty());
let (set, warnings) = build_store(&[(Verdict::Approve, Some(file.to_toml().unwrap()))]);
assert!(warnings.is_empty(), "{warnings:?}");
let verifier = Ed25519ApproveVerifier {
verifying_key: key.public().as_bytes(),
};
let (set, warnings) = verify_approves(set, Some(&verifier));
assert!(warnings.is_empty(), "{warnings:?}");
set
}
fn fenced_base(workspace: &str) -> Caveats {
Caveats {
fs_read: Scope::only([workspace.to_string()]),
fs_write: Scope::only([workspace.to_string()]),
..Caveats::top()
}
}
#[test]
fn ocap_approval_does_not_reach_caveats_before_folding() {
let mut state = PermissionPromptState {
ocap_policy: verified_fs_read_policy("/outside/token"),
..Default::default()
};
let base = fenced_base("/ws");
let caveats = state.recalled_caveats(&base, None).unwrap();
assert!(
!newt_core::caveats::permits_path(&caveats.fs_read, "/outside/token"),
"an ocap_policy that is never folded must not widen recall"
);
state.fold_ocap_approvals();
assert!(newt_core::caveats::permits_path(
&state.recalled_caveats(&base, None).unwrap().fs_read,
"/outside/token"
));
}
#[test]
fn fold_ocap_approvals_widens_recalled_caveats_like_a_durable_grant() {
let mut state = PermissionPromptState {
ocap_policy: verified_fs_read_policy("/outside/token"),
..Default::default()
};
state.fold_ocap_approvals();
let base = fenced_base("/ws");
let widened = state.recalled_caveats(&base, None).unwrap();
assert!(newt_core::caveats::permits_path(
&widened.fs_read,
"/outside/token"
));
assert!(!newt_core::caveats::permits_path(
&widened.fs_write,
"/outside/token"
));
let ceiling = fenced_base("/ws");
let capped = state.recalled_caveats(&base, Some(&ceiling)).unwrap();
assert!(!newt_core::caveats::permits_path(
&capped.fs_read,
"/outside/token"
));
}
#[test]
fn folding_never_resurrects_an_unverified_approve() {
let file = PolicyFile::parse("[[fs]]\npath = \"/outside/token\"\n").unwrap();
let (set, _) = build_store(&[(Verdict::Approve, Some(file.to_toml().unwrap()))]);
let (set, warnings) = verify_approves(set, None);
assert!(!warnings.is_empty(), "an unsigned approve must warn loudly");
let mut state = PermissionPromptState {
ocap_policy: set,
..Default::default()
};
state.fold_ocap_approvals();
let widened = state.recalled_caveats(&fenced_base("/ws"), None).unwrap();
assert!(!newt_core::caveats::permits_path(
&widened.fs_read,
"/outside/token"
));
}