1pub enum Status {
3 Permfail,
4 Tempfail,
5}
6
7quick_error! {
8 #[derive(Debug, PartialEq, Clone)]
9 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}