]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Finish rdatatype conversion. 473/head
authorBrian Wellington <bwelling@xbill.org>
Mon, 18 May 2020 22:08:39 +0000 (15:08 -0700)
committerBrian Wellington <bwelling@xbill.org>
Mon, 18 May 2020 22:08:39 +0000 (15:08 -0700)
Add more checking to dns.rdata.register_type, to ensure that an existing
type mnemonic isn't overwritten.  Use the enum functionality for mapping
names to values and values to names, rather than duplicating it.

dns/rdata.py
dns/rdatatype.py

index fd42e4bc13d504ce7044f3e935537135ac626ea7..f691001988fe7037854a2fb57e4f230c626abb26 100644 (file)
@@ -516,8 +516,13 @@ def register_type(implementation, rdtype, rdtype_text, is_singleton=False,
     """
 
     existing_cls = get_rdata_class(rdclass, rdtype)
-    if existing_cls != GenericRdata:
+    if existing_cls != GenericRdata or dns.rdatatype.is_metatype(rdtype):
         raise RdatatypeExists(rdclass=rdclass, rdtype=rdtype)
+    try:
+        if dns.rdatatype.RdataType(rdtype).name != rdtype_text:
+            raise RdatatypeExists(rdclass=rdclass, rdtype=rdtype)
+    except ValueError:
+        pass
     _rdata_classes[(rdclass, rdtype)] = getattr(implementation,
                                                 rdtype_text.replace('-', '_'))
     dns.rdatatype.register_type(rdtype, rdtype_text, is_singleton)
index 24442be70a75ade4b9d85b02e470f77b14307401..4e401af209608b5dcbd6116d6353a852fb2eef6a 100644 (file)
@@ -97,15 +97,10 @@ class RdataType(enum.IntEnum):
     TA = 32768
     DLV = 32769
 
-_by_text = {}
-_by_value = {}
+_registered_by_text = {}
+_registered_by_value = {}
 
-for (name, value) in RdataType.__members__.items():
-    globals()[name] = value
-    real_name = name.replace('_', '-')
-    _by_text[real_name] = value
-    if value not in _by_value:
-        _by_value[value] = real_name
+globals().update(RdataType.__members__.items())
 
 _metatypes = {
     OPT: True
@@ -141,7 +136,12 @@ def from_text(text):
     Returns an ``int``.
     """
 
-    value = _by_text.get(text.upper())
+    text = text.upper().replace('-', '_')
+    try:
+        return RdataType[text]
+    except KeyError:
+        pass
+    value = _registered_by_text.get(text.upper())
     if value is None:
         match = _unknown_type_pattern.match(text)
         if match is None:
@@ -165,10 +165,13 @@ def to_text(value):
 
     if value < 0 or value > 65535:
         raise ValueError("type must be between >= 0 and <= 65535")
-    text = _by_value.get(value)
-    if text is None:
-        text = 'TYPE' + repr(value)
-    return text
+    try:
+        return RdataType(value).name.replace('_', '-')
+    except ValueError:
+        text = _registered_by_value.get(value)
+        if text:
+            return text
+        return f'TYPE{value}'
 
 
 def to_enum(value):
@@ -235,7 +238,7 @@ def register_type(rdtype, rdtype_text, is_singleton=False):
     RRsets of the type can have only one member.)
     """
 
-    _by_text[rdtype_text] = rdtype
-    _by_value[rdtype] = rdtype_text
+    _registered_by_text[rdtype_text] = rdtype
+    _registered_by_value[rdtype] = rdtype_text
     if is_singleton:
         _singletons[rdtype] = True