Merge ~spitap/dkimpy:utf8-support into dkimpy:master
- Git
- lp:~spitap/dkimpy
- utf8-support
- Merge into 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) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
dkimpy developers | Pending | ||
Review via email:
|
Commit message
Added UTF-8 support && ability to check message from CLI
Description of the change
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
1 | diff --git a/.gitignore b/.gitignore |
2 | index 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/ |
10 | diff --git a/dkim/asyncsupport.py b/dkim/asyncsupport.py |
11 | index 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 |
45 | diff --git a/dkim/dkimverify.py b/dkim/dkimverify.py |
46 | index 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") |
108 | diff --git a/dkim/dnsplug.py b/dkim/dnsplug.py |
109 | index 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) |
134 | diff --git a/dkim/tests/__init__.py b/dkim/tests/__init__.py |
135 | index 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, |
154 | diff --git a/dkim/tests/data/test_punnycode.message b/dkim/tests/data/test_punnycode.message |
155 | new file mode 100644 |
156 | index 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. |
169 | diff --git a/dkim/tests/data/test_utf8.message b/dkim/tests/data/test_utf8.message |
170 | new file mode 100644 |
171 | index 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. |
184 | diff --git a/dkim/tests/test_arc.py b/dkim/tests/test_arc.py |
185 | index 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] |
209 | diff --git a/dkim/tests/test_dkim.py b/dkim/tests/test_dkim.py |
210 | index 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', |
366 | diff --git a/dkim/tests/test_dkim_ed25519.py b/dkim/tests/test_dkim_ed25519.py |
367 | index 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] |
390 | diff --git a/dkim/tests/test_dkim_generate.py b/dkim/tests/test_dkim_generate.py |
391 | index 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] |
426 | diff --git a/dkim/tests/test_dkim_rsavariants.py b/dkim/tests/test_dkim_rsavariants.py |
427 | index 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] |
450 | diff --git a/dkim/tests/test_dkim_tlsrpt.py b/dkim/tests/test_dkim_tlsrpt.py |
451 | index 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] |