| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """DNS Result Codes.""" |
|
|
| from typing import Tuple |
|
|
| import dns.enum |
| import dns.exception |
|
|
|
|
| class Rcode(dns.enum.IntEnum): |
| |
| NOERROR = 0 |
| |
| FORMERR = 1 |
| |
| SERVFAIL = 2 |
| |
| NXDOMAIN = 3 |
| |
| NOTIMP = 4 |
| |
| REFUSED = 5 |
| |
| YXDOMAIN = 6 |
| |
| YXRRSET = 7 |
| |
| NXRRSET = 8 |
| |
| NOTAUTH = 9 |
| |
| NOTZONE = 10 |
| |
| DSOTYPENI = 11 |
| |
| BADVERS = 16 |
| |
| BADSIG = 16 |
| |
| BADKEY = 17 |
| |
| BADTIME = 18 |
| |
| BADMODE = 19 |
| |
| BADNAME = 20 |
| |
| BADALG = 21 |
| |
| BADTRUNC = 22 |
| |
| BADCOOKIE = 23 |
|
|
| @classmethod |
| def _maximum(cls): |
| return 4095 |
|
|
| @classmethod |
| 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) |
|
|
|
|
| |
|
|
| 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 |
|
|
| |
|
|