- Fixed problem with header folding that caused the first line to be

folded too long (Updated test test_add_body_length since l= tag is no
      longer at the beginning of a line
This commit is contained in:
Scott Kitterman
2017-05-30 12:11:15 -04:00
parent 497d74ca4b
commit e14a4f3539
3 changed files with 14 additions and 7 deletions
+3
View File
@@ -1,4 +1,7 @@
UNRELEASED Version 0.6.2 UNRELEASED Version 0.6.2
- Fixed problem with header folding that caused the first line to be
folded too long (Updated test test_add_body_length since l= tag is no
longer at the beginning of a line)
- Fixed python3.4 string interpolation issue - Fixed python3.4 string interpolation issue
- Fix some byte casting issues & typos - Fix some byte casting issues & typos
- Add test case for verification when should headers are signed - Add test case for verification when should headers are signed
+10 -6
View File
@@ -299,7 +299,7 @@ def text(s):
if type(s) is str: return s if type(s) is str: return s
return s.encode('ascii') return s.encode('ascii')
def fold(header): def fold(header, namelen=0):
"""Fold a header line into multiple crlf-separated lines at column 72. """Fold a header line into multiple crlf-separated lines at column 72.
>>> text(fold(b'foo')) >>> text(fold(b'foo'))
@@ -318,14 +318,18 @@ def fold(header):
i += 3 i += 3
pre = header[:i] pre = header[:i]
header = header[i:] header = header[i:]
while len(header) > 72: # 72 is the max line length we actually want, but the header field name
i = header[:72].rfind(b" ") # has to fit in the first line too (See Debian Bug #863690).
maxleng = 72 - namelen
while len(header) > maxleng:
i = header[:maxleng].rfind(b" ")
if i == -1: if i == -1:
j = 72 j = maxleng
else: else:
j = i + 1 j = i + 1
pre += header[:j] + b"\r\n " pre += header[:j] + b"\r\n "
header = header[j:] header = header[j:]
namelen = 0
return pre + header return pre + header
def load_pk_from_dns(name, dnsfunc=get_txt): def load_pk_from_dns(name, dnsfunc=get_txt):
@@ -485,7 +489,7 @@ class DomainSigner(object):
header_value = b"; ".join(b"=".join(x) for x in fields) header_value = b"; ".join(b"=".join(x) for x in fields)
if not standardize: if not standardize:
header_value = fold(header_value) header_value = fold(header_value, namelen=len(header_name))
header_value = RE_BTAG.sub(b'\\1',header_value) header_value = RE_BTAG.sub(b'\\1',header_value)
header = (header_name, b' ' + header_value) header = (header_name, b' ' + header_value)
h = HashThrough(self.hasher()) h = HashThrough(self.hasher())
@@ -510,7 +514,7 @@ class DomainSigner(object):
header_value = b"; ".join(b"=".join(x) for x in fields) + b"\r\n" header_value = b"; ".join(b"=".join(x) for x in fields) + b"\r\n"
if not standardize: if not standardize:
header_value = fold(header_value) header_value = fold(header_value, namelen=len(header_name))
return header_value return header_value
+1 -1
View File
@@ -103,7 +103,7 @@ Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
sig = dkim.sign( sig = dkim.sign(
self.message, b"test", b"example.com", self.key, length=True) self.message, b"test", b"example.com", self.key, length=True)
msg = email.message_from_string(self.message.decode('utf-8')) msg = email.message_from_string(self.message.decode('utf-8'))
self.assertIn('\n l=%s' % len(msg.get_payload() + '\n'), sig.decode('utf-8')) self.assertIn('; l=%s' % len(msg.get_payload() + '\n'), sig.decode('utf-8'))
res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc) res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc)
self.assertTrue(res) self.assertTrue(res)