use agent_bridle::{AttestRequirement, CallRequest, Rule, StepUpPolicy};
pub use agent_bridle::Presence;
#[must_use]
pub fn crew_step_up_policy() -> StepUpPolicy {
StepUpPolicy::new(
vec![
Rule {
selector: "compose_roster".to_string(),
requirement: AttestRequirement::NONE,
},
Rule {
selector: "crew".to_string(),
requirement: AttestRequirement::presence(Presence::Prompt),
},
Rule {
selector: "team".to_string(),
requirement: AttestRequirement::presence(Presence::Prompt),
},
],
AttestRequirement::presence(Presence::Prompt),
)
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CrewAuthz {
Allow,
NeedsAttest(Presence),
}
#[must_use]
pub fn crew_authz(
policy: &StepUpPolicy,
op: &str,
resource: &str,
established: Presence,
) -> CrewAuthz {
let req = policy.required_for(&CallRequest::new(op, serde_json::Value::Null, resource));
if req.demands_gesture() && established < req.presence {
CrewAuthz::NeedsAttest(req.presence)
} else {
CrewAuthz::Allow
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn compose_roster_never_needs_a_gesture() {
let p = crew_step_up_policy();
assert_eq!(
crew_authz(&p, "compose_roster", "", Presence::None),
CrewAuthz::Allow
);
}
#[test]
fn crew_dispatch_needs_at_least_prompt() {
let p = crew_step_up_policy();
assert_eq!(
crew_authz(&p, "crew", "add a flag", Presence::None),
CrewAuthz::NeedsAttest(Presence::Prompt)
);
assert_eq!(
crew_authz(&p, "crew", "add a flag", Presence::Prompt),
CrewAuthz::Allow
);
assert_eq!(
crew_authz(&p, "crew", "add a flag", Presence::Passkey),
CrewAuthz::Allow
);
}
#[test]
fn team_and_unknown_ops_default_to_attest() {
let p = crew_step_up_policy();
assert_eq!(
crew_authz(&p, "team", "build X", Presence::None),
CrewAuthz::NeedsAttest(Presence::Prompt)
);
assert_eq!(
crew_authz(&p, "mystery_op", "", Presence::None),
CrewAuthz::NeedsAttest(Presence::Prompt)
);
}
#[test]
fn a_passkey_required_action_is_not_satisfied_by_prompt() {
let p = StepUpPolicy::new(
vec![Rule {
selector: "crew:secrets/*".to_string(),
requirement: AttestRequirement::presence(Presence::Passkey),
}],
AttestRequirement::NONE,
);
assert_eq!(
crew_authz(&p, "crew", "secrets/rotate", Presence::Prompt),
CrewAuthz::NeedsAttest(Presence::Passkey)
);
assert_eq!(
crew_authz(&p, "crew", "secrets/rotate", Presence::Passkey),
CrewAuthz::Allow
);
}
}