]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
All rdata comparsion now uses the digestable form.
authorBob Halley <halley@dnspython.org>
Fri, 5 Sep 2014 15:10:16 +0000 (08:10 -0700)
committerBob Halley <halley@dnspython.org>
Fri, 5 Sep 2014 15:10:16 +0000 (08:10 -0700)
32 files changed:
ChangeLog
dns/rdata.py
dns/rdtypes/ANY/CERT.py
dns/rdtypes/ANY/DNSKEY.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/NSEC.py
dns/rdtypes/ANY/NSEC3.py
dns/rdtypes/ANY/NSEC3PARAM.py
dns/rdtypes/ANY/RP.py
dns/rdtypes/ANY/RRSIG.py
dns/rdtypes/ANY/SOA.py
dns/rdtypes/ANY/SSHFP.py
dns/rdtypes/ANY/TLSA.py
dns/rdtypes/ANY/X25.py
dns/rdtypes/IN/A.py
dns/rdtypes/IN/AAAA.py
dns/rdtypes/IN/APL.py
dns/rdtypes/IN/DHCID.py
dns/rdtypes/IN/IPSECKEY.py
dns/rdtypes/IN/NAPTR.py
dns/rdtypes/IN/NSAP.py
dns/rdtypes/IN/PX.py
dns/rdtypes/IN/SRV.py
dns/rdtypes/IN/WKS.py
dns/rdtypes/dsbase.py
dns/rdtypes/mxbase.py
dns/rdtypes/nsbase.py
dns/rdtypes/txtbase.py

index b28613fceb27a47479a3af0895924280391f4fe9..a6a52de0c322566bb75d5107f50120a3f7d31840 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2014-09-05  Bob Halley  <halley@dnspython.org>
+
+       * Comparing two rdata is now always done by comparing the binary
+         data of the DNSSEC digestable forms.  This corrects a number of
+         errors where dnspython's rdata comparsion order was not the
+         DNSSEC order.
+
+       * Add CAA implementation.  Thanks to Brian Wellington for the
+         patch.
+
 2014-09-01  Bob Halley  <halley@dnspython.org>
 
        * (Version 1.12.0 released)
index 74ddef0b05afbfd63110cc23447d7af87a352cd9..46fa08908ee5098874eb9eed9413dff61eea0350 100644 (file)
@@ -207,7 +207,8 @@ class Rdata(object):
         rdclass.  Return < 0 if self < other in the DNSSEC ordering,
         0 if self == other, and > 0 if self > other.
         """
-        raise NotImplementedError
+        return dns.util.cmp(self.to_digestable(dns.name.root),
+                            other.to_digestable(dns.name.root))
 
     def __eq__(self, other):
         if not isinstance(other, Rdata):
@@ -260,19 +261,6 @@ class Rdata(object):
     def __hash__(self):
         return hash(self.to_digestable(dns.name.root))
 
-    def _wire_cmp(self, other):
-        # A number of types compare rdata in wire form, so we provide
-        # the method here instead of duplicating it.
-        #
-        # We specifiy an arbitrary origin of '.' when doing the
-        # comparison, since the rdata may have relative names and we
-        # can't convert a relative name to wire without an origin.
-        b1 = io.BytesIO()
-        self.to_wire(b1, None, dns.name.root)
-        b2 = io.BytesIO()
-        other.to_wire(b2, None, dns.name.root)
-        return dns.util.cmp(b1.getvalue(), b2.getvalue())
-
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
         """Build an rdata object from text format.
@@ -362,9 +350,6 @@ class GenericRdata(Rdata):
     def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin = None):
         return cls(rdclass, rdtype, wire[current : current + rdlen])
 
-    def _cmp(self, other):
-        return dns.util.cmp(self.data, other.data)
-
 _rdata_modules = {}
 _module_prefix = 'dns.rdtypes'
 
