use thiserror::Error;
#[derive(Error, Debug, Clone, PartialEq)]
pub enum AntiSSRFError {
#[error("IP address disallowed by policy")]
IPDisallowed,
#[error("Request scheme disallowed by policy")]
SchemeDisallowed,
#[error("Request header disallowed by policy")]
HeaderDenied,
#[error("Required request header missing")]
HeaderRequired,
#[error("Invalid header name")]
InvalidHeader,
#[error("Cannot use AntiSSRF with custom lookup function")]
CustomLookupNotAllowed,
#[error("Policy is locked and cannot be modified")]
PolicyLocked,
#[error("Conflicting policy configuration")]
ConflictingConfiguration,
#[error("Invalid CIDR block: {0}")]
InvalidCIDR(String),
#[error("Invalid IP address: {0}")]
InvalidIP(String),
#[error("Invalid URL: {0}")]
InvalidURL(String),
#[error("Redirect validation failed: {0}")]
RedirectValidationFailed(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn error_display_messages() {
assert_eq!(
AntiSSRFError::IPDisallowed.to_string(),
"IP address disallowed by policy"
);
assert_eq!(
AntiSSRFError::SchemeDisallowed.to_string(),
"Request scheme disallowed by policy"
);
assert_eq!(
AntiSSRFError::HeaderDenied.to_string(),
"Request header disallowed by policy"
);
assert_eq!(
AntiSSRFError::HeaderRequired.to_string(),
"Required request header missing"
);
assert_eq!(
AntiSSRFError::InvalidHeader.to_string(),
"Invalid header name"
);
assert_eq!(
AntiSSRFError::CustomLookupNotAllowed.to_string(),
"Cannot use AntiSSRF with custom lookup function"
);
assert_eq!(
AntiSSRFError::PolicyLocked.to_string(),
"Policy is locked and cannot be modified"
);
assert_eq!(
AntiSSRFError::ConflictingConfiguration.to_string(),
"Conflicting policy configuration"
);
assert_eq!(
AntiSSRFError::InvalidCIDR("10.0.0.0/33".to_string()).to_string(),
"Invalid CIDR block: 10.0.0.0/33"
);
assert_eq!(
AntiSSRFError::InvalidIP("not-an-ip".to_string()).to_string(),
"Invalid IP address: not-an-ip"
);
assert_eq!(
AntiSSRFError::InvalidURL("not-a-url".to_string()).to_string(),
"Invalid URL: not-a-url"
);
assert_eq!(
AntiSSRFError::RedirectValidationFailed("http://127.0.0.1/secret".to_string()).to_string(),
"Redirect validation failed: http://127.0.0.1/secret"
);
}
#[test]
fn error_clonable() {
let err = AntiSSRFError::IPDisallowed;
let cloned = err.clone();
assert_eq!(err, cloned);
}
#[test]
fn error_partial_eq() {
assert_eq!(AntiSSRFError::PolicyLocked, AntiSSRFError::PolicyLocked);
assert_ne!(
AntiSSRFError::IPDisallowed,
AntiSSRFError::SchemeDisallowed
);
}
}