]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Create DNSKEY Flag enum.
authorBrian Wellington <bwelling@xbill.org>
Mon, 18 May 2020 19:56:08 +0000 (12:56 -0700)
committerBrian Wellington <bwelling@xbill.org>
Mon, 18 May 2020 19:56:08 +0000 (12:56 -0700)
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.

dns/rdtypes/ANY/CDNSKEY.py
dns/rdtypes/ANY/DNSKEY.py
dns/rdtypes/dnskeybase.py
tests/test_rdtypeanydnskey.py

index 653ae1be16a3bcf50bfd9aa6a76b39d0c75a3ae6..aae8bd7770cd7baf697c141d7e89e8eaf87b1dd9 100644 (file)
 # 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):
index e36f7bc5b124daeb8bb6fc9a58edf84c726d8d24..f5c918b0c35174bb2f61ecb4dc6ff86e008dae0e 100644 (file)
 # 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):
index 345baded3ff7fcc12d833d74434d81679e79b668..3b35a0c64447372a0fc4c7c5b23e210cbf95418e 100644 (file)
@@ -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)
index d354aa502f057ffab108a888c4dc7d1a158721a9..4ad768399a5413f0aa5e88c922dbbc711d5dd60d 100644 (file)
@@ -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__':