All rdata comparsion now uses the digestable form. master
authorBob Halley <halley@dnspython.org>
Thu, 4 Sep 2014 22:21:32 +0000 (15:21 -0700)
committerBob Halley <halley@dnspython.org>
Thu, 4 Sep 2014 22:21:32 +0000 (15:21 -0700)
33 files changed:
ChangeLog
dns/rdata.py
dns/rdtypes/ANY/CAA.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 cb2bb450b5dfaf6065e419bf50d6ded4b238cec3..c953588e211bcb38903c7c172ad619b37d377e66 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2014-09-04  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.
 
index 350bf790b861942822094b734903711d23f2d151..3a31ae1c44512d93ec2c26a46a434da87a659193 100644 (file)
@@ -207,8 +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 cmp(self.to_digestable(dns.name.root),
+                   other.to_digestable(dns.name.root))
 
     def __eq__(self, other):
         if not isinstance(other, Rdata):
@@ -257,19 +257,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 = cStringIO.StringIO()
-        self.to_wire(b1, None, dns.name.root)
-        b2 = cStringIO.StringIO()
-        other.to_wire(b2, None, dns.name.root)
-        return cmp(b1.getvalue(), b2.getvalue())
-
     def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
         """Build an rdata object from text format.
 
@@ -363,9 +350,6 @@ class GenericRdata(Rdata):
 
     from_wire = classmethod(from_wire)
 
-    def _cmp(self, other):
-        return cmp(self.data, other.data)
-
 _rdata_modules = {}
 _module_prefix = 'dns.rdtypes'
 
index 34a042f52be83ba665431124a90d96ca57312c77..3bd52a09c43674161db726aa0e4e2b6e94e10a28 100644 (file)
@@ -71,13 +71,3 @@ class CAA(dns.rdata.Rdata):
         return cls(rdclass, rdtype, flags, tag, value)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        v = cmp(self.flags, other.flags)
-        if v == 0:
-            v = cmp(len(self.tag), len(other.tag))
-        if v == 0:
-            v = cmp(self.tag, other.tag)
-        if v == 0:
-            v = cmp(self.value, other.value)
-        return v
index c102521a149e72c1d540a695ee33f7ac6b089434..df2ab07b31e90504ee961243a0cedfa261f6bcd6 100644 (file)
@@ -117,15 +117,3 @@ class CERT(dns.rdata.Rdata):
                    certificate)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        f = cStringIO.StringIO()
-        self.to_wire(f)
-        wire1 = f.getvalue()
-        f.seek(0)
-        f.truncate()
-        other.to_wire(f)
-        wire2 = f.getvalue()
-        f.close()
-
-        return cmp(wire1, wire2)
index 7bc5850021e87c63f7489adfdef14c084153abef..cb059337206d8672c187ed033fe07417420eb5bf 100644 (file)
@@ -128,14 +128,6 @@ class DNSKEY(dns.rdata.Rdata):
 
     from_wire = classmethod(from_wire)
 
-    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 = cmp(hs, ho)
-        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])"""
index 38d1d88b287fbd3708dade05e2f3d68cb10ee765..399948114ff251d0f0b22fc6949483bb6c1f762e 100644 (file)
@@ -120,14 +120,6 @@ class GPOS(dns.rdata.Rdata):
 
     from_wire = classmethod(from_wire)
 
-    def _cmp(self, other):
-        v = cmp(self.latitude, other.latitude)
-        if v == 0:
-            v = cmp(self.longitude, other.longitude)
-            if v == 0:
-                v = cmp(self.altitude, other.altitude)
-        return v
-
     def _get_float_latitude(self):
         return float(self.latitude)
 
index 15fd54e69ef03c7ac0dd739b4f9cde124d8b1208..4fe7a0f93fb3cb6b885bcdbdf1c3285922435368 100644 (file)
@@ -75,9 +75,3 @@ class HINFO(dns.rdata.Rdata):
         return cls(rdclass, rdtype, cpu, os)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        v = cmp(self.cpu, other.cpu)
-        if v == 0:
-            v = cmp(self.os, other.os)
-        return v
index 968b36f5e23f09d77fde0c0ee0187db2345eb78c..654d5c79135d96e20d87065a8c8dd9919a727de6 100644 (file)
@@ -111,30 +111,3 @@ class HIP(dns.rdata.Rdata):
             server = server.choose_relativity(origin, relativize)
             servers.append(server)
         self.servers = servers
