Merge ~spitap/dkimpy:utf8-support into dkimpy:master

Proposed by Adrien
Status: Needs review
Proposed branch: ~spitap/dkimpy:utf8-support
Merge into: dkimpy:master
Diff against target: 533 lines (+157/-68)
13 files modified
.gitignore (+1/-0)
dkim/asyncsupport.py (+9/-5)
dkim/dkimverify.py (+34/-4)
dkim/dnsplug.py (+2/-3)
dkim/tests/__init__.py (+9/-0)
dkim/tests/data/test_punnycode.message (+9/-0)
dkim/tests/data/test_utf8.message (+9/-0)
dkim/tests/test_arc.py (+3/-4)
dkim/tests/test_dkim.py (+57/-22)
dkim/tests/test_dkim_ed25519.py (+3/-3)
dkim/tests/test_dkim_generate.py (+5/-6)
dkim/tests/test_dkim_rsavariants.py (+3/-3)
dkim/tests/test_dkim_tlsrpt.py (+13/-18)
Reviewer Review Type Date Requested Status
dkimpy developers Pending
Review via email: mp+427826@code.launchpad.net

Commit message

Added UTF-8 support && ability to check message from CLI

To post a comment you must log in.

Unmerged commits

9813d5b... by Adrien

UT8-Support

b446e70... by Scott Kitterman

