!16 Revert "update to 2.1.0"
From: @xiyuanwang Reviewed-by: @small_leek Signed-off-by: @small_leek
This commit is contained in:
commit
e8f23c65a6
99
base64.patch
Normal file
99
base64.patch
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
From f36ac6022a2a3d5b067387908aa31932234a31e1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lumir Balhar <lbalhar@redhat.com>
|
||||||
|
Date: Fri, 17 Apr 2020 08:01:22 +0200
|
||||||
|
Subject: [PATCH] Backwards compatibility for base64 module
|
||||||
|
|
||||||
|
---
|
||||||
|
dns/tsigkeyring.py | 16 ++++++++++++----
|
||||||
|
tests/test_tsigkeyring.py | 39 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 51 insertions(+), 4 deletions(-)
|
||||||
|
create mode 100644 tests/test_tsigkeyring.py
|
||||||
|
|
||||||
|
diff --git a/dns/tsigkeyring.py b/dns/tsigkeyring.py
|
||||||
|
index 5e5fe1c..1dab2aa 100644
|
||||||
|
--- a/dns/tsigkeyring.py
|
||||||
|
+++ b/dns/tsigkeyring.py
|
||||||
|
@@ -19,7 +19,14 @@
|
||||||
|
|
||||||
|
from dns._compat import maybe_decode, maybe_encode
|
||||||
|
|
||||||
|
-import base64
|
||||||
|
+
|
||||||
|
+try:
|
||||||
|
+ # New in version 3.1
|
||||||
|
+ from base64 import decodebytes, encodebytes
|
||||||
|
+except ImportError:
|
||||||
|
+ # Deprecated since version 3.1 and removed since 3.9
|
||||||
|
+ from base64 import decodestring as decodebytes
|
||||||
|
+ from base64 import encodestring as encodebytes
|
||||||
|
|
||||||
|
import dns.name
|
||||||
|
|
||||||
|
@@ -32,7 +39,7 @@ def from_text(textring):
|
||||||
|
keyring = {}
|
||||||
|
for keytext in textring:
|
||||||
|
keyname = dns.name.from_text(keytext)
|
||||||
|
- secret = base64.decodestring(maybe_encode(textring[keytext]))
|
||||||
|
+ secret = decodebytes(textring[keytext].encode())
|
||||||
|
keyring[keyname] = secret
|
||||||
|
return keyring
|
||||||
|
|
||||||
|
@@ -44,7 +51,8 @@ def to_text(keyring):
|
||||||
|
|
||||||
|
textring = {}
|
||||||
|
for keyname in keyring:
|
||||||
|
- keytext = maybe_decode(keyname.to_text())
|
||||||
|
- secret = maybe_decode(base64.encodestring(keyring[keyname]))
|
||||||
|
+ keytext = keyname.to_text()
|
||||||
|
+ # rstrip to get rid of the \n encoding adds
|
||||||
|
+ secret = encodebytes(keyring[keyname]).decode().rstrip()
|
||||||
|
textring[keytext] = secret
|
||||||
|
return textring
|
||||||
|
diff --git a/tests/test_tsigkeyring.py b/tests/test_tsigkeyring.py
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..17177c0
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tests/test_tsigkeyring.py
|
||||||
|
@@ -0,0 +1,39 @@
|
||||||
|
+# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
|
||||||
|
+
|
||||||
|
+try:
|
||||||
|
+ # New in version 3.1
|
||||||
|
+ from base64 import decodebytes
|
||||||
|
+except ImportError:
|
||||||
|
+ # Deprecated since version 3.1 and removed since 3.9
|
||||||
|
+ from base64 import decodestring as decodebytes
|
||||||
|
+
|
||||||
|
+import unittest
|
||||||
|
+
|
||||||
|
+import dns.tsigkeyring
|
||||||
|
+
|
||||||
|
+text_keyring = {
|
||||||
|
+ 'keyname.' : 'NjHwPsMKjdN++dOfE5iAiQ=='
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+rich_keyring = {
|
||||||
|
+ dns.name.from_text('keyname.') : \
|
||||||
|
+ decodebytes('NjHwPsMKjdN++dOfE5iAiQ=='.encode())
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+class TSIGKeyRingTestCase(unittest.TestCase):
|
||||||
|
+
|
||||||
|
+ def test_from_text(self):
|
||||||
|
+ """text keyring -> rich keyring"""
|
||||||
|
+ rkeyring = dns.tsigkeyring.from_text(text_keyring)
|
||||||
|
+ self.assertEqual(rkeyring, rich_keyring)
|
||||||
|
+
|
||||||
|
+ def test_to_text(self):
|
||||||
|
+ """text keyring -> rich keyring -> text keyring"""
|
||||||
|
+ tkeyring = dns.tsigkeyring.to_text(rich_keyring)
|
||||||
|
+ self.assertEqual(tkeyring, text_keyring)
|
||||||
|
+
|
||||||
|
+ def test_from_and_to_text(self):
|
||||||
|
+ """text keyring -> rich keyring -> text keyring"""
|
||||||
|
+ rkeyring = dns.tsigkeyring.from_text(text_keyring)
|
||||||
|
+ tkeyring = dns.tsigkeyring.to_text(rkeyring)
|
||||||
|
+ self.assertEqual(tkeyring, text_keyring)
|
||||||
|
--
|
||||||
|
2.25.2
|
||||||
|
|
||||||
22
collections_abc.patch
Normal file
22
collections_abc.patch
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
diff -ru dnspython-1.16.0-orig/dns/namedict.py dnspython-1.16.0/dns/namedict.py
|
||||||
|
--- dnspython-1.16.0-orig/dns/namedict.py 2018-12-01 10:25:27.000000000 -0500
|
||||||
|
+++ dnspython-1.16.0/dns/namedict.py 2020-01-21 19:48:57.266576401 -0500
|
||||||
|
@@ -27,12 +27,16 @@
|
||||||
|
|
||||||
|
"""DNS name dictionary"""
|
||||||
|
|
||||||
|
-import collections
|
||||||
|
import dns.name
|
||||||
|
from ._compat import xrange
|
||||||
|
|
||||||
|
+try:
|
||||||
|
+ from collections.abc import MutableMapping
|
||||||
|
+except ImportError:
|
||||||
|
+ from collections import MutableMapping
|
||||||
|
|
||||||
|
-class NameDict(collections.MutableMapping):
|
||||||
|
+
|
||||||
|
+class NameDict(MutableMapping):
|
||||||
|
"""A dictionary whose keys are dns.name.Name objects.
|
||||||
|
|
||||||
|
In addition to being like a regular Python dictionary, this
|
||||||
BIN
dnspython-1.16.0.tar.gz
Normal file
BIN
dnspython-1.16.0.tar.gz
Normal file
Binary file not shown.
Binary file not shown.
@ -22,42 +22,8 @@ index 1738c1a..1e0c727 100644
|
|||||||
- _network_available = False
|
- _network_available = False
|
||||||
+_network_available = False
|
+_network_available = False
|
||||||
|
|
||||||
# Some tests use a "nano nameserver" for testing. It requires trio
|
resolv_conf = u"""
|
||||||
# and threading, so try to import it and if it doesn't work, skip
|
/t/t
|
||||||
diff -ruNa dnspython-2.1.0-org/tests/test_async.py dnspython-2.1.0/tests/test_async.py
|
|
||||||
--- dnspython-2.1.0-org/tests/test_async.py 2021-07-07 10:04:01.861405149 +0800
|
|
||||||
+++ dnspython-2.1.0/tests/test_async.py 2021-07-07 10:04:59.981489084 +0800
|
|
||||||
@@ -41,12 +41,8 @@
|
|
||||||
|
|
||||||
# Some tests require the internet to be available to run, so let's
|
|
||||||
# skip those if it's not there.
|
|
||||||
-_network_available = True
|
|
||||||
-try:
|
|
||||||
- socket.gethostbyname('dnspython.org')
|
|
||||||
-except socket.gaierror:
|
|
||||||
- _network_available = False
|
|
||||||
|
|
||||||
+_network_available = False
|
|
||||||
|
|
||||||
# Probe for IPv4 and IPv6
|
|
||||||
query_addresses = []
|
|
||||||
diff -ruNa dnspython-2.1.0-org/tests/test_query.py dnspython-2.1.0/tests/test_query.py
|
|
||||||
--- dnspython-2.1.0-org/tests/test_query.py 2021-07-07 10:04:01.861405149 +0800
|
|
||||||
+++ dnspython-2.1.0/tests/test_query.py 2021-07-07 10:05:44.431553273 +0800
|
|
||||||
@@ -38,11 +38,8 @@
|
|
||||||
|
|
||||||
# Some tests require the internet to be available to run, so let's
|
|
||||||
# skip those if it's not there.
|
|
||||||
-_network_available = True
|
|
||||||
-try:
|
|
||||||
- socket.gethostbyname('dnspython.org')
|
|
||||||
-except socket.gaierror:
|
|
||||||
- _network_available = False
|
|
||||||
+
|
|
||||||
+_network_available = False
|
|
||||||
|
|
||||||
# Some tests use a "nano nameserver" for testing. It requires trio
|
|
||||||
# and threading, so try to import it and if it doesn't work, skip
|
|
||||||
--
|
--
|
||||||
1.8.3.1
|
1.8.3.1
|
||||||
|
|
||||||
|
|||||||
@ -13,18 +13,19 @@ messages, names, and records.
|
|||||||
|
|
||||||
Name: python-dns
|
Name: python-dns
|
||||||
Summary: %{sum}
|
Summary: %{sum}
|
||||||
Version: 2.1.0
|
Version: 1.16.0
|
||||||
Release: 1
|
Release: 3
|
||||||
License: ISC and MIT
|
License: MIT
|
||||||
URL: http://www.dnspython.org/
|
URL: http://www.dnspython.org/
|
||||||
Source0: https://github.com/rthalley/dnspython/archive/v%{version}/dnspython-%{version}.tar.gz
|
Source0: http://www.dnspython.org/kits/%{version}/dnspython-%{version}.tar.gz
|
||||||
|
|
||||||
Patch0: fix-failed-tests.patch
|
|
||||||
|
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
|
Patch0: unicode_label_escapify.patch
|
||||||
|
Patch1: collections_abc.patch
|
||||||
|
Patch2: base64.patch
|
||||||
|
Patch3: fix-failed-tests.patch
|
||||||
|
|
||||||
BuildRequires: python3-devel python3-setuptools python3-pycryptodome python3-ecdsa
|
BuildRequires: python3-devel python3-setuptools python3-pycryptodome python3-ecdsa
|
||||||
BuildRequires: python3-pytest
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
%{_description}
|
%{_description}
|
||||||
@ -50,7 +51,7 @@ find examples -type f | xargs chmod a-x
|
|||||||
%py3_install
|
%py3_install
|
||||||
|
|
||||||
%check
|
%check
|
||||||
pytest
|
%{__python3} setup.py test
|
||||||
|
|
||||||
%files -n python3-dns
|
%files -n python3-dns
|
||||||
%doc LICENSE
|
%doc LICENSE
|
||||||
@ -61,9 +62,6 @@ pytest
|
|||||||
%doc examples
|
%doc examples
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Wed Jul 07 2021 gaihuiying<gaihuiying1@huawei.com> - 2.1.0-1
|
|
||||||
- update to 2.1.0
|
|
||||||
|
|
||||||
* Tue Nov 17 2020 jinzhimin<jinzhimin2@huawei.com> - 1.16.0-3
|
* Tue Nov 17 2020 jinzhimin<jinzhimin2@huawei.com> - 1.16.0-3
|
||||||
- fix tests failed
|
- fix tests failed
|
||||||
|
|
||||||
|
|||||||
110
unicode_label_escapify.patch
Normal file
110
unicode_label_escapify.patch
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
diff -ru dnspython-1.16.0-orig/dns/name.py dnspython-1.16.0/dns/name.py
|
||||||
|
--- dnspython-1.16.0-orig/dns/name.py 2018-12-05 08:35:40.000000000 -0500
|
||||||
|
+++ dnspython-1.16.0/dns/name.py 2020-01-22 01:07:53.319289996 -0500
|
||||||
|
@@ -195,16 +195,10 @@
|
||||||
|
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''
|
||||||
|
- if self.allow_pure_ascii and self.is_all_ascii(label):
|
||||||
|
+ if self.allow_pure_ascii and is_all_ascii(label):
|
||||||
|
return label.encode('ascii')
|
||||||
|
if not have_idna_2008:
|
||||||
|
raise NoIDNA2008
|
||||||
|
@@ -230,6 +224,7 @@
|
||||||
|
raise IDNAException(idna_exception=e)
|
||||||
|
|
||||||
|
_escaped = bytearray(b'"().;\\@$')
|
||||||
|
+_escaped_text = u'"().;\\@$'
|
||||||
|
|
||||||
|
IDNA_2003_Practical = IDNA2003Codec(False)
|
||||||
|
IDNA_2003_Strict = IDNA2003Codec(True)
|
||||||
|
@@ -263,7 +258,9 @@
|
||||||
|
if isinstance(label, binary_type):
|
||||||
|
label = label.decode()
|
||||||
|
for c in label:
|
||||||
|
- if c > u'\x20' and c < u'\x7f':
|
||||||
|
+ if c in _escaped_text:
|
||||||
|
+ text += u'\\' + c
|
||||||
|
+ elif c > u'\x20' and c < u'\x7f':
|
||||||
|
text += c
|
||||||
|
else:
|
||||||
|
if c >= u'\x7f':
|
||||||
|
@@ -827,7 +824,7 @@
|
||||||
|
if text == u'@':
|
||||||
|
text = u''
|
||||||
|
if text:
|
||||||
|
- if text == u'.':
|
||||||
|
+ if text in [u'.', u'\u3002', u'\uff0e', u'\uff61']:
|
||||||
|
return Name([b'']) # no Unicode "u" on this constant!
|
||||||
|
for c in text:
|
||||||
|
if escaping:
|
||||||
|
@@ -870,6 +867,13 @@
|
||||||
|
return Name(labels)
|
||||||
|
|
||||||
|
|
||||||
|
+def is_all_ascii(text):
|
||||||
|
+ for c in text:
|
||||||
|
+ if ord(c) > 0x7f:
|
||||||
|
+ return False
|
||||||
|
+ return True
|
||||||
|
+
|
||||||
|
+
|
||||||
|
def from_text(text, origin=root, idna_codec=None):
|
||||||
|
"""Convert text into a Name object.
|
||||||
|
|
||||||
|
@@ -886,7 +890,18 @@
|
||||||
|
"""
|
||||||
|
|
||||||
|
if isinstance(text, text_type):
|
||||||
|
- return from_unicode(text, origin, idna_codec)
|
||||||
|
+ if not is_all_ascii(text):
|
||||||
|
+ # Some codepoint in the input text is > 127, so IDNA applies.
|
||||||
|
+ return from_unicode(text, origin, idna_codec)
|
||||||
|
+ # The input is all ASCII, so treat this like an ordinary non-IDNA
|
||||||
|
+ # domain name. Note that "all ASCII" is about the input text,
|
||||||
|
+ # not the codepoints in the domain name. E.g. if text has value
|
||||||
|
+ #
|
||||||
|
+ # r'\150\151\152\153\154\155\156\157\158\159'
|
||||||
|
+ #
|
||||||
|
+ # then it's still "all ASCII" even though the domain name has
|
||||||
|
+ # codepoints > 127.
|
||||||
|
+ text = text.encode('ascii')
|
||||||
|
if not isinstance(text, binary_type):
|
||||||
|
raise ValueError("input to from_text() must be a string")
|
||||||
|
if not (origin is None or isinstance(origin, Name)):
|
||||||
|
diff -ru dnspython-1.16.0-orig/tests/test_name.py dnspython-1.16.0/tests/test_name.py
|
||||||
|
--- dnspython-1.16.0-orig/tests/test_name.py 2018-12-01 10:48:40.000000000 -0500
|
||||||
|
+++ dnspython-1.16.0/tests/test_name.py 2020-01-21 23:19:07.998492185 -0500
|
||||||
|
@@ -255,6 +255,23 @@
|
||||||
|
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 testToText13(self):
|
||||||
|
+ n = dns.name.from_text(r'\150\151\152\153\154\155\156\157\158\159.')
|
||||||
|
+ t = n.to_text()
|
||||||
|
+ self.assertEqual(t, r'\150\151\152\153\154\155\156\157\158\159.')
|
||||||
|
+
|
||||||
|
+ def testToText14(self):
|
||||||
|
+ # You can't send this to_unicode() as it wasn't unicode to begin with.
|
||||||
|
+ def bad():
|
||||||
|
+ n = dns.name.from_text(r'\150\151\152\153\154\155\156\157\158\159.')
|
||||||
|
+ t = n.to_unicode()
|
||||||
|
+ self.failUnlessRaises(UnicodeDecodeError, bad)
|
||||||
|
+
|
||||||
|
def testSlice1(self):
|
||||||
|
n = dns.name.from_text(r'a.b.c.', origin=None)
|
||||||
|
s = n[:]
|
||||||
Loading…
x
Reference in New Issue
Block a user