index f7a397fb2918a309ef2c3ad35343322350f23123..4c27212972e32c9cb7c48f65b52ea678ad7d7bb2 100644 (file)
@@ -119,15 +119,3 @@ class CERT(dns.rdata.Rdata):
                    certificate)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        f = io.BytesIO()
-        self.to_wire(f)
-        wire1 = f.getvalue()
-        f.seek(0)
-        f.truncate()
-        other.to_wire(f)
-        wire2 = f.getvalue()
-        f.close()
-
-        return dns.util.cmp(wire1, wire2)
index 246a2fd494c75587b53744b9d26369fbee8a3749..0c9a42f35c206714dbeab3573a822057736ef316 100644 (file)
@@ -127,14 +127,6 @@ class DNSKEY(dns.rdata.Rdata):
         return cls(rdclass, rdtype, header[0], header[1], header[2],
                    key)
 
-    def _cmp(self, other):
-        hs = struct.pack("!HBB", self.flags, self.protocol, self.algorithm)
-        ho = struct.pack("!HBB", other.flags, other.protocol, other.algorithm)
-        v = dns.util.cmp(hs, ho)
-        if v == 0:
-            v = dns.util.cmp(self.key, other.key)
-        return v
-
     def flags_to_text_set(self):
         """Convert a DNSKEY flags value to set texts
         @rtype: set([string])"""
index 5952c3c807013e9a080520b64ceb8b36dcb24f40..c560c0a3a68b724935986c6bda112b446138c65d 100644 (file)
@@ -115,14 +115,6 @@ class GPOS(dns.rdata.Rdata):
 
     from_wire = classmethod(from_wire)
 
-    def _cmp(self, other):
-        v = dns.util.cmp(self.latitude, other.latitude)
-        if v == 0:
-            v = dns.util.cmp(self.longitude, other.longitude)
-            if v == 0:
-                v = dns.util.cmp(self.altitude, other.altitude)
-        return v
-
     def _get_float_latitude(self):
         return float(self.latitude)
 
index 12e26094e67238b6aed38751805f2dd7e5211c3f..4abb62415f17c99bb0c976db78e740835ed3c3e6 100644 (file)
@@ -74,9 +74,3 @@ class HINFO(dns.rdata.Rdata):
         return cls(rdclass, rdtype, cpu, os)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        v = dns.util.cmp(self.cpu, other.cpu)
-        if v == 0:
-            v = dns.util.cmp(self.os, other.os)
-        return v
index 60f78dc1224b1e97db7a985ce3ef018df142f9eb..bb48069a8c3994b7c344d90ba4170aa707506bf6 100644 (file)
@@ -113,30 +113,3 @@ class HIP(dns.rdata.Rdata):
             server = server.choose_relativity(origin, relativize)
             servers.append(server)
         self.servers = servers
-
-    def _cmp(self, other):
-        b1 = io.BytesIO()
-        lh = len(self.hit)
-        lk = len(self.key)
-        b1.write(struct.pack("!BBH", lh, self.algorithm, lk))
-        b1.write(self.hit)
-        b1.write(self.key)
-        b2 = io.BytesIO()
-        lh = len(other.hit)
-        lk = len(other.key)
-        b2.write(struct.pack("!BBH", lh, other.algorithm, lk))
-        b2.write(other.hit)
-        b2.write(other.key)
-        v = dns.util.cmp(b1.getvalue(), b2.getvalue())
-        if v != 0:
-            return v
-        ls = len(self.servers)
-        lo = len(other.servers)
-        count = min(ls, lo)
-        i = 0
-        while i < count:
-            v = dns.util.cmp(self.servers[i], other.servers[i])
-            if v != 0:
-                return v
-            i += 1
-        return ls - lo
index d292a89d0b33b249448dc63aef06fb900ade4226..1bd4b3da299c48c328f1ab9b15d420b71a261dbb 100644 (file)
@@ -87,9 +87,3 @@ class ISDN(dns.rdata.Rdata):
         return cls(rdclass, rdtype, address, subaddress)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        v = dns.util.cmp(self.address, other.address)