WIP to support DNS data via text file and support for non-UTF-8 email addresses

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/.gitignore b/.gitignore
2index debba34..589aff8 100644
3--- a/.gitignore
4+++ b/.gitignore
5@@ -4,3 +4,4 @@ dkim/*.pyc
6 dkim/tests/*.pyc
7 dkimpy.egg-info
8 dist
9+build/
10diff --git a/dkim/asyncsupport.py b/dkim/asyncsupport.py
11index 226cc42..e326827 100644
12--- a/dkim/asyncsupport.py
13+++ b/dkim/asyncsupport.py
14@@ -50,13 +50,17 @@ async def get_txt_async(name, timeout=5):
15 # Note: This will use the existing loop or create one if needed
16 loop = asyncio.get_event_loop()
17 resolver = aiodns.DNSResolver(loop=loop, timeout=timeout)
18-
19- async def query(name, qtype):
20- return await resolver.query(name, qtype)
21+
22+ try:
23+ unicode_name = name.decode('utf-8')
24+ except UnicodeDecodeError:
25+ return None
26+ async def query(unicode_name, qtype):
27+ return await resolver.query(unicode_name, qtype)
28
29 #q = query(name, 'TXT')
30 try:
31- result = await query(name, 'TXT')
32+ result = await query(unicode_name, 'TXT')
33 except aiodns.error.DNSError:
34 result = None
35
36@@ -86,7 +90,7 @@ class DKIM(dkim.DKIM):
37 name = sig[b's'] + b"._domainkey." + sig[b'd'] + b"."
38 try:
39 self.pk, self.keysize, self.ktag, self.seqtlsrpt = await load_pk_from_dns_async(name,
40- dnsfunc, timeout=self.timeout)
41+ dnsfunc, timeout=self.timeout)
42 except dkim.KeyFormatError as e:
43 self.logger.error("%s" % e)
44 return False
45diff --git a/dkim/dkimverify.py b/dkim/dkimverify.py
46index 2ca90d5..e1d6243 100644
47--- a/dkim/dkimverify.py
48+++ b/dkim/dkimverify.py
49@@ -28,24 +28,54 @@ import argparse
50
51 import dkim
52
53+def filedns(datafile, tgtdomain, selector):
54+
55+ def dnsf(self, domain, timeout=5):
56+ target = "{0}._domainkey.{1}.".format(selector, tgtdomain)
57+ _dns_responses = {
58+ target : read_test_data(datafile),
59+ }
60+ try:
61+ domain = domain.decode('ascii')
62+ except UnicodeDecodeError:
63+ return None
64+ self.assertTrue(domain in _dns_responses,domain)
65+ return _dns_responses[domain]
66+
67+ return dnsf
68+
69 def main():
70 parser = argparse.ArgumentParser(
71 description='Verify DKIM signature for email messages.',
72 epilog="message to be verified follows commands on stdin")
73+ parser.add_argument('-v', '--verbose', action='store_true', default=False,
74+ help='turn verbose mode on')
75 parser.add_argument('--index', metavar='N', type=int, default=0,
76 help='Index of DKIM signature header to verify: default=0')
77+ parser.add_argument('-f', '--dnsfile', action="store", default=None,
78+ help='File containing DKIM public key records' )
79+ parser.add_argument('-d', '--domain', action="store", default=None,
80+ help='Domain for DNS record in dnsfile. Mandatory with -f.' )
81+ parser.add_argument('-s', '--selector', action="store", default=None,
82+ help='Selector for DNS record in dnsfile. Mandatory with -f.' )
83 args=parser.parse_args()
84 if sys.version_info[0] >= 3:
85 # Make sys.stdin a binary stream.
86 sys.stdin = sys.stdin.detach()
87
88 message = sys.stdin.read()
89- verbose = '-v' in sys.argv
90- if verbose:
91+ if args.verbose:
92 import logging
93- d = dkim.DKIM(message, logger=logging)
94+ log=logging
95+ else:
96+ log=None
97+ if args.dnsfile:
98+ if not args.domain or not args.selector:
99+ raise SyntaxError('Both --domain and --selector are required with --dnsfile')
100+ dnsfc=filedns(args.dnsfile, args.domain, args.selector)
101+ d = dkim.DKIM(message, logger=log, dnsfunc=dnsfc)
102 else:
103- d = dkim.DKIM(message)
104+ d = dkim.DKIM(message, logger=log)
105 res = d.verify(args.index)
106 if not res:
107 print("signature verification failed")
108diff --git a/dkim/dnsplug.py b/dkim/dnsplug.py
109index 5ccf97c..4c75d34 100644
110--- a/dkim/dnsplug.py
111+++ b/dkim/dnsplug.py
112@@ -24,7 +24,6 @@ __all__ = [
113 'get_txt'
114 ]
115
116-
117 def get_txt_dnspython(name, timeout=5):
118 """Return a TXT record associated with a DNS name."""
119 try:
120@@ -78,11 +77,11 @@ except ImportError:
121 def get_txt(name, timeout=5):
122 """Return a TXT record associated with a DNS name.
123
124- @param name: The bytestring domain name to look up.
125+ @param name: The string domain name to look up.
126 """
127 # pydns needs Unicode, but DKIM's d= is ASCII (already punycoded).
128 try:
129- unicode_name = name.decode('UTF-8')
130+ unicode_name = name.decode('utf-8')
131 except UnicodeDecodeError:
132 return None
133 txt = _get_txt(unicode_name, timeout)
134diff --git a/dkim/tests/__init__.py b/dkim/tests/__init__.py
135index 4fb2926..50fe90f 100644
136--- a/dkim/tests/__init__.py
137+++ b/dkim/tests/__init__.py
138@@ -24,6 +24,15 @@
139 import unittest
140
141
142+def utf8_decode(data):
143+ """To decode utf-8 bytestring"""
144+ try:
145+ data = data.decode('utf-8')
146+ except UnicodeDecodeError:
147+ return None
148+ return data
149+
150+
151 def test_suite():
152 from dkim.tests import (
153 test_canonicalization,
154diff --git a/dkim/tests/data/test_punnycode.message b/dkim/tests/data/test_punnycode.message
155new file mode 100644
156index 0000000..bece5cc
157--- /dev/null
158+++ b/dkim/tests/data/test_punnycode.message
159@@ -0,0 +1,9 @@
160+Authentication-Results: lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass
161+Received: from localhost
162+Message-ID: <example@example.com>
163+Date: Mon, 01 Jan 2011 01:02:03 +0400
164+From: UTF8 user <test@xn----ylba7abgd9bnh0e.xn--qxa6a>
165+To: somebody@example.com
166+Subject: Testing
167+
168+This is a test message.
169diff --git a/dkim/tests/data/test_utf8.message b/dkim/tests/data/test_utf8.message
170new file mode 100644
171index 0000000..80b6543
172--- /dev/null
173+++ b/dkim/tests/data/test_utf8.message
174@@ -0,0 +1,9 @@
175+Authentication-Results: lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass
176+Received: from localhost
177+Message-ID: <example@example.com>
178+Date: Mon, 01 Jan 2011 01:02:03 +0400
179+From: UTF8 user <test@κλαρα-σωλις.ευ>
180+To: somebody@example.com
181+Subject: Testing
182+
183+This is a test message.
184diff --git a/dkim/tests/test_arc.py b/dkim/tests/test_arc.py
185index a65c7c3..c07b9ce 100644
186--- a/dkim/tests/test_arc.py
187+++ b/dkim/tests/test_arc.py
188@@ -23,7 +23,7 @@
189 import os.path
190 import unittest
191 import time
192-
193+from . import utf8_decode
194 import dkim
195
196
197@@ -61,9 +61,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
198 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
199 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
200 }
201- try:
202- domain = domain.decode('ascii')
203- except UnicodeDecodeError:
204+ domain = utf8_decode(domain)
205+ if not domain:
206 return None
207 self.assertTrue(domain in _dns_responses,domain)
208 return _dns_responses[domain]
209diff --git a/dkim/tests/test_dkim.py b/dkim/tests/test_dkim.py
210index dc589d6..3ce5379 100644
211--- a/dkim/tests/test_dkim.py
212+++ b/dkim/tests/test_dkim.py
213@@ -22,7 +22,7 @@ import unittest
214 import time
215
216 import dkim
217-
218+from . import utf8_decode
219
220 def read_test_data(filename):
221 """Get the content of the given test data file.
222@@ -61,6 +61,8 @@ class TestSignAndVerify(unittest.TestCase):
223 self.message4 = read_test_data("rfc6376.signed.msg")
224 self.message5 = read_test_data("rfc6376.signed.rsa.msg")
225 self.message6 = read_test_data("test.message.baddomain")
226+ self.messageutf8 = read_test_data("test_utf8.message")
227+ self.messagepunycode = read_test_data("test_punnycode.message")
228 self.key = read_test_data("test.private")
229 self.rfckey = read_test_data("rfc8032_7_1.key")
230
231@@ -81,9 +83,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
232 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
233 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
234 }
235- try:
236- domain = domain.decode('ascii')
237- except UnicodeDecodeError:
238+ domain = utf8_decode(domain)
239+ if not domain:
240 return None
241 self.assertTrue(domain in _dns_responses,domain)
242 return _dns_responses[domain]
243@@ -105,9 +106,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
244 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
245 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
246 }
247- try:
248- domain = domain.decode('ascii')
249- except UnicodeDecodeError:
250+ domain = utf8_decode(domain)
251+ if not domain:
252 return None
253 self.assertTrue(domain in _dns_responses,domain)
254 return _dns_responses[domain]
255@@ -129,9 +129,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
256 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
257 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
258 }
259- try:
260- domain = domain.decode('ascii')
261- except UnicodeDecodeError:
262+ domain = utf8_decode(domain)
263+ if not domain:
264 return None
265 self.assertTrue(domain in _dns_responses,domain)
266 return _dns_responses[domain]
267@@ -153,9 +152,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
268 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
269 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
270 }
271- try:
272- domain = domain.decode('ascii')
273- except UnicodeDecodeError:
274+ domain = utf8_decode(domain)
275+ if not domain:
276 return None
277 self.assertTrue(domain in _dns_responses,domain)
278 return _dns_responses[domain]
279@@ -172,9 +170,8 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ=="""
280 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \
281 p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""
282 }
283- try:
284- domain = domain.decode('ascii')
285- except UnicodeDecodeError:
286+ domain = utf8_decode(domain)
287+ if not domain:
288 return None
289 self.assertTrue(domain in _dns_responses,domain)
290 return _dns_responses[domain]
291@@ -190,9 +187,8 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ=="""
292 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \
293 p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""
294 }
295- try:
296- domain = domain.decode('ascii')
297- except UnicodeDecodeError:
298+ domain = utf8_decode(domain)
299+ if not domain:
300 return None
301 self.assertTrue(domain in _dns_responses,domain)
302 return _dns_responses[domain]
303@@ -206,13 +202,32 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ=="""
304 _dns_responses = {
305 'test._domainkey.legitimate.com(.attacker.com.': read_test_data("test.txt"),
306 }
307- try:
308- domain = domain.decode('ascii')
309- except UnicodeDecodeError:
310+ domain = utf8_decode(domain)
311+ if not domain:
312 return None
313 self.assertTrue(domain in _dns_responses,domain)
314 return _dns_responses[domain]
315
316+ def dnsfuncutf8(self, domain, timeout=5):
317+ _dns_responses = {
318+ '2022._domainkey.κλαρα-σωλις.ευ.': read_test_data("2048_testkey_PKCS8.key.pub.txt"),
319+ 'test._domainkey.legitimate.com(.attacker.com.': read_test_data("test.txt"),
320+ }
321+ domain = utf8_decode(domain)
322+ if not domain:
323+ return None
324+ self.assertTrue(domain in _dns_responses)
325+ return _dns_responses[domain]
326+
327+ def dnsfuncpunycode(self, domain, timeout=5):
328+ _dns_response = {
329+ '2022._domainkey.xn----ylba7abgd9bnh0e.xn--qxa6a.' : read_test_data("2048_testkey_PKCS8.key.pub.txt")
330+ }
331+ domain = utf8_decode(domain)
332+ if not domain:
333+ return None
334+ self.assertTrue(domain in _dns_response)
335+ return _dns_response[domain]
336
337 def test_verifies(self):
338 # A message verifies after being signed.
339@@ -499,6 +514,26 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ==
340 sigerror = True
341 self.assertTrue(sigerror)
342
343+ def test_utf_8_verifies(self):
344+ # Attempt to verify message with UTF-8 domain.
345+ key = read_test_data("2048_testkey_PKCS8.key")
346+ for header_algo in (b"simple", b"relaxed"):
347+ for body_algo in (b"simple", b"relaxed"):
348+ sig = dkim.sign(self.messageutf8, b'2022', "κλαρα-σωλις.ευ".encode('utf-8'), key,
349+ canonicalize=(header_algo, body_algo))
350+ res = dkim.verify(sig + self.messageutf8, dnsfunc=self.dnsfuncutf8)
351+ self.assertTrue(res)
352+
353+ def test_punnycode_verifies(self):
354+ # Attempt to verify message with UTF-8 domain.
355+ key = read_test_data("2048_testkey_PKCS8.key")
356+ for header_algo in (b"simple", b"relaxed"):
357+ for body_algo in (b"simple", b"relaxed"):
358+ sig = dkim.sign(self.messagepunycode, b'2022', "xn----ylba7abgd9bnh0e.xn--qxa6a".encode('utf-8'), key,
359+ canonicalize=(header_algo, body_algo))
360+ res = dkim.verify(sig + self.messagepunycode, dnsfunc=self.dnsfuncpunycode)
361+ self.assertTrue(res)
362+
363 def test_validate_signature_fields(self):
364 sig = {b'v': b'1',
365 b'a': b'rsa-sha256',
366diff --git a/dkim/tests/test_dkim_ed25519.py b/dkim/tests/test_dkim_ed25519.py
367index 5cf89e4..adeea99 100644
368--- a/dkim/tests/test_dkim_ed25519.py
369+++ b/dkim/tests/test_dkim_ed25519.py
370@@ -22,6 +22,7 @@ import os.path
371 import unittest
372 import time
373
374+from . import utf8_decode
375 import dkim
376
377
378@@ -72,9 +73,8 @@ p=yi50DjK5O9pqbFpNHklsv9lqaS0ArSYu02qp1S0DW1Y=""",
379 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \
380 p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""
381 }
382- try:
383- domain = domain.decode('ascii')
384- except UnicodeDecodeError:
385+ domain = utf8_decode(domain)
386+ if not domain:
387 return None
388 self.assertTrue(domain in _dns_responses,domain)
389 return _dns_responses[domain]
390diff --git a/dkim/tests/test_dkim_generate.py b/dkim/tests/test_dkim_generate.py
391index 1649ab5..7063c5b 100644
392--- a/dkim/tests/test_dkim_generate.py
393+++ b/dkim/tests/test_dkim_generate.py
394@@ -23,6 +23,7 @@ import unittest
395
396 import dkim
397 import dknewkey
398+from . import utf8_decode
399
400 def read_data(path):
401 """Get the content of the given test data file."""
402@@ -88,9 +89,8 @@ class TestSignAndVerify(unittest.TestCase):
403 _dns_responses = {
404 'test._domainkey.example.com.': read_data(self.rsa_dns_key_file),
405 }
406- try:
407- domain = domain.decode('ascii')
408- except UnicodeDecodeError:
409+ domain = utf8_decode(domain)
410+ if not domain:
411 return None
412 self.assertTrue(domain in _dns_responses,domain)
413 return _dns_responses[domain]
414@@ -99,9 +99,8 @@ class TestSignAndVerify(unittest.TestCase):
415 _dns_responses = {
416 'test1._domainkey.example.com.': read_data(self.ed25519_dns_key_file),
417 }
418- try:
419- domain = domain.decode('ascii')
420- except UnicodeDecodeError:
421+ domain = utf8_decode(domain)
422+ if not domain:
423 return None
424 self.assertTrue(domain in _dns_responses,domain)
425 return _dns_responses[domain]
426diff --git a/dkim/tests/test_dkim_rsavariants.py b/dkim/tests/test_dkim_rsavariants.py
427index 992d466..a230b3a 100644
428--- a/dkim/tests/test_dkim_rsavariants.py
429+++ b/dkim/tests/test_dkim_rsavariants.py
430@@ -22,6 +22,7 @@ import unittest
431 import time
432
433 import dkim
434+from . import utf8_decode
435
436
437 def read_test_data(filename):
438@@ -51,9 +52,8 @@ class TestSignAndVerify(unittest.TestCase):
439 'test4._domainkey.example.com.': read_test_data("2048_testkey_wo_markers.pub.rsa.txt"),
440 'test5._domainkey.example.com.': read_test_data("2048_testkey_PKCS8.key.pub.txt")
441 }
442- try:
443- domain = domain.decode('ascii')
444- except UnicodeDecodeError:
445+ domain = utf8_decode(domain)
446+ if not domain:
447 return None
448 self.assertTrue(domain in _dns_responses,domain)
449 return _dns_responses[domain]
450diff --git a/dkim/tests/test_dkim_tlsrpt.py b/dkim/tests/test_dkim_tlsrpt.py
451index 83b31b6..2684885 100644
452--- a/dkim/tests/test_dkim_tlsrpt.py
453+++ b/dkim/tests/test_dkim_tlsrpt.py
454@@ -22,6 +22,7 @@ import unittest
455 import time
456
457 import dkim
458+from . import utf8_decode
459
460
461 def read_test_data(filename):
462@@ -79,9 +80,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
463 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
464 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
465 }
466- try:
467- domain = domain.decode('ascii')
468- except UnicodeDecodeError:
469+ domain = utf8_decode(domain)
470+ if not domain:
471 return None
472 self.assertTrue(domain in _dns_responses,domain)
473 return _dns_responses[domain]
474@@ -103,9 +103,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
475 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
476 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
477 }
478- try:
479- domain = domain.decode('ascii')
480- except UnicodeDecodeError:
481+ domain = utf8_decode(domain)
482+ if not domain:
483 return None
484 self.assertTrue(domain in _dns_responses,domain)
485 return _dns_responses[domain]
486@@ -127,9 +126,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
487 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
488 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
489 }
490- try:
491- domain = domain.decode('ascii')
492- except UnicodeDecodeError:
493+ domain = utf8_decode(domain)
494+ if not domain:
495 return None
496 self.assertTrue(domain in _dns_responses,domain)
497 return _dns_responses[domain]
498@@ -151,9 +149,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
499 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
500 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
501 }
502- try:
503- domain = domain.decode('ascii')
504- except UnicodeDecodeError:
505+ domain = utf8_decode(domain)
506+ if not domain:
507 return None
508 self.assertTrue(domain in _dns_responses,domain)
509 return _dns_responses[domain]
510@@ -170,9 +167,8 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ=="""
511 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \
512 p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""
513 }
514- try:
515- domain = domain.decode('ascii')
516- except UnicodeDecodeError:
517+ domain = utf8_decode(domain)
518+ if not domain:
519 return None
520 self.assertTrue(domain in _dns_responses,domain)
521 return _dns_responses[domain]
522@@ -194,9 +190,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
523 MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
524 Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
525 }
526- try:
527- domain = domain.decode('ascii')
528- except UnicodeDecodeError:
529+ domain = utf8_decode(domain)
530+ if not domain:
531 return None
532 self.assertTrue(domain in _dns_responses,domain)
533 return _dns_responses[domain]

Subscribers

People subscribed via source and target branches

to all changes: