# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
import base64
+import enum
import struct
import dns.exception
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):
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)
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__':