]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
make name and rdata use the immutable decorator
authorBob Halley <halley@dnspython.org>
Wed, 19 Aug 2020 12:30:30 +0000 (05:30 -0700)
committerBob Halley <halley@dnspython.org>
Wed, 19 Aug 2020 12:30:30 +0000 (05:30 -0700)
65 files changed:
dns/name.py
dns/rdata.py
dns/rdtypes/ANY/AFSDB.py
dns/rdtypes/ANY/AMTRELAY.py
dns/rdtypes/ANY/AVC.py
dns/rdtypes/ANY/CAA.py
dns/rdtypes/ANY/CDNSKEY.py
dns/rdtypes/ANY/CDS.py
dns/rdtypes/ANY/CERT.py
dns/rdtypes/ANY/CNAME.py
dns/rdtypes/ANY/CSYNC.py
dns/rdtypes/ANY/DLV.py
dns/rdtypes/ANY/DNAME.py
dns/rdtypes/ANY/DNSKEY.py
dns/rdtypes/ANY/DS.py
dns/rdtypes/ANY/EUI48.py
dns/rdtypes/ANY/EUI64.py
dns/rdtypes/ANY/GPOS.py
dns/rdtypes/ANY/HINFO.py
dns/rdtypes/ANY/HIP.py
dns/rdtypes/ANY/ISDN.py
dns/rdtypes/ANY/LOC.py
dns/rdtypes/ANY/MX.py
dns/rdtypes/ANY/NINFO.py
dns/rdtypes/ANY/NS.py
dns/rdtypes/ANY/NSEC.py
dns/rdtypes/ANY/NSEC3.py
dns/rdtypes/ANY/NSEC3PARAM.py
dns/rdtypes/ANY/OPENPGPKEY.py
dns/rdtypes/ANY/OPT.py
dns/rdtypes/ANY/PTR.py
dns/rdtypes/ANY/RP.py
dns/rdtypes/ANY/RRSIG.py
dns/rdtypes/ANY/RT.py
dns/rdtypes/ANY/SOA.py
dns/rdtypes/ANY/SPF.py
dns/rdtypes/ANY/SSHFP.py
dns/rdtypes/ANY/TKEY.py
dns/rdtypes/ANY/TLSA.py
dns/rdtypes/ANY/TSIG.py
dns/rdtypes/ANY/TXT.py
dns/rdtypes/ANY/URI.py
dns/rdtypes/ANY/X25.py
dns/rdtypes/CH/A.py
dns/rdtypes/IN/A.py
dns/rdtypes/IN/AAAA.py
dns/rdtypes/IN/APL.py
dns/rdtypes/IN/DHCID.py
dns/rdtypes/IN/HTTPS.py
dns/rdtypes/IN/IPSECKEY.py
dns/rdtypes/IN/KX.py
dns/rdtypes/IN/NAPTR.py
dns/rdtypes/IN/NSAP.py
dns/rdtypes/IN/NSAP_PTR.py
dns/rdtypes/IN/PX.py
dns/rdtypes/IN/SRV.py
dns/rdtypes/IN/SVCB.py
dns/rdtypes/IN/WKS.py
dns/rdtypes/dnskeybase.py
dns/rdtypes/dsbase.py
dns/rdtypes/euibase.py
dns/rdtypes/mxbase.py
dns/rdtypes/nsbase.py
dns/rdtypes/svcbbase.py
dns/rdtypes/txtbase.py

index 8775e0b8b3fe38cd0694e68f2923215909b05a91..8905d70f723963f0e30e85fe084c6a52ecb6c246 100644 (file)
@@ -30,6 +30,7 @@ except ImportError:  # pragma: no cover
 
 import dns.wire
 import dns.exception
+import dns.immutable
 
 # fullcompare() result values
 
@@ -305,6 +306,7 @@ def _maybe_convert_to_binary(label):
     raise ValueError  # pragma: no cover
 
 
+@dns.immutable.immutable
 class Name:
 
     """A DNS name.
@@ -321,17 +323,9 @@ class Name:
         """
 
         labels = [_maybe_convert_to_binary(x) for x in labels]
-        super().__setattr__('labels', tuple(labels))
+        self.labels = tuple(labels)
         _validate_labels(self.labels)
 
-    def __setattr__(self, name, value):
-        # Names are immutable
-        raise TypeError("object doesn't support attribute assignment")
-
-    def __delattr__(self, name):
-        # Names are immutable
-        raise TypeError("object doesn't support attribute deletion")
-
     def __copy__(self):
         return Name(self.labels)
 
index 3f0b6d2120e582f92973f9dbb9091557debf4b2a..0d8f881f514291b1d3b2ad096d0b680ce29dff13 100644 (file)
@@ -97,6 +97,7 @@ def _truncate_bitmap(what):
 _constify = dns.immutable.constify
 
 
+@dns.immutable.immutable
 class Rdata:
     """Base class for all DNS rdata types."""
 
