summaryrefslogtreecommitdiff
path: root/dns/rdtypes/ANY/DNSKEY.py
diff options
context:
space:
mode:
Diffstat (limited to 'dns/rdtypes/ANY/DNSKEY.py')
-rw-r--r--dns/rdtypes/ANY/DNSKEY.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/dns/rdtypes/ANY/DNSKEY.py b/dns/rdtypes/ANY/DNSKEY.py
index 1d678d2..7bc5850 100644
--- a/dns/rdtypes/ANY/DNSKEY.py
+++ b/dns/rdtypes/ANY/DNSKEY.py
@@ -20,11 +20,54 @@ import dns.exception
import dns.dnssec
import dns.rdata
+
# flag constants
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 = dict([(y, x) for x, y in _flag_by_text.iteritems()])
+
+
+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
+
+
class DNSKEY(dns.rdata.Rdata):
"""DNSKEY record
@@ -92,3 +135,8 @@ class DNSKEY(dns.rdata.Rdata):
if v == 0:
v = cmp(self.key, other.key)
return v
+
+ def flags_to_text_set(self):
+ """Convert a DNSKEY flags value to set texts
+ @rtype: set([string])"""
+ return flags_to_text_set(self.flags)