use super::{
enforcer::{enforce_compiled_policy, enforce_pair_compiled_policies},
CompiledPolicies, CompiledPolicy,
};
use crate::symcc::{
factory,
term::{Term, TermPrim},
verifier::Asserts,
};
use std::sync::Arc;
pub fn verify_evaluate_opt(phi: impl FnOnce(&Term) -> Term, policy: &CompiledPolicy) -> Asserts {
match factory::not(phi(&policy.term)) {
Term::Prim(TermPrim::Bool(false)) => Arc::new(vec![false.into()]),
assert => Arc::new(
enforce_compiled_policy(policy)
.into_iter()
.chain(std::iter::once(assert))
.collect(),
),
}
}
pub fn verify_is_authorized_opt(
phi: impl FnOnce(&Term, &Term) -> Term,
policies1: &CompiledPolicies,
policies2: &CompiledPolicies,
) -> Asserts {
assert_eq!(&policies1.symenv, &policies2.symenv);
match factory::not(phi(&policies1.term, &policies2.term)) {
Term::Prim(TermPrim::Bool(false)) => Arc::new(vec![false.into()]),
assert => Arc::new(
enforce_pair_compiled_policies(policies1, policies2)
.into_iter()
.chain(std::iter::once(assert))
.collect(),
),
}
}
pub fn verify_never_errors_opt(policy: &CompiledPolicy) -> Asserts {
verify_evaluate_opt(|term| factory::is_some(term.clone()), policy)
}
pub fn verify_always_matches_opt(policy: &CompiledPolicy) -> Asserts {
verify_evaluate_opt(
|term| factory::eq(term.clone(), factory::some_of(true.into())),
policy,
)
}
pub fn verify_never_matches_opt(policy: &CompiledPolicy) -> Asserts {
verify_evaluate_opt(
|term| factory::not(factory::eq(term.clone(), factory::some_of(true.into()))),
policy,
)
}
pub fn verify_implies_opt(policies1: &CompiledPolicies, policies2: &CompiledPolicies) -> Asserts {
verify_is_authorized_opt(
|term1, term2| factory::implies(term1.clone(), term2.clone()),
policies1,
policies2,
)
}
pub fn verify_always_allows_opt(policies: &CompiledPolicies) -> Asserts {
verify_implies_opt(
&CompiledPolicies::allow_all(policies.symenv.clone()),
policies,
)
}
pub fn verify_always_denies_opt(policies: &CompiledPolicies) -> Asserts {
verify_implies_opt(
policies,
&CompiledPolicies::deny_all(policies.symenv.clone()),
)
}
pub fn verify_equivalent_opt(
policies1: &CompiledPolicies,
policies2: &CompiledPolicies,
) -> Asserts {
verify_is_authorized_opt(
|term1, term2| factory::eq(term1.clone(), term2.clone()),
policies1,
policies2,
)
}
pub fn verify_disjoint_opt(policies1: &CompiledPolicies, policies2: &CompiledPolicies) -> Asserts {
let disjoint = |t1: &Term, t2: &Term| factory::not(factory::and(t1.clone(), t2.clone()));
verify_is_authorized_opt(disjoint, policies1, policies2)
}