-
-    def _cmp(self, other):
-        b1 = cStringIO.StringIO()
-        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 = cStringIO.StringIO()
-        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 = 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 = cmp(self.servers[i], other.servers[i])
-            if v != 0:
-                return v
-            i += 1
-        return ls - lo
index 0c2d3cd035b9568539b519b61e1c6770662ff2d9..0a5c01d5519ffa6783d89387bf514a5b948c85c0 100644 (file)
@@ -88,9 +88,3 @@ class ISDN(dns.rdata.Rdata):
         return cls(rdclass, rdtype, address, subaddress)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        v = cmp(self.address, other.address)
-        if v == 0:
-            v = cmp(self.subaddress, other.subaddress)
-        return v
index 6266ae669656bae15f4576324688e265ac80cbab..6cc5521758c2e6dc2ee20a3f7a9eb36a155196b4 100644 (file)
@@ -313,18 +313,6 @@ class LOC(dns.rdata.Rdata):
 
     from_wire = classmethod(from_wire)
 
-    def _cmp(self, other):
-        f = cStringIO.StringIO()
-        self.to_wire(f)
-        wire1 = f.getvalue()
-        f.seek(0)
-        f.truncate()
-        other.to_wire(f)
-        wire2 = f.getvalue()
-        f.close()
-
-        return cmp(wire1, wire2)
-
     def _get_float_latitude(self):
         return _tuple_to_float(self.latitude)
 
index ad113a4b59df673b42a7ed7f89e55450f2f3ca43..fd76cc433f0ebad2a929a9cffc13a745cd9fce9e 100644 (file)
@@ -123,6 +123,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 b42fe4c828bfcbfe45098ae88a9c9586782b6b30..1ed391dc33ee8164b421a184240227ec6985b798 100644 (file)
@@ -175,10 +175,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):
-        b1 = cStringIO.StringIO()
-        self.to_wire(b1)
-        b2 = cStringIO.StringIO()
-        other.to_wire(b2)
-        return cmp(b1.getvalue(), b2.getvalue())
index f514991ac66393be31247802e9f8199888fc269c..e12b04fc7d1ab09ce7073289aa9ae443ae4799f7 100644 (file)
@@ -80,10 +80,3 @@ class NSEC3PARAM(dns.rdata.Rdata):
         return cls(rdclass, rdtype, algorithm, flags, iterations, salt)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        b1 = cStringIO.StringIO()
-        self.to_wire(b1)
-        b2 = cStringIO.StringIO()
-        other.to_wire(b2)
-        return cmp(b1.getvalue(), b2.getvalue())
index 26c55314e136c89184a66bda74a68c37c16e1c3f..cb6b7c8d01b84c0f9b6e8bee1eda8c2a6f53ebaa 100644 (file)
@@ -78,9 +78,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 = cmp(self.mbox, other.mbox)
-        if v == 0:
-            v = cmp(self.txt, other.txt)
-        return v
index 98c548dff2985a9e044ac16fd05e4d4f12921e54..77ce2bfdf5add746b9397354f84b4e9b9c428275 100644 (file)
@@ -150,6 +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):
-        return self._wire_cmp(other)
index 2d6f21b56b9bacbe247e7aca682f91f5f399aeab..de786147054df4903421433c13ea45fbf1cc5e91 100644 (file)
@@ -112,16 +112,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 = cmp(self.mname, other.mname)
-        if v == 0:
-            v = 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 = cmp(self_ints, other_ints)
-        return v
index 4c439511c8b831e89c0a0a0119f7be2534c17796..f5a34c21a729d200ef23ec16eb7a2966bc9b283a 100644 (file)
@@ -74,11 +74,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 = cmp(hs, ho)
-        if v == 0:
-            v = cmp(self.fingerprint, other.fingerprint)
-        return v
index 6ca8c0a596cbaa6539b4eac4ca9fef7624b58d18..92867ef3836d7094cd2a771f5df3b2041d02cfcb 100644 (file)
@@ -79,11 +79,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 = cmp(hs, ho)
-        if v == 0:
-            v = cmp(self.cert, other.cert)
-        return v
index ae91295f8c98094b30dc6ff1e5d677dad1231a3e..47671e4dd936c0378e4097bb0cf6cd5b92b0a638 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 cmp(self.address, other.address)
index 372d3332260eefc8926706b6f1491e9b167ffd6c..945d93488ad7b4a041099953a32e3d5ea6e71332 100644 (file)
@@ -50,8 +50,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 cmp(sa, oa)
index e131bd5070308b7bac9a5aa3b091c21bac96e5c3..65be1c259724491177b555d24ae8d6f2ad2b2c64 100644 (file)
@@ -51,8 +51,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 cmp(sa, oa)
index 59da75b9f43371ad659395ab046d63e870b862a7..6239f078af7c807807184210565c0861a9f8bbbb 100644 (file)
@@ -156,15 +156,3 @@ class APL(dns.rdata.Rdata):
         return cls(rdclass, rdtype, items)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        f = cStringIO.StringIO()