-        if v == 0:
-            v = dns.util.cmp(self.subaddress, other.subaddress)
-        return v
index 0c9bbdd0b85777c0a290cac726bd92c577334e8a..f240c6737786770dd56beca6be67410b9398bc96 100644 (file)
@@ -313,18 +313,6 @@ class LOC(dns.rdata.Rdata):
 
     from_wire = classmethod(from_wire)
 
-    def _cmp(self, other):
-        f = io.BytesIO()
-        self.to_wire(f)
-        wire1 = f.getvalue()
-        f.seek(0)
-        f.truncate()
-        other.to_wire(f)
-        wire2 = f.getvalue()
-        f.close()
-
-        return dns.util.cmp(wire1, wire2)
-
     def _get_float_latitude(self):
         return _tuple_to_float(self.latitude)
 
index b3f0220bdc17d5ddba5e5f1152de4fb423f21bdf..eb6ac2fd5e6d8cd08fefb88be7c3052154ffcffe 100644 (file)
@@ -124,6 +124,3 @@ class NSEC(dns.rdata.Rdata):
 
     def choose_relativity(self, origin = None, relativize = True):
         self.next = self.next.choose_relativity(origin, relativize)
-
-    def _cmp(self, other):
-        return self._wire_cmp(other)
index 76a28671639277abac03a4f9497ac589de616836..ec0aa48fa4fb09a3e808b5ea055c26cae0090744 100644 (file)
@@ -178,6 +178,3 @@ class NSEC3(dns.rdata.Rdata):
         return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, windows)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        return self._wire_cmp(other)
index ede686323b15ab80c411714d17bf238f9f2bd2f9..bddc2a90cb94923cf499ad8f466ff7f142bae6ff 100644 (file)
@@ -82,6 +82,3 @@ class NSEC3PARAM(dns.rdata.Rdata):
         return cls(rdclass, rdtype, algorithm, flags, iterations, salt)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        return self._wire_cmp(other)
index f7afca065f037d5bf1bd98c614fa2ec04822f113..c22be998ab101cc778f954b5b5334f5a23ca6c02 100644 (file)
@@ -79,9 +79,3 @@ class RP(dns.rdata.Rdata):
     def choose_relativity(self, origin = None, relativize = True):
         self.mbox = self.mbox.choose_relativity(origin, relativize)
         self.txt = self.txt.choose_relativity(origin, relativize)
-
-    def _cmp(self, other):
-        v = dns.util.cmp(self.mbox, other.mbox)
-        if v == 0:
-            v = dns.util.cmp(self.txt, other.txt)
-        return v
index b45e0c9d5a45c189d2e5f8918f947fc4b44fd389..6f39cb81103df6be5e0f326c9db3a848f5901c60 100644 (file)
@@ -150,19 +150,3 @@ class RRSIG(dns.rdata.Rdata):
 
     def choose_relativity(self, origin = None, relativize = True):
         self.signer = self.signer.choose_relativity(origin, relativize)
-
-    def _cmp(self, other):
-        hs = struct.pack('!HBBIIIH', self.type_covered,
-                         self.algorithm, self.labels,
-                         self.original_ttl, self.expiration,
-                         self.inception, self.key_tag)
-        ho = struct.pack('!HBBIIIH', other.type_covered,
-                         other.algorithm, other.labels,
-                         other.original_ttl, other.expiration,
-                         other.inception, other.key_tag)
-        v = dns.util.cmp(hs, ho)
-        if v == 0:
-            v = dns.util.cmp(self.signer, other.signer)
-            if v == 0:
-                v = dns.util.cmp(self.signature, other.signature)
-        return v
index be010f868dce27375d027e825b3f1dff260de0de..00d5b1a583c3e94c3dc7702409966089137b6ec0 100644 (file)
@@ -113,16 +113,3 @@ class SOA(dns.rdata.Rdata):
     def choose_relativity(self, origin = None, relativize = True):
         self.mname = self.mname.choose_relativity(origin, relativize)
         self.rname = self.rname.choose_relativity(origin, relativize)
