cfdkim/
errors.rs

1/// DKIM error status
2pub enum Status {
3    Permfail,
4    Tempfail,
5}
6
7quick_error! {
8    #[derive(Debug, PartialEq, Clone)]
9    /// DKIM errors
10    pub enum DKIMError {
11        UnsupportedHashAlgorithm(value: String) {
12            display("unsupported hash algorithm: {}", value)
13        }
14        UnsupportedCanonicalizationType(value: String) {
15            display("unsupported canonicalization: {}", value)
16        }
17        SignatureSyntaxError(err: String) {
18            display("signature syntax error: {}", err)
19        }
20        SignatureMissingRequiredTag(name: &'static str) {
21            display("signature missing required tag ({})", name)
22        }
23        IncompatibleVersion {
24            display("incompatible version")
25        }
26        DomainMismatch {
27            display("domain mismatch")
28        }
29        FromFieldNotSigned {
30            display("From field not signed")
31        }
32        SignatureExpired {
33            display("signature expired")
34        }
35        UnacceptableSignatureHeader {
36            display("unacceptable signature header")
37        }
38        UnsupportedQueryMethod {
39            display("unsupported query method")
40        }
41        KeyUnavailable(err: String) {
42            display("key unavailable: {}", err)
43        }
44        UnknownInternalError(err: String) {
45            display("internal error: {}", err)
46        }
47        NoKeyForSignature {
48            display("no key for signature")
49        }
50        KeySyntaxError {
51            display("key syntax error")
52        }
53        KeyIncompatibleVersion {
54            display("key incompatible version")
55        }
56        InappropriateKeyAlgorithm {
57            display("inappropriate key algorithm")
58        }
59        SignatureDidNotVerify {
60            display("signature did not verify")
61        }
62        BodyHashDidNotVerify {
63            display("body hash did not verify")
64        }
65        MalformedBody {
66            display("malformed email body")
67        }
68        FailedToSign(err: String) {
69            display("failed sign: {}", err)
70        }
71        BuilderError(err: &'static str) {
72            display("failed to build object: {}", err)
73        }
74    }
75}
76
77impl DKIMError {
78    pub fn status(self) -> Status {
79        use DKIMError::*;
80        match self {
81            SignatureSyntaxError(_)
82            | SignatureMissingRequiredTag(_)
83            | IncompatibleVersion
84            | DomainMismatch
85            | FromFieldNotSigned
86            | SignatureExpired
87            | UnacceptableSignatureHeader
88            | UnsupportedQueryMethod
89            | NoKeyForSignature
90            | KeySyntaxError
91            | KeyIncompatibleVersion
92            | InappropriateKeyAlgorithm
93            | SignatureDidNotVerify
94            | BodyHashDidNotVerify
95            | MalformedBody
96            | UnsupportedCanonicalizationType(_)
97            | UnsupportedHashAlgorithm(_) => Status::Permfail,
98            KeyUnavailable(_) | UnknownInternalError(_) => Status::Tempfail,
99            BuilderError(_) | FailedToSign(_) => unreachable!(),
100        }
101    }
102}