-        self.to_wire(f)
-        wire1 = f.getvalue()
-        f.seek(0)
-        f.truncate()
-        other.to_wire(f)
-        wire2 = f.getvalue()
-        f.close()
-
-        return cmp(wire1, wire2)
index 5524beadd13f283514d6005dc003dedd9f0bb5fc..705e4a4e3d49777e79cd11128c236e3d7f7414cc 100644 (file)
@@ -55,6 +55,3 @@ class DHCID(dns.rdata.Rdata):
         return cls(rdclass, rdtype, data)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        return cmp(self.data, other.data)
index d85b6fe9931b4ae2c58eab01e7b007a53b4db81b..d5d16bd87f7bfb96643e0e75dbd1d494645de558 100644 (file)
@@ -145,15 +145,3 @@ class IPSECKEY(dns.rdata.Rdata):
                    gateway, key)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        f = cStringIO.StringIO()
-        self.to_wire(f)
-        wire1 = f.getvalue()
-        f.seek(0)
-        f.truncate()
-        other.to_wire(f)
-        wire2 = f.getvalue()
-        f.close()
-
-        return cmp(wire1, wire2)
index 7fe043082b397c948b308e37bdd0f63d554238a4..1357c6698d4cbed8111b7588698d969e7d983b08 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 = cmp(sp, op)
-        if v == 0:
-            v = cmp(self.flags, other.flags)
-            if v == 0:
-                v = cmp(self.service, other.service)
-                if v == 0:
-                    v = cmp(self.regexp, other.regexp)
-                    if v == 0:
-                        v = cmp(self.replacement, other.replacement)
-        return v
index 216cb0a81aac33bd0a3746c4c5b08f84398d538b..c20406399b95b8397bfc46849b7b13d03739d63e 100644 (file)
@@ -54,6 +54,3 @@ class NSAP(dns.rdata.Rdata):
         return cls(rdclass, rdtype, address)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        return cmp(self.address, other.address)
index 1422b8348756785bd0a5503dc5a0db82b0e08471..1b86789e2a7cbac0c72c5f98bba4d849a36dd24c 100644 (file)
@@ -85,13 +85,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 = cmp(sp, op)
-        if v == 0:
-            v = cmp(self.map822, other.map822)
-            if v == 0:
-                v = cmp(self.mapx400, other.mapx400)
-        return v
index e101b26beaeb24e8a644b2b83159ed26e78bb8bb..5da202b8f734bcefc73f0e672678c35664d6eb52 100644 (file)
@@ -79,11 +79,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 = cmp(sp, op)
-        if v == 0:
-            v = cmp(self.target, other.target)
-        return v
index 04c3054e449c72c96faf6310ac8163c5d81d69d2..9d01504450b5def8b4d672e19e4f7c783c927dc2 100644 (file)
@@ -99,15 +99,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 = cmp(sa, oa)
-        if v == 0:
-            sp = struct.pack('!B', self.protocol)
-            op = struct.pack('!B', other.protocol)
-            v = cmp(sp, op)
-            if v == 0:
-                v = cmp(self.bitmap, other.bitmap)
-        return v
index 6f5559a7e4ed5c53f39338583991e6f564a20d3a..abcc57a73e87da508e91113d36a9fc599b8c37c6 100644 (file)
@@ -80,13 +80,3 @@ class DSBase(dns.rdata.Rdata):
         return cls(rdclass, rdtype, header[0], header[1], header[2], digest)
 
     from_wire = classmethod(from_wire)
-
-    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 = cmp(hs, ho)
-        if v == 0:
-            v = cmp(self.digest, other.digest)
-        return v
index abc6a9ed5b241867f350da9ba0647299c6320d39..754aff59a727b690510ab4028c3c7e9206e4871c 100644 (file)
@@ -76,14 +76,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 = cmp(sp, op)
-        if v == 0:
-            v = 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
index fbd5ef1e51eb027f8189d26335dab0106d577408..84f088a16417e47c0be2bbcdb95c9bf7e597f940 100644 (file)
@@ -65,9 +65,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 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
index 580f056ea0999d81e59fddaebfc7424e297f8dbc..cf4b4cef9aa2f1b4eaa81425c84c944ba50a3d4c 100644 (file)
@@ -82,6 +82,3 @@ class TXTBase(dns.rdata.Rdata):
         return cls(rdclass, rdtype, strings)
 
     from_wire = classmethod(from_wire)
-
-    def _cmp(self, other):
-        return cmp(self.strings, other.strings)