use super::*;
#[test]
fn a_deny_hidden_past_a_classifier_limit_asks() {
let p = Policy::parse(crate::DEFAULT_POLICY).unwrap();
let operands = (0..crate::shell::MAX_ATOMS + 10)
.map(|i| format!("f{i}"))
.collect::<Vec<_>>()
.join(" ");
for line in [
format!("cat {operands}; cat ~/.ssh/id_rsa"),
format!(
"cat ~/.ssh/id_rsa # {}",
"x".repeat(crate::lexer::MAX_COMMAND_BYTES)
),
] {
let d = evaluate(&p, &ctx(), &shell(&line)).unwrap();
assert!(
matches!(d.verdict, Verdict::Ask | Verdict::Deny),
"{:?} {:?}",
d.verdict,
d.rules
);
}
}
#[test]
fn unparseable_is_never_allowed() {
let p = policy("version: 1\ndefaults: allow\n");
let d = evaluate(&p, &ctx(), &shell("echo 'unterminated")).unwrap();
assert_eq!(d.verdict, Verdict::Ask);
assert_eq!(d.rules, ["unparseable"]);
let d = evaluate(
&p,
&ctx(),
&Action::Net {
url: "https://".into(),
},
)
.unwrap();
assert_eq!(d.verdict, Verdict::Defer);
let powershell = Action::ForeignShell {
shell: "PowerShell".into(),
command: "Get-ChildItem".into(),
};
let d = evaluate(&p, &ctx(), &powershell).unwrap();
assert_eq!(
(d.verdict, d.rules),
(Verdict::Defer, vec!["unparseable".to_owned()])
);
let p = policy("version: 1\ndefaults: ask\n");
let d = evaluate(&p, &ctx(), &shell("echo 'unterminated")).unwrap();
assert_eq!(d.verdict, Verdict::Ask);
}