use rocketmq_security_api::DetailedDecision;
use rocketmq_security_api::LayerFailureKind;
use crate::authorization::enums::decision::Decision as PolicyDecision;
use crate::AuthFailureKind;
use crate::AuthServiceError;
#[must_use]
pub const fn project_policy_decision(decision: PolicyDecision) -> DetailedDecision {
match decision {
PolicyDecision::Allow => DetailedDecision::Allow,
PolicyDecision::Deny => DetailedDecision::Deny,
}
}
#[must_use]
pub fn project_authorization_error(error: &AuthServiceError) -> LayerFailureKind {
match error.kind() {
AuthFailureKind::Timeout => LayerFailureKind::Timeout,
AuthFailureKind::InvalidConfiguration | AuthFailureKind::Unavailable => LayerFailureKind::Unavailable,
_ => LayerFailureKind::Error,
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::AuthOperation;
#[test]
fn policy_decisions_remain_binary() {
assert_eq!(project_policy_decision(PolicyDecision::Allow), DetailedDecision::Allow);
assert_eq!(project_policy_decision(PolicyDecision::Deny), DetailedDecision::Deny);
}
#[test]
fn unavailable_and_operational_errors_never_abstain() {
assert_eq!(
project_authorization_error(&AuthServiceError::new(
AuthOperation::Initialize,
AuthFailureKind::Unavailable,
)),
LayerFailureKind::Unavailable
);
assert_eq!(
project_authorization_error(&AuthServiceError::new(
AuthOperation::Authorize,
AuthFailureKind::Internal,
)),
LayerFailureKind::Error
);
}
#[test]
fn service_errors_keep_timeout_unavailable_and_error_distinct() {
assert_eq!(
project_authorization_error(&AuthServiceError::new(
AuthOperation::WriteMetadata,
AuthFailureKind::Timeout,
)),
LayerFailureKind::Timeout
);
assert_eq!(
project_authorization_error(&AuthServiceError::new(
AuthOperation::ReadMetadata,
AuthFailureKind::Unavailable,
)),
LayerFailureKind::Unavailable
);
assert_eq!(
project_authorization_error(&AuthServiceError::new(
AuthOperation::Authorize,
AuthFailureKind::Internal,
)),
LayerFailureKind::Error
);
}
}