From: Brian Wellington Date: Mon, 18 May 2020 19:56:08 +0000 (-0700) Subject: Create DNSKEY Flag enum. X-Git-Tag: v2.0.0rc1~198^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=95aa24af98ef5f861afca513bb629405adbab571;p=thirdparty%2Fdnspython.git Create DNSKEY Flag enum. The flags are defined in dnskeybase, and additionally visible in DNSKEY and CDNSKEY. Also, remove flags_to_text_set() and flags_from_text_set(). The DNSKEY record doesn't support text flags; this was leftover from the KEY record. Remove tests that are no longer needed, and update other tests for these changes. --- diff --git a/dns/rdtypes/ANY/CDNSKEY.py b/dns/rdtypes/ANY/CDNSKEY.py index 653ae1be..aae8bd77 100644 --- a/dns/rdtypes/ANY/CDNSKEY.py +++ b/dns/rdtypes/ANY/CDNSKEY.py @@ -16,10 +16,7 @@ # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. import dns.rdtypes.dnskeybase -from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set - - -__all__ = ['flags_to_text_set', 'flags_from_text_set'] +from dns.rdtypes.dnskeybase import SEP, REVOKE, ZONE class CDNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): diff --git a/dns/rdtypes/ANY/DNSKEY.py b/dns/rdtypes/ANY/DNSKEY.py index e36f7bc5..f5c918b0 100644 --- a/dns/rdtypes/ANY/DNSKEY.py +++ b/dns/rdtypes/ANY/DNSKEY.py @@ -16,10 +16,7 @@ # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. import dns.rdtypes.dnskeybase -from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set - - -__all__ = ['flags_to_text_set', 'flags_from_text_set'] +from dns.rdtypes.dnskeybase import SEP, REVOKE, ZONE class DNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): diff --git a/dns/rdtypes/dnskeybase.py b/dns/rdtypes/dnskeybase.py index 345baded..3b35a0c6 100644 --- a/dns/rdtypes/dnskeybase.py +++ b/dns/rdtypes/dnskeybase.py @@ -16,6 +16,7 @@ # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. import base64 +import enum import struct import dns.exception @@ -23,54 +24,14 @@ import dns.dnssec import dns.rdata # wildcard import -__all__ = ["SEP", "REVOKE", "ZONE", - "flags_to_text_set", "flags_from_text_set"] +__all__ = ["SEP", "REVOKE", "ZONE"] -# flag constants -SEP = 0x0001 -REVOKE = 0x0080 -ZONE = 0x0100 +class Flag(enum.IntFlag): + SEP = 0x0001 + REVOKE = 0x0080 + ZONE = 0x0100 -_flag_by_text = { - 'SEP': SEP, - 'REVOKE': REVOKE, - 'ZONE': ZONE -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. -_flag_by_value = {y: x for x, y in _flag_by_text.items()} - - -def flags_to_text_set(flags): - """Convert a DNSKEY flags value to set texts - @rtype: set([string])""" - - flags_set = set() - mask = 0x1 - while mask <= 0x8000: - if flags & mask: - text = _flag_by_value.get(mask) - if not text: - text = hex(mask) - flags_set.add(text) - mask <<= 1 - return flags_set - - -def flags_from_text_set(texts_set): - """Convert set of DNSKEY flag mnemonic texts to DNSKEY flag value - @rtype: int""" - - flags = 0 - for text in texts_set: - try: - flags += _flag_by_text[text] - except KeyError: - raise NotImplementedError( - "DNSKEY flag '%s' is not supported" % text) - return flags +globals().update(Flag.__members__) class DNSKEYBase(dns.rdata.Rdata): @@ -123,8 +84,3 @@ class DNSKEYBase(dns.rdata.Rdata): key = wire[current: current + rdlen].unwrap() return cls(rdclass, rdtype, header[0], header[1], header[2], key) - - def flags_to_text_set(self): - """Convert a DNSKEY flags value to set texts - @rtype: set([string])""" - return flags_to_text_set(self.flags) diff --git a/tests/test_rdtypeanydnskey.py b/tests/test_rdtypeanydnskey.py index d354aa50..4ad76839 100644 --- a/tests/test_rdtypeanydnskey.py +++ b/tests/test_rdtypeanydnskey.py @@ -23,46 +23,20 @@ from typing import Set # pylint: disable=unused-import class RdtypeAnyDnskeyTestCase(unittest.TestCase): - def testFlagsEmpty(self): # type: () -> None - '''Test DNSKEY flag to/from text conversion for zero flag/empty set.''' - good_s = set() #type: Set[str] - good_f = 0 - from_flags = dns.rdtypes.ANY.DNSKEY.flags_to_text_set(good_f) - self.assertEqual(from_flags, good_s, - '"{}" != "{}"'.format(from_flags, good_s)) - from_set = dns.rdtypes.ANY.DNSKEY.flags_from_text_set(good_s) - self.assertEqual(from_set, good_f, - '"0x{:x}" != "0x{:x}"'.format(from_set, good_f)) - def testFlagsAll(self): # type: () -> None '''Test that all defined flags are recognized.''' good_s = {'SEP', 'REVOKE', 'ZONE'} good_f = 0x181 - from_flags = dns.rdtypes.ANY.DNSKEY.flags_to_text_set(good_f) - self.assertEqual(from_flags, good_s, - '"{}" != "{}"'.format(from_flags, good_s)) - from_text = dns.rdtypes.ANY.DNSKEY.flags_from_text_set(good_s) - self.assertEqual(from_text, good_f, - '"0x{:x}" != "0x{:x}"'.format(from_text, good_f)) - - def testFlagsUnknownToText(self): # type: () -> None - '''Test that undefined flags are returned in hexadecimal notation.''' - unk_s = {'0x8000'} - flags_s = dns.rdtypes.ANY.DNSKEY.flags_to_text_set(0x8000) - self.assertEqual(flags_s, unk_s, '"{}" != "{}"'.format(flags_s, unk_s)) - - def testFlagsUnknownToFlags(self): # type: () -> None - '''Test that conversion from undefined mnemonic raises error.''' - self.assertRaises(NotImplementedError, - dns.rdtypes.ANY.DNSKEY.flags_from_text_set, - (['0x8000'])) + self.assertEqual(dns.rdtypes.ANY.DNSKEY.SEP | + dns.rdtypes.ANY.DNSKEY.REVOKE | + dns.rdtypes.ANY.DNSKEY.ZONE, good_f) def testFlagsRRToText(self): # type: () -> None '''Test that RR method returns correct flags.''' rr = dns.rrset.from_text('foo', 300, 'IN', 'DNSKEY', '257 3 8 KEY=')[0] - rr_s = {'ZONE', 'SEP'} - flags_s = rr.flags_to_text_set() - self.assertEqual(flags_s, rr_s, '"{}" != "{}"'.format(flags_s, rr_s)) + self.assertEqual(dns.rdtypes.ANY.DNSKEY.ZONE | + dns.rdtypes.ANY.DNSKEY.SEP, + rr.flags) if __name__ == '__main__':