-
-    def _cmp(self, other):
-        v = dns.util.cmp(self.mname, other.mname)
-        if v == 0:
-            v = dns.util.cmp(self.rname, other.rname)
-            if v == 0:
-                self_ints = struct.pack('!IIIII', self.serial, self.refresh,
-                                        self.retry, self.expire, self.minimum)
-                other_ints = struct.pack('!IIIII', other.serial, other.refresh,
-                                         other.retry, other.expire,
-                                         other.minimum)
-                v = dns.util.cmp(self_ints, other_ints)
-        return v
index b7ee254436999e00c93d636788ce29b310dc54ea..43afaa33cb3956875ca6c4ef6c636da68d6bbbed 100644 (file)
@@ -75,11 +75,3 @@ class SSHFP(dns.rdata.Rdata):
         return cls(rdclass, rdtype, header[0], header[1], fingerprint)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        hs = struct.pack("!BB", self.algorithm, self.fp_type)
-        ho = struct.pack("!BB", other.algorithm, other.fp_type)
-        v = dns.util.cmp(hs, ho)
-        if v == 0:
-            v = dns.util.cmp(self.fingerprint, other.fingerprint)
-        return v
index d4320e497d603926330a92228bc3edb46e68697e..76c8c5233d71c9316ca22af525bf5c0ee3db19e9 100644 (file)
@@ -80,11 +80,3 @@ class TLSA(dns.rdata.Rdata):
         return cls(rdclass, rdtype, header[0], header[1], header[2], cert)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        hs = struct.pack("!BBB", self.usage, self.selector, self.mtype)
-        ho = struct.pack("!BBB", other.usage, other.selector, other.mtype)
-        v = dns.util.cmp(hs, ho)
-        if v == 0:
-            v = dns.util.cmp(self.cert, other.cert)
-        return v
index 33ebd45f2894304ad44031c4366bca9208add77a..3d6f9277ae2e6510259f973d6f9988fd11da7b52 100644 (file)
@@ -57,6 +57,3 @@ class X25(dns.rdata.Rdata):
         return cls(rdclass, rdtype, address)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        return dns.util.cmp(self.address, other.address)
index e21640649625386bb0489b26800f85b0aa3a6704..df4f6ed98c67def554802cfa194a46bc12e854cb 100644 (file)
@@ -51,8 +51,3 @@ class A(dns.rdata.Rdata):
         return cls(rdclass, rdtype, address)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        sa = dns.ipv4.inet_aton(self.address)
-        oa = dns.ipv4.inet_aton(other.address)
-        return dns.util.cmp(sa, oa)
index e955d14754d3aa593d8e737b262cec5ac38146d5..ee4c73570306e8d1f7872ac184692a5eccaa766d 100644 (file)
@@ -52,8 +52,3 @@ class AAAA(dns.rdata.Rdata):
         return cls(rdclass, rdtype, address)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        sa = dns.inet.inet_pton(dns.inet.AF_INET6, self.address)
-        oa = dns.inet.inet_pton(dns.inet.AF_INET6, other.address)
-        return dns.util.cmp(sa, oa)
index 58e35b662cc1e28f2d83a21d7533e80f5093b65e..0f2f175c2a2b70873c6952ac62d446d6e139c03c 100644 (file)
@@ -157,15 +157,3 @@ class APL(dns.rdata.Rdata):
         return cls(rdclass, rdtype, items)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        f = io.BytesIO()
-        self.to_wire(f)
-        wire1 = f.getvalue()
-        f.seek(0)
-        f.truncate()
-        other.to_wire(f)
-        wire2 = f.getvalue()
-        f.close()
-
-        return dns.util.cmp(wire1, wire2)
index 898cc91af7e160b95978d44b73688104503fd538..260b11842264f1f113fb697446d507b489ca168f 100644 (file)
@@ -58,6 +58,3 @@ class DHCID(dns.rdata.Rdata):
         return cls(rdclass, rdtype, data)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        return dns.util.cmp(self.data, other.data)
