pub enum Status {
Permfail,
Tempfail,
}
quick_error! {
#[derive(Debug, PartialEq, Clone)]
pub enum DKIMError {
UnsupportedHashAlgorithm(value: String) {
display("unsupported hash algorithm: {}", value)
}
UnsupportedCanonicalizationType(value: String) {
display("unsupported canonicalization: {}", value)
}
SignatureSyntaxError(err: String) {
display("signature syntax error: {}", err)
}
SignatureMissingRequiredTag(name: &'static str) {
display("signature missing required tag ({})", name)
}
IncompatibleVersion {
display("incompatible version")
}
DomainMismatch {
display("domain mismatch")
}
FromFieldNotSigned {
display("From field not signed")
}
SignatureExpired {
display("signature expired")
}
UnacceptableSignatureHeader {
display("unacceptable signature header")
}
UnsupportedQueryMethod {
display("unsupported query method")
}
KeyUnavailable(err: String) {
display("key unavailable: {}", err)
}
UnknownInternalError(err: String) {
display("internal error: {}", err)
}
NoKeyForSignature {
display("no key for signature")
}
KeySyntaxError {
display("key syntax error")
}
KeyIncompatibleVersion {
display("key incompatible version")
}
InappropriateKeyAlgorithm {
display("inappropriate key algorithm")
}
SignatureDidNotVerify {
display("signature did not verify")
}
BodyHashDidNotVerify {
display("body hash did not verify")
}
MalformedBody {
display("malformed email body")
}
FailedToSign(err: String) {
display("failed sign: {}", err)
}
BuilderError(err: &'static str) {
display("failed to build object: {}", err)
}
}
}
impl DKIMError {
pub fn status(self) -> Status {
use DKIMError::*;
match self {
SignatureSyntaxError(_)
| SignatureMissingRequiredTag(_)
| IncompatibleVersion
| DomainMismatch
| FromFieldNotSigned
| SignatureExpired
| UnacceptableSignatureHeader
| UnsupportedQueryMethod
| NoKeyForSignature
| KeySyntaxError
| KeyIncompatibleVersion
| InappropriateKeyAlgorithm
| SignatureDidNotVerify
| BodyHashDidNotVerify
| MalformedBody
| UnsupportedCanonicalizationType(_)
| UnsupportedHashAlgorithm(_) => Status::Permfail,
KeyUnavailable(_) | UnknownInternalError(_) => Status::Tempfail,
BuilderError(_) | FailedToSign(_) => unreachable!(),
}
}
}