@@ -110,17 +111,9 @@ class Rdata:
         *rdtype*, an ``int`` is the rdatatype of the Rdata.
         """
 
-        object.__setattr__(self, 'rdclass', rdclass)
-        object.__setattr__(self, 'rdtype', rdtype)
-        object.__setattr__(self, 'rdcomment', None)
-
-    def __setattr__(self, name, value):
-        # Rdatas are immutable
-        raise TypeError("object doesn't support attribute assignment")
-
-    def __delattr__(self, name):
-        # Rdatas are immutable
-        raise TypeError("object doesn't support attribute deletion")
+        self.rdclass = rdclass
+        self.rdtype = rdtype
+        self.rdcomment = None
 
     def _get_all_slots(self):
         return itertools.chain.from_iterable(getattr(cls, '__slots__', [])
@@ -339,6 +332,11 @@ class Rdata:
             object.__setattr__(rd, 'rdcomment', rdcomment)
         return rd
 
+    def as_value(self, value):
+        # This is the "additional type checking" placeholder that actually
+        # doesn't do any additional checking.
+        return value
+
 
 class GenericRdata(Rdata):
 
index 40878900d323ad673841072efe12dd036ce52653..d7838e7e76347b4a7ef82b2b1e71449c5e4798e7 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.mxbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class AFSDB(dns.rdtypes.mxbase.UncompressedDowncasingMX):
 
     """AFSDB record"""
index 4e012a271ce2fe4871b4c864d261870d1e63c39c..de6e99eb3c27c9c769d74438d5003c971694f491 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdtypes.util
 
 
 class Relay(dns.rdtypes.util.Gateway):
     name = 'AMTRELAY relay'
 
+@dns.immutable.immutable
 class AMTRELAY(dns.rdata.Rdata):
 
     """AMTRELAY record"""
@@ -36,10 +38,10 @@ class AMTRELAY(dns.rdata.Rdata):
                  relay_type, relay):
         super().__init__(rdclass, rdtype)
         Relay(relay_type, relay).check()
-        object.__setattr__(self, 'precedence', precedence)
-        object.__setattr__(self, 'discovery_optional', discovery_optional)
-        object.__setattr__(self, 'relay_type', relay_type)
-        object.__setattr__(self, 'relay', relay)
+        self.precedence = self.as_value(precedence)
+        self.discovery_optional = self.as_value(discovery_optional)
+        self.relay_type = self.as_value(relay_type)
+        self.relay = self.as_value(relay)
 
     def to_text(self, origin=None, relativize=True, **kw):
         relay = Relay(self.relay_type, self.relay).to_text(origin, relativize)
index 1fa5ecfd0b18ae756931412847525eeaf82f3bad..11e026d08ff1d53d26da524ffa30d258e57e35e9 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.txtbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class AVC(dns.rdtypes.txtbase.TXTBase):
 
     """AVC record"""
index b7edae8768cb03626301c654ab66e44613eef992..7c6dd0194eec7456361ef1aac86e35f1fd92750e 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.tokenizer
 
 
+@dns.immutable.immutable
 class CAA(dns.rdata.Rdata):
 
     """CAA (Certification Authority Authorization) record"""
@@ -32,9 +34,9 @@ class CAA(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, flags, tag, value):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'flags', flags)
-        object.__setattr__(self, 'tag', tag)
-        object.__setattr__(self, 'value', value)
+        self.flags = self.as_value(flags)
+        self.tag = self.as_value(tag)
+        self.value = self.as_value(value)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '%u %s "%s"' % (self.flags,
index a8b1d8bac1eefd375bb785b63b7bbe748076923d..14b19417d7862fc7738f2402d022c0352bf4b029 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.dnskeybase
+import dns.immutable
 
 # pylint: disable=unused-import
 from dns.rdtypes.dnskeybase import SEP, REVOKE, ZONE  # noqa: F401
 # pylint: enable=unused-import
 
+@dns.immutable.immutable
 class CDNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase):
 
     """CDNSKEY record"""
index a63041dd798f3b32cacef753f9ff6043576a8f76..39e3556e7485f975ed0f3c3ef41f48627864a58f 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.dsbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class CDS(dns.rdtypes.dsbase.DSBase):
 
     """CDS record"""
index 3fce95b6e91874332915cded40811132e5bf2b24..c78322a74294146f99da9312b6c90eebf48fcc98 100644 (file)
@@ -19,6 +19,7 @@ import struct
 import base64
 
 import dns.exception
+import dns.immutable
 import dns.dnssec
 import dns.rdata
 import dns.tokenizer
@@ -54,6 +55,7 @@ def _ctype_to_text(what):
     return str(what)
 
 
+@dns.immutable.immutable
 class CERT(dns.rdata.Rdata):
 
     """CERT record"""
@@ -65,10 +67,10 @@ class CERT(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, certificate_type, key_tag, algorithm,
                  certificate):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'certificate_type', certificate_type)
-        object.__setattr__(self, 'key_tag', key_tag)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'certificate', certificate)
+        self.certificate_type = self.as_value(certificate_type)
+        self.key_tag = self.as_value(key_tag)
+        self.algorithm = self.as_value(algorithm)
+        self.certificate = self.as_value(certificate)
 
     def to_text(self, origin=None, relativize=True, **kw):
         certificate_type = _ctype_to_text(self.certificate_type)
index 11d42aa7fdb7a959337ed3f6c1315d75c8429294..a4fcfa8880dc86186defcdb3ed5084b95beb8c65 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.nsbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class CNAME(dns.rdtypes.nsbase.NSBase):
 
     """CNAME record
index 9cba5fad09610d99fc7591f76528273af9b17f08..0f626a94efe847ac8a921e050e17703ea96c2963 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.rdatatype
 import dns.name
 import dns.rdtypes.util
 
 
+@dns.immutable.immutable
 class Bitmap(dns.rdtypes.util.Bitmap):
     type_name = 'CSYNC'
 
 
+@dns.immutable.immutable
 class CSYNC(dns.rdata.Rdata):
 
     """CSYNC record"""
@@ -36,9 +39,9 @@ class CSYNC(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, serial, flags, windows):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'serial', serial)
-        object.__setattr__(self, 'flags', flags)
-        object.__setattr__(self, 'windows', dns.rdata._constify(windows))
+        self.serial = self.as_value(serial)
+        self.flags = self.as_value(flags)
+        self.windows = self.as_value(dns.rdata._constify(windows))
 
     def to_text(self, origin=None, relativize=True, **kw):
         text = Bitmap(self.windows).to_text()
index 163521258320999faf5b966f452dc77d685b8a19..947dc42e140be50a62dc4f47d75caf68916bb5e1 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.dsbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class DLV(dns.rdtypes.dsbase.DSBase):
 
     """DLV record"""
index 2000d9b03546ca02cf0a1a095080ca3ba01f8f4f..f4984b55587303536d0e3df78f3e7f760158cba1 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.nsbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class DNAME(dns.rdtypes.nsbase.UncompressedNS):
 
     """DNAME record"""
index 7173b4145a05d735d954c8ab0437e97579841a1e..e69a7c197e8eccb6bc0696d45b03b0b061415968 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.dnskeybase
+import dns.immutable
 
 # pylint: disable=unused-import
 from dns.rdtypes.dnskeybase import SEP, REVOKE, ZONE  # noqa: F401
 # pylint: enable=unused-import
 
+@dns.immutable.immutable
 class DNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase):
 
     """DNSKEY record"""
index 7d457b2281e3fa4a816885299c994457c23f6ba4..3f6c3ee8be12e2aae7b7de536b35a2be464d7d8e 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.dsbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class DS(dns.rdtypes.dsbase.DSBase):
 
     """DS record"""
index b16e81f317a0840161ce83041d538ca6306fd7a8..0ab88ad0f8c720e44f1779d896d13642d5136002 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.euibase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class EUI48(dns.rdtypes.euibase.EUIBase):
 
     """EUI48 record"""
index cc080760009119c59184a49d603c7f7afff3de5a..c42957efe940e335beed4c537970f955a5eec86e 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.euibase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class EUI64(dns.rdtypes.euibase.EUIBase):
 
     """EUI64 record"""
index 8285b3fcb47e1fee3f7a05c6a59117faf9c0deb0..f9e3ed8defc52d6edb8a7c359404beaf7925ffa4 100644 (file)
@@ -18,6 +18,7 @@
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.tokenizer
 
@@ -47,6 +48,7 @@ def _sanitize(value):
     return value
 
 
+@dns.immutable.immutable
 class GPOS(dns.rdata.Rdata):
 
     """GPOS record"""
@@ -72,9 +74,9 @@ class GPOS(dns.rdata.Rdata):
         _validate_float_string(latitude)
         _validate_float_string(longitude)
         _validate_float_string(altitude)
-        object.__setattr__(self, 'latitude', latitude)
-        object.__setattr__(self, 'longitude', longitude)
-        object.__setattr__(self, 'altitude', altitude)
+        self.latitude = self.as_value(latitude)
+        self.longitude = self.as_value(longitude)
+        self.altitude = self.as_value(altitude)
         flat = self.float_latitude
         if flat < -90.0 or flat > 90.0:
             raise dns.exception.FormError('bad latitude')
index 6c1ccfae77a9b2145d0c513a34cfb792a5b45d3a..b2543306ae3958bd7f584510a6d61d832fb0982d 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.tokenizer
 
 
+@dns.immutable.immutable
 class HINFO(dns.rdata.Rdata):
 
     """HINFO record"""
@@ -33,13 +35,13 @@ class HINFO(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, cpu, os):
         super().__init__(rdclass, rdtype)
         if isinstance(cpu, str):
-            object.__setattr__(self, 'cpu', cpu.encode())
+            self.cpu = self.as_value(cpu.encode())
         else:
-            object.__setattr__(self, 'cpu', cpu)
+            self.cpu = self.as_value(cpu)
         if isinstance(os, str):
-            object.__setattr__(self, 'os', os.encode())
+            self.os = self.as_value(os.encode())
         else:
-            object.__setattr__(self, 'os', os)
+            self.os = self.as_value(os)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '"{}" "{}"'.format(dns.rdata._escapify(self.cpu),
index 437ee73381df80b445702b95903e89412e0f45c7..4ed350737fd82ae68b500e39c3c2d1d3f441191e 100644 (file)
@@ -20,10 +20,12 @@ import base64
 import binascii
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.rdatatype
 
 
+@dns.immutable.immutable
 class HIP(dns.rdata.Rdata):
 
     """HIP record"""
@@ -34,10 +36,10 @@ class HIP(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, hit, algorithm, key, servers):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'hit', hit)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'key', key)
-        object.__setattr__(self, 'servers', dns.rdata._constify(servers))
+        self.hit = self.as_value(hit)
+        self.algorithm = self.as_value(algorithm)
+        self.key = self.as_value(key)
+        self.servers = self.as_value(dns.rdata._constify(servers))
 
     def to_text(self, origin=None, relativize=True, **kw):
         hit = binascii.hexlify(self.hit).decode()
index b07594f9add164cdd7cb26dcfee5cf94d5b972b5..2a6ff6febce9ef73cb16b996dc8ffba66dbae0d6 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.tokenizer
 
 
+@dns.immutable.immutable
 class ISDN(dns.rdata.Rdata):
 
     """ISDN record"""
@@ -33,13 +35,13 @@ class ISDN(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, address, subaddress):
         super().__init__(rdclass, rdtype)
         if isinstance(address, str):
-            object.__setattr__(self, 'address', address.encode())
+            self.address = self.as_value(address.encode())
         else:
-            object.__setattr__(self, 'address', address)
+            self.address = self.as_value(address)
         if isinstance(address, str):
-            object.__setattr__(self, 'subaddress', subaddress.encode())
+            self.subaddress = self.as_value(subaddress.encode())
         else:
-            object.__setattr__(self, 'subaddress', subaddress)
+            self.subaddress = self.as_value(subaddress)
 
     def to_text(self, origin=None, relativize=True, **kw):
         if self.subaddress:
index c9e985b9b5f4ad3de5f6246de3d8e83c45efaabb..d2a7783c4c62465e482c513173e3f5c185d6589b 100644 (file)
@@ -18,6 +18,7 @@
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 
 
@@ -90,6 +91,7 @@ def _decode_size(what, desc):
     return base * pow(10, exponent)
 
 
+@dns.immutable.immutable
 class LOC(dns.rdata.Rdata):
 
     """LOC record"""
@@ -115,16 +117,16 @@ class LOC(dns.rdata.Rdata):
             latitude = float(latitude)
         if isinstance(latitude, float):
             latitude = _float_to_tuple(latitude)
-        object.__setattr__(self, 'latitude', dns.rdata._constify(latitude))
+        self.latitude = self.as_value(dns.rdata._constify(latitude))
         if isinstance(longitude, int):
             longitude = float(longitude)
         if isinstance(longitude, float):
             longitude = _float_to_tuple(longitude)
-        object.__setattr__(self, 'longitude', dns.rdata._constify(longitude))
-        object.__setattr__(self, 'altitude', float(altitude))
-        object.__setattr__(self, 'size', float(size))
-        object.__setattr__(self, 'horizontal_precision', float(hprec))
-        object.__setattr__(self, 'vertical_precision', float(vprec))
+        self.longitude = self.as_value(dns.rdata._constify(longitude))
+        self.altitude = self.as_value(float(altitude))
+        self.size = self.as_value(float(size))
+        self.horizontal_precision = self.as_value(float(hprec))
+        self.vertical_precision = self.as_value(float(vprec))
 
     def to_text(self, origin=None, relativize=True, **kw):
         if self.latitude[4] > 0:
index 0a06494f73af2b9b7c388d57cfbbbc0193da52c1..a697ea4554f0ff68b12d7e7ce4c048307d8a2f79 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.mxbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class MX(dns.rdtypes.mxbase.MXBase):
 
     """MX record"""
index d4c8572c81afa2901d6e87b9cbabbe6791d1aa85..d53e96765d90361d39d1bf8f892f85b82d6a7c64 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.txtbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class NINFO(dns.rdtypes.txtbase.TXTBase):
 
     """NINFO record"""
index f9fcf637f73f56af6ea62e0fe0d7851ecece7fc5..a0cc232a143bb58c424b25dae729abeb751521ca 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.nsbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class NS(dns.rdtypes.nsbase.NSBase):
 
     """NS record"""
index 626d33997dac75fe4bc38a87d2ea1daf7f84e659..c7bde1c5504fa0be336611ddebcd3610aca90a42 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.rdatatype
 import dns.name
 import dns.rdtypes.util
 
 
+@dns.immutable.immutable
 class Bitmap(dns.rdtypes.util.Bitmap):
     type_name = 'NSEC'
 
 
+@dns.immutable.immutable
 class NSEC(dns.rdata.Rdata):
 
     """NSEC record"""
@@ -34,8 +37,8 @@ class NSEC(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, next, windows):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'next', next)
-        object.__setattr__(self, 'windows', dns.rdata._constify(windows))
+        self.next = self.as_value(next)
+        self.windows = self.as_value(dns.rdata._constify(windows))
 
     def to_text(self, origin=None, relativize=True, **kw):
         next = self.next.choose_relativity(origin, relativize)
index 91471f0f571e0a837196aae180e5a0e2820d3651..8c9a66be2a84bca2737d5dc4031f75c0d74cc6a2 100644 (file)
@@ -20,6 +20,7 @@ import binascii
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.rdatatype
 import dns.rdtypes.util
@@ -37,10 +38,12 @@ SHA1 = 1
 OPTOUT = 1
 
 
+@dns.immutable.immutable
 class Bitmap(dns.rdtypes.util.Bitmap):
     type_name = 'NSEC3'
 
 
+@dns.immutable.immutable
 class NSEC3(dns.rdata.Rdata):
 
     """NSEC3 record"""
@@ -50,15 +53,15 @@ class NSEC3(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt,
                  next, windows):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'flags', flags)
-        object.__setattr__(self, 'iterations', iterations)
+        self.algorithm = self.as_value(algorithm)
+        self.flags = self.as_value(flags)
+        self.iterations = self.as_value(iterations)
         if isinstance(salt, str):
-            object.__setattr__(self, 'salt', salt.encode())
+            self.salt = self.as_value(salt.encode())
         else:
-            object.__setattr__(self, 'salt', salt)
-        object.__setattr__(self, 'next', next)
-        object.__setattr__(self, 'windows', dns.rdata._constify(windows))
+            self.salt = self.as_value(salt)
+        self.next = self.as_value(next)
+        self.windows = self.as_value(dns.rdata._constify(windows))
 
     def to_text(self, origin=None, relativize=True, **kw):
         next = base64.b32encode(self.next).translate(
index 31ab8b776f8bc10a594189b340645a6dad1636c3..d31116fc4e900302ae322fed07524baec400bd3e 100644 (file)
@@ -19,9 +19,11 @@ import struct
 import binascii
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 
 
+@dns.immutable.immutable
 class NSEC3PARAM(dns.rdata.Rdata):
 
     """NSEC3PARAM record"""
@@ -30,13 +32,13 @@ class NSEC3PARAM(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'flags', flags)
-        object.__setattr__(self, 'iterations', iterations)
+        self.algorithm = self.as_value(algorithm)
+        self.flags = self.as_value(flags)
+        self.iterations = self.as_value(iterations)
         if isinstance(salt, str):
-            object.__setattr__(self, 'salt', salt.encode())
+            self.salt = self.as_value(salt.encode())
         else:
-            object.__setattr__(self, 'salt', salt)
+            self.salt = self.as_value(salt)
 
     def to_text(self, origin=None, relativize=True, **kw):
         if self.salt == b'':
index f632132e29827ccacfc9e7c9179d66aeed8a6702..44b6087faa9eab7783d990af91060ed932488ac4 100644 (file)
 import base64
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.tokenizer
 
+@dns.immutable.immutable
 class OPENPGPKEY(dns.rdata.Rdata):
 
     """OPENPGPKEY record"""
@@ -29,7 +31,7 @@ class OPENPGPKEY(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, key):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'key', key)
+        self.key = self.as_value(key)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return dns.rdata._base64ify(self.key)
index 5d86d82802fa64da010f52c9368f4ef0d648bbbe..d962689405c6197e3585802bd526ef3e9c52cb93 100644 (file)
@@ -18,6 +18,7 @@
 import struct
 
 import dns.edns
+import dns.immutable
 import dns.exception
 import dns.rdata
 
@@ -25,6 +26,7 @@ import dns.rdata
 # We don't implement from_text, and that's ok.
 # pylint: disable=abstract-method
 
+@dns.immutable.immutable
 class OPT(dns.rdata.Rdata):
 
     """OPT record"""
@@ -43,7 +45,7 @@ class OPT(dns.rdata.Rdata):
         """
 
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'options', dns.rdata._constify(options))
+        self.options = self.as_value(dns.rdata._constify(options))
 
     def _to_wire(self, file, compress=None, origin=None, canonicalize=False):
         for opt in self.options:
index 20cd50761d826f023557a9f0d16d6143b28e35a6..265bed0353c97096f29aa466806965cdd9c13cc8 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.nsbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class PTR(dns.rdtypes.nsbase.NSBase):
 
     """PTR record"""
index a6054da9b5c3d19f7719f3019dc1ddb1e2db1b2d..d872727bca43d3baf7515e9562b1e1f074c90f60 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.name
 
 
+@dns.immutable.immutable
 class RP(dns.rdata.Rdata):
 
     """RP record"""
@@ -30,8 +32,8 @@ class RP(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, mbox, txt):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'mbox', mbox)
-        object.__setattr__(self, 'txt', txt)
+        self.mbox = self.as_value(mbox)
+        self.txt = self.as_value(txt)
 
     def to_text(self, origin=None, relativize=True, **kw):
         mbox = self.mbox.choose_relativity(origin, relativize)
index 2077d905fb5c871b820e9a26bdde9f13229dcdba..53cc55a6069663e8bffec3e6e0c2484eda12959c 100644 (file)
@@ -21,6 +21,7 @@ import struct
 import time
 
 import dns.dnssec
+import dns.immutable
 import dns.exception
 import dns.rdata
 import dns.rdatatype
@@ -50,6 +51,7 @@ def posixtime_to_sigtime(what):
     return time.strftime('%Y%m%d%H%M%S', time.gmtime(what))
 
 
+@dns.immutable.immutable
 class RRSIG(dns.rdata.Rdata):
 
     """RRSIG record"""
@@ -62,15 +64,15 @@ class RRSIG(dns.rdata.Rdata):
                  original_ttl, expiration, inception, key_tag, signer,
                  signature):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'type_covered', type_covered)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'labels', labels)
-        object.__setattr__(self, 'original_ttl', original_ttl)
-        object.__setattr__(self, 'expiration', expiration)
-        object.__setattr__(self, 'inception', inception)
-        object.__setattr__(self, 'key_tag', key_tag)
-        object.__setattr__(self, 'signer', signer)
-        object.__setattr__(self, 'signature', signature)
+        self.type_covered = self.as_value(type_covered)
+        self.algorithm = self.as_value(algorithm)
+        self.labels = self.as_value(labels)
+        self.original_ttl = self.as_value(original_ttl)
+        self.expiration = self.as_value(expiration)
+        self.inception = self.as_value(inception)
+        self.key_tag = self.as_value(key_tag)
+        self.signer = self.as_value(signer)
+        self.signature = self.as_value(signature)
 
     def covers(self):
         return self.type_covered
index d0feb79e9d958cd67be85ff05ed2bdc1a350095a..8d9c6bd0556b907950cae942735a936df107f350 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.mxbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class RT(dns.rdtypes.mxbase.UncompressedDowncasingMX):
 
     """RT record"""
index 32b0a8663322f0c001924a814f05a201fb7a4840..e56938464b3d194c403cb3054a8a55c91792007e 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.name
 
 
+@dns.immutable.immutable
 class SOA(dns.rdata.Rdata):
 
     """SOA record"""
@@ -34,13 +36,13 @@ class SOA(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, mname, rname, serial, refresh, retry,
                  expire, minimum):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'mname', mname)
-        object.__setattr__(self, 'rname', rname)
-        object.__setattr__(self, 'serial', serial)
-        object.__setattr__(self, 'refresh', refresh)
-        object.__setattr__(self, 'retry', retry)
-        object.__setattr__(self, 'expire', expire)
-        object.__setattr__(self, 'minimum', minimum)
+        self.mname = self.as_value(mname)
+        self.rname = self.as_value(rname)
+        self.serial = self.as_value(serial)
+        self.refresh = self.as_value(refresh)
+        self.retry = self.as_value(retry)
+        self.expire = self.as_value(expire)
+        self.minimum = self.as_value(minimum)
 
     def to_text(self, origin=None, relativize=True, **kw):
         mname = self.mname.choose_relativity(origin, relativize)
index f1f6834e0050cdb30162038e567b3e7b29db2797..1190e0deda18d8ab82e5bdab9249f996eb7e0b9e 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.txtbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class SPF(dns.rdtypes.txtbase.TXTBase):
 
     """SPF record"""
index a3cc00391e9be95e260a472e55e2896f6a9e039f..dd222b4f50a405443263dda53e24a4f69b3fa1d4 100644 (file)
@@ -19,9 +19,11 @@ import struct
 import binascii
 
 import dns.rdata
+import dns.immutable
 import dns.rdatatype
 
 
+@dns.immutable.immutable
 class SSHFP(dns.rdata.Rdata):
 
     """SSHFP record"""
@@ -33,9 +35,9 @@ class SSHFP(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, algorithm, fp_type,
                  fingerprint):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'fp_type', fp_type)
-        object.__setattr__(self, 'fingerprint', fingerprint)
+        self.algorithm = self.as_value(algorithm)
+        self.fp_type = self.as_value(fp_type)
+        self.fingerprint = self.as_value(fingerprint)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '%d %d %s' % (self.algorithm,
index 70bac63ba14fd50eaa9c03a0b31ff8c17d584218..871578a2ee3b8f92d43689ba3e1fb56a7380d36e 100644 (file)
@@ -19,10 +19,12 @@ import base64
 import struct
 
 import dns.dnssec
+import dns.immutable
 import dns.exception
 import dns.rdata
 
 
+@dns.immutable.immutable
 class TKEY(dns.rdata.Rdata):
 
     """TKEY Record"""
@@ -33,13 +35,13 @@ class TKEY(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, algorithm, inception, expiration,
                  mode, error, key, other=b''):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'inception', inception)
-        object.__setattr__(self, 'expiration', expiration)
-        object.__setattr__(self, 'mode', mode)
-        object.__setattr__(self, 'error', error)
-        object.__setattr__(self, 'key', dns.rdata._constify(key))
-        object.__setattr__(self, 'other', dns.rdata._constify(other))
+        self.algorithm = self.as_value(algorithm)
+        self.inception = self.as_value(inception)
+        self.expiration = self.as_value(expiration)
+        self.mode = self.as_value(mode)
+        self.error = self.as_value(error)
+        self.key = self.as_value(dns.rdata._constify(key))
+        self.other = self.as_value(dns.rdata._constify(other))
 
     def to_text(self, origin=None, relativize=True, **kw):
         _algorithm = self.algorithm.choose_relativity(origin, relativize)
index 9c9c8662b8f823924d210b36ccdf02bfe419e9ab..5e7dc1917510c0df6f43f30a23035352ed3c77fb 100644 (file)
@@ -19,9 +19,11 @@ import struct
 import binascii
 
 import dns.rdata
+import dns.immutable
 import dns.rdatatype
 
 
+@dns.immutable.immutable
 class TLSA(dns.rdata.Rdata):
 
     """TLSA record"""
@@ -33,10 +35,10 @@ class TLSA(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, usage, selector,
                  mtype, cert):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'usage', usage)
-        object.__setattr__(self, 'selector', selector)
-        object.__setattr__(self, 'mtype', mtype)
-        object.__setattr__(self, 'cert', cert)
+        self.usage = self.as_value(usage)
+        self.selector = self.as_value(selector)
+        self.mtype = self.as_value(mtype)
+        self.cert = self.as_value(cert)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '%d %d %d %s' % (self.usage,
index 85b80be1c478151e39c59112d5be04464b792e2a..e179d620a15b2480c64e037787b8d8a262b576d6 100644 (file)
@@ -19,9 +19,11 @@ import base64
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 
 
+@dns.immutable.immutable
 class TSIG(dns.rdata.Rdata):
 
     """TSIG record"""
@@ -53,13 +55,13 @@ class TSIG(dns.rdata.Rdata):
         """
 
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'time_signed', time_signed)
-        object.__setattr__(self, 'fudge', fudge)
-        object.__setattr__(self, 'mac', dns.rdata._constify(mac))
-        object.__setattr__(self, 'original_id', original_id)
-        object.__setattr__(self, 'error', error)
-        object.__setattr__(self, 'other', dns.rdata._constify(other))
+        self.algorithm = self.as_value(algorithm)
+        self.time_signed = self.as_value(time_signed)
+        self.fudge = self.as_value(fudge)
+        self.mac = self.as_value(dns.rdata._constify(mac))
+        self.original_id = self.as_value(original_id)
+        self.error = self.as_value(error)
+        self.other = self.as_value(dns.rdata._constify(other))
 
     def to_text(self, origin=None, relativize=True, **kw):
         algorithm = self.algorithm.choose_relativity(origin, relativize)
index c5ae919c5e0c446f883eb6abf64c29b8112c8c23..cc4b661107480d9da3e14aca35685418d8c8533d 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.txtbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class TXT(dns.rdtypes.txtbase.TXTBase):
 
     """TXT record"""
index 7d6d06854015c8a81f8dbac57d62717d940dd9e2..0892bd8b298f177549faeb0bc7081c998f15ddcd 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.name
 
 
+@dns.immutable.immutable
 class URI(dns.rdata.Rdata):
 
     """URI record"""
@@ -33,14 +35,14 @@ class URI(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, priority, weight, target):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'priority', priority)
-        object.__setattr__(self, 'weight', weight)
+        self.priority = self.as_value(priority)
+        self.weight = self.as_value(weight)
         if len(target) < 1:
             raise dns.exception.SyntaxError("URI target cannot be empty")
         if isinstance(target, str):
-            object.__setattr__(self, 'target', target.encode())
+            self.target = self.as_value(target.encode())
         else:
-            object.__setattr__(self, 'target', target)
+            self.target = self.as_value(target)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '%d %d "%s"' % (self.priority, self.weight,
index 29b9c4d539cf119874cd74c47ac47c82773644ba..ec2550887b75932fd3c674beb703f09fa5c54d5b 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.tokenizer
 
 
+@dns.immutable.immutable
 class X25(dns.rdata.Rdata):
 
     """X25 record"""
@@ -33,9 +35,9 @@ class X25(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, address):
         super().__init__(rdclass, rdtype)
         if isinstance(address, str):
-            object.__setattr__(self, 'address', address.encode())
+            self.address = self.as_value(address.encode())
         else:
-            object.__setattr__(self, 'address', address)
+            self.address = self.as_value(address)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '"%s"' % dns.rdata._escapify(self.address)
index 0cb89e216a0241b958c39716846da2877e543b54..6bc3afb12cf7e748aa6d0cb69642238abb7346a8 100644 (file)
@@ -18,7 +18,9 @@
 import struct
 
 import dns.rdtypes.mxbase
+import dns.immutable
 
+@dns.immutable.immutable
 class A(dns.rdata.Rdata):
 
     """A record for Chaosnet"""
@@ -30,8 +32,8 @@ class A(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, domain, address):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'domain', domain)
-        object.__setattr__(self, 'address', address)
+        self.domain = self.as_value(domain)
+        self.address = self.as_value(address)
 
     def to_text(self, origin=None, relativize=True, **kw):
         domain = self.domain.choose_relativity(origin, relativize)
index 35ec46f58c45dd13f039c331274dabdd69bf5386..d5870cd3e36080557c92c0c5eb416b0fa49b1475 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.exception
+import dns.immutable
 import dns.ipv4
 import dns.rdata
 import dns.tokenizer
 
 
+@dns.immutable.immutable
 class A(dns.rdata.Rdata):
 
     """A record."""
@@ -31,7 +33,7 @@ class A(dns.rdata.Rdata):
         super().__init__(rdclass, rdtype)
         # check that it's OK
         dns.ipv4.inet_aton(address)
-        object.__setattr__(self, 'address', address)
+        self.address = self.as_value(address)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return self.address
index c37b82a88ade7ac1f128f5106d7acc4e198833db..174b8a616d2f91218e73d31caeeee6ab899d9667 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.exception
+import dns.immutable
 import dns.ipv6
 import dns.rdata
 import dns.tokenizer
 
 
+@dns.immutable.immutable
 class AAAA(dns.rdata.Rdata):
 
     """AAAA record."""
@@ -31,7 +33,7 @@ class AAAA(dns.rdata.Rdata):
         super().__init__(rdclass, rdtype)
         # check that it's OK
         dns.ipv6.inet_aton(address)
-        object.__setattr__(self, 'address', address)
+        self.address = self.as_value(address)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return self.address
index 3b1b8d12a12f12d3bb9eda33ec4c24d2fe8ec090..8c3f2ce8a512af9916cc61abb3a9dd6ac3f5f5fd 100644 (file)
@@ -20,11 +20,13 @@ import codecs
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.ipv4
 import dns.ipv6
 import dns.rdata
 import dns.tokenizer
 
+@dns.immutable.immutable
 class APLItem:
 
     """An APL list item."""
@@ -68,6 +70,7 @@ class APLItem:
         file.write(address)
 
 
+@dns.immutable.immutable
 class APL(dns.rdata.Rdata):
 
     """APL record."""
@@ -78,7 +81,7 @@ class APL(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, items):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'items', dns.rdata._constify(items))
+        self.items = self.as_value(dns.rdata._constify(items))
 
     def to_text(self, origin=None, relativize=True, **kw):
         return ' '.join(map(str, self.items))
index 6f66eb89363855067a3868b6378534a8190a1c3a..d3620fef6f6a73f72ec5c2693b4a0d3f099a8dc3 100644 (file)
 import base64
 
 import dns.exception
+import dns.immutable
 
 
+@dns.immutable.immutable
 class DHCID(dns.rdata.Rdata):
 
     """DHCID record"""
@@ -30,7 +32,7 @@ class DHCID(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, data):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'data', data)
+        self.data = self.as_value(data)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return dns.rdata._base64ify(self.data)
index ad67897043233ef6f9eddb01752a7c169bbedc94..6a67e8ed287e977035f778ddd4a7be13c8071fab 100644 (file)
@@ -1,6 +1,8 @@
 # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
 
 import dns.rdtypes.svcbbase
+import dns.immutable
 
+@dns.immutable.immutable
 class HTTPS(dns.rdtypes.svcbbase.SVCBBase):
     """HTTPS record"""
index 182ad2cbb20e398fbd5c150afb5c4d69023e0766..a18e40e29afd1f32f23565a8caecb2c2a323a75b 100644 (file)
@@ -19,12 +19,14 @@ import struct
 import base64
 
 import dns.exception
+import dns.immutable
 import dns.rdtypes.util
 
 
 class Gateway(dns.rdtypes.util.Gateway):
     name = 'IPSECKEY gateway'
 
+@dns.immutable.immutable
 class IPSECKEY(dns.rdata.Rdata):
 
     """IPSECKEY record"""
@@ -37,11 +39,11 @@ class IPSECKEY(dns.rdata.Rdata):
                  gateway, key):
         super().__init__(rdclass, rdtype)
         Gateway(gateway_type, gateway).check()
-        object.__setattr__(self, 'precedence', precedence)
-        object.__setattr__(self, 'gateway_type', gateway_type)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'gateway', gateway)
-        object.__setattr__(self, 'key', key)
+        self.precedence = self.as_value(precedence)
+        self.gateway_type = self.as_value(gateway_type)
+        self.algorithm = self.as_value(algorithm)
+        self.gateway = self.as_value(gateway)
+        self.key = self.as_value(key)
 
     def to_text(self, origin=None, relativize=True, **kw):
         gateway = Gateway(self.gateway_type, self.gateway).to_text(origin,
index ebf8fd77debdeb849e302eaacc3df05b4ea5dc7a..c27e9215a364e35df76a11ef2f439b88fe3990ca 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.mxbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class KX(dns.rdtypes.mxbase.UncompressedDowncasingMX):
 
     """KX record"""
index f45262cafcef2e5e224e1e8045e24f82f65eccdb..f496b3feb8b8a7948514238dde4a400d7a916db7 100644 (file)
@@ -18,6 +18,7 @@
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.name
 import dns.rdata
 
@@ -35,6 +36,7 @@ def _sanitize(value):
     return value
 
 
+@dns.immutable.immutable
 class NAPTR(dns.rdata.Rdata):
 
     """NAPTR record"""
@@ -47,12 +49,12 @@ class NAPTR(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, order, preference, flags, service,
                  regexp, replacement):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'flags', _sanitize(flags))
-        object.__setattr__(self, 'service', _sanitize(service))
-        object.__setattr__(self, 'regexp', _sanitize(regexp))
-        object.__setattr__(self, 'order', order)
-        object.__setattr__(self, 'preference', preference)
-        object.__setattr__(self, 'replacement', replacement)
+        self.flags = self.as_value(_sanitize(flags))
+        self.service = self.as_value(_sanitize(service))
+        self.regexp = self.as_value(_sanitize(regexp))
+        self.order = self.as_value(order)
+        self.preference = self.as_value(preference)
+        self.replacement = self.as_value(replacement)
 
     def to_text(self, origin=None, relativize=True, **kw):
         replacement = self.replacement.choose_relativity(origin, relativize)
index 78730a1a115481615eaa4748d0411cc9378047bd..76dd2f833f3ec6278a6dcc3d818c38f385ed69b7 100644 (file)
 import binascii
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.tokenizer
 
 
+@dns.immutable.immutable
 class NSAP(dns.rdata.Rdata):
 
     """NSAP record."""
@@ -32,7 +34,7 @@ class NSAP(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, address):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'address', address)
+        self.address = self.as_value(address)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return "0x%s" % binascii.hexlify(self.address).decode()
index a5b66c803fcd550fc4bf9cb6f0229a902c0fc7e4..57dadd4747f6254dff7c7d0b454a662eed7644eb 100644 (file)
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import dns.rdtypes.nsbase
+import dns.immutable
 
 
+@dns.immutable.immutable
 class NSAP_PTR(dns.rdtypes.nsbase.UncompressedNS):
 
     """NSAP-PTR record"""
index 288bb125f1072ffbcf89b062a74eb89dcc1c98de..9e7d24dc257c2076974d35929a980c0807eefaf1 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.name
 
 
+@dns.immutable.immutable
 class PX(dns.rdata.Rdata):
 
     """PX record."""