index 3ae3495e93303fa52cab791cfdf0156a2d4fefc9..02db282932a9a1f1a00ea275a868242110ca38c1 100644 (file)
@@ -147,15 +147,3 @@ class IPSECKEY(dns.rdata.Rdata):
                    gateway, key)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        f = io.BytesIO()
-        self.to_wire(f)
-        wire1 = f.getvalue()
-        f.seek(0)
-        f.truncate()
-        other.to_wire(f)
-        wire2 = f.getvalue()
-        f.close()
-
-        return dns.util.cmp(wire1, wire2)
index 51408088bccfa86f40513462062d821df6059b87..725389c7835206b2e7a1535b2bb6b3b8f4c2aa1f 100644 (file)
@@ -116,17 +116,3 @@ class NAPTR(dns.rdata.Rdata):
     def choose_relativity(self, origin = None, relativize = True):
         self.replacement = self.replacement.choose_relativity(origin,
                                                               relativize)
-
-    def _cmp(self, other):
-        sp = struct.pack("!HH", self.order, self.preference)
-        op = struct.pack("!HH", other.order, other.preference)
-        v = dns.util.cmp(sp, op)
-        if v == 0:
-            v = dns.util.cmp(self.flags, other.flags)
-            if v == 0:
-                v = dns.util.cmp(self.service, other.service)
-                if v == 0:
-                    v = dns.util.cmp(self.regexp, other.regexp)
-                    if v == 0:
-                        v = dns.util.cmp(self.replacement, other.replacement)
-        return v
index faa2f6c2b97fbeb0b79c3407ba53265b4e4f12fc..7ffdd10da13f7dce5b8983fdc3706a7096033e74 100644 (file)
@@ -55,6 +55,3 @@ class NSAP(dns.rdata.Rdata):
         return cls(rdclass, rdtype, address)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        return dns.util.cmp(self.address, other.address)
index b848e5c754e6e52900f8c864723b7a7a2ee143f2..70ae66b14e241f612345e452eb9465ceec6fb5fc 100644 (file)
@@ -86,13 +86,3 @@ class PX(dns.rdata.Rdata):
     def choose_relativity(self, origin = None, relativize = True):
         self.map822 = self.map822.choose_relativity(origin, relativize)
         self.mapx400 = self.mapx400.choose_relativity(origin, relativize)
-
-    def _cmp(self, other):
-        sp = struct.pack("!H", self.preference)
-        op = struct.pack("!H", other.preference)
-        v = dns.util.cmp(sp, op)
-        if v == 0:
-            v = dns.util.cmp(self.map822, other.map822)
-            if v == 0:
-                v = dns.util.cmp(self.mapx400, other.mapx400)
-        return v
index 64449d7527eac4732a9f4c380c4c5e0f0e5885d7..3bc9e1e558d5170af9e609cfda9e9af33dec0eca 100644 (file)
@@ -80,11 +80,3 @@ class SRV(dns.rdata.Rdata):
 
     def choose_relativity(self, origin = None, relativize = True):
         self.target = self.target.choose_relativity(origin, relativize)
-
-    def _cmp(self, other):
-        sp = struct.pack("!HHH", self.priority, self.weight, self.port)
-        op = struct.pack("!HHH", other.priority, other.weight, other.port)
-        v = dns.util.cmp(sp, op)
-        if v == 0:
-            v = dns.util.cmp(self.target, other.target)
-        return v
index 8a9137bf96182961ce04394868f2f78a54bbfe9c..f73c41a22a15aea4645f3f4abc7c9aeec03365ac 100644 (file)
@@ -96,15 +96,3 @@ class WKS(dns.rdata.Rdata):
         return cls(rdclass, rdtype, address, protocol, bitmap)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        sa = dns.ipv4.inet_aton(self.address)
