rocketmq_auth/
layered_authorization.rs1use rocketmq_security_api::DetailedDecision;
18use rocketmq_security_api::LayerFailureKind;
19
20use crate::authorization::enums::decision::Decision as PolicyDecision;
21use crate::AuthFailureKind;
22use crate::AuthServiceError;
23
24#[must_use]
29pub const fn project_policy_decision(decision: PolicyDecision) -> DetailedDecision {
30 match decision {
31 PolicyDecision::Allow => DetailedDecision::Allow,
32 PolicyDecision::Deny => DetailedDecision::Deny,
33 }
34}
35
36#[must_use]
42pub fn project_authorization_error(error: &AuthServiceError) -> LayerFailureKind {
43 match error.kind() {
44 AuthFailureKind::Timeout => LayerFailureKind::Timeout,
45 AuthFailureKind::InvalidConfiguration | AuthFailureKind::Unavailable => LayerFailureKind::Unavailable,
46 _ => LayerFailureKind::Error,
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53 use crate::AuthOperation;
54
55 #[test]
56 fn policy_decisions_remain_binary() {
57 assert_eq!(project_policy_decision(PolicyDecision::Allow), DetailedDecision::Allow);
58 assert_eq!(project_policy_decision(PolicyDecision::Deny), DetailedDecision::Deny);
59 }
60
61 #[test]
62 fn unavailable_and_operational_errors_never_abstain() {
63 assert_eq!(
64 project_authorization_error(&AuthServiceError::new(
65 AuthOperation::Initialize,
66 AuthFailureKind::Unavailable,
67 )),
68 LayerFailureKind::Unavailable
69 );
70 assert_eq!(
71 project_authorization_error(&AuthServiceError::new(
72 AuthOperation::Authorize,
73 AuthFailureKind::Internal,
74 )),
75 LayerFailureKind::Error
76 );
77 }
78
79 #[test]
80 fn service_errors_keep_timeout_unavailable_and_error_distinct() {
81 assert_eq!(
82 project_authorization_error(&AuthServiceError::new(
83 AuthOperation::WriteMetadata,
84 AuthFailureKind::Timeout,
85 )),
86 LayerFailureKind::Timeout
87 );
88 assert_eq!(
89 project_authorization_error(&AuthServiceError::new(
90 AuthOperation::ReadMetadata,
91 AuthFailureKind::Unavailable,
92 )),
93 LayerFailureKind::Unavailable
94 );
95 assert_eq!(
96 project_authorization_error(&AuthServiceError::new(
97 AuthOperation::Authorize,
98 AuthFailureKind::Internal,
99 )),
100 LayerFailureKind::Error
101 );
102 }
103}