pub mod request_build;
pub mod request_parse;
pub mod response_build;
pub mod response_parse;
use crate::dsig::algorithms::PeerCryptoPolicy;
use crate::nameid::NameId;
use crate::xml::parse::QName;
use std::time::{Duration, SystemTime};
pub(crate) const SAMLP_NS: &str = "urn:oasis:names:tc:SAML:2.0:protocol";
pub(crate) const SAML_NS: &str = "urn:oasis:names:tc:SAML:2.0:assertion";
pub(crate) fn samlp_qname(local: &str) -> QName {
QName::new(Some(SAMLP_NS.to_owned()), local)
}
pub(crate) fn saml_qname(local: &str) -> QName {
QName::new(Some(SAML_NS.to_owned()), local)
}
pub struct ConsumeLogoutRequest<'a> {
pub peer_crypto_policy: Option<&'a PeerCryptoPolicy>,
pub body: &'a [u8],
pub binding: crate::binding::Binding,
pub detached_signature: Option<crate::idp::DetachedSignature<'a>>,
pub expected_destination: &'a str,
pub now: SystemTime,
pub clock_skew: Duration,
}
pub struct ConsumeLogoutResponse<'a> {
pub peer_crypto_policy: Option<&'a PeerCryptoPolicy>,
pub body: &'a [u8],
pub binding: crate::binding::Binding,
pub detached_signature: Option<crate::idp::DetachedSignature<'a>>,
pub tracker: &'a LogoutTracker,
pub expected_destination: &'a str,
pub now: SystemTime,
pub clock_skew: Duration,
}
pub struct StartLogout<'a> {
pub name_id: &'a NameId,
pub session_index: Option<&'a str>,
pub relay_state: Option<&'a str>,
pub reason: Option<&'a str>,
pub binding: crate::binding::Binding,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct LogoutTracker {
pub request_id: String,
pub issued_at: SystemTime,
pub peer_entity_id: String,
}
#[derive(Debug)]
pub struct LogoutDispatch {
pub tracker: LogoutTracker,
pub dispatch: crate::binding::Dispatch,
}
#[derive(Debug, Clone)]
pub struct ParsedLogoutRequest {
pub id: String,
pub issuer: String,
pub issue_instant: SystemTime,
pub destination: Option<String>,
pub not_on_or_after: Option<SystemTime>,
pub reason: Option<String>,
pub name_id: NameId,
pub session_index: Vec<String>,
pub relay_state: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LogoutStatus {
Success,
PartialLogout,
RequestDenied,
Requester,
Responder,
}
impl LogoutStatus {
pub fn uri(self) -> &'static str {
match self {
LogoutStatus::Success => "urn:oasis:names:tc:SAML:2.0:status:Success",
LogoutStatus::PartialLogout => "urn:oasis:names:tc:SAML:2.0:status:PartialLogout",
LogoutStatus::RequestDenied => "urn:oasis:names:tc:SAML:2.0:status:RequestDenied",
LogoutStatus::Requester => "urn:oasis:names:tc:SAML:2.0:status:Requester",
LogoutStatus::Responder => "urn:oasis:names:tc:SAML:2.0:status:Responder",
}
}
pub(crate) fn top_level_uri(self) -> &'static str {
match self {
LogoutStatus::Success => "urn:oasis:names:tc:SAML:2.0:status:Success",
LogoutStatus::PartialLogout | LogoutStatus::Responder => {
"urn:oasis:names:tc:SAML:2.0:status:Responder"
}
LogoutStatus::RequestDenied | LogoutStatus::Requester => {
"urn:oasis:names:tc:SAML:2.0:status:Requester"
}
}
}
pub(crate) fn second_level_uri(self) -> Option<&'static str> {
match self {
LogoutStatus::PartialLogout => Some("urn:oasis:names:tc:SAML:2.0:status:PartialLogout"),
LogoutStatus::RequestDenied => Some("urn:oasis:names:tc:SAML:2.0:status:RequestDenied"),
LogoutStatus::Success | LogoutStatus::Requester | LogoutStatus::Responder => None,
}
}
}
#[derive(Debug, Clone)]
pub enum LogoutOutcome {
Success,
PartialLogout {
message: Option<String>,
},
Failure {
status: String,
message: Option<String>,
},
}