use serde::{Deserialize, Serialize};
use crate::wac::conditions::{ConditionOutcome, RequestContext};
use crate::wac::document::{get_ids, IdOrIds};
use crate::wac::evaluator::GroupMembership;
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct IssuerConditionBody {
#[serde(rename = "acl:issuer", default, skip_serializing_if = "Option::is_none")]
pub issuer: Option<IdOrIds>,
#[serde(
rename = "acl:issuerGroup",
default,
skip_serializing_if = "Option::is_none"
)]
pub issuer_group: Option<IdOrIds>,
#[serde(
rename = "acl:issuerClass",
default,
skip_serializing_if = "Option::is_none"
)]
pub issuer_class: Option<IdOrIds>,
}
#[derive(Debug, Default, Clone, Copy)]
pub struct IssuerConditionEvaluator;
impl IssuerConditionEvaluator {
pub fn evaluate(
&self,
body: &IssuerConditionBody,
ctx: &RequestContext<'_>,
groups: &dyn GroupMembership,
) -> ConditionOutcome {
for cls in get_ids(&body.issuer_class) {
if cls == "foaf:Agent" || cls == "http://xmlns.com/foaf/0.1/Agent" {
return ConditionOutcome::Satisfied;
}
}
let Some(iss) = ctx.issuer else {
return ConditionOutcome::Denied;
};
for i in get_ids(&body.issuer) {
if i == iss {
return ConditionOutcome::Satisfied;
}
}
for g in get_ids(&body.issuer_group) {
if groups.is_member(g, iss) {
return ConditionOutcome::Satisfied;
}
}
ConditionOutcome::Denied
}
}