jcollie pushed to python-dns (master). "1.12.0"

notifications at fedoraproject.org notifications at fedoraproject.org
Fri Apr 3 15:35:03 UTC 2015


>From 1c1e3cdf9ad04ff435f9c0f217aeee8850b36863 Mon Sep 17 00:00:00 2001
From: "Jeffrey C. Ollie" <jeff at ocjtech.us>
Date: Fri, 3 Apr 2015 10:34:50 -0500
Subject: 1.12.0


diff --git a/.gitignore b/.gitignore
index c93f436..a548a01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,7 @@
 /dnspython-1.11.1.tar.gz.asc
 /dnspython3-1.11.1.tar.gz
 /dnspython3-1.11.1.tar.gz.asc
+/dnspython-1.12.0.tar.gz
+/dnspython-1.12.0.tar.gz.asc
+/dnspython3-1.12.0.tar.gz
+/dnspython3-1.12.0.tar.gz.asc
diff --git a/dnspython-1.10.1-tlsa.patch b/dnspython-1.10.1-tlsa.patch
deleted file mode 100644
index 31aca18..0000000
--- a/dnspython-1.10.1-tlsa.patch
+++ /dev/null
@@ -1,175 +0,0 @@
-commit 38d5ea59581275eafcf55f2d677056875483fa2f
-Author: Pieter Lexis <pieter at plexis.eu>
-Date:   Mon Sep 17 23:58:20 2012 +0200
-
-    Add TLSA (RFC 6698) record type
-
-diff --git a/dns/rdatatype.py b/dns/rdatatype.py
-index 380cfcd..f64307a 100644
---- a/dns/rdatatype.py
-+++ b/dns/rdatatype.py
-@@ -78,6 +78,7 @@ DNSKEY = 48
- DHCID = 49
- NSEC3 = 50
- NSEC3PARAM = 51
-+TLSA = 52
- HIP = 55
- SPF = 99
- UNSPEC = 103
-@@ -140,6 +141,7 @@ _by_text = {
-     'DHCID' : DHCID,
-     'NSEC3' : NSEC3,
-     'NSEC3PARAM' : NSEC3PARAM,
-+    'TLSA' : TLSA,
-     'HIP' : HIP,
-     'SPF' : SPF,
-     'UNSPEC' : UNSPEC,
-diff --git a/dns/rdtypes/ANY/TLSA.py b/dns/rdtypes/ANY/TLSA.py
-new file mode 100644
-index 0000000..6ca8c0a
---- /dev/null
-+++ b/dns/rdtypes/ANY/TLSA.py
-@@ -0,0 +1,89 @@
-+# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc.
-+#
-+# Permission to use, copy, modify, and distribute this software and its
-+# documentation for any purpose with or without fee is hereby granted,
-+# provided that the above copyright notice and this permission notice
-+# appear in all copies.
-+#
-+# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-+
-+import struct
-+
-+import dns.rdata
-+import dns.rdatatype
-+
-+class TLSA(dns.rdata.Rdata):
-+    """TLSA record
-+
-+    @ivar usage: The certificate usage
-+    @type usage: int
-+    @ivar selector: The selector field
-+    @type selector: int
-+    @ivar mtype: The 'matching type' field
-+    @type mtype: int
-+    @ivar cert: The 'Certificate Association Data' field
-+    @type cert: string
-+    @see: RFC 6698"""
-+
-+    __slots__ = ['usage', 'selector', 'mtype', 'cert']
-+
-+    def __init__(self, rdclass, rdtype, usage, selector,
-+                 mtype, cert):
-+        super(TLSA, self).__init__(rdclass, rdtype)
-+        self.usage = usage
-+        self.selector = selector
-+        self.mtype = mtype
-+        self.cert = cert
-+
-+    def to_text(self, origin=None, relativize=True, **kw):
-+        return '%d %d %d %s' % (self.usage,
-+                                self.selector,
-+                                self.mtype,
-+                                dns.rdata._hexify(self.cert,
-+                                               chunksize=128))
-+
-+    def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
-+        usage = tok.get_uint8()
-+        selector = tok.get_uint8()
-+        mtype = tok.get_uint8()
-+        cert_chunks = []
-+        while 1:
-+            t = tok.get().unescape()
-+            if t.is_eol_or_eof():
-+                break
-+            if not t.is_identifier():
-+                raise dns.exception.SyntaxError
-+            cert_chunks.append(t.value)
-+        cert = ''.join(cert_chunks)
-+        cert = cert.decode('hex_codec')
-+        return cls(rdclass, rdtype, usage, selector, mtype, cert)
-+
-+    from_text = classmethod(from_text)
-+
-+    def to_wire(self, file, compress = None, origin = None):
-+        header = struct.pack("!BBB", self.usage, self.selector, self.mtype)
-+        file.write(header)
-+        file.write(self.cert)
-+
-+    def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin = None):
-+        header = struct.unpack("!BBB", wire[current : current + 3])
-+        current += 3
-+        rdlen -= 3
-+        cert = wire[current : current + rdlen].unwrap()
-+        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
-diff --git a/dns/rdtypes/ANY/__init__.py b/dns/rdtypes/ANY/__init__.py
-index 721e9dd..cfb0be6 100644
---- a/dns/rdtypes/ANY/__init__.py
-+++ b/dns/rdtypes/ANY/__init__.py
-@@ -33,6 +33,7 @@ __all__ = [
-     'NSEC',
-     'NSEC3',
-     'NSEC3PARAM',
-+    'TLSA',
-     'PTR',
-     'RP',
-     'RRSIG',
-diff --git a/tests/example b/tests/example
-index 2f753a2..71fb8e6 100644
---- a/tests/example
-+++ b/tests/example
-@@ -165,6 +165,9 @@ srv02			SRV	65535 65535 65535 old-slow-box.example.com.
- $TTL 301	; 5 minutes 1 second
- t			A	73.80.65.49
- $TTL 3600	; 1 hour
-+tlsa1			TLSA	3 1 1 01a9cdf989b504fe5dca90c0d2167b6550570734f7c763e09fdf88904e06157065
-+tlsa2			TLSA	1 0 1 efddf0d915c7bdc5782c0881e1b2a95ad099fbdd06d7b1f77982d9364338d955
-+tlsa3			TLSA	1 0 2 81ee7f6c0ecc6b09b7785a9418f54432de630dd54dc6ee9e3c49de547708d236d4c413c3e97e44f969e635958aa410495844127c04883503e5b024cf7a8f6a94
- txt01			TXT	"foo"
- txt02			TXT	"foo" "bar"
- txt03			TXT	"foo"
-diff --git a/tests/example1.good b/tests/example1.good
-index 0834d17..4c2d01a 100644
---- a/tests/example1.good
-+++ b/tests/example1.good
-@@ -90,6 +90,9 @@ srv01 3600 IN SRV 0 0 0 .
- srv02 3600 IN SRV 65535 65535 65535 old-slow-box.example.com.
- sshfp1 3600 IN SSHFP 1 1 aa549bfe898489c02d1715d97d79c57ba2fa76ab
- t 301 IN A 73.80.65.49
-+tlsa1 3600 IN TLSA 3 1 1 01a9cdf989b504fe5dca90c0d2167b6550570734f7c763e09fdf88904e06157065
-+tlsa2 3600 IN TLSA 1 0 1 efddf0d915c7bdc5782c0881e1b2a95ad099fbdd06d7b1f77982d9364338d955
-+tlsa3 3600 IN TLSA 1 0 2 81ee7f6c0ecc6b09b7785a9418f54432de630dd54dc6ee9e3c49de547708d236d4c413c3e97e44f969e635958aa410495844127c04883503e5b024cf7a8f6a94
- txt01 3600 IN TXT "foo"
- txt02 3600 IN TXT "foo" "bar"
- txt03 3600 IN TXT "foo"
-diff --git a/tests/example2.good b/tests/example2.good
-index de4bcd5..1bf6b59 100644
---- a/tests/example2.good
-+++ b/tests/example2.good
-@@ -90,6 +90,9 @@ srv01.example. 3600 IN SRV 0 0 0 .
- srv02.example. 3600 IN SRV 65535 65535 65535 old-slow-box.example.com.
- sshfp1.example. 3600 IN SSHFP 1 1 aa549bfe898489c02d1715d97d79c57ba2fa76ab
- t.example. 301 IN A 73.80.65.49
-+tlsa1.example. 3600 IN TLSA 3 1 1 01a9cdf989b504fe5dca90c0d2167b6550570734f7c763e09fdf88904e06157065
-+tlsa2.example. 3600 IN TLSA 1 0 1 efddf0d915c7bdc5782c0881e1b2a95ad099fbdd06d7b1f77982d9364338d955
-+tlsa3.example. 3600 IN TLSA 1 0 2 81ee7f6c0ecc6b09b7785a9418f54432de630dd54dc6ee9e3c49de547708d236d4c413c3e97e44f969e635958aa410495844127c04883503e5b024cf7a8f6a94
- txt01.example. 3600 IN TXT "foo"
- txt02.example. 3600 IN TXT "foo" "bar"
- txt03.example. 3600 IN TXT "foo"
diff --git a/dnspython-1.11.1-ecdsa-loc.patch b/dnspython-1.11.1-ecdsa-loc.patch
deleted file mode 100644
index 7c1aba5..0000000
--- a/dnspython-1.11.1-ecdsa-loc.patch
+++ /dev/null
@@ -1,1671 +0,0 @@
-diff -Naur dnspython-orig/dnspython-1.11.1/ChangeLog dnspython/dnspython-1.11.1/ChangeLog
---- dnspython-orig/dnspython-1.11.1/ChangeLog	2013-09-02 14:50:25.000000000 -0400
-+++ dnspython/dnspython-1.11.1/ChangeLog	2014-02-18 18:36:33.484753464 -0500
-@@ -1,3 +1,9 @@
-+2013-12-11  Bob Halley  <halley at dnspython.org>
-+
-+	* dns/query.py: Fix problems with the IXFR state machine which caused
-+	  long diffs to fail.  Thanks to James Raftery for the fix and the
-+	  repeated prodding to get it applied :)
-+
- 2013-09-02  Bob Halley  <halley at dnspython.org>
- 
- 	* (Version 1.11.1 released)
-diff -Naur dnspython-orig/dnspython-1.11.1/dns/dnssec.py dnspython/dnspython-1.11.1/dns/dnssec.py
---- dnspython-orig/dnspython-1.11.1/dns/dnssec.py	2013-08-09 13:03:27.000000000 -0400
-+++ dnspython/dnspython-1.11.1/dns/dnssec.py	2014-02-18 18:36:33.485753475 -0500
-@@ -45,6 +45,8 @@
- RSASHA1NSEC3SHA1 = 7
- RSASHA256 = 8
- RSASHA512 = 10
-+ECDSAP256SHA256 = 13
-+ECDSAP384SHA384 = 14
- INDIRECT = 252
- PRIVATEDNS = 253
- PRIVATEOID = 254
-@@ -60,6 +62,8 @@
-     'RSASHA256' : RSASHA256,
-     'RSASHA512' : RSASHA512,
-     'INDIRECT' : INDIRECT,
-+    'ECDSAP256SHA256' : ECDSAP256SHA256,
-+    'ECDSAP384SHA384' : ECDSAP384SHA384,
-     'PRIVATEDNS' : PRIVATEDNS,
-     'PRIVATEOID' : PRIVATEOID,
-     }
-@@ -153,6 +157,9 @@
- def _is_dsa(algorithm):
-     return algorithm in (DSA, DSANSEC3SHA1)
- 
-+def _is_ecdsa(algorithm):
-+    return _have_ecdsa and (algorithm in (ECDSAP256SHA256, ECDSAP384SHA384))
-+
- def _is_md5(algorithm):
-     return algorithm == RSAMD5
- 
-@@ -161,7 +168,10 @@
-                          DSANSEC3SHA1, RSASHA1NSEC3SHA1)
- 
- def _is_sha256(algorithm):
--    return algorithm == RSASHA256
-+    return algorithm in (RSASHA256, ECDSAP256SHA256)
-+
-+def _is_sha384(algorithm):
-+    return algorithm == ECDSAP384SHA384
- 
- def _is_sha512(algorithm):
-     return algorithm == RSASHA512
-@@ -173,6 +183,8 @@
-         return dns.hash.get('SHA1')()
-     if _is_sha256(algorithm):
-         return dns.hash.get('SHA256')()
-+    if _is_sha384(algorithm):
-+        return dns.hash.get('SHA384')()
-     if _is_sha512(algorithm):
-         return dns.hash.get('SHA512')()
-     raise ValidationFailure, 'unknown hash for algorithm %u' % algorithm
-@@ -274,6 +286,30 @@
-             (dsa_r, dsa_s) = struct.unpack('!20s20s', rrsig.signature[1:])
-             sig = (Crypto.Util.number.bytes_to_long(dsa_r),
-                    Crypto.Util.number.bytes_to_long(dsa_s))
-+        elif _is_ecdsa(rrsig.algorithm):
-+            if rrsig.algorithm == ECDSAP256SHA256:
-+                curve = ecdsa.curves.NIST256p
-+                key_len = 32
-+                digest_len = 32
-+            elif rrsig.algorithm == ECDSAP384SHA384:
-+                curve = ecdsa.curves.NIST384p
-+                key_len = 48
-+                digest_len = 48
-+            else:
-+                # shouldn't happen
-+                raise ValidationFailure, 'unknown ECDSA curve'
-+            keyptr = candidate_key.key
-+            x = Crypto.Util.number.bytes_to_long(keyptr[0:key_len])
-+            y = Crypto.Util.number.bytes_to_long(keyptr[key_len:key_len * 2])
-+            assert ecdsa.ecdsa.point_is_valid(curve.generator, x, y)
-+            point = ecdsa.ellipticcurve.Point(curve.curve, x, y, curve.order)
-+            verifying_key = ecdsa.keys.VerifyingKey.from_public_point(point,
-+                                                                      curve)
-+            pubkey = ECKeyWrapper(verifying_key, key_len)
-+            r = rrsig.signature[:key_len]
-+            s = rrsig.signature[key_len:]
-+            sig = ecdsa.ecdsa.Signature(Crypto.Util.number.bytes_to_long(r),
-+                                        Crypto.Util.number.bytes_to_long(s))
-         else:
-             raise ValidationFailure, 'unknown algorithm %u' % rrsig.algorithm
- 
-@@ -302,7 +338,7 @@
-             digest = _make_algorithm_id(rrsig.algorithm) + digest
-             padlen = keylen // 8 - len(digest) - 3
-             digest = chr(0) + chr(1) + chr(0xFF) * padlen + chr(0) + digest
--        elif _is_dsa(rrsig.algorithm):
-+        elif _is_dsa(rrsig.algorithm) or _is_ecdsa(rrsig.algorithm):
-             pass
-         else:
-             # Raise here for code clarity; this won't actually ever happen
-@@ -372,3 +408,21 @@
- except ImportError:
-     validate = _need_pycrypto
-     validate_rrsig = _need_pycrypto
-+
-+try:
-+    import ecdsa
-+    import ecdsa.ecdsa
-+    import ecdsa.ellipticcurve
-+    import ecdsa.keys
-+    _have_ecdsa = True
-+
-+    class ECKeyWrapper(object):
-+        def __init__(self, key, key_len):
-+            self.key = key
-+            self.key_len = key_len
-+        def verify(self, digest, sig):
-+            diglong = Crypto.Util.number.bytes_to_long(digest)
-+            return self.key.pubkey.verifies(diglong, sig)
-+
-+except ImportError:
-+    _have_ecdsa = False
-diff -Naur dnspython-orig/dnspython-1.11.1/dns/query.py dnspython/dnspython-1.11.1/dns/query.py
---- dnspython-orig/dnspython-1.11.1/dns/query.py	2013-08-26 12:04:21.000000000 -0400
-+++ dnspython/dnspython-1.11.1/dns/query.py	2014-02-18 18:36:33.486753487 -0500
-@@ -411,6 +411,8 @@
-         tcpmsg = struct.pack("!H", l) + wire
-         _net_write(s, tcpmsg, expiration)
-     done = False
-+    delete_mode = True
-+    expecting_SOA = False
-     soa_rrset = None
-     soa_count = 0
-     if relativize:
-@@ -439,18 +441,16 @@
-         tsig_ctx = r.tsig_ctx
-         first = False
-         answer_index = 0
--        delete_mode = False
--        expecting_SOA = False
-         if soa_rrset is None:
-             if not r.answer or r.answer[0].name != oname:
--                raise dns.exception.FormError
-+                raise dns.exception.FormError("No answer or RRset not for qname")
-             rrset = r.answer[0]
-             if rrset.rdtype != dns.rdatatype.SOA:
-                 raise dns.exception.FormError("first RRset is not an SOA")
-             answer_index = 1
-             soa_rrset = rrset.copy()
-             if rdtype == dns.rdatatype.IXFR:
--                if soa_rrset[0].serial == serial:
-+                if soa_rrset[0].serial <= serial:
-                     #
-                     # We're already up-to-date.
-                     #
-@@ -471,7 +471,14 @@
-                     expecting_SOA = False
-                 elif rdtype == dns.rdatatype.IXFR:
-                     delete_mode = not delete_mode
--                if rrset == soa_rrset and not delete_mode:
-+                #
-+                # If this SOA RRset is equal to the first we saw then we're
-+                # finished. If this is an IXFR we also check that we're seeing
-+                # the record in the expected part of the response.
-+                #
-+                if rrset == soa_rrset and \
-+                        (rdtype == dns.rdatatype.AXFR or \
-+                        (rdtype == dns.rdatatype.IXFR and delete_mode)):
-                     done = True
-             elif expecting_SOA:
-                 #
-diff -Naur dnspython-orig/dnspython-1.11.1/dns/rdtypes/ANY/LOC.py dnspython/dnspython-1.11.1/dns/rdtypes/ANY/LOC.py
---- dnspython-orig/dnspython-1.11.1/dns/rdtypes/ANY/LOC.py	2011-07-09 10:05:21.000000000 -0400
-+++ dnspython/dnspython-1.11.1/dns/rdtypes/ANY/LOC.py	2014-02-18 18:36:33.487753499 -0500
-@@ -22,6 +22,11 @@
- _pows = (1L, 10L, 100L, 1000L, 10000L, 100000L, 1000000L, 10000000L,
-          100000000L, 1000000000L, 10000000000L)
- 
-+# default values are in centimeters
-+_default_size = 100.0
-+_default_hprec = 1000000.0
-+_default_vprec = 1000.0
-+
- def _exponent_of(what, desc):
-     exp = None
-     for i in xrange(len(_pows)):
-@@ -98,13 +103,14 @@
-                  'horizontal_precision', 'vertical_precision']
- 
-     def __init__(self, rdclass, rdtype, latitude, longitude, altitude,
--                 size=1.0, hprec=10000.0, vprec=10.0):
-+                 size=_default_size, hprec=_default_hprec, vprec=_default_vprec):
-         """Initialize a LOC record instance.
- 
-         The parameters I{latitude} and I{longitude} may be either a 4-tuple
-         of integers specifying (degrees, minutes, seconds, milliseconds),
-         or they may be floating point values specifying the number of
--        degrees.  The other parameters are floats."""
-+        degrees. The other parameters are floats. Size, horizontal precision,
-+        and vertical precision are specified in centimeters."""
- 
-         super(LOC, self).__init__(rdclass, rdtype)
-         if isinstance(latitude, int) or isinstance(latitude, long):
-@@ -141,8 +147,10 @@
-             self.longitude[3], long_hemisphere, self.altitude / 100.0
-             )
- 
--        if self.size != 1.0 or self.horizontal_precision != 10000.0 or \
--           self.vertical_precision != 10.0:
-+        # do not print default values
-+        if self.size != _default_size or \
-+            self.horizontal_precision != _default_hprec or \
-+            self.vertical_precision != _default_vprec:
-             text += " %0.2fm %0.2fm %0.2fm" % (
-                 self.size / 100.0, self.horizontal_precision / 100.0,
-                 self.vertical_precision / 100.0
-@@ -152,9 +160,9 @@
-     def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
-         latitude = [0, 0, 0, 0]
-         longitude = [0, 0, 0, 0]
--        size = 1.0
--        hprec = 10000.0
--        vprec = 10.0
-+        size = _default_size
-+        hprec = _default_hprec
-+        vprec = _default_vprec
- 
-         latitude[0] = tok.get_int()
-         t = tok.get_string()
-@@ -240,8 +248,8 @@
-                     value = token.value
-                     if value[-1] == 'm':
-                         value = value[0 : -1]
--                        vprec = float(value) * 100.0	# m -> cm
--                        tok.get_eol()
-+                    vprec = float(value) * 100.0	# m -> cm
-+                    tok.get_eol()
- 
-         return cls(rdclass, rdtype, latitude, longitude, altitude,
-                    size, hprec, vprec)
-diff -Naur dnspython-orig/dnspython-1.11.1/tests/dnssec.py dnspython/dnspython-1.11.1/tests/dnssec.py
---- dnspython-orig/dnspython-1.11.1/tests/dnssec.py	2013-03-31 06:33:53.000000000 -0400
-+++ dnspython/dnspython-1.11.1/tests/dnssec.py	2014-02-18 18:36:33.487753499 -0500
-@@ -97,6 +97,40 @@
- example_ds_sha256 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DS,
-                                         '18673 3 2 eb8344cbbf07c9d3d3d6c81d10c76653e28d8611a65e639ef8f716e4e4e5d913')
- 
-+when3 = 1379801800
-+
-+abs_ecdsa256_keys = { abs_example :
-+                      dns.rrset.from_text('example.', 86400, 'IN', 'DNSKEY',
-+                                          "256 3 13 +3ss1sCpdARVA61DJigEsL/8quo2a8MszKtn2gkkfxgzFs8S2UHtpb4N fY+XFmNW+JK6MsCkI3jHYN8eEQUgMw==",
-+                                          "257 3 13 eJCEVH7AS3wnoaQpaNlAXH0W8wxymtT9P6P3qjN2ZCV641ED8pF7wZ5V yWfOpgTs6oaZevbJgehl/GaRPUgVyQ==")
-+                 }
-+
-+abs_ecdsa256_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                       'ns1.example. hostmaster.example. 4 10800 3600 604800 86400')
-+
-+abs_other_ecdsa256_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                             'ns1.example. hostmaster.example. 2 10800 3600 604800 86401')
-+
-+abs_ecdsa256_soa_rrsig = dns.rrset.from_text('example.', 86400, 'IN', 'RRSIG',
-+                                             "SOA 13 1 86400 20130921221753 20130921221638 7460 example. Sm09SOGz1ULB5D/duwdE2Zpn8bWbVBM77H6N1wPkc42LevvVO+kZEjpq 2nq4GOMJcih52667GIAbMrwmU5P2MQ==")
-+
-+when4 = 1379804850
-+
-+abs_ecdsa384_keys = { abs_example :
-+                      dns.rrset.from_text('example.', 86400, 'IN', 'DNSKEY',
-+                                          "256 3 14 1bG8qWviKNXQX3BIuG6/T5jrP1FISiLW/8qGF6BsM9DQtWYhhZUA3Owr OAEiyHAhQwjkN2kTvWiAYoPN80Ii+5ff9/atzY4F9W50P4l75Dj9PYrL HN/hLUgWMNVc9pvA",
-+                                          "257 3 14 mSub2n0KRt6u2FaD5XJ3oQu0R4XvB/9vUJcyW6+oo0y+KzfQeTdkf1ro ZMVKoyWXW9zUKBYGJpMUIdbAxzrYi7f5HyZ3yDpBFz1hw9+o3CX+gtgb +RyhHfJDwwFXBid9")
-+                 }
-+
-+abs_ecdsa384_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                       'ns1.example. hostmaster.example. 2 10800 3600 604800 86400')
-+
-+abs_other_ecdsa384_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                             'ns1.example. hostmaster.example. 2 10800 3600 604800 86401')
-+
-+abs_ecdsa384_soa_rrsig = dns.rrset.from_text('example.', 86400, 'IN', 'RRSIG',
-+                                             "SOA 14 1 86400 20130929021229 20130921230729 63571 example. CrnCu34EeeRz0fEhL9PLlwjpBKGYW8QjBjFQTwd+ViVLRAS8tNkcDwQE NhSV89NEjj7ze1a/JcCfcJ+/mZgnvH4NHLNg3Tf6KuLZsgs2I4kKQXEk 37oIHravPEOlGYNI")
-+
- class DNSSECValidatorTestCase(unittest.TestCase):
- 
-     def testAbsoluteRSAGood(self):
-@@ -143,6 +177,35 @@
-         ds = dns.dnssec.make_ds(abs_example, example_sep_key, 'SHA256')
-         self.failUnless(ds == example_ds_sha256)
- 
-+    @unittest.skipIf(not dns.dnssec._have_ecdsa,
-+                     "python ECDSA can not be imported")
-+    def testAbsoluteECDSA256Good(self):
-+        dns.dnssec.validate(abs_ecdsa256_soa, abs_ecdsa256_soa_rrsig,
-+                            abs_ecdsa256_keys, None, when3)
-+
-+    @unittest.skipIf(not dns.dnssec._have_ecdsa,
-+                     "python ECDSA can not be imported")
-+    def testAbsoluteECDSA256Bad(self):
-+        def bad():
-+            dns.dnssec.validate(abs_other_ecdsa256_soa, abs_ecdsa256_soa_rrsig,
-+                                abs_ecdsa256_keys, None, when3)
-+        self.failUnlessRaises(dns.dnssec.ValidationFailure, bad)
-+
-+    @unittest.skipIf(not dns.dnssec._have_ecdsa,
-+                     "python ECDSA can not be imported")
-+    def testAbsoluteECDSA384Good(self):
-+        dns.dnssec.validate(abs_ecdsa384_soa, abs_ecdsa384_soa_rrsig,
-+                            abs_ecdsa384_keys, None, when4)
-+
-+    @unittest.skipIf(not dns.dnssec._have_ecdsa,
-+                     "python ECDSA can not be imported")
-+    def testAbsoluteECDSA384Bad(self):
-+        def bad():
-+            dns.dnssec.validate(abs_other_ecdsa384_soa, abs_ecdsa384_soa_rrsig,
-+                                abs_ecdsa384_keys, None, when4)
-+        self.failUnlessRaises(dns.dnssec.ValidationFailure, bad)
-+
-+
- if __name__ == '__main__':
-     import_ok = False
-     try:
-diff -Naur dnspython-orig/dnspython-1.11.1/tests/rdtypeanyloc.py dnspython/dnspython-1.11.1/tests/rdtypeanyloc.py
---- dnspython-orig/dnspython-1.11.1/tests/rdtypeanyloc.py	1969-12-31 19:00:00.000000000 -0500
-+++ dnspython/dnspython-1.11.1/tests/rdtypeanyloc.py	2014-02-18 18:36:33.488753510 -0500
-@@ -0,0 +1,68 @@
-+# Copyright (C) 2014 Red Hat, Inc.
-+# Author: Petr Spacek <pspacek at redhat.com>
-+#
-+# Permission to use, copy, modify, and distribute this software and its
-+# documentation for any purpose with or without fee is hereby granted,
-+# provided that the above copyright notice and this permission notice
-+# appear in all copies.
-+#
-+# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES
-+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-+
-+import unittest
-+
-+import dns.rrset
-+import dns.rdtypes.ANY.LOC
-+
-+class RdtypeAnyLocTestCase(unittest.TestCase):
-+
-+    def testEqual1(self):
-+        '''Test default values for size, horizontal and vertical precision.'''
-+        r1 = dns.rrset.from_text('foo', 300, 'IN', 'LOC',
-+                                 '49 11 42.400 N 16 36 29.600 E 227.64m')
-+        r2 = dns.rrset.from_text('FOO', 600, 'in', 'loc',
-+                                 '49 11 42.400 N 16 36 29.600 E 227.64m '
-+                                 '1.00m 10000.00m 10.00m')
-+        self.failUnless(r1 == r2, '"%s" != "%s"' % (r1, r2))
-+
-+    def testEqual2(self):
-+        '''Test default values for size, horizontal and vertical precision.'''
-+        r1 = dns.rdtypes.ANY.LOC.LOC(1, 29, (49, 11, 42, 400),
-+                                     (16, 36, 29, 600), 22764.0) # centimeters
-+        r2 = dns.rdtypes.ANY.LOC.LOC(1, 29, (49, 11, 42, 400),
-+                                     (16, 36, 29, 600), 22764.0, # centimeters
-+                                     100.0, 1000000.00, 1000.0)  # centimeters
-+        self.failUnless(r1 == r2, '"%s" != "%s"' % (r1, r2))
-+
-+    def testEqual3(self):
-+        '''Test size, horizontal and vertical precision parsers: 100 cm == 1 m.
-+
-+        Parsers in from_text() and __init__() have to produce equal results.'''
-+        r1 = dns.rdtypes.ANY.LOC.LOC(1, 29, (49, 11, 42, 400),
-+                                     (16, 36, 29, 600), 22764.0,
-+                                     200.0, 1000.00, 200.0)      # centimeters
-+        r2 = dns.rrset.from_text('FOO', 600, 'in', 'loc',
-+                                 '49 11 42.400 N 16 36 29.600 E 227.64m '
-+                                 '2.00m 10.00m 2.00m')[0]
-+        self.failUnless(r1 == r2, '"%s" != "%s"' % (r1, r2))
-+
-+    def testEqual4(self):
-+        '''Test size, horizontal and vertical precision parsers without unit.
-+
-+        Parsers in from_text() and __init__() have produce equal result
-+        for values with and without trailing "m".'''
-+        r1 = dns.rdtypes.ANY.LOC.LOC(1, 29, (49, 11, 42, 400),
-+                                     (16, 36, 29, 600), 22764.0,
-+                                     200.0, 1000.00, 200.0)      # centimeters
-+        r2 = dns.rrset.from_text('FOO', 600, 'in', 'loc',
-+                                 '49 11 42.400 N 16 36 29.600 E 227.64 '
-+                                 '2 10 2')[0] # meters without explicit unit
-+        self.failUnless(r1 == r2, '"%s" != "%s"' % (r1, r2))
-+
-+if __name__ == '__main__':
-+    unittest.main()
-diff -Naur dnspython-orig/dnspython3-1.11.1/ChangeLog dnspython/dnspython3-1.11.1/ChangeLog
---- dnspython-orig/dnspython3-1.11.1/ChangeLog	2013-09-02 14:59:21.000000000 -0400
-+++ dnspython/dnspython3-1.11.1/ChangeLog	2014-02-18 18:36:33.489753522 -0500
-@@ -1,3 +1,9 @@
-+2013-12-11  Bob Halley  <halley at dnspython.org>
-+
-+	* dns/query.py: Fix problems with the IXFR state machine which caused
-+	  long diffs to fail.  Thanks to James Raftery for the fix and the
-+	  repeated prodding to get it applied :)
-+
- 2013-09-02  Bob Halley  <halley at dnspython.org>
- 
- 	* (Version 1.11.1 released)
-diff -Naur dnspython-orig/dnspython3-1.11.1/dns/dnssec.py dnspython/dnspython3-1.11.1/dns/dnssec.py
---- dnspython-orig/dnspython3-1.11.1/dns/dnssec.py	2013-08-09 13:04:11.000000000 -0400
-+++ dnspython/dnspython3-1.11.1/dns/dnssec.py	2014-02-18 18:37:09.537175404 -0500
-@@ -45,6 +45,8 @@
- RSASHA1NSEC3SHA1 = 7
- RSASHA256 = 8
- RSASHA512 = 10
-+ECDSAP256SHA256 = 13
-+ECDSAP384SHA384 = 14
- INDIRECT = 252
- PRIVATEDNS = 253
- PRIVATEOID = 254
-@@ -60,6 +62,8 @@
-     'RSASHA256' : RSASHA256,
-     'RSASHA512' : RSASHA512,
-     'INDIRECT' : INDIRECT,
-+    'ECDSAP256SHA256' : ECDSAP256SHA256,
-+    'ECDSAP384SHA384' : ECDSAP384SHA384,
-     'PRIVATEDNS' : PRIVATEDNS,
-     'PRIVATEOID' : PRIVATEOID,
-     }
-@@ -153,6 +157,9 @@
- def _is_dsa(algorithm):
-     return algorithm in (DSA, DSANSEC3SHA1)
- 
-+def _is_ecdsa(algorithm):
-+    return _have_ecdsa and (algorithm in (ECDSAP256SHA256, ECDSAP384SHA384))
-+
- def _is_md5(algorithm):
-     return algorithm == RSAMD5
- 
-@@ -161,7 +168,10 @@
-                          DSANSEC3SHA1, RSASHA1NSEC3SHA1)
- 
- def _is_sha256(algorithm):
--    return algorithm == RSASHA256
-+    return algorithm in (RSASHA256, ECDSAP256SHA256)
-+
-+def _is_sha384(algorithm):
-+    return algorithm == ECDSAP384SHA384
- 
- def _is_sha512(algorithm):
-     return algorithm == RSASHA512
-@@ -173,6 +183,8 @@
-         return dns.hash.get('SHA1')()
-     if _is_sha256(algorithm):
-         return dns.hash.get('SHA256')()
-+    if _is_sha384(algorithm):
-+        return dns.hash.get('SHA384')()
-     if _is_sha512(algorithm):
-         return dns.hash.get('SHA512')()
-     raise ValidationFailure('unknown hash for algorithm %u' % algorithm)
-@@ -274,6 +286,30 @@
-             (dsa_r, dsa_s) = struct.unpack('!20s20s', rrsig.signature[1:])
-             sig = (Crypto.Util.number.bytes_to_long(dsa_r),
-                    Crypto.Util.number.bytes_to_long(dsa_s))
-+        elif _is_ecdsa(rrsig.algorithm):
-+            if rrsig.algorithm == ECDSAP256SHA256:
-+                curve = ecdsa.curves.NIST256p
-+                key_len = 32
-+                digest_len = 32
-+            elif rrsig.algorithm == ECDSAP384SHA384:
-+                curve = ecdsa.curves.NIST384p
-+                key_len = 48
-+                digest_len = 48
-+            else:
-+                # shouldn't happen
-+                raise ValidationFailure('unknown ECDSA curve')
-+            keyptr = candidate_key.key
-+            x = Crypto.Util.number.bytes_to_long(keyptr[0:key_len])
-+            y = Crypto.Util.number.bytes_to_long(keyptr[key_len:key_len * 2])
-+            assert ecdsa.ecdsa.point_is_valid(curve.generator, x, y)
-+            point = ecdsa.ellipticcurve.Point(curve.curve, x, y, curve.order)
-+            verifying_key = ecdsa.keys.VerifyingKey.from_public_point(point,
-+                                                                      curve)
-+            pubkey = ECKeyWrapper(verifying_key, key_len)
-+            r = rrsig.signature[:key_len]
-+            s = rrsig.signature[key_len:]
-+            sig = ecdsa.ecdsa.Signature(Crypto.Util.number.bytes_to_long(r),
-+                                        Crypto.Util.number.bytes_to_long(s))
-         else:
-             raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm)
- 
-@@ -303,7 +339,7 @@
-             padlen = keylen // 8 - len(digest) - 3
-             digest = bytes([0]) + bytes([1]) + bytes([0xFF]) * padlen + \
-                      bytes([0]) + digest
--        elif _is_dsa(rrsig.algorithm):
-+        elif _is_dsa(rrsig.algorithm) or _is_ecdsa(rrsig.algorithm):
-             pass
-         else:
-             # Raise here for code clarity; this won't actually ever happen
-@@ -373,3 +409,21 @@
- except ImportError:
-     validate = _need_pycrypto
-     validate_rrsig = _need_pycrypto
-+
-+try:
-+    import ecdsa
-+    import ecdsa.ecdsa
-+    import ecdsa.ellipticcurve
-+    import ecdsa.keys
-+    _have_ecdsa = True
-+
-+    class ECKeyWrapper(object):
-+        def __init__(self, key, key_len):
-+            self.key = key
-+            self.key_len = key_len
-+        def verify(self, digest, sig):
-+            diglong = Crypto.Util.number.bytes_to_long(digest)
-+            return self.key.pubkey.verifies(diglong, sig)
-+
-+except ImportError:
-+    _have_ecdsa = False
-diff -Naur dnspython-orig/dnspython3-1.11.1/dns/dnssec.py.orig dnspython/dnspython3-1.11.1/dns/dnssec.py.orig
---- dnspython-orig/dnspython3-1.11.1/dns/dnssec.py.orig	1969-12-31 19:00:00.000000000 -0500
-+++ dnspython/dnspython3-1.11.1/dns/dnssec.py.orig	2014-02-18 18:36:33.490753534 -0500
-@@ -0,0 +1,375 @@
-+# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc.
-+#
-+# Permission to use, copy, modify, and distribute this software and its
-+# documentation for any purpose with or without fee is hereby granted,
-+# provided that the above copyright notice and this permission notice
-+# appear in all copies.
-+#
-+# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-+
-+"""Common DNSSEC-related functions and constants."""
-+
-+import io
-+import struct
-+import time
-+
-+import dns.exception
-+import dns.hash
-+import dns.name
-+import dns.node
-+import dns.rdataset
-+import dns.rdata
-+import dns.rdatatype
-+import dns.rdataclass
-+
-+class UnsupportedAlgorithm(dns.exception.DNSException):
-+    """Raised if an algorithm is not supported."""
-+    pass
-+
-+class ValidationFailure(dns.exception.DNSException):
-+    """The DNSSEC signature is invalid."""
-+    pass
-+
-+RSAMD5 = 1
-+DH = 2
-+DSA = 3
-+ECC = 4
-+RSASHA1 = 5
-+DSANSEC3SHA1 = 6
-+RSASHA1NSEC3SHA1 = 7
-+RSASHA256 = 8
-+RSASHA512 = 10
-+INDIRECT = 252
-+PRIVATEDNS = 253
-+PRIVATEOID = 254
-+
-+_algorithm_by_text = {
-+    'RSAMD5' : RSAMD5,
-+    'DH' : DH,
-+    'DSA' : DSA,
-+    'ECC' : ECC,
-+    'RSASHA1' : RSASHA1,
-+    'DSANSEC3SHA1' : DSANSEC3SHA1,
-+    'RSASHA1NSEC3SHA1' : RSASHA1NSEC3SHA1,
-+    'RSASHA256' : RSASHA256,
-+    'RSASHA512' : RSASHA512,
-+    'INDIRECT' : INDIRECT,
-+    'PRIVATEDNS' : PRIVATEDNS,
-+    'PRIVATEOID' : PRIVATEOID,
-+    }
-+
-+# We construct the inverse mapping programmatically to ensure that we
-+# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
-+# would cause the mapping not to be true inverse.
-+
-+_algorithm_by_value = dict([(y, x) for x, y in _algorithm_by_text.items()])
-+
-+def algorithm_from_text(text):
-+    """Convert text into a DNSSEC algorithm value
-+    @rtype: int"""
-+
-+    value = _algorithm_by_text.get(text.upper())
-+    if value is None:
-+        value = int(text)
-+    return value
-+
-+def algorithm_to_text(value):
-+    """Convert a DNSSEC algorithm value to text
-+    @rtype: string"""
-+
-+    text = _algorithm_by_value.get(value)
-+    if text is None:
-+        text = str(value)
-+    return text
-+
-+def _to_rdata(record, origin):
-+    s = io.BytesIO()
-+    record.to_wire(s, origin=origin)
-+    return s.getvalue()
-+
-+def key_id(key, origin=None):
-+    rdata = _to_rdata(key, origin)
-+    if key.algorithm == RSAMD5:
-+        return (rdata[-3] << 8) + rdata[-2]
-+    else:
-+        total = 0
-+        for i in range(len(rdata) // 2):
-+            total += (rdata[2 * i] << 8) + rdata[2 * i + 1]
-+        if len(rdata) % 2 != 0:
-+            total += rdata[len(rdata) - 1] << 8
-+        total += ((total >> 16) & 0xffff);
-+        return total & 0xffff
-+
-+def make_ds(name, key, algorithm, origin=None):
-+    if algorithm.upper() == 'SHA1':
-+        dsalg = 1
-+        hash = dns.hash.get('SHA1')()
-+    elif algorithm.upper() == 'SHA256':
-+        dsalg = 2
-+        hash = dns.hash.get('SHA256')()
-+    else:
-+        raise UnsupportedAlgorithm('unsupported algorithm "%s"' % algorithm)
-+
-+    if isinstance(name, str):
-+        name = dns.name.from_text(name, origin)
-+    hash.update(name.canonicalize().to_wire())
-+    hash.update(_to_rdata(key, origin))
-+    digest = hash.digest()
-+
-+    dsrdata = struct.pack("!HBB", key_id(key), key.algorithm, dsalg) + digest
-+    return dns.rdata.from_wire(dns.rdataclass.IN, dns.rdatatype.DS, dsrdata, 0,
-+                               len(dsrdata))
-+
-+def _find_candidate_keys(keys, rrsig):
-+    candidate_keys=[]
-+    value = keys.get(rrsig.signer)
-+    if value is None:
-+        return None
-+    if isinstance(value, dns.node.Node):
-+        try:
-+            rdataset = value.find_rdataset(dns.rdataclass.IN,
-+                                           dns.rdatatype.DNSKEY)
-+        except KeyError:
-+            return None
-+    else:
-+        rdataset = value
-+    for rdata in rdataset:
-+        if rdata.algorithm == rrsig.algorithm and \
-+               key_id(rdata) == rrsig.key_tag:
-+            candidate_keys.append(rdata)
-+    return candidate_keys
-+
-+def _is_rsa(algorithm):
-+    return algorithm in (RSAMD5, RSASHA1,
-+                         RSASHA1NSEC3SHA1, RSASHA256,
-+                         RSASHA512)
-+
-+def _is_dsa(algorithm):
-+    return algorithm in (DSA, DSANSEC3SHA1)
-+
-+def _is_md5(algorithm):
-+    return algorithm == RSAMD5
-+
-+def _is_sha1(algorithm):
-+    return algorithm in (DSA, RSASHA1,
-+                         DSANSEC3SHA1, RSASHA1NSEC3SHA1)
-+
-+def _is_sha256(algorithm):
-+    return algorithm == RSASHA256
-+
-+def _is_sha512(algorithm):
-+    return algorithm == RSASHA512
-+
-+def _make_hash(algorithm):
-+    if _is_md5(algorithm):
-+        return dns.hash.get('MD5')()
-+    if _is_sha1(algorithm):
-+        return dns.hash.get('SHA1')()
-+    if _is_sha256(algorithm):
-+        return dns.hash.get('SHA256')()
-+    if _is_sha512(algorithm):
-+        return dns.hash.get('SHA512')()
-+    raise ValidationFailure('unknown hash for algorithm %u' % algorithm)
-+
-+def _make_algorithm_id(algorithm):
-+    if _is_md5(algorithm):
-+        oid = [0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05]
-+    elif _is_sha1(algorithm):
-+        oid = [0x2b, 0x0e, 0x03, 0x02, 0x1a]
-+    elif _is_sha256(algorithm):
-+        oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01]
-+    elif _is_sha512(algorithm):
-+        oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03]
-+    else:
-+        raise ValidationFailure('unknown algorithm %u' % algorithm)
-+    olen = len(oid)
-+    dlen = _make_hash(algorithm).digest_size
-+    idbytes = [0x30] + [8 + olen + dlen] + \
-+              [0x30, olen + 4] + [0x06, olen] + oid + \
-+              [0x05, 0x00] + [0x04, dlen]
-+    return bytes(idbytes)
-+
-+def _validate_rrsig(rrset, rrsig, keys, origin=None, now=None):
-+    """Validate an RRset against a single signature rdata
-+
-+    The owner name of the rrsig is assumed to be the same as the owner name
-+    of the rrset.
-+
-+    @param rrset: The RRset to validate
-+    @type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
-+    tuple
-+    @param rrsig: The signature rdata
-+    @type rrsig: dns.rrset.Rdata
-+    @param keys: The key dictionary.
-+    @type keys: a dictionary keyed by dns.name.Name with node or rdataset values
-+    @param origin: The origin to use for relative names
-+    @type origin: dns.name.Name or None
-+    @param now: The time to use when validating the signatures.  The default
-+    is the current time.
-+    @type now: int
-+    """
-+
-+    if isinstance(origin, str):
-+        origin = dns.name.from_text(origin, dns.name.root)
-+
-+    for candidate_key in _find_candidate_keys(keys, rrsig):
-+        if not candidate_key:
-+            raise ValidationFailure('unknown key')
-+
-+        # For convenience, allow the rrset to be specified as a (name, rdataset)
-+        # tuple as well as a proper rrset
-+        if isinstance(rrset, tuple):
-+            rrname = rrset[0]
-+            rdataset = rrset[1]
-+        else:
-+            rrname = rrset.name
-+            rdataset = rrset
-+
-+        if now is None:
-+            now = time.time()
-+        if rrsig.expiration < now:
-+            raise ValidationFailure('expired')
-+        if rrsig.inception > now:
-+            raise ValidationFailure('not yet valid')
-+
-+        hash = _make_hash(rrsig.algorithm)
-+
-+        if _is_rsa(rrsig.algorithm):
-+            keyptr = candidate_key.key
-+            (count,) = struct.unpack('!B', keyptr[0:1])
-+            keyptr = keyptr[1:]
-+            if count == 0:
-+                (count,) = struct.unpack('!H', keyptr[0:2])
-+                keyptr = keyptr[2:]
-+            rsa_e = keyptr[0:count]
-+            rsa_n = keyptr[count:]
-+            keylen = len(rsa_n) * 8
-+            pubkey = Crypto.PublicKey.RSA.construct(
-+                (Crypto.Util.number.bytes_to_long(rsa_n),
-+                 Crypto.Util.number.bytes_to_long(rsa_e)))
-+            sig = (Crypto.Util.number.bytes_to_long(rrsig.signature),)
-+        elif _is_dsa(rrsig.algorithm):
-+            keyptr = candidate_key.key
-+            (t,) = struct.unpack('!B', keyptr[0:1])
-+            keyptr = keyptr[1:]
-+            octets = 64 + t * 8
-+            dsa_q = keyptr[0:20]
-+            keyptr = keyptr[20:]
-+            dsa_p = keyptr[0:octets]
-+            keyptr = keyptr[octets:]
-+            dsa_g = keyptr[0:octets]
-+            keyptr = keyptr[octets:]
-+            dsa_y = keyptr[0:octets]
-+            pubkey = Crypto.PublicKey.DSA.construct(
-+                (Crypto.Util.number.bytes_to_long(dsa_y),
-+                 Crypto.Util.number.bytes_to_long(dsa_g),
-+                 Crypto.Util.number.bytes_to_long(dsa_p),
-+                 Crypto.Util.number.bytes_to_long(dsa_q)))
-+            (dsa_r, dsa_s) = struct.unpack('!20s20s', rrsig.signature[1:])
-+            sig = (Crypto.Util.number.bytes_to_long(dsa_r),
-+                   Crypto.Util.number.bytes_to_long(dsa_s))
-+        else:
-+            raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm)
-+
-+        hash.update(_to_rdata(rrsig, origin)[:18])
-+        hash.update(rrsig.signer.to_digestable(origin))
-+
-+        if rrsig.labels < len(rrname) - 1:
-+            suffix = rrname.split(rrsig.labels + 1)[1]
-+            rrname = dns.name.from_text('*', suffix)
-+        rrnamebuf = rrname.to_digestable(origin)
-+        rrfixed = struct.pack('!HHI', rdataset.rdtype, rdataset.rdclass,
-+                              rrsig.original_ttl)
-+        rrlist = sorted(rdataset);
-+        for rr in rrlist:
-+            hash.update(rrnamebuf)
-+            hash.update(rrfixed)
-+            rrdata = rr.to_digestable(origin)
-+            rrlen = struct.pack('!H', len(rrdata))
-+            hash.update(rrlen)
-+            hash.update(rrdata)
-+
-+        digest = hash.digest()
-+
-+        if _is_rsa(rrsig.algorithm):
-+            # PKCS1 algorithm identifier goop
-+            digest = _make_algorithm_id(rrsig.algorithm) + digest
-+            padlen = keylen // 8 - len(digest) - 3
-+            digest = bytes([0]) + bytes([1]) + bytes([0xFF]) * padlen + \
-+                     bytes([0]) + digest
-+        elif _is_dsa(rrsig.algorithm):
-+            pass
-+        else:
-+            # Raise here for code clarity; this won't actually ever happen
-+            # since if the algorithm is really unknown we'd already have
-+            # raised an exception above
-+            raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm)
-+
-+        if pubkey.verify(digest, sig):
-+            return
-+    raise ValidationFailure('verify failure')
-+
-+def _validate(rrset, rrsigset, keys, origin=None, now=None):
-+    """Validate an RRset
-+
-+    @param rrset: The RRset to validate
-+    @type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
-+    tuple
-+    @param rrsigset: The signature RRset
-+    @type rrsigset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
-+    tuple
-+    @param keys: The key dictionary.
-+    @type keys: a dictionary keyed by dns.name.Name with node or rdataset values
-+    @param origin: The origin to use for relative names
-+    @type origin: dns.name.Name or None
-+    @param now: The time to use when validating the signatures.  The default
-+    is the current time.
-+    @type now: int
-+    """
-+
-+    if isinstance(origin, str):
-+        origin = dns.name.from_text(origin, dns.name.root)
-+
-+    if isinstance(rrset, tuple):
-+        rrname = rrset[0]
-+    else:
-+        rrname = rrset.name
-+
-+    if isinstance(rrsigset, tuple):
-+        rrsigname = rrsigset[0]
-+        rrsigrdataset = rrsigset[1]
-+    else:
-+        rrsigname = rrsigset.name
-+        rrsigrdataset = rrsigset
-+
-+    rrname = rrname.choose_relativity(origin)
-+    rrsigname = rrname.choose_relativity(origin)
-+    if rrname != rrsigname:
-+        raise ValidationFailure("owner names do not match")
-+
-+    for rrsig in rrsigrdataset:
-+        try:
-+            _validate_rrsig(rrset, rrsig, keys, origin, now)
-+            return
-+        except ValidationFailure:
-+            pass
-+    raise ValidationFailure("no RRSIGs validated")
-+
-+def _need_pycrypto(*args, **kwargs):
-+    raise NotImplementedError("DNSSEC validation requires pycrypto")
-+
-+try:
-+    import Crypto.PublicKey.RSA
-+    import Crypto.PublicKey.DSA
-+    import Crypto.Util.number
-+    validate = _validate
-+    validate_rrsig = _validate_rrsig
-+except ImportError:
-+    validate = _need_pycrypto
-+    validate_rrsig = _need_pycrypto
-diff -Naur dnspython-orig/dnspython3-1.11.1/dns/query.py dnspython/dnspython3-1.11.1/dns/query.py
---- dnspython-orig/dnspython3-1.11.1/dns/query.py	2012-05-31 04:19:04.000000000 -0400
-+++ dnspython/dnspython3-1.11.1/dns/query.py	2014-02-18 18:36:33.491753545 -0500
-@@ -411,6 +411,8 @@
-         tcpmsg = struct.pack("!H", l) + wire
-         _net_write(s, tcpmsg, expiration)
-     done = False
-+    delete_mode = True
-+    expecting_SOA = False
-     soa_rrset = None
-     soa_count = 0
-     if relativize:
-@@ -439,18 +441,16 @@
-         tsig_ctx = r.tsig_ctx
-         first = False
-         answer_index = 0
--        delete_mode = False
--        expecting_SOA = False
-         if soa_rrset is None:
-             if not r.answer or r.answer[0].name != oname:
--                raise dns.exception.FormError
-+                raise dns.exception.FormError("No answer or RRset not for qname")
-             rrset = r.answer[0]
-             if rrset.rdtype != dns.rdatatype.SOA:
-                 raise dns.exception.FormError("first RRset is not an SOA")
-             answer_index = 1
-             soa_rrset = rrset.copy()
-             if rdtype == dns.rdatatype.IXFR:
--                if soa_rrset[0].serial == serial:
-+                if soa_rrset[0].serial <= serial:
-                     #
-                     # We're already up-to-date.
-                     #
-@@ -471,7 +471,14 @@
-                     expecting_SOA = False
-                 elif rdtype == dns.rdatatype.IXFR:
-                     delete_mode = not delete_mode
--                if rrset == soa_rrset and not delete_mode:
-+                #
-+                # If this SOA RRset is equal to the first we saw then we're
-+                # finished. If this is an IXFR we also check that we're seeing
-+                # the record in the expected part of the response.
-+                #
-+                if rrset == soa_rrset and \
-+                        (rdtype == dns.rdatatype.AXFR or \
-+                        (rdtype == dns.rdatatype.IXFR and delete_mode)):
-                     done = True
-             elif expecting_SOA:
-                 #
-diff -Naur dnspython-orig/dnspython3-1.11.1/dns/rdtypes/ANY/LOC.py dnspython/dnspython3-1.11.1/dns/rdtypes/ANY/LOC.py
---- dnspython-orig/dnspython3-1.11.1/dns/rdtypes/ANY/LOC.py	2011-07-09 10:08:27.000000000 -0400
-+++ dnspython/dnspython3-1.11.1/dns/rdtypes/ANY/LOC.py	2014-02-18 18:36:33.491753545 -0500
-@@ -23,6 +23,11 @@
- _pows = (1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
-          100000000, 1000000000, 10000000000)
- 
-+# default values are in centimeters
-+_default_size = 100.0
-+_default_hprec = 1000000.0
-+_default_vprec = 1000.0
-+
- def _exponent_of(what, desc):
-     exp = None
-     for i in range(len(_pows)):
-@@ -98,13 +103,14 @@
-                  'horizontal_precision', 'vertical_precision']
- 
-     def __init__(self, rdclass, rdtype, latitude, longitude, altitude,
--                 size=1.0, hprec=10000.0, vprec=10.0):
-+                 size=_default_size, hprec=_default_hprec, vprec=_default_vprec):
-         """Initialize a LOC record instance.
- 
-         The parameters I{latitude} and I{longitude} may be either a 4-tuple
-         of integers specifying (degrees, minutes, seconds, milliseconds),
-         or they may be floating point values specifying the number of
--        degrees.  The other parameters are floats."""
-+        degrees. The other parameters are floats. Size, horizontal precision,
-+        and vertical precision are specified in centimeters."""
- 
-         super(LOC, self).__init__(rdclass, rdtype)
-         if isinstance(latitude, int):
-@@ -141,8 +147,10 @@
-             self.longitude[3], long_hemisphere, self.altitude / 100.0
-             )
- 
--        if self.size != 1.0 or self.horizontal_precision != 10000.0 or \
--           self.vertical_precision != 10.0:
-+        # do not print default values
-+        if self.size != _default_size or \
-+            self.horizontal_precision != _default_hprec or \
-+            self.vertical_precision != _default_vprec:
-             text += " %0.2fm %0.2fm %0.2fm" % (
-                 self.size / 100.0, self.horizontal_precision / 100.0,
-                 self.vertical_precision / 100.0
-@@ -152,9 +160,9 @@
-     def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
-         latitude = [0, 0, 0, 0]
-         longitude = [0, 0, 0, 0]
--        size = 1.0
--        hprec = 10000.0
--        vprec = 10.0
-+        size = _default_size
-+        hprec = _default_hprec
-+        vprec = _default_vprec
- 
-         latitude[0] = tok.get_int()
-         t = tok.get_string()
-@@ -240,8 +248,8 @@
-                     value = token.value
-                     if value[-1] == 'm':
-                         value = value[0 : -1]
--                        vprec = float(value) * 100.0	# m -> cm
--                        tok.get_eol()
-+                    vprec = float(value) * 100.0	# m -> cm
-+                    tok.get_eol()
- 
-         return cls(rdclass, rdtype, latitude, longitude, altitude,
-                    size, hprec, vprec)
-diff -Naur dnspython-orig/dnspython3-1.11.1/dns/rdtypes/ANY/LOC.py.orig dnspython/dnspython3-1.11.1/dns/rdtypes/ANY/LOC.py.orig
---- dnspython-orig/dnspython3-1.11.1/dns/rdtypes/ANY/LOC.py.orig	1969-12-31 19:00:00.000000000 -0500
-+++ dnspython/dnspython3-1.11.1/dns/rdtypes/ANY/LOC.py.orig	2014-02-18 18:36:33.491753545 -0500
-@@ -0,0 +1,334 @@
-+# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-+#
-+# Permission to use, copy, modify, and distribute this software and its
-+# documentation for any purpose with or without fee is hereby granted,
-+# provided that the above copyright notice and this permission notice
-+# appear in all copies.
-+#
-+# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-+
-+import io
-+import struct
-+
-+import dns.exception
-+import dns.rdata
-+import dns.util
-+
-+_pows = (1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
-+         100000000, 1000000000, 10000000000)
-+
-+def _exponent_of(what, desc):
-+    exp = None
-+    for i in range(len(_pows)):
-+        if what // _pows[i] == 0:
-+            exp = i - 1
-+            break
-+    if exp is None or exp < 0:
-+        raise dns.exception.SyntaxError("%s value out of bounds" % desc)
-+    return exp
-+
-+def _float_to_tuple(what):
-+    if what < 0:
-+        sign = -1
-+        what *= -1
-+    else:
-+        sign = 1
-+    what = int(round(what * 3600000))
-+    degrees = what // 3600000
-+    what -= degrees * 3600000
-+    minutes = what // 60000
-+    what -= minutes * 60000
-+    seconds = what // 1000
-+    what -= seconds * 1000
-+    return (degrees * sign, minutes, seconds, what)
-+
-+def _tuple_to_float(what):
-+    if what[0] < 0:
-+        sign = -1
-+        value = float(what[0]) * -1
-+    else:
-+        sign = 1
-+        value = float(what[0])
-+    value += float(what[1]) / 60.0
-+    value += float(what[2]) / 3600.0
-+    value += float(what[3]) / 3600000.0
-+    return sign * value
-+
-+def _encode_size(what, desc):
-+    what = int(what);
-+    exponent = _exponent_of(what, desc) & 0xF
-+    base = what // pow(10, exponent) & 0xF
-+    return base * 16 + exponent
-+
-+def _decode_size(what, desc):
-+    exponent = what & 0x0F
-+    if exponent > 9:
-+        raise dns.exception.SyntaxError("bad %s exponent" % desc)
-+    base = (what & 0xF0) >> 4
-+    if base > 9:
-+        raise dns.exception.SyntaxError("bad %s base" % desc)
-+    return int(base) * pow(10, exponent)
-+
-+class LOC(dns.rdata.Rdata):
-+    """LOC record
-+
-+    @ivar latitude: latitude
-+    @type latitude: (int, int, int, int) tuple specifying the degrees, minutes,
-+    seconds, and milliseconds of the coordinate.
-+    @ivar longitude: longitude
-+    @type longitude: (int, int, int, int) tuple specifying the degrees,
-+    minutes, seconds, and milliseconds of the coordinate.
-+    @ivar altitude: altitude
-+    @type altitude: float
-+    @ivar size: size of the sphere
-+    @type size: float
-+    @ivar horizontal_precision: horizontal precision
-+    @type horizontal_precision: float
-+    @ivar vertical_precision: vertical precision
-+    @type vertical_precision: float
-+    @see: RFC 1876"""
-+
-+    __slots__ = ['latitude', 'longitude', 'altitude', 'size',
-+                 'horizontal_precision', 'vertical_precision']
-+
-+    def __init__(self, rdclass, rdtype, latitude, longitude, altitude,
-+                 size=1.0, hprec=10000.0, vprec=10.0):
-+        """Initialize a LOC record instance.
-+
-+        The parameters I{latitude} and I{longitude} may be either a 4-tuple
-+        of integers specifying (degrees, minutes, seconds, milliseconds),
-+        or they may be floating point values specifying the number of
-+        degrees.  The other parameters are floats."""
-+
-+        super(LOC, self).__init__(rdclass, rdtype)
-+        if isinstance(latitude, int):
-+            latitude = float(latitude)
-+        if isinstance(latitude, float):
-+            latitude = _float_to_tuple(latitude)
-+        self.latitude = latitude
-+        if isinstance(longitude, int):
-+            longitude = float(longitude)
-+        if isinstance(longitude, float):
-+            longitude = _float_to_tuple(longitude)
-+        self.longitude = longitude
-+        self.altitude = float(altitude)
-+        self.size = float(size)
-+        self.horizontal_precision = float(hprec)
-+        self.vertical_precision = float(vprec)
-+
-+    def to_text(self, origin=None, relativize=True, **kw):
-+        if self.latitude[0] > 0:
-+            lat_hemisphere = 'N'
-+            lat_degrees = self.latitude[0]
-+        else:
-+            lat_hemisphere = 'S'
-+            lat_degrees = -1 * self.latitude[0]
-+        if self.longitude[0] > 0:
-+            long_hemisphere = 'E'
-+            long_degrees = self.longitude[0]
-+        else:
-+            long_hemisphere = 'W'
-+            long_degrees = -1 * self.longitude[0]
-+        text = "%d %d %d.%03d %s %d %d %d.%03d %s %0.2fm" % (
-+            lat_degrees, self.latitude[1], self.latitude[2], self.latitude[3],
-+            lat_hemisphere, long_degrees, self.longitude[1], self.longitude[2],
-+            self.longitude[3], long_hemisphere, self.altitude / 100.0
-+            )
-+
-+        if self.size != 1.0 or self.horizontal_precision != 10000.0 or \
-+           self.vertical_precision != 10.0:
-+            text += " %0.2fm %0.2fm %0.2fm" % (
-+                self.size / 100.0, self.horizontal_precision / 100.0,
-+                self.vertical_precision / 100.0
-+            )
-+        return text
-+
-+    def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
-+        latitude = [0, 0, 0, 0]
-+        longitude = [0, 0, 0, 0]
-+        size = 1.0
-+        hprec = 10000.0
-+        vprec = 10.0
-+
-+        latitude[0] = tok.get_int()
-+        t = tok.get_string()
-+        if t.isdigit():
-+            latitude[1] = int(t)
-+            t = tok.get_string()
-+            if '.' in t:
-+                (seconds, milliseconds) = t.split('.')
-+                if not seconds.isdigit():
-+                    raise dns.exception.SyntaxError('bad latitude seconds value')
-+                latitude[2] = int(seconds)
-+                if latitude[2] >= 60:
-+                    raise dns.exception.SyntaxError('latitude seconds >= 60')
-+                l = len(milliseconds)
-+                if l == 0 or l > 3 or not milliseconds.isdigit():
-+                    raise dns.exception.SyntaxError('bad latitude milliseconds value')
-+                if l == 1:
-+                    m = 100
-+                elif l == 2:
-+                    m = 10
-+                else:
-+                    m = 1
-+                latitude[3] = m * int(milliseconds)
-+                t = tok.get_string()
-+            elif t.isdigit():
-+                latitude[2] = int(t)
-+                t = tok.get_string()
-+        if t == 'S':
-+            latitude[0] *= -1
-+        elif t != 'N':
-+            raise dns.exception.SyntaxError('bad latitude hemisphere value')
-+
-+        longitude[0] = tok.get_int()
-+        t = tok.get_string()
-+        if t.isdigit():
-+            longitude[1] = int(t)
-+            t = tok.get_string()
-+            if '.' in t:
-+                (seconds, milliseconds) = t.split('.')
-+                if not seconds.isdigit():
-+                    raise dns.exception.SyntaxError('bad longitude seconds value')
-+                longitude[2] = int(seconds)
-+                if longitude[2] >= 60:
-+                    raise dns.exception.SyntaxError('longitude seconds >= 60')
-+                l = len(milliseconds)
-+                if l == 0 or l > 3 or not milliseconds.isdigit():
-+                    raise dns.exception.SyntaxError('bad longitude milliseconds value')
-+                if l == 1:
-+                    m = 100
-+                elif l == 2:
-+                    m = 10
-+                else:
-+                    m = 1
-+                longitude[3] = m * int(milliseconds)
-+                t = tok.get_string()
-+            elif t.isdigit():
-+                longitude[2] = int(t)
-+                t = tok.get_string()
-+        if t == 'W':
-+            longitude[0] *= -1
-+        elif t != 'E':
-+            raise dns.exception.SyntaxError('bad longitude hemisphere value')
-+
-+        t = tok.get_string()
-+        if t[-1] == 'm':
-+            t = t[0 : -1]
-+        altitude = float(t) * 100.0	# m -> cm
-+
-+        token = tok.get().unescape()
-+        if not token.is_eol_or_eof():
-+            value = token.value
-+            if value[-1] == 'm':
-+                value = value[0 : -1]
-+            size = float(value) * 100.0	# m -> cm
-+            token = tok.get().unescape()
-+            if not token.is_eol_or_eof():
-+                value = token.value
-+                if value[-1] == 'm':
-+                    value = value[0 : -1]
-+                hprec = float(value) * 100.0	# m -> cm
-+                token = tok.get().unescape()
-+                if not token.is_eol_or_eof():
-+                    value = token.value
-+                    if value[-1] == 'm':
-+                        value = value[0 : -1]
-+                        vprec = float(value) * 100.0	# m -> cm
-+                        tok.get_eol()
-+
-+        return cls(rdclass, rdtype, latitude, longitude, altitude,
-+                   size, hprec, vprec)
-+
-+    from_text = classmethod(from_text)
-+
-+    def to_wire(self, file, compress = None, origin = None):
-+        if self.latitude[0] < 0:
-+            sign = -1
-+            degrees = -1 * self.latitude[0]
-+        else:
-+            sign = 1
-+            degrees = self.latitude[0]
-+        milliseconds = (degrees * 3600000 +
-+                        self.latitude[1] * 60000 +
-+                        self.latitude[2] * 1000 +
-+                        self.latitude[3]) * sign
-+        latitude = 0x80000000 + milliseconds
-+        if self.longitude[0] < 0:
-+            sign = -1
-+            degrees = -1 * self.longitude[0]
-+        else:
-+            sign = 1
-+            degrees = self.longitude[0]
-+        milliseconds = (degrees * 3600000 +
-+                        self.longitude[1] * 60000 +
-+                        self.longitude[2] * 1000 +
-+                        self.longitude[3]) * sign
-+        longitude = 0x80000000 + milliseconds
-+        altitude = int(self.altitude) + 10000000
-+        size = _encode_size(self.size, "size")
-+        hprec = _encode_size(self.horizontal_precision, "horizontal precision")
-+        vprec = _encode_size(self.vertical_precision, "vertical precision")
-+        wire = struct.pack("!BBBBIII", 0, size, hprec, vprec, latitude,
-+                           longitude, altitude)
-+        file.write(wire)
-+
-+    def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin = None):
-+        (version, size, hprec, vprec, latitude, longitude, altitude) = \
-+                  struct.unpack("!BBBBIII", wire[current : current + rdlen])
-+        if latitude > 0x80000000:
-+            latitude = float(latitude - 0x80000000) / 3600000
-+        else:
-+            latitude = -1 * float(0x80000000 - latitude) / 3600000
-+        if latitude < -90.0 or latitude > 90.0:
-+            raise dns.exception.FormError("bad latitude")
-+        if longitude > 0x80000000:
-+            longitude = float(longitude - 0x80000000) / 3600000
-+        else:
-+            longitude = -1 * float(0x80000000 - longitude) / 3600000
-+        if longitude < -180.0 or longitude > 180.0:
-+            raise dns.exception.FormError("bad longitude")
-+        altitude = float(altitude) - 10000000.0
-+        size = _decode_size(size, "size")
-+        hprec = _decode_size(hprec, "horizontal precision")
-+        vprec = _decode_size(vprec, "vertical precision")
-+        return cls(rdclass, rdtype, latitude, longitude, altitude,
-+                   size, hprec, vprec)
-+
-+    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)
-+
-+    def _set_float_latitude(self, value):
-+        self.latitude = _float_to_tuple(value)
-+
-+    float_latitude = property(_get_float_latitude, _set_float_latitude,
-+                              doc="latitude as a floating point value")
-+
-+    def _get_float_longitude(self):
-+        return _tuple_to_float(self.longitude)
-+
-+    def _set_float_longitude(self, value):
-+        self.longitude = _float_to_tuple(value)
-+
-+    float_longitude = property(_get_float_longitude, _set_float_longitude,
-+                               doc="longitude as a floating point value")
-diff -Naur dnspython-orig/dnspython3-1.11.1/tests/dnssec.py dnspython/dnspython3-1.11.1/tests/dnssec.py
---- dnspython-orig/dnspython3-1.11.1/tests/dnssec.py	2013-03-31 06:35:33.000000000 -0400
-+++ dnspython/dnspython3-1.11.1/tests/dnssec.py	2014-02-18 18:36:33.492753557 -0500
-@@ -97,6 +97,40 @@
- example_ds_sha256 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DS,
-                                         '18673 3 2 eb8344cbbf07c9d3d3d6c81d10c76653e28d8611a65e639ef8f716e4e4e5d913')
- 
-+when3 = 1379801800
-+
-+abs_ecdsa256_keys = { abs_example :
-+                      dns.rrset.from_text('example.', 86400, 'IN', 'DNSKEY',
-+                                          "256 3 13 +3ss1sCpdARVA61DJigEsL/8quo2a8MszKtn2gkkfxgzFs8S2UHtpb4N fY+XFmNW+JK6MsCkI3jHYN8eEQUgMw==",
-+                                          "257 3 13 eJCEVH7AS3wnoaQpaNlAXH0W8wxymtT9P6P3qjN2ZCV641ED8pF7wZ5V yWfOpgTs6oaZevbJgehl/GaRPUgVyQ==")
-+                 }
-+
-+abs_ecdsa256_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                       'ns1.example. hostmaster.example. 4 10800 3600 604800 86400')
-+
-+abs_other_ecdsa256_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                             'ns1.example. hostmaster.example. 2 10800 3600 604800 86401')
-+
-+abs_ecdsa256_soa_rrsig = dns.rrset.from_text('example.', 86400, 'IN', 'RRSIG',
-+                                             "SOA 13 1 86400 20130921221753 20130921221638 7460 example. Sm09SOGz1ULB5D/duwdE2Zpn8bWbVBM77H6N1wPkc42LevvVO+kZEjpq 2nq4GOMJcih52667GIAbMrwmU5P2MQ==")
-+
-+when4 = 1379804850
-+
-+abs_ecdsa384_keys = { abs_example :
-+                      dns.rrset.from_text('example.', 86400, 'IN', 'DNSKEY',
-+                                          "256 3 14 1bG8qWviKNXQX3BIuG6/T5jrP1FISiLW/8qGF6BsM9DQtWYhhZUA3Owr OAEiyHAhQwjkN2kTvWiAYoPN80Ii+5ff9/atzY4F9W50P4l75Dj9PYrL HN/hLUgWMNVc9pvA",
-+                                          "257 3 14 mSub2n0KRt6u2FaD5XJ3oQu0R4XvB/9vUJcyW6+oo0y+KzfQeTdkf1ro ZMVKoyWXW9zUKBYGJpMUIdbAxzrYi7f5HyZ3yDpBFz1hw9+o3CX+gtgb +RyhHfJDwwFXBid9")
-+                 }
-+
-+abs_ecdsa384_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                       'ns1.example. hostmaster.example. 2 10800 3600 604800 86400')
-+
-+abs_other_ecdsa384_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                             'ns1.example. hostmaster.example. 2 10800 3600 604800 86401')
-+
-+abs_ecdsa384_soa_rrsig = dns.rrset.from_text('example.', 86400, 'IN', 'RRSIG',
-+                                             "SOA 14 1 86400 20130929021229 20130921230729 63571 example. CrnCu34EeeRz0fEhL9PLlwjpBKGYW8QjBjFQTwd+ViVLRAS8tNkcDwQE NhSV89NEjj7ze1a/JcCfcJ+/mZgnvH4NHLNg3Tf6KuLZsgs2I4kKQXEk 37oIHravPEOlGYNI")
-+
- class DNSSECValidatorTestCase(unittest.TestCase):
- 
-     def testAbsoluteRSAGood(self):
-@@ -143,6 +177,35 @@
-         ds = dns.dnssec.make_ds(abs_example, example_sep_key, 'SHA256')
-         self.assertTrue(ds == example_ds_sha256)
- 
-+    @unittest.skipIf(not dns.dnssec._have_ecdsa,
-+                     "python ECDSA can not be imported")
-+    def testAbsoluteECDSA256Good(self):
-+        dns.dnssec.validate(abs_ecdsa256_soa, abs_ecdsa256_soa_rrsig,
-+                            abs_ecdsa256_keys, None, when3)
-+
-+    @unittest.skipIf(not dns.dnssec._have_ecdsa,
-+                     "python ECDSA can not be imported")
-+    def testAbsoluteECDSA256Bad(self):
-+        def bad():
-+            dns.dnssec.validate(abs_other_ecdsa256_soa, abs_ecdsa256_soa_rrsig,
-+                                abs_ecdsa256_keys, None, when3)
-+        self.failUnlessRaises(dns.dnssec.ValidationFailure, bad)
-+
-+    @unittest.skipIf(not dns.dnssec._have_ecdsa,
-+                     "python ECDSA can not be imported")
-+    def testAbsoluteECDSA384Good(self):
-+        dns.dnssec.validate(abs_ecdsa384_soa, abs_ecdsa384_soa_rrsig,
-+                            abs_ecdsa384_keys, None, when4)
-+
-+    @unittest.skipIf(not dns.dnssec._have_ecdsa,
-+                     "python ECDSA can not be imported")
-+    def testAbsoluteECDSA384Bad(self):
-+        def bad():
-+            dns.dnssec.validate(abs_other_ecdsa384_soa, abs_ecdsa384_soa_rrsig,
-+                                abs_ecdsa384_keys, None, when4)
-+        self.failUnlessRaises(dns.dnssec.ValidationFailure, bad)
-+
-+
- if __name__ == '__main__':
-     import_ok = False
-     try:
-diff -Naur dnspython-orig/dnspython3-1.11.1/tests/dnssec.py.orig dnspython/dnspython3-1.11.1/tests/dnssec.py.orig
---- dnspython-orig/dnspython3-1.11.1/tests/dnssec.py.orig	1969-12-31 19:00:00.000000000 -0500
-+++ dnspython/dnspython3-1.11.1/tests/dnssec.py.orig	2014-02-18 18:36:33.492753557 -0500
-@@ -0,0 +1,156 @@
-+# Copyright (C) 2011 Nominum, Inc.
-+#
-+# Permission to use, copy, modify, and distribute this software and its
-+# documentation for any purpose with or without fee is hereby granted,
-+# provided that the above copyright notice and this permission notice
-+# appear in all copies.
-+#
-+# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-+
-+import unittest
-+
-+import dns.dnssec
-+import dns.name
-+import dns.rdata
-+import dns.rdataclass
-+import dns.rdatatype
-+import dns.rrset
-+
-+abs_dnspython_org = dns.name.from_text('dnspython.org')
-+
-+abs_keys = { abs_dnspython_org :
-+             dns.rrset.from_text('dnspython.org.', 3600, 'IN', 'DNSKEY',
-+                                 '257 3 5 AwEAAenVTr9L1OMlL1/N2ta0Qj9LLLnnmFWIr1dJoAsWM9BQfsbV7kFZ XbAkER/FY9Ji2o7cELxBwAsVBuWn6IUUAJXLH74YbC1anY0lifjgt29z SwDzuB7zmC7yVYZzUunBulVW4zT0tg1aePbpVL2EtTL8VzREqbJbE25R KuQYHZtFwG8S4iBxJUmT2Bbd0921LLxSQgVoFXlQx/gFV2+UERXcJ5ce iX6A6wc02M/pdg/YbJd2rBa0MYL3/Fz/Xltre0tqsImZGxzi6YtYDs45 NC8gH+44egz82e2DATCVM1ICPmRDjXYTLldQiWA2ZXIWnK0iitl5ue24 7EsWJefrIhE=',
-+                                 '256 3 5 AwEAAdSSghOGjU33IQZgwZM2Hh771VGXX05olJK49FxpSyuEAjDBXY58 LGU9R2Zgeecnk/b9EAhFu/vCV9oECtiTCvwuVAkt9YEweqYDluQInmgP NGMJCKdSLlnX93DkjDw8rMYv5dqXCuSGPlKChfTJOLQxIAxGloS7lL+c 0CTZydAF')
-+         }
-+
-+abs_keys_duplicate_keytag = { abs_dnspython_org :
-+             dns.rrset.from_text('dnspython.org.', 3600, 'IN', 'DNSKEY',
-+                                 '257 3 5 AwEAAenVTr9L1OMlL1/N2ta0Qj9LLLnnmFWIr1dJoAsWM9BQfsbV7kFZ XbAkER/FY9Ji2o7cELxBwAsVBuWn6IUUAJXLH74YbC1anY0lifjgt29z SwDzuB7zmC7yVYZzUunBulVW4zT0tg1aePbpVL2EtTL8VzREqbJbE25R KuQYHZtFwG8S4iBxJUmT2Bbd0921LLxSQgVoFXlQx/gFV2+UERXcJ5ce iX6A6wc02M/pdg/YbJd2rBa0MYL3/Fz/Xltre0tqsImZGxzi6YtYDs45 NC8gH+44egz82e2DATCVM1ICPmRDjXYTLldQiWA2ZXIWnK0iitl5ue24 7EsWJefrIhE=',
-+                                 '256 3 5 AwEAAdSSg++++THIS/IS/NOT/THE/CORRECT/KEY++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AaOSydAF',
-+                                 '256 3 5 AwEAAdSSghOGjU33IQZgwZM2Hh771VGXX05olJK49FxpSyuEAjDBXY58 LGU9R2Zgeecnk/b9EAhFu/vCV9oECtiTCvwuVAkt9YEweqYDluQInmgP NGMJCKdSLlnX93DkjDw8rMYv5dqXCuSGPlKChfTJOLQxIAxGloS7lL+c 0CTZydAF')
-+         }
-+
-+rel_keys = { dns.name.empty :
-+             dns.rrset.from_text('@', 3600, 'IN', 'DNSKEY',
-+                                 '257 3 5 AwEAAenVTr9L1OMlL1/N2ta0Qj9LLLnnmFWIr1dJoAsWM9BQfsbV7kFZ XbAkER/FY9Ji2o7cELxBwAsVBuWn6IUUAJXLH74YbC1anY0lifjgt29z SwDzuB7zmC7yVYZzUunBulVW4zT0tg1aePbpVL2EtTL8VzREqbJbE25R KuQYHZtFwG8S4iBxJUmT2Bbd0921LLxSQgVoFXlQx/gFV2+UERXcJ5ce iX6A6wc02M/pdg/YbJd2rBa0MYL3/Fz/Xltre0tqsImZGxzi6YtYDs45 NC8gH+44egz82e2DATCVM1ICPmRDjXYTLldQiWA2ZXIWnK0iitl5ue24 7EsWJefrIhE=',
-+                                 '256 3 5 AwEAAdSSghOGjU33IQZgwZM2Hh771VGXX05olJK49FxpSyuEAjDBXY58 LGU9R2Zgeecnk/b9EAhFu/vCV9oECtiTCvwuVAkt9YEweqYDluQInmgP NGMJCKdSLlnX93DkjDw8rMYv5dqXCuSGPlKChfTJOLQxIAxGloS7lL+c 0CTZydAF')
-+         }
-+
-+when = 1290250287
-+
-+abs_soa = dns.rrset.from_text('dnspython.org.', 3600, 'IN', 'SOA',
-+                              'howl.dnspython.org. hostmaster.dnspython.org. 2010020047 3600 1800 604800 3600')
-+
-+abs_other_soa = dns.rrset.from_text('dnspython.org.', 3600, 'IN', 'SOA',
-+                                    'foo.dnspython.org. hostmaster.dnspython.org. 2010020047 3600 1800 604800 3600')
-+
-+abs_soa_rrsig = dns.rrset.from_text('dnspython.org.', 3600, 'IN', 'RRSIG',
-+                                    'SOA 5 2 3600 20101127004331 20101119213831 61695 dnspython.org. sDUlltRlFTQw5ITFxOXW3TgmrHeMeNpdqcZ4EXxM9FHhIlte6V9YCnDw t6dvM9jAXdIEi03l9H/RAd9xNNW6gvGMHsBGzpvvqFQxIBR2PoiZA1mX /SWHZFdbt4xjYTtXqpyYvrMK0Dt7bUYPadyhPFCJ1B+I8Zi7B5WJEOd0 8vs=')
-+
-+rel_soa = dns.rrset.from_text('@', 3600, 'IN', 'SOA',
-+                              'howl hostmaster 2010020047 3600 1800 604800 3600')
-+
-+rel_other_soa = dns.rrset.from_text('@', 3600, 'IN', 'SOA',
-+                                    'foo hostmaster 2010020047 3600 1800 604800 3600')
-+
-+rel_soa_rrsig = dns.rrset.from_text('@', 3600, 'IN', 'RRSIG',
-+                                    'SOA 5 2 3600 20101127004331 20101119213831 61695 @ sDUlltRlFTQw5ITFxOXW3TgmrHeMeNpdqcZ4EXxM9FHhIlte6V9YCnDw t6dvM9jAXdIEi03l9H/RAd9xNNW6gvGMHsBGzpvvqFQxIBR2PoiZA1mX /SWHZFdbt4xjYTtXqpyYvrMK0Dt7bUYPadyhPFCJ1B+I8Zi7B5WJEOd0 8vs=')
-+
-+sep_key = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DNSKEY,
-+                              '257 3 5 AwEAAenVTr9L1OMlL1/N2ta0Qj9LLLnnmFWIr1dJoAsWM9BQfsbV7kFZ XbAkER/FY9Ji2o7cELxBwAsVBuWn6IUUAJXLH74YbC1anY0lifjgt29z SwDzuB7zmC7yVYZzUunBulVW4zT0tg1aePbpVL2EtTL8VzREqbJbE25R KuQYHZtFwG8S4iBxJUmT2Bbd0921LLxSQgVoFXlQx/gFV2+UERXcJ5ce iX6A6wc02M/pdg/YbJd2rBa0MYL3/Fz/Xltre0tqsImZGxzi6YtYDs45 NC8gH+44egz82e2DATCVM1ICPmRDjXYTLldQiWA2ZXIWnK0iitl5ue24 7EsWJefrIhE=')
-+
-+good_ds = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DS,
-+                              '57349 5 2 53A79A3E7488AB44FFC56B2D1109F0699D1796DD977E72108B841F96 E47D7013')
-+
-+when2 = 1290425644
-+
-+abs_example = dns.name.from_text('example')
-+
-+abs_dsa_keys = { abs_example :
-+                 dns.rrset.from_text('example.', 86400, 'IN', 'DNSKEY',
-+                                     '257 3 3 CI3nCqyJsiCJHTjrNsJOT4RaszetzcJPYuoH3F9ZTVt3KJXncCVR3bwn 1w0iavKljb9hDlAYSfHbFCp4ic/rvg4p1L8vh5s8ToMjqDNl40A0hUGQ Ybx5hsECyK+qHoajilUX1phYSAD8d9WAGO3fDWzUPBuzR7o85NiZCDxz yXuNVfni0uhj9n1KYhEO5yAbbruDGN89wIZcxMKuQsdUY2GYD93ssnBv a55W6XRABYWayKZ90WkRVODLVYLSn53Pj/wwxGH+XdhIAZJXimrZL4yl My7rtBsLMqq8Ihs4Tows7LqYwY7cp6y/50tw6pj8tFqMYcPUjKZV36l1 M/2t5BVg3i7IK61Aidt6aoC3TDJtzAxg3ZxfjZWJfhHjMJqzQIfbW5b9 q1mjFsW5EUv39RaNnX+3JWPRLyDqD4pIwDyqfutMsdk/Py3paHn82FGp CaOg+nicqZ9TiMZURN/XXy5JoXUNQ3RNvbHCUiPUe18KUkY6mTfnyHld 1l9YCWmzXQVClkx/hOYxjJ4j8Ife58+Obu5X',
-+                                     '256 3 3 CJE1yb9YRQiw5d2xZrMUMR+cGCTt1bp1KDCefmYKmS+Z1+q9f42ETVhx JRiQwXclYwmxborzIkSZegTNYIV6mrYwbNB27Q44c3UGcspb3PiOw5TC jNPRYEcdwGvDZ2wWy+vkSV/S9tHXY8O6ODiE6abZJDDg/RnITyi+eoDL R3KZ5n/V1f1T1b90rrV6EewhBGQJpQGDogaXb2oHww9Tm6NfXyo7SoMM pbwbzOckXv+GxRPJIQNSF4D4A9E8XCksuzVVdE/0lr37+uoiAiPia38U 5W2QWe/FJAEPLjIp2eTzf0TrADc1pKP1wrA2ASpdzpm/aX3IB5RPp8Ew S9U72eBFZJAUwg635HxJVxH1maG6atzorR566E+e0OZSaxXS9o1o6QqN 3oPlYLGPORDiExilKfez3C/x/yioOupW9K5eKF0gmtaqrHX0oq9s67f/ RIM2xVaKHgG9Vf2cgJIZkhv7sntujr+E4htnRmy9P9BxyFxsItYxPI6Z bzygHAZpGhlI/7ltEGlIwKxyTK3ZKBm67q7B')
-+                 }
-+
-+abs_dsa_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                  'ns1.example. hostmaster.example. 2 10800 3600 604800 86400')
-+
-+abs_other_dsa_soa = dns.rrset.from_text('example.', 86400, 'IN', 'SOA',
-+                                        'ns1.example. hostmaster.example. 2 10800 3600 604800 86401')
-+
-+abs_dsa_soa_rrsig = dns.rrset.from_text('example.', 86400, 'IN', 'RRSIG',
-+                                        'SOA 3 1 86400 20101129143231 20101122112731 42088 example. CGul9SuBofsktunV8cJs4eRs6u+3NCS3yaPKvBbD+pB2C76OUXDZq9U=')
-+
-+example_sep_key = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DNSKEY,
-+                                      '257 3 3 CI3nCqyJsiCJHTjrNsJOT4RaszetzcJPYuoH3F9ZTVt3KJXncCVR3bwn 1w0iavKljb9hDlAYSfHbFCp4ic/rvg4p1L8vh5s8ToMjqDNl40A0hUGQ Ybx5hsECyK+qHoajilUX1phYSAD8d9WAGO3fDWzUPBuzR7o85NiZCDxz yXuNVfni0uhj9n1KYhEO5yAbbruDGN89wIZcxMKuQsdUY2GYD93ssnBv a55W6XRABYWayKZ90WkRVODLVYLSn53Pj/wwxGH+XdhIAZJXimrZL4yl My7rtBsLMqq8Ihs4Tows7LqYwY7cp6y/50tw6pj8tFqMYcPUjKZV36l1 M/2t5BVg3i7IK61Aidt6aoC3TDJtzAxg3ZxfjZWJfhHjMJqzQIfbW5b9 q1mjFsW5EUv39RaNnX+3JWPRLyDqD4pIwDyqfutMsdk/Py3paHn82FGp CaOg+nicqZ9TiMZURN/XXy5JoXUNQ3RNvbHCUiPUe18KUkY6mTfnyHld 1l9YCWmzXQVClkx/hOYxjJ4j8Ife58+Obu5X')
-+
-+example_ds_sha1 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DS,
-+                                      '18673 3 1 71b71d4f3e11bbd71b4eff12cde69f7f9215bbe7')
-+
-+example_ds_sha256 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.DS,
-+                                        '18673 3 2 eb8344cbbf07c9d3d3d6c81d10c76653e28d8611a65e639ef8f716e4e4e5d913')
-+
-+class DNSSECValidatorTestCase(unittest.TestCase):
-+
-+    def testAbsoluteRSAGood(self):
-+        dns.dnssec.validate(abs_soa, abs_soa_rrsig, abs_keys, None, when)
-+
-+    def testDuplicateKeytag(self):
-+        dns.dnssec.validate(abs_soa, abs_soa_rrsig, abs_keys_duplicate_keytag, None, when)
-+
-+    def testAbsoluteRSABad(self):
-+        def bad():
-+            dns.dnssec.validate(abs_other_soa, abs_soa_rrsig, abs_keys, None,
-+                                when)
-+        self.assertRaises(dns.dnssec.ValidationFailure, bad)
-+
-+    def testRelativeRSAGood(self):
-+        dns.dnssec.validate(rel_soa, rel_soa_rrsig, rel_keys,
-+                            abs_dnspython_org, when)
-+
-+    def testRelativeRSABad(self):
-+        def bad():
-+            dns.dnssec.validate(rel_other_soa, rel_soa_rrsig, rel_keys,
-+                                abs_dnspython_org, when)
-+        self.assertRaises(dns.dnssec.ValidationFailure, bad)
-+
-+    def testMakeSHA256DS(self):
-+        ds = dns.dnssec.make_ds(abs_dnspython_org, sep_key, 'SHA256')
-+        self.assertTrue(ds == good_ds)
-+
-+    def testAbsoluteDSAGood(self):
-+        dns.dnssec.validate(abs_dsa_soa, abs_dsa_soa_rrsig, abs_dsa_keys, None,
-+                            when2)
-+
-+    def testAbsoluteDSABad(self):
-+        def bad():
-+            dns.dnssec.validate(abs_other_dsa_soa, abs_dsa_soa_rrsig,
-+                                abs_dsa_keys, None, when2)
-+        self.assertRaises(dns.dnssec.ValidationFailure, bad)
-+
-+    def testMakeExampleSHA1DS(self):
-+        ds = dns.dnssec.make_ds(abs_example, example_sep_key, 'SHA1')
-+        self.assertTrue(ds == example_ds_sha1)
-+
-+    def testMakeExampleSHA256DS(self):
-+        ds = dns.dnssec.make_ds(abs_example, example_sep_key, 'SHA256')
-+        self.assertTrue(ds == example_ds_sha256)
-+
-+if __name__ == '__main__':
-+    import_ok = False
-+    try:
-+        import Crypto.Util.number
-+        import_ok = True
-+    except:
-+        pass
-+    if import_ok:
-+        unittest.main()
-+    else:
-+        print('skipping DNSSEC tests because pycrypto is not installed')
-diff -Naur dnspython-orig/dnspython3-1.11.1/tests/rdtypeanyloc.py dnspython/dnspython3-1.11.1/tests/rdtypeanyloc.py
---- dnspython-orig/dnspython3-1.11.1/tests/rdtypeanyloc.py	1969-12-31 19:00:00.000000000 -0500
-+++ dnspython/dnspython3-1.11.1/tests/rdtypeanyloc.py	2014-02-18 18:36:33.492753557 -0500
-@@ -0,0 +1,68 @@
-+# Copyright (C) 2014 Red Hat, Inc.
-+# Author: Petr Spacek <pspacek at redhat.com>
-+#
-+# Permission to use, copy, modify, and distribute this software and its
-+# documentation for any purpose with or without fee is hereby granted,
-+# provided that the above copyright notice and this permission notice
-+# appear in all copies.
-+#
-+# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES
-+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-+
-+import unittest
-+
-+import dns.rrset
-+import dns.rdtypes.ANY.LOC
-+
-+class RdtypeAnyLocTestCase(unittest.TestCase):
-+
-+    def testEqual1(self):
-+        '''Test default values for size, horizontal and vertical precision.'''
-+        r1 = dns.rrset.from_text('foo', 300, 'IN', 'LOC',
-+                                 '49 11 42.400 N 16 36 29.600 E 227.64m')
-+        r2 = dns.rrset.from_text('FOO', 600, 'in', 'loc',
-+                                 '49 11 42.400 N 16 36 29.600 E 227.64m '
-+                                 '1.00m 10000.00m 10.00m')
-+        self.failUnless(r1 == r2, '"%s" != "%s"' % (r1, r2))
-+
-+    def testEqual2(self):
-+        '''Test default values for size, horizontal and vertical precision.'''
-+        r1 = dns.rdtypes.ANY.LOC.LOC(1, 29, (49, 11, 42, 400),
-+                                     (16, 36, 29, 600), 22764.0) # centimeters
-+        r2 = dns.rdtypes.ANY.LOC.LOC(1, 29, (49, 11, 42, 400),
-+                                     (16, 36, 29, 600), 22764.0, # centimeters
-+                                     100.0, 1000000.00, 1000.0)  # centimeters
-+        self.failUnless(r1 == r2, '"%s" != "%s"' % (r1, r2))
-+
-+    def testEqual3(self):
-+        '''Test size, horizontal and vertical precision parsers: 100 cm == 1 m.
-+
-+        Parsers in from_text() and __init__() have to produce equal results.'''
-+        r1 = dns.rdtypes.ANY.LOC.LOC(1, 29, (49, 11, 42, 400),
-+                                     (16, 36, 29, 600), 22764.0,
-+                                     200.0, 1000.00, 200.0)      # centimeters
-+        r2 = dns.rrset.from_text('FOO', 600, 'in', 'loc',
-+                                 '49 11 42.400 N 16 36 29.600 E 227.64m '
-+                                 '2.00m 10.00m 2.00m')[0]
-+        self.failUnless(r1 == r2, '"%s" != "%s"' % (r1, r2))
-+
-+    def testEqual4(self):
-+        '''Test size, horizontal and vertical precision parsers without unit.
-+
-+        Parsers in from_text() and __init__() have produce equal result
-+        for values with and without trailing "m".'''
-+        r1 = dns.rdtypes.ANY.LOC.LOC(1, 29, (49, 11, 42, 400),
-+                                     (16, 36, 29, 600), 22764.0,
-+                                     200.0, 1000.00, 200.0)      # centimeters
-+        r2 = dns.rrset.from_text('FOO', 600, 'in', 'loc',
-+                                 '49 11 42.400 N 16 36 29.600 E 227.64 '
-+                                 '2 10 2')[0] # meters without explicit unit
-+        self.failUnless(r1 == r2, '"%s" != "%s"' % (r1, r2))
-+
-+if __name__ == '__main__':
-+    unittest.main()
diff --git a/python-dns.spec b/python-dns.spec
index 298bb93..1855677 100644
--- a/python-dns.spec
+++ b/python-dns.spec
@@ -21,8 +21,8 @@
 %endif
 
 Name:           python-dns
