Spaces:
Running
Running
# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license | |
# Copyright (C) 2001-2017 Nominum, Inc. | |
# | |
# Permission to use, copy, modify, and distribute this software and its | |
# documentation for any purpose with or without fee is hereby granted, | |
# provided that the above copyright notice and this permission notice | |
# appear in all copies. | |
# | |
# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES | |
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR | |
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | |
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
"""DNS Result Codes.""" | |
from typing import Tuple | |
import dns.enum | |
import dns.exception | |
class Rcode(dns.enum.IntEnum): | |
#: No error | |
NOERROR = 0 | |
#: Format error | |
FORMERR = 1 | |
#: Server failure | |
SERVFAIL = 2 | |
#: Name does not exist ("Name Error" in RFC 1025 terminology). | |
NXDOMAIN = 3 | |
#: Not implemented | |
NOTIMP = 4 | |
#: Refused | |
REFUSED = 5 | |
#: Name exists. | |
YXDOMAIN = 6 | |
#: RRset exists. | |
YXRRSET = 7 | |
#: RRset does not exist. | |
NXRRSET = 8 | |
#: Not authoritative. | |
NOTAUTH = 9 | |
#: Name not in zone. | |
NOTZONE = 10 | |
#: DSO-TYPE Not Implemented | |
DSOTYPENI = 11 | |
#: Bad EDNS version. | |
BADVERS = 16 | |
#: TSIG Signature Failure | |
BADSIG = 16 | |
#: Key not recognized. | |
BADKEY = 17 | |
#: Signature out of time window. | |
BADTIME = 18 | |
#: Bad TKEY Mode. | |
BADMODE = 19 | |
#: Duplicate key name. | |
BADNAME = 20 | |
#: Algorithm not supported. | |
BADALG = 21 | |
#: Bad Truncation | |
BADTRUNC = 22 | |
#: Bad/missing Server Cookie | |
BADCOOKIE = 23 | |
def _maximum(cls): | |
return 4095 | |
def _unknown_exception_class(cls): | |
return UnknownRcode | |
class UnknownRcode(dns.exception.DNSException): | |
"""A DNS rcode is unknown.""" | |
def from_text(text: str) -> Rcode: | |
"""Convert text into an rcode. | |
*text*, a ``str``, the textual rcode or an integer in textual form. | |
Raises ``dns.rcode.UnknownRcode`` if the rcode mnemonic is unknown. | |
Returns a ``dns.rcode.Rcode``. | |
""" | |
return Rcode.from_text(text) | |
def from_flags(flags: int, ednsflags: int) -> Rcode: | |
"""Return the rcode value encoded by flags and ednsflags. | |
*flags*, an ``int``, the DNS flags field. | |
*ednsflags*, an ``int``, the EDNS flags field. | |
Raises ``ValueError`` if rcode is < 0 or > 4095 | |
Returns a ``dns.rcode.Rcode``. | |
""" | |
value = (flags & 0x000F) | ((ednsflags >> 20) & 0xFF0) | |
return Rcode.make(value) | |
def to_flags(value: Rcode) -> Tuple[int, int]: | |
"""Return a (flags, ednsflags) tuple which encodes the rcode. | |
*value*, a ``dns.rcode.Rcode``, the rcode. | |
Raises ``ValueError`` if rcode is < 0 or > 4095. | |
Returns an ``(int, int)`` tuple. | |
""" | |
if value < 0 or value > 4095: | |
raise ValueError("rcode must be >= 0 and <= 4095") | |
v = value & 0xF | |
ev = (value & 0xFF0) << 20 | |
return (v, ev) | |
def to_text(value: Rcode, tsig: bool = False) -> str: | |
"""Convert rcode into text. | |
*value*, a ``dns.rcode.Rcode``, the rcode. | |
Raises ``ValueError`` if rcode is < 0 or > 4095. | |
Returns a ``str``. | |
""" | |
if tsig and value == Rcode.BADVERS: | |
return "BADSIG" | |
return Rcode.to_text(value) | |
### BEGIN generated Rcode constants | |
NOERROR = Rcode.NOERROR | |
FORMERR = Rcode.FORMERR | |
SERVFAIL = Rcode.SERVFAIL | |
NXDOMAIN = Rcode.NXDOMAIN | |
NOTIMP = Rcode.NOTIMP | |
REFUSED = Rcode.REFUSED | |
YXDOMAIN = Rcode.YXDOMAIN | |
YXRRSET = Rcode.YXRRSET | |
NXRRSET = Rcode.NXRRSET | |
NOTAUTH = Rcode.NOTAUTH | |
NOTZONE = Rcode.NOTZONE | |
DSOTYPENI = Rcode.DSOTYPENI | |
BADVERS = Rcode.BADVERS | |
BADSIG = Rcode.BADSIG | |
BADKEY = Rcode.BADKEY | |
BADTIME = Rcode.BADTIME | |
BADMODE = Rcode.BADMODE | |
BADNAME = Rcode.BADNAME | |
BADALG = Rcode.BADALG | |
BADTRUNC = Rcode.BADTRUNC | |
BADCOOKIE = Rcode.BADCOOKIE | |
### END generated Rcode constants | |