Compare commits
No commits in common. 'c9' and 'c8' have entirely different histories.
@ -1 +1 @@
|
|||||||
SOURCES/dnspython-2.3.0.tar.gz
|
SOURCES/dnspython-1.15.0.tar.gz
|
||||||
|
@ -1 +1 @@
|
|||||||
698b6e84cf9d0ce2a0157b3bdaf7c4a852adf3dc SOURCES/dnspython-2.3.0.tar.gz
|
fcb8edb4b307f68a27cd356e7b44f53512b63b5e SOURCES/dnspython-1.15.0.tar.gz
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
From 76e10ef549aed9f1438d97b116495c312a450a34 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Bob Halley <halley@dnspython.org>
|
|
||||||
Date: Wed, 18 Jan 2023 04:50:29 -0800
|
|
||||||
Subject: [PATCH 1/4] Add missing quic files to setup.py cythonize [#887].
|
|
||||||
|
|
||||||
(cherry picked from commit 211419bb0df840bab4696be3f6d9544d57df6603)
|
|
||||||
---
|
|
||||||
setup.py | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/setup.py b/setup.py
|
|
||||||
index c91c719..2ccaf8b 100755
|
|
||||||
--- a/setup.py
|
|
||||||
+++ b/setup.py
|
|
||||||
@@ -30,7 +30,8 @@ else:
|
|
||||||
from Cython.Build import cythonize
|
|
||||||
|
|
||||||
ext_modules = cythonize(
|
|
||||||
- ["dns/*.py", "dns/rdtypes/*.py", "dns/rdtypes/*/*.py"], language_level="3"
|
|
||||||
+ ["dns/*.py", "dns/quic/*.py", "dns/rdtypes/*.py", "dns/rdtypes/*/*.py"],
|
|
||||||
+ language_level="3",
|
|
||||||
)
|
|
||||||
|
|
||||||
kwargs = {
|
|
||||||
--
|
|
||||||
2.40.1
|
|
||||||
|
|
@ -1,112 +0,0 @@
|
|||||||
From ecf2b229bd23229928599751950eda1639cd7e05 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Rafael Guterres Jeffman <rjeffman@redhat.com>
|
|
||||||
Date: Wed, 14 Jun 2023 15:17:57 -0300
|
|
||||||
Subject: [PATCH 2/4] Disable SHA1 tests.
|
|
||||||
|
|
||||||
Disable SHA1 dependent tests, as SHA1 is not available on c9s/RHEL 9.
|
|
||||||
---
|
|
||||||
tests/test_dnssec.py | 13 +++++++++++++
|
|
||||||
1 file changed, 13 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/tests/test_dnssec.py b/tests/test_dnssec.py
|
|
||||||
index 098af69..920c955 100644
|
|
||||||
--- a/tests/test_dnssec.py
|
|
||||||
+++ b/tests/test_dnssec.py
|
|
||||||
@@ -603,25 +603,30 @@ class DNSSECValidatorTestCase(unittest.TestCase):
|
|
||||||
self.assertEqual(dns.dnssec.key_id(rsamd5_keys[abs_example][0]), 30239)
|
|
||||||
self.assertEqual(dns.dnssec.key_id(rsamd5_keys[abs_example][1]), 62992)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testAbsoluteRSAGood(self): # type: () -> None
|
|
||||||
dns.dnssec.validate(abs_soa, abs_soa_rrsig, abs_keys, None, when)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testDuplicateKeytag(self): # type: () -> None
|
|
||||||
dns.dnssec.validate(
|
|
||||||
abs_soa, abs_soa_rrsig, abs_keys_duplicate_keytag, None, when
|
|
||||||
)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testAbsoluteRSABad(self): # type: () -> None
|
|
||||||
def bad(): # type: () -> None
|
|
||||||
dns.dnssec.validate(abs_other_soa, abs_soa_rrsig, abs_keys, None, when)
|
|
||||||
|
|
||||||
self.assertRaises(dns.dnssec.ValidationFailure, bad)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testRelativeRSAGood(self): # type: () -> None
|
|
||||||
dns.dnssec.validate(rel_soa, rel_soa_rrsig, rel_keys, abs_dnspython_org, when)
|
|
||||||
# test the text conversion for origin too
|
|
||||||
dns.dnssec.validate(rel_soa, rel_soa_rrsig, rel_keys, "dnspython.org", when)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testRelativeRSABad(self): # type: () -> None
|
|
||||||
def bad(): # type: () -> None
|
|
||||||
dns.dnssec.validate(
|
|
||||||
@@ -630,6 +635,7 @@ class DNSSECValidatorTestCase(unittest.TestCase):
|
|
||||||
|
|
||||||
self.assertRaises(dns.dnssec.ValidationFailure, bad)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testAbsoluteDSAGood(self): # type: () -> None
|
|
||||||
dns.dnssec.validate(
|
|
||||||
abs_dsa_soa,
|
|
||||||
@@ -742,6 +748,7 @@ class DNSSECValidatorTestCase(unittest.TestCase):
|
|
||||||
rsasha512_ns, rsasha512_ns_rrsig, rsasha512_keys, None, rsasha512_when
|
|
||||||
)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testWildcardGoodAndBad(self):
|
|
||||||
dns.dnssec.validate(
|
|
||||||
wildcard_txt, wildcard_txt_rrsig, wildcard_keys, None, wildcard_when
|
|
||||||
@@ -768,6 +775,7 @@ class DNSSECValidatorTestCase(unittest.TestCase):
|
|
||||||
com_txt, com_txt_rrsig[0], wildcard_keys, None, wildcard_when
|
|
||||||
)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testAlternateParameterFormats(self): # type: () -> None
|
|
||||||
# Pass rrset and rrsigset as (name, rdataset) tuples, not rrsets
|
|
||||||
rrset = (abs_soa.name, abs_soa.to_rdataset())
|
|
||||||
@@ -882,6 +890,7 @@ class DNSSECMiscTestCase(unittest.TestCase):
|
|
||||||
|
|
||||||
|
|
||||||
class DNSSECMakeDSTestCase(unittest.TestCase):
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testMnemonicParser(self):
|
|
||||||
good_ds_mnemonic = dns.rdata.from_text(
|
|
||||||
dns.rdataclass.IN,
|
|
||||||
@@ -891,6 +900,7 @@ class DNSSECMakeDSTestCase(unittest.TestCase):
|
|
||||||
)
|
|
||||||
self.assertEqual(good_ds, good_ds_mnemonic)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testMakeExampleSHA1DS(self): # type: () -> None
|
|
||||||
algorithm: Any
|
|
||||||
for algorithm in ("SHA1", "sha1", dns.dnssec.DSDigest.SHA1):
|
|
||||||
@@ -909,6 +919,7 @@ class DNSSECMakeDSTestCase(unittest.TestCase):
|
|
||||||
)
|
|
||||||
self.assertEqual(ds, example_ds_sha1)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testMakeExampleSHA1DSValidationOkByPolicy(self): # type: () -> None
|
|
||||||
algorithm: Any
|
|
||||||
for algorithm in ("SHA1", "sha1", dns.dnssec.DSDigest.SHA1):
|
|
||||||
@@ -924,6 +935,7 @@ class DNSSECMakeDSTestCase(unittest.TestCase):
|
|
||||||
)
|
|
||||||
self.assertEqual(ds, example_ds_sha1)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testMakeExampleSHA1DSDeniedByPolicy(self): # type: () -> None
|
|
||||||
with self.assertRaises(dns.dnssec.DeniedByPolicy):
|
|
||||||
ds = dns.dnssec.make_ds(abs_example, example_sep_key, "SHA1")
|
|
||||||
@@ -1174,6 +1186,7 @@ class DNSSECSignatureTestCase(unittest.TestCase):
|
|
||||||
rrsig_template = abs_soa_rrsig[0]
|
|
||||||
data = dns.dnssec._make_rrsig_signature_data(abs_soa, rrsig_template)
|
|
||||||
|
|
||||||
+ @unittest.skip(reason="SHA1 is not supported.")
|
|
||||||
def testSignatureRSASHA1(self): # type: () -> None
|
|
||||||
key = rsa.generate_private_key(
|
|
||||||
public_exponent=65537, key_size=2048, backend=default_backend()
|
|
||||||
--
|
|
||||||
2.40.1
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
From 8c23aaa4a213624cce86caa2e452ad19123d36f4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Rafael Guterres Jeffman <rjeffman@redhat.com>
|
|
||||||
Date: Wed, 14 Jun 2023 15:24:02 -0300
|
|
||||||
Subject: [PATCH 3/4] Do not use setuptools_scm[toml] for build.
|
|
||||||
|
|
||||||
---
|
|
||||||
setup.cfg | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/setup.cfg b/setup.cfg
|
|
||||||
index af48e0e..e9bec34 100644
|
|
||||||
--- a/setup.cfg
|
|
||||||
+++ b/setup.cfg
|
|
||||||
@@ -4,7 +4,7 @@ version = 2.3.0
|
|
||||||
author = Bob Halley
|
|
||||||
author_email = halley@dnspython.org
|
|
||||||
license = ISC
|
|
||||||
-license_file = LICENSE
|
|
||||||
+license_files = LICENSE
|
|
||||||
description = DNS toolkit
|
|
||||||
url = https://www.dnspython.org
|
|
||||||
project_urls =
|
|
||||||
@@ -46,7 +46,7 @@ packages =
|
|
||||||
dns.rdtypes.CH
|
|
||||||
python_requires = >=3.7
|
|
||||||
test_suite = tests
|
|
||||||
-setup_requires = setuptools>=44; setuptools_scm[toml]>=3.4.3
|
|
||||||
+setup_requires = setuptools>=44
|
|
||||||
|
|
||||||
[options.extras_require]
|
|
||||||
DOH = httpx>=0.21.1; h2>=4.1.0; requests; requests-toolbelt
|
|
||||||
--
|
|
||||||
2.40.1
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
From d8fea6c4e5512fd830c48035035ff3ea16b06444 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Rafael Guterres Jeffman <rjeffman@redhat.com>
|
|
||||||
Date: Wed, 14 Jun 2023 17:06:47 -0300
|
|
||||||
Subject: [PATCH 4/4] Disable tests that require external internet connection
|
|
||||||
|
|
||||||
---
|
|
||||||
tests/util.py | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/tests/util.py b/tests/util.py
|
|
||||||
index 5518b41..87ede4c 100644
|
|
||||||
--- a/tests/util.py
|
|
||||||
+++ b/tests/util.py
|
|
||||||
@@ -27,7 +27,8 @@ import dns.rdataclass
|
|
||||||
import dns.rdatatype
|
|
||||||
|
|
||||||
# Cache for is_internet_reachable()
|
|
||||||
-_internet_reachable = None
|
|
||||||
+# RHEL 9 build environment does not have provide external network access.
|
|
||||||
+_internet_reachable = False
|
|
||||||
_have_ipv4 = False
|
|
||||||
_have_ipv6 = False
|
|
||||||
|
|
||||||
--
|
|
||||||
2.40.1
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
|||||||
From 9d29457ac5e8d5ab932c62c39665ac1b057040d3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Bob Halley <halley@dnspython.org>
|
|
||||||
Date: Sat, 11 Feb 2023 15:17:27 -0800
|
|
||||||
Subject: [PATCH] Add dns.quic to setup.cfg for legacy setup.py installs [#896]
|
|
||||||
|
|
||||||
---
|
|
||||||
setup.cfg | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/setup.cfg b/setup.cfg
|
|
||||||
index bd07111..f536eee 100644
|
|
||||||
--- a/setup.cfg
|
|
||||||
+++ b/setup.cfg
|
|
||||||
@@ -40,6 +40,7 @@ provides = dns
|
|
||||||
[options]
|
|
||||||
packages =
|
|
||||||
dns
|
|
||||||
+ dns.quic
|
|
||||||
dns.rdtypes
|
|
||||||
dns.rdtypes.IN
|
|
||||||
dns.rdtypes.ANY
|
|
||||||
--
|
|
||||||
2.41.0
|
|
||||||
|
|
@ -0,0 +1,99 @@
|
|||||||
|
From a77e0c662c6d5b8224ac1e283aee8353bcd1536e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lumir Balhar <lbalhar@redhat.com>
|
||||||
|
Date: Mon, 22 Apr 2024 16:49:15 +0200
|
||||||
|
Subject: [PATCH] CVE-2023-29483
|
||||||
|
|
||||||
|
---
|
||||||
|
dns/query.py | 60 +++++++++++++++++++++++++++++++++++-----------------
|
||||||
|
1 file changed, 41 insertions(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dns/query.py b/dns/query.py
|
||||||
|
index 19b9fbb..2dba3cc 100644
|
||||||
|
--- a/dns/query.py
|
||||||
|
+++ b/dns/query.py
|
||||||
|
@@ -170,6 +170,22 @@ def _addresses_equal(af, a1, a2):
|
||||||
|
return n1 == n2 and a1[1:] == a2[1:]
|
||||||
|
|
||||||
|
|
||||||
|
+def _matches_destination(af, from_address, destination, ignore_unexpected):
|
||||||
|
+ # Check that from_address is appropriate for a response to a query
|
||||||
|
+ # sent to destination.
|
||||||
|
+ if not destination:
|
||||||
|
+ return True
|
||||||
|
+ if _addresses_equal(af, from_address, destination) or (
|
||||||
|
+ dns.inet.is_multicast(destination[0]) and from_address[1:] == destination[1:]
|
||||||
|
+ ):
|
||||||
|
+ return True
|
||||||
|
+ elif ignore_unexpected:
|
||||||
|
+ return False
|
||||||
|
+ raise UnexpectedSource(
|
||||||
|
+ f"got a response from {from_address} instead of " f"{destination}"
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+
|
||||||
|
def _destination_and_source(af, where, port, source, source_port):
|
||||||
|
# Apply defaults and compute destination and source tuples
|
||||||
|
# suitable for use in connect(), sendto(), or bind().
|
||||||
|
@@ -194,7 +210,7 @@ def _destination_and_source(af, where, port, source, source_port):
|
||||||
|
|
||||||
|
|
||||||
|
def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0,
|
||||||
|
- ignore_unexpected=False, one_rr_per_rrset=False):
|
||||||
|
+ ignore_unexpected=False, one_rr_per_rrset=False, ignore_errors=False):
|
||||||
|
"""Return the response obtained after sending a query via UDP.
|
||||||
|
|
||||||
|
@param q: the query
|
||||||
|
@@ -239,26 +255,32 @@ def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0,
|
||||||
|
while 1:
|
||||||
|
_wait_for_readable(s, expiration)
|
||||||
|
(wire, from_address) = s.recvfrom(65535)
|
||||||
|
- if _addresses_equal(af, from_address, destination) or \
|
||||||
|
- (dns.inet.is_multicast(where) and
|
||||||
|
- from_address[1:] == destination[1:]):
|
||||||
|
- break
|
||||||
|
- if not ignore_unexpected:
|
||||||
|
- raise UnexpectedSource('got a response from '
|
||||||
|
- '%s instead of %s' % (from_address,
|
||||||
|
- destination))
|
||||||
|
- finally:
|
||||||
|
- if begin_time is None:
|
||||||
|
- response_time = 0
|
||||||
|
- else:
|
||||||
|
+ if not _matches_destination(
|
||||||
|
+ s.family, from_address, destination, ignore_unexpected
|
||||||
|
+ ):
|
||||||
|
+ continue
|
||||||
|
+
|
||||||
|
response_time = time.time() - begin_time
|
||||||
|
+
|
||||||
|
+ try:
|
||||||
|
+ r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac,
|
||||||
|
+ one_rr_per_rrset=one_rr_per_rrset)
|
||||||
|
+ r.time = response_time
|
||||||
|
+ except Exception:
|
||||||
|
+ if ignore_errors:
|
||||||
|
+ continue
|
||||||
|
+ else:
|
||||||
|
+ raise
|
||||||
|
+
|
||||||
|
+ if q.is_response(r):
|
||||||
|
+ return r
|
||||||
|
+ else:
|
||||||
|
+ if ignore_errors:
|
||||||
|
+ continue
|
||||||
|
+ else:
|
||||||
|
+ raise BadResponse
|
||||||
|
+ finally:
|
||||||
|
s.close()
|
||||||
|
- r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac,
|
||||||
|
- one_rr_per_rrset=one_rr_per_rrset)
|
||||||
|
- r.time = response_time
|
||||||
|
- if not q.is_response(r):
|
||||||
|
- raise BadResponse
|
||||||
|
- return r
|
||||||
|
|
||||||
|
|
||||||
|
def _net_read(sock, count, expiration):
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,161 @@
|
|||||||
|
From c28f0584ba37cd6b0e9919dcbec652a34a420843 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lumir Balhar <lbalhar@redhat.com>
|
||||||
|
Date: Wed, 28 Aug 2019 14:10:36 +0200
|
||||||
|
Subject: [PATCH] Backported original patch from:
|
||||||
|
https://github.com/rthalley/dnspython/commit/c76aa6ac9969447220c8e807aa1e5640a6c12924
|
||||||
|
|
||||||
|
Unicode label escapify was not escapifying special characters. [Issue #339]
|
||||||
|
---
|
||||||
|
dns/name.py | 57 +++++++++++++++++++++++-----------------------
|
||||||
|
tests/test_name.py | 5 ++++
|
||||||
|
2 files changed, 34 insertions(+), 28 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dns/name.py b/dns/name.py
|
||||||
|
index 97e216c..4a064d6 100644
|
||||||
|
--- a/dns/name.py
|
||||||
|
+++ b/dns/name.py
|
||||||
|
@@ -116,20 +116,28 @@ class IDNACodec(object):
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
+ def is_idna(self, label):
|
||||||
|
+ return label.lower().startswith(b'xn--')
|
||||||
|
+
|
||||||
|
+ def is_all_ascii(self, label):
|
||||||
|
+ for c in label:
|
||||||
|
+ if ord(c) > 0x7f:
|
||||||
|
+ return False
|
||||||
|
+ return True
|
||||||
|
+
|
||||||
|
def encode(self, label):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def decode(self, label):
|
||||||
|
- # We do not apply any IDNA policy on decode; we just
|
||||||
|
- downcased = label.lower()
|
||||||
|
- if downcased.startswith(b'xn--'):
|
||||||
|
+ # We do not apply any IDNA policy on decode.
|
||||||
|
+ if self.is_idna(label):
|
||||||
|
try:
|
||||||
|
- label = downcased[4:].decode('punycode')
|
||||||
|
+ label = label[4:].decode('punycode')
|
||||||
|
except Exception as e:
|
||||||
|
raise IDNAException(idna_exception=e)
|
||||||
|
else:
|
||||||
|
label = maybe_decode(label)
|
||||||
|
- return _escapify(label, True)
|
||||||
|
+ return _escapify(label)
|
||||||
|
|
||||||
|
class IDNA2003Codec(IDNACodec):
|
||||||
|
|
||||||
|
@@ -159,7 +167,7 @@ class IDNA2003Codec(IDNACodec):
|
||||||
|
if label == b'':
|
||||||
|
return u''
|
||||||
|
try:
|
||||||
|
- return _escapify(encodings.idna.ToUnicode(label), True)
|
||||||
|
+ return _escapify(encodings.idna.ToUnicode(label))
|
||||||
|
except Exception as e:
|
||||||
|
raise IDNAException(idna_exception=e)
|
||||||
|
|
||||||
|
@@ -197,12 +205,6 @@ class IDNA2008Codec(IDNACodec):
|
||||||
|
self.allow_pure_ascii = allow_pure_ascii
|
||||||
|
self.strict_decode = strict_decode
|
||||||
|
|
||||||
|
- def is_all_ascii(self, label):
|
||||||
|
- for c in label:
|
||||||
|
- if ord(c) > 0x7f:
|
||||||
|
- return False
|
||||||
|
- return True
|
||||||
|
-
|
||||||
|
def encode(self, label):
|
||||||
|
if label == '':
|
||||||
|
return b''
|
||||||
|
@@ -227,11 +229,12 @@ class IDNA2008Codec(IDNACodec):
|
||||||
|
try:
|
||||||
|
if self.uts_46:
|
||||||
|
label = idna.uts46_remap(label, False, False)
|
||||||
|
- return _escapify(idna.ulabel(label), True)
|
||||||
|
+ return _escapify(idna.ulabel(label))
|
||||||
|
except idna.IDNAError as e:
|
||||||
|
raise IDNAException(idna_exception=e)
|
||||||
|
|
||||||
|
_escaped = bytearray(b'"().;\\@$')
|
||||||
|
+_escaped_text = '"().;\\@$'
|
||||||
|
|
||||||
|
IDNA_2003_Practical = IDNA2003Codec(False)
|
||||||
|
IDNA_2003_Strict = IDNA2003Codec(True)
|
||||||
|
@@ -242,13 +245,13 @@ IDNA_2008_Strict = IDNA2008Codec(False, False, False, True)
|
||||||
|
IDNA_2008_Transitional = IDNA2008Codec(True, True, False, False)
|
||||||
|
IDNA_2008 = IDNA_2008_Practical
|
||||||
|
|
||||||
|
-def _escapify(label, unicode_mode=False):
|
||||||
|
+def _escapify(label):
|
||||||
|
"""Escape the characters in label which need it.
|
||||||
|
- @param unicode_mode: escapify only special and whitespace (<= 0x20)
|
||||||
|
- characters
|
||||||
|
@returns: the escaped string
|
||||||
|
@rtype: string"""
|
||||||
|
- if not unicode_mode:
|
||||||
|
+ if isinstance(label, bytes):
|
||||||
|
+ # Ordinary DNS label mode. Escape special characters and values
|
||||||
|
+ # < 0x20 or > 0x7f.
|
||||||
|
text = ''
|
||||||
|
if isinstance(label, text_type):
|
||||||
|
label = label.encode()
|
||||||
|
@@ -259,19 +262,17 @@ def _escapify(label, unicode_mode=False):
|
||||||
|
text += chr(c)
|
||||||
|
else:
|
||||||
|
text += '\\%03d' % c
|
||||||
|
- return text.encode()
|
||||||
|
+ return text
|
||||||
|
|
||||||
|
+ # Unicode label mode. Escape only special characters and values < 0x20
|
||||||
|
text = u''
|
||||||
|
- if isinstance(label, binary_type):
|
||||||
|
- label = label.decode()
|
||||||
|
for c in label:
|
||||||
|
- if c > u'\x20' and c < u'\x7f':
|
||||||
|
- text += c
|
||||||
|
+ if c in _escaped_text:
|
||||||
|
+ text += '\\' + c
|
||||||
|
+ elif c <= '\x20':
|
||||||
|
+ text += '\\%03d' % ord(c)
|
||||||
|
else:
|
||||||
|
- if c >= u'\x7f':
|
||||||
|
- text += c
|
||||||
|
- else:
|
||||||
|
- text += u'\\%03d' % ord(c)
|
||||||
|
+ text += c
|
||||||
|
return text
|
||||||
|
|
||||||
|
def _validate_labels(labels):
|
||||||
|
@@ -519,8 +520,8 @@ class Name(object):
|
||||||
|
l = self.labels[:-1]
|
||||||
|
else:
|
||||||
|
l = self.labels
|
||||||
|
- s = b'.'.join(map(_escapify, l))
|
||||||
|
- return maybe_decode(s)
|
||||||
|
+ s = '.'.join(map(_escapify, l))
|
||||||
|
+ return s
|
||||||
|
|
||||||
|
def to_unicode(self, omit_final_dot=False, idna_codec=None):
|
||||||
|
"""Convert name to Unicode text format.
|
||||||
|
diff --git a/tests/test_name.py b/tests/test_name.py
|
||||||
|
index f2a8773..fa1d3eb 100644
|
||||||
|
--- a/tests/test_name.py
|
||||||
|
+++ b/tests/test_name.py
|
||||||
|
@@ -255,6 +255,11 @@ class NameTestCase(unittest.TestCase):
|
||||||
|
t = dns.name.root.to_unicode()
|
||||||
|
self.assertEqual(t, '.')
|
||||||
|
|
||||||
|
+ def testToText12(self):
|
||||||
|
+ n = dns.name.from_text(r'a\.b.c')
|
||||||
|
+ t = n.to_unicode()
|
||||||
|
+ self.assertEqual(t, r'a\.b.c.')
|
||||||
|
+
|
||||||
|
def testSlice1(self):
|
||||||
|
n = dns.name.from_text(r'a.b.c.', origin=None)
|
||||||
|
s = n[:]
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
@ -0,0 +1,14 @@
|
|||||||
|
diff --git a/dns/query.py b/dns/query.py
|
||||||
|
index bfecd43..19b9fbb 100644
|
||||||
|
--- a/dns/query.py
|
||||||
|
+++ b/dns/query.py
|
||||||
|
@@ -467,7 +467,8 @@ def xfr(where, zone, rdtype=dns.rdatatype.AXFR, rdclass=dns.rdataclass.IN,
|
||||||
|
first = True
|
||||||
|
while not done:
|
||||||
|
mexpiration = _compute_expiration(timeout)
|
||||||
|
- if mexpiration is None or mexpiration > expiration:
|
||||||
|
+ if mexpiration is None or \
|
||||||
|
+ (expiration is not None and mexpiration > expiration):
|
||||||
|
mexpiration = expiration
|
||||||
|
if use_udp:
|
||||||
|
_wait_for_readable(s, expiration)
|
@ -0,0 +1,12 @@
|
|||||||
|
diff -ruN /home/avram/Desktop/dnspython-1.15.0.orig/tests/test_zone.py /home/avram/Desktop/dnspython-1.15.0/tests/test_zone.py
|
||||||
|
--- a/tests/test_zone.py 2016-09-20 12:24:02.000000000 -0400
|
||||||
|
+++ b/tests/test_zone.py 2016-10-04 07:59:39.717946790 -0400
|
||||||
|
@@ -177,7 +177,7 @@
|
||||||
|
def testToFileFilename(self):
|
||||||
|
z = dns.zone.from_file(here('example'), 'example')
|
||||||
|
try:
|
||||||
|
- z.to_file('example3-filename.out')
|
||||||
|
+ z.to_file(here('example3-filename.out'))
|
||||||
|
ok = filecmp.cmp(here('example3-filename.out'),
|
||||||
|
here('example3.good'))
|
||||||
|
finally:
|
Loading…
Reference in new issue