use crate::auth_lys::session::LysSession;
use crate::auth_lys::{
AccessAction, AccessDecisionError, AccessResource, DeliberateDecision, GrantReceipt, HotAction,
RefusalCause, SubjectBinding,
};
use crate::link::LinkAction;
pub const OPEN_KIND: &str = "open";
pub const OPEN_GRANT: &str = "open";
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OpenSession {
name: String,
}
impl OpenSession {
#[must_use]
pub const fn new(name: String) -> Self {
Self { name }
}
fn unavailable(resource: &AccessResource, action: AccessAction) -> AccessDecisionError {
super::binding::refusal(resource, action, "", RefusalCause::DeliberateUnavailable)
}
}
impl LysSession for OpenSession {
fn holder(&self) -> &str {
&self.name
}
fn holder_kind(&self) -> Option<&str> {
Some(OPEN_KIND)
}
fn decide(
&self,
_subject: &SubjectBinding,
_action: HotAction,
_now: u64,
) -> Result<GrantReceipt, AccessDecisionError> {
Ok(GrantReceipt {
grant: OPEN_GRANT.to_owned(),
})
}
fn decide_link(
&self,
subject: &SubjectBinding,
action: LinkAction,
_now: u64,
) -> Result<GrantReceipt, AccessDecisionError> {
Err(Self::unavailable(
subject.resource(),
action.access_action(),
))
}
fn open_link(
&self,
link: &AccessResource,
end: LinkAction,
_now: u64,
) -> Result<DeliberateDecision, AccessDecisionError> {
Err(Self::unavailable(link, end.access_action()))
}
fn decide_live(
&self,
resource: &AccessResource,
action: AccessAction,
_now: u64,
) -> Result<DeliberateDecision, AccessDecisionError> {
Err(Self::unavailable(resource, action))
}
}