@@ -32,9 +34,9 @@ class PX(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, preference, map822, mapx400):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'preference', preference)
-        object.__setattr__(self, 'map822', map822)
-        object.__setattr__(self, 'mapx400', mapx400)
+        self.preference = self.as_value(preference)
+        self.map822 = self.as_value(map822)
+        self.mapx400 = self.as_value(mapx400)
 
     def to_text(self, origin=None, relativize=True, **kw):
         map822 = self.map822.choose_relativity(origin, relativize)
index a3debab9c3b55d063b4b9006a31039efec464f98..c3c3b99ad96cd61355c36b70b76c26348067c041 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.name
 
 
+@dns.immutable.immutable
 class SRV(dns.rdata.Rdata):
 
     """SRV record"""
@@ -32,10 +34,10 @@ class SRV(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, priority, weight, port, target):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'priority', priority)
-        object.__setattr__(self, 'weight', weight)
-        object.__setattr__(self, 'port', port)
-        object.__setattr__(self, 'target', target)
+        self.priority = self.as_value(priority)
+        self.weight = self.as_value(weight)
+        self.port = self.as_value(port)
+        self.target = self.as_value(target)
 
     def to_text(self, origin=None, relativize=True, **kw):
         target = self.target.choose_relativity(origin, relativize)
index 8effeb805be17740258d965da3aefaeb8cf215f5..14838e1622472fe47878652867e223600f7fab55 100644 (file)
@@ -1,6 +1,8 @@
 # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
 
 import dns.rdtypes.svcbbase
+import dns.immutable
 
+@dns.immutable.immutable
 class SVCB(dns.rdtypes.svcbbase.SVCBBase):
     """SVCB record"""
index 75444fb5a57dde7e919bdfb391a80332dfa420f4..ba42283dab6019273e9525a5bf4244880d0b2c62 100644 (file)
@@ -19,12 +19,14 @@ import socket
 import struct
 
 import dns.ipv4
+import dns.immutable
 import dns.rdata
 
 _proto_tcp = socket.getprotobyname('tcp')
 _proto_udp = socket.getprotobyname('udp')
 
 
+@dns.immutable.immutable
 class WKS(dns.rdata.Rdata):
 
     """WKS record"""
@@ -35,9 +37,9 @@ class WKS(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, address, protocol, bitmap):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'address', address)
-        object.__setattr__(self, 'protocol', protocol)
-        object.__setattr__(self, 'bitmap', dns.rdata._constify(bitmap))
+        self.address = self.as_value(address)
+        self.protocol = self.as_value(protocol)
+        self.bitmap = self.as_value(dns.rdata._constify(bitmap))
 
     def to_text(self, origin=None, relativize=True, **kw):
         bits = []
index 935ebeb2b17032b4edfe76e6a1e1a38ae82140c6..6686f8d10d3f0a34918f16e7857b6dd7ae49da33 100644 (file)
@@ -20,6 +20,7 @@ import enum
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.dnssec
 import dns.rdata
 
@@ -32,6 +33,7 @@ class Flag(enum.IntFlag):
     ZONE = 0x0100
 
 
+@dns.immutable.immutable
 class DNSKEYBase(dns.rdata.Rdata):
 
     """Base class for rdata that is like a DNSKEY record"""
@@ -40,10 +42,10 @@ class DNSKEYBase(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, flags, protocol, algorithm, key):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'flags', flags)
-        object.__setattr__(self, 'protocol', protocol)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'key', key)
+        self.flags = self.as_value(flags)
+        self.protocol = self.as_value(protocol)
+        self.algorithm = self.as_value(algorithm)
+        self.key = self.as_value(key)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '%d %d %d %s' % (self.flags, self.protocol, self.algorithm,
index d7850beec5e011fc189859ef5bbfc4139c4a2451..baa9e87dcd4d18a6b894e4b223addba917b2c38e 100644 (file)
@@ -19,10 +19,12 @@ import struct
 import binascii
 
 import dns.dnssec
+import dns.immutable
 import dns.rdata
 import dns.rdatatype
 
 
+@dns.immutable.immutable
 class DSBase(dns.rdata.Rdata):
 
     """Base class for rdata that is like a DS record"""
@@ -32,10 +34,10 @@ class DSBase(dns.rdata.Rdata):
     def __init__(self, rdclass, rdtype, key_tag, algorithm, digest_type,
                  digest):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'key_tag', key_tag)
-        object.__setattr__(self, 'algorithm', algorithm)
-        object.__setattr__(self, 'digest_type', digest_type)
-        object.__setattr__(self, 'digest', digest)
+        self.key_tag = self.as_value(key_tag)
+        self.algorithm = self.as_value(algorithm)
+        self.digest_type = self.as_value(digest_type)
+        self.digest = self.as_value(digest)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '%d %d %d %s' % (self.key_tag, self.algorithm,
index ba44571f32a094d70d37b19cc6f6cf19aa192f3b..d71e5c2f7d24ef681aaa97df460870cfc54acdc2 100644 (file)
 import binascii
 
 import dns.rdata
+import dns.immutable
 
 
+@dns.immutable.immutable
 class EUIBase(dns.rdata.Rdata):
 
     """EUIxx record"""
@@ -35,7 +37,7 @@ class EUIBase(dns.rdata.Rdata):
         if len(eui) != self.byte_len:
             raise dns.exception.FormError('EUI%s rdata has to have %s bytes'
                                           % (self.byte_len * 8, self.byte_len))
-        object.__setattr__(self, 'eui', eui)
+        self.eui = self.as_value(eui)
 
     def to_text(self, origin=None, relativize=True, **kw):
         return dns.rdata._hexify(self.eui, chunksize=2).replace(' ', '-')
index 723b762715fc003cf182319b654e880d07a95dc3..525a717804b97257a02ff1cf0227483baf322f9c 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.name
 
 
+@dns.immutable.immutable
 class MXBase(dns.rdata.Rdata):
 
     """Base class for rdata that is like an MX record."""
@@ -32,8 +34,8 @@ class MXBase(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, preference, exchange):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'preference', preference)
-        object.__setattr__(self, 'exchange', exchange)
+        self.preference = self.as_value(preference)
+        self.exchange = self.as_value(exchange)
 
     def to_text(self, origin=None, relativize=True, **kw):
         exchange = self.exchange.choose_relativity(origin, relativize)
@@ -58,6 +60,7 @@ class MXBase(dns.rdata.Rdata):
         return cls(rdclass, rdtype, preference, exchange)
 
 
+@dns.immutable.immutable
 class UncompressedMX(MXBase):
 
     """Base class for rdata that is like an MX record, but whose name
@@ -68,6 +71,7 @@ class UncompressedMX(MXBase):
         super()._to_wire(file, None, origin, False)
 
 
+@dns.immutable.immutable
 class UncompressedDowncasingMX(MXBase):
 
     """Base class for rdata that is like an MX record, but whose name
index 212f8c0a081f9c800d1297e79662f8bc6922e881..e4d9ac5bb3805094f67b662213034868e3e81e60 100644 (file)
 """NS-like base classes."""
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.name
 
 
+@dns.immutable.immutable
 class NSBase(dns.rdata.Rdata):
 
     """Base class for rdata that is like an NS record."""
