dns_message_parser/rr/edns/
rfc_8914.rs

1use std::{
2    convert::TryFrom,
3    fmt::{Display, Formatter, Result as FmtResult},
4};
5use thiserror::Error;
6
7pub const EXTENDED_DNS_ERROR_EXTRA_TEXT_ERROR: usize =
8    u16::MAX as usize - std::mem::size_of::<u16>();
9
10try_from_enum_to_integer! {
11    #[repr(u16)]
12    /// The [Extended DNS Error Codes] field in the [Extended DNS Errors].
13    ///
14    /// [type]: https://tools.ietf.org/html/rfc8914#section-5.2-3
15    /// [Extended DNS Errors]: crate::rr::edns::ExtendedDNSErrors
16    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
17    pub enum ExtendedDNSErrorCodes {
18        /// The [Other] type.
19        ///
20        /// [Other]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-0-o
21        Other = 0,
22        /// The [Unsupported DNSKEY Algorithm] type.
23        ///
24        /// [Unsupported DNSKEY Algorithm]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-1-u
25        UnsupportedDNSKEYAlgorithm = 1,
26        /// The [Unsupported DS Digest Type] type.
27        ///
28        /// [Unsupported DS Digest Type]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-2-u
29        UnsupportedDSDigestType = 2,
30        /// The [Stale Answer] type.
31        ///
32        /// [Stale Answer]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-3-s
33        StaleAnswer = 3,
34        /// The [Forged Answer] type.
35        ///
36        /// [Forged Answer]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-4-f
37        ForgedAnswer = 4,
38        /// The [DNSSEC Indeterminate] type.
39        ///
40        /// [DNSSEC Indeterminate]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-5-d
41        DNSSECIndeterminate = 5,
42        /// The [DNSSEC Bogus] type.
43        ///
44        /// [DNSSEC Bogus]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-6-d
45        DNSSECBogus = 6,
46        /// The [Signature Expired] type.
47        ///
48        /// [Signature Expired]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-7-s
49        SignatureExpired = 7,
50        /// The [Signature Not Yet Valid] type.
51        ///
52        /// [Signature Not Yet Valid]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-8-s
53        SignatureNotYetValid = 8,
54        /// The [DNSKEY Missing] type.
55        ///
56        /// [DNSKEY Missing]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-9-d
57        DNSKEYMissing = 9,
58        /// The [RRSIGs Missing] type.
59        ///
60        /// [RRSIGs Missing]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-10-
61        RRSIGsMissing = 10,
62        /// The [No Zone Key Bit Set] type.
63        ///
64        /// [No Zone Key Bit Set]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-11-
65        NoZoneKeyBitSet = 11,
66        /// The [NSEC Missing] type.
67        ///
68        /// [NSEC Missing]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-12-
69        NSECMissing = 12,
70        /// The [Cached Error] type.
71        ///
72        /// [Cached Error]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-13-
73        CachedError = 13,
74        /// The [Not Ready] type.
75        ///
76        /// [Not Ready]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-14-
77        NotReady = 14,
78        /// The [Blocked] type.
79        ///
80        /// [Blocked]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-15-
81        Blocked = 15,
82        /// The [Censored] type.
83        ///
84        /// [Censored]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-16-
85        Censored = 16,
86        /// The [Filtered] type.
87        ///
88        /// [Filtered]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-17-
89        Filtered = 17,
90        /// The [Prohibited] type.
91        ///
92        /// [Prohibited]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-18-
93        Prohibited = 18,
94        /// The [Stale NXDOMAIN Answer] type.
95        ///
96        /// [Stale NXDOMAIN Answer]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-19-
97        StaleNXDomainAnswer = 19,
98        /// The [Not Authoritative] type.
99        ///
100        /// [Not Authoritative]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-20-
101        NotAuthoritative = 20,
102        /// The [Not Supported] type.
103        ///
104        /// [Not Supported]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-21-
105        NotSupported = 21,
106        /// The [No Reachable Authority] type.
107        ///
108        /// [No Reachable Authority]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-22-
109        NoReachableAuthority = 22,
110        /// The [Network Error] type.
111        ///
112        /// [Network Error]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-23-
113        NetworkError = 23,
114        /// The [Invalid Data] type.
115        ///
116        /// [Invalid Data]: https://datatracker.ietf.org/doc/html/rfc8914#name-extended-dns-error-code-24-
117        InvalidData = 24,
118    }
119}
120
121#[derive(Debug, PartialEq, Clone, Eq, Hash)]
122pub struct ExtendedDNSErrorExtraText {
123    inner: String,
124}
125
126impl Display for ExtendedDNSErrorExtraText {
127    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
128        write!(f, "{}", self.inner)
129    }
130}
131
132impl AsRef<str> for ExtendedDNSErrorExtraText {
133    fn as_ref(&self) -> &str {
134        &self.inner
135    }
136}
137
138#[derive(Debug, Clone, PartialEq, Eq, Hash, Error)]
139pub enum ExtendedDNSErrorExtraTextError {
140    #[error("Text too big {0}")]
141    TooBig(usize),
142}
143
144impl TryFrom<&str> for ExtendedDNSErrorExtraText {
145    type Error = ExtendedDNSErrorExtraTextError;
146
147    fn try_from(text: &str) -> Result<Self, Self::Error> {
148        let len = text.len();
149        if len <= EXTENDED_DNS_ERROR_EXTRA_TEXT_ERROR {
150            Ok(ExtendedDNSErrorExtraText {
151                inner: text.to_owned(),
152            })
153        } else {
154            Err(ExtendedDNSErrorExtraTextError::TooBig(len))
155        }
156    }
157}
158
159impl TryFrom<String> for ExtendedDNSErrorExtraText {
160    type Error = ExtendedDNSErrorExtraTextError;
161
162    fn try_from(text: String) -> Result<Self, Self::Error> {
163        let len = text.len();
164        if len <= EXTENDED_DNS_ERROR_EXTRA_TEXT_ERROR {
165            Ok(ExtendedDNSErrorExtraText { inner: text })
166        } else {
167            Err(ExtendedDNSErrorExtraTextError::TooBig(len))
168        }
169    }
170}
171
172#[derive(Debug, PartialEq, Clone, Eq, Hash)]
173pub struct ExtendedDNSErrors {
174    pub info_code: ExtendedDNSErrorCodes,
175    pub extra_text: ExtendedDNSErrorExtraText,
176}
177
178impl Display for ExtendedDNSErrors {
179    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
180        write!(
181            f,
182            "Extended DNS Errors {} {}",
183            self.info_code, self.extra_text
184        )
185    }
186}