From 64f158c07f1bacf703618821dc4e986ede0958e8 Mon Sep 17 00:00:00 2001 From: Brian Wellington Date: Mon, 18 May 2020 15:08:39 -0700 Subject: [PATCH] Finish rdatatype conversion. 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 | 7 ++++++- dns/rdatatype.py | 33 ++++++++++++++++++--------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/dns/rdata.py b/dns/rdata.py index fd42e4bc..f6910019 100644 --- a/dns/rdata.py +++ b/dns/rdata.py @@ -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) diff --git a/dns/rdatatype.py b/dns/rdatatype.py index 24442be7..4e401af2 100644 --- a/dns/rdatatype.py +++ b/dns/rdatatype.py @@ -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 -- 2.47.3