@@ -30,7 +32,7 @@ class NSBase(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, target):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'target', target)
+        self.target = self.as_value(target)
 
     def to_text(self, origin=None, relativize=True, **kw):
         target = self.target.choose_relativity(origin, relativize)
@@ -51,6 +53,7 @@ class NSBase(dns.rdata.Rdata):
         return cls(rdclass, rdtype, target)
 
 
+@dns.immutable.immutable
 class UncompressedNS(NSBase):
 
     """Base class for rdata that is like an NS record, but whose name
index 9bb835463a8db59b04ebc85266bd36f86776d90d..6dcb1c631d46237d3aaf1ba75714962a93404df6 100644 (file)
@@ -6,6 +6,7 @@ import io
 import struct
 
 import dns.enum
+import dns.immutable
 import dns.exception
 import dns.immutable
 import dns.ipv4
@@ -141,26 +142,26 @@ def _unescape(value, list_mode=False):
         return items[0]
 
 
+@dns.immutable.immutable
 class Param:
     """Abstract base class for SVCB parameters"""
 
-    def __setattr__(self, name, value):
-        # Params are immutable
-        raise TypeError("object doesn't support attribute assignment")
-
-    def __delattr__(self, name):
-        # Params are immutable
-        raise TypeError("object doesn't support attribute deletion")
-
     @classmethod
     def emptiness(cls):
         return Emptiness.NEVER
 
+    def as_value(self, value):
+        # This is the "additional type checking" placeholder that actually
+        # doesn't do any additional checking.
+        return value
+
+
+@dns.immutable.immutable
 class GenericParam(Param):
     """Generic SVCB parameter
     """
     def __init__(self, value):
-        object.__setattr__(self, 'value', value)
+        self.value = self.as_value(value)
 
     @classmethod
     def emptiness(cls):
@@ -188,6 +189,7 @@ class GenericParam(Param):
         file.write(self.value)
 
 
+@dns.immutable.immutable
 class MandatoryParam(Param):
     def __init__(self, keys):
         # check for duplicates
@@ -200,7 +202,7 @@ class MandatoryParam(Param):
             if k == ParamKey.MANDATORY:
                 raise ValueError('listed the mandatory key as mandatory')
         keys = dns.immutable.constify(keys)
-        object.__setattr__(self, 'keys', keys)
+        self.keys = self.as_value(keys)
 
     @classmethod
     def from_value(cls, value):
@@ -226,6 +228,8 @@ class MandatoryParam(Param):
         for key in self.keys:
             file.write(struct.pack('!H', key))
 
+
+@dns.immutable.immutable
 class ALPNParam(Param):
     def __init__(self, ids):
         for id in ids:
@@ -233,7 +237,7 @@ class ALPNParam(Param):
                 raise dns.exception.FormError('empty ALPN')
             if len(id) > 255:
                 raise ValueError('ALPN id too long')
-        object.__setattr__(self, 'ids', dns.immutable.constify(ids))
+        self.ids = self.as_value(dns.immutable.constify(ids))
 
     @classmethod
     def from_value(cls, value):
@@ -255,6 +259,8 @@ class ALPNParam(Param):
             file.write(struct.pack('!B', len(id)))
             file.write(id)
 
+
+@dns.immutable.immutable
 class NoDefaultALPNParam(Param):
     # We don't ever expect to instantiate this class, but we need
     # a from_value() and a from_wire_parser(), so we just return None
@@ -284,11 +290,12 @@ class NoDefaultALPNParam(Param):
         raise NotImplementedError  # pragma: no cover
 
 
+@dns.immutable.immutable
 class PortParam(Param):
     def __init__(self, port):
         if port < 0 or port > 65535:
             raise ValueError('port out-of-range')
-        object.__setattr__(self, 'port', port)
+        self.port = self.as_value(port)
 
     @classmethod
     def from_value(cls, value):
@@ -307,12 +314,13 @@ class PortParam(Param):
         file.write(struct.pack('!H', self.port))
 
 
+@dns.immutable.immutable
 class IPv4HintParam(Param):
     def __init__(self, addresses):
         for address in addresses:
             # check validity
             dns.ipv4.inet_aton(address)
-        object.__setattr__(self, 'addresses', dns.immutable.constify(addresses))
+        self.addresses = self.as_value(dns.immutable.constify(addresses))
 
     @classmethod
     def from_value(cls, value):
@@ -335,12 +343,13 @@ class IPv4HintParam(Param):
             file.write(dns.ipv4.inet_aton(address))
 
 
+@dns.immutable.immutable
 class IPv6HintParam(Param):
     def __init__(self, addresses):
         for address in addresses:
             # check validity
             dns.ipv6.inet_aton(address)
-        object.__setattr__(self, 'addresses', dns.immutable.constify(addresses))
+        self.addresses = self.as_value(dns.immutable.constify(addresses))
 
     @classmethod
     def from_value(cls, value):
@@ -363,9 +372,10 @@ class IPv6HintParam(Param):
             file.write(dns.ipv6.inet_aton(address))
 
 
+@dns.immutable.immutable
 class ECHConfigParam(Param):
     def __init__(self, echconfig):
-        object.__setattr__(self, 'echconfig', echconfig)
+        self.echconfig = self.as_value(echconfig)
 
     @classmethod
     def from_value(cls, value):
@@ -416,6 +426,7 @@ def _validate_and_define(params, key, value):
     params[key] = value
 
 
+@dns.immutable.immutable
 class SVCBBase(dns.rdata.Rdata):
 
     """Base class for SVCB-like records"""
@@ -426,9 +437,9 @@ class SVCBBase(dns.rdata.Rdata):
 
     def __init__(self, rdclass, rdtype, priority, target, params):
         super().__init__(rdclass, rdtype)
-        object.__setattr__(self, 'priority', priority)
-        object.__setattr__(self, 'target', target)
-        object.__setattr__(self, 'params', dns.immutable.constify(params))
+        self.priority = self.as_value(priority)
+        self.target = self.as_value(target)
+        self.params = self.as_value(dns.immutable.constify(params))
         # Make sure any paramater listed as mandatory is present in the
         # record.
         mandatory = params.get(ParamKey.MANDATORY)
index 6d0b6abeb69647c7cf64a15f1d9507f05360aed5..6539c5a4effc558b02266ee6ab77d484efd9041a 100644 (file)
 import struct
 
 import dns.exception
+import dns.immutable
 import dns.rdata
 import dns.tokenizer
 
 
+@dns.immutable.immutable
 class TXTBase(dns.rdata.Rdata):
 
     """Base class for rdata that is like a TXT record (see RFC 1035)."""
@@ -49,7 +51,7 @@ class TXTBase(dns.rdata.Rdata):
             else:
                 string = dns.rdata._constify(string)
             encoded_strings.append(string)
-        object.__setattr__(self, 'strings', tuple(encoded_strings))
+        self.strings = self.as_value(tuple(encoded_strings))
 
     def to_text(self, origin=None, relativize=True, **kw):
         txt = ''