-Version:        1.11.1
-Release:        4%{?dist}
+Version:        1.12.0
+Release:        1%{?dist}
 Summary:        DNS toolkit for Python
 
 Group:          Development/Languages
@@ -37,7 +37,6 @@ Source3:        http://www.dnspython.org/kits3/%{version}/dnspython3-%{version}.
 %if 0%{?rhel} == 5
 Patch0:         0001-Don-t-fail-on-older-python-versions-because-of-hashe.patch
 %endif
-Patch1:		dnspython-1.11.1-ecdsa-loc.patch
 
 BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
 
@@ -138,7 +137,6 @@ pushd %{py2dir}
 %patch0 -p1
 popd
 %endif
-%patch1 -p1
 
 %build
 pushd %{py2dir}
@@ -189,12 +187,12 @@ pushd %{py2dir}/tests
 # skip one test because it queries the network
 # dnssec tests fail in RHEL5 Python 2.4 due to the
 # lack of some hashes
-for py in *.py
+for py in test_*.py
 do
 %if 0%{?rhel} == 5
-    if [ $py != resolver.py -a $py != dnssec.py -a $py != grange.py ]
+    if [ $py != test_resolver.py -a $py != test_dnssec.py -a $py != test_grange.py ]
 %else
-    if [ $py != resolver.py ]
+    if [ $py != test_resolver.py ]
 %endif
     then
         PYTHONPATH=%{buildroot}%{python_sitelib} %{__python} $py