-        oa = dns.ipv4.inet_aton(other.address)
-        v = dns.util.cmp(sa, oa)
-        if v == 0:
-            sp = struct.pack('!B', self.protocol)
-            op = struct.pack('!B', other.protocol)
-            v = dns.util.cmp(sp, op)
-            if v == 0:
-                v = dns.util.cmp(self.bitmap, other.bitmap)
-        return v
index fac237dbf1ae7c4dcd62f322627bd268a6927af3..1b6817ae5e7014a74074af5280b0022045e6ea30 100644 (file)
@@ -78,13 +78,3 @@ class DSBase(dns.rdata.Rdata):
         rdlen -= 4
         digest = wire[current : current + rdlen].unwrap()
         return cls(rdclass, rdtype, header[0], header[1], header[2], digest)
-
-    def _cmp(self, other):
-        hs = struct.pack("!HBB", self.key_tag, self.algorithm,
-                         self.digest_type)
-        ho = struct.pack("!HBB", other.key_tag, other.algorithm,
-                         other.digest_type)
-        v = dns.util.cmp(hs, ho)
-        if v == 0:
-            v = dns.util.cmp(self.digest, other.digest)
-        return v
index 4f6206f01c4f940e16c4196b907ff09c0eb876bb..167ebad76d05feb18941ef33c1ea3125ebc7d85f 100644 (file)
@@ -15,6 +15,7 @@
 
 """MX-like base classes."""
 
+import io
 import struct
 
 import dns.exception
@@ -74,14 +75,6 @@ class MXBase(dns.rdata.Rdata):
     def choose_relativity(self, origin = None, relativize = True):
         self.exchange = self.exchange.choose_relativity(origin, relativize)
 
-    def _cmp(self, other):
-        sp = struct.pack("!H", self.preference)
-        op = struct.pack("!H", other.preference)
-        v = dns.util.cmp(sp, op)
-        if v == 0:
-            v = dns.util.cmp(self.exchange, other.exchange)
-        return v
-
 class UncompressedMX(MXBase):
     """Base class for rdata that is like an MX record, but whose name
     is not compressed when converted to DNS wire format, and whose
@@ -91,7 +84,9 @@ class UncompressedMX(MXBase):
         super(UncompressedMX, self).to_wire(file, None, origin)
 
     def to_digestable(self, origin = None):
-        return self.to_wire(f, None, origin)
+        f = io.BytesIO()
+        self.to_wire(f, None, origin)
+        return f.getvalue()
 
 class UncompressedDowncasingMX(MXBase):
     """Base class for rdata that is like an MX record, but whose name
index 37c35a95b3526af74fbfe6250cfae672cc3d82fb..615fa5d8ac390302543f33d14c7272eaaacbe3ec 100644 (file)
@@ -64,9 +64,6 @@ class NSBase(dns.rdata.Rdata):
     def choose_relativity(self, origin = None, relativize = True):
         self.target = self.target.choose_relativity(origin, relativize)
 
-    def _cmp(self, other):
-        return dns.util.cmp(self.target, other.target)
-
 class UncompressedNS(NSBase):
     """Base class for rdata that is like an NS record, but whose name
     is not compressed when convert to DNS wire format, and whose
@@ -76,4 +73,4 @@ class UncompressedNS(NSBase):
         super(UncompressedNS, self).to_wire(file, None, origin)
 
     def to_digestable(self, origin = None):
-        return self.to_wire(None, None, origin)
+        return self.target.to_wire(None, None, origin)
index 0554f62ecffc63753dd4053ec648d9d6ba1d3f4f..c6cbb5983e89397126b4d36f7de201074c766f87 100644 (file)
@@ -80,6 +80,3 @@ class TXTBase(dns.rdata.Rdata):
             rdlen -= l
             strings.append(s)
         return cls(rdclass, rdtype, strings)
-
-    def _cmp(self, other):
-        return dns.util.cmp(self.strings, other.strings)