@@ -205,9 +203,15 @@ popd
 %if 0%{?with_python26}
 pushd %{py26dir}/tests
 # skip one test because it queries the network
-for py in *.py
+# dnssec tests fail in RHEL5 Python 2.4 due to the
+# lack of some hashes
+for py in test_*.py
 do
-    if [ $py != resolver.py ]
+%if 0%{?rhel} == 5
+    if [ $py != test_resolver.py -a $py != test_dnssec.py -a $py ]
+%else
+    if [ $py != test_resolver.py ]
+%endif
     then
         PYTHONPATH=%{buildroot}%{python26_sitelib} %{__python26} $py
     fi
@@ -218,9 +222,9 @@ popd
 %if 0%{?with_python3}
 pushd %{py3dir}/tests
 # skip one test because it queries the network
-for py in *.py
+for py in test_*.py
 do
-    if [ $py != resolver.py ]
+    if [ $py != test_resolver.py ]
     then
        PYTHONPATH=%{buildroot}%{python3_sitelib} %{__python3} $py
     fi
diff --git a/sources b/sources
index edca90b..0e65f71 100644
--- a/sources
+++ b/sources
@@ -1,4 +1,4 @@
-6167344ca849bd2ba108a8aa6118cb2b  dnspython-1.11.1.tar.gz
-a4a62448f1ab7dec26ab9e03999339ca  dnspython-1.11.1.tar.gz.asc
-c0203410e1405c3ee1d70dafa4ad6612  dnspython3-1.11.1.tar.gz
-ed10be2fa38a1bacc8a3cc987256a21e  dnspython3-1.11.1.tar.gz.asc
+3f2601ef3c8b77fc6d21a9c77a81efeb  dnspython-1.12.0.tar.gz
+e2f0a80d0cf1f1d5a81916ae94b01e30  dnspython-1.12.0.tar.gz.asc
+32178038d8a1b11e818ae4658745133c  dnspython3-1.12.0.tar.gz
+d0e823de9f39b3e1e01879fe82600fbc  dnspython3-1.12.0.tar.gz.asc
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/python-dns.git/commit/?h=master&id=1c1e3cdf9ad04ff435f9c0f217aeee8850b36863


More information about the scm-commits mailing list