summaryrefslogtreecommitdiff
path: root/src/leap/mail/smtp/rfc3156.py
diff options
context:
space:
mode:
authorKali Kaneko <kali@leap.se>2014-04-09 16:11:23 -0500
committerKali Kaneko <kali@leap.se>2014-04-09 16:11:23 -0500
commit4124f7b486ecd1ee90451255bb35c46606ef55e5 (patch)
tree58205da129e77194d2961bd16996a38bf09cf3ea /src/leap/mail/smtp/rfc3156.py
parent13f23aaf1433f7f5f5111b81a21ab873b2d975de (diff)
parent8b1d8e88955fe5c1af8cee973abfdec4043a650c (diff)
Merge tag '0.3.9' into deb-0.3.9
Tag leap.mail version 0.3.9 Conflicts: pkg/requirements.pip
Diffstat (limited to 'src/leap/mail/smtp/rfc3156.py')
-rw-r--r--src/leap/mail/smtp/rfc3156.py29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/leap/mail/smtp/rfc3156.py b/src/leap/mail/smtp/rfc3156.py
index 9739531..62a0675 100644
--- a/src/leap/mail/smtp/rfc3156.py
+++ b/src/leap/mail/smtp/rfc3156.py
@@ -24,6 +24,7 @@ import base64
from abc import ABCMeta, abstractmethod
from StringIO import StringIO
+from twisted.python import log
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email import errors
@@ -145,14 +146,26 @@ def encode_base64(msg):
:param msg: The non-multipart message to be encoded.
:type msg: email.message.Message
"""
- orig = msg.get_payload()
- encdata = _bencode(orig)
- msg.set_payload(encdata)
- # replace or set the Content-Transfer-Encoding header.
- try:
- msg.replace_header('Content-Transfer-Encoding', 'base64')
- except KeyError:
- msg['Content-Transfer-Encoding'] = 'base64'
+ encoding = msg.get('Content-Transfer-Encoding', None)
+ if encoding is not None:
+ encoding = encoding.lower()
+ # XXX Python's email module can only decode quoted-printable, base64 and
+ # uuencoded data, so we might have to implement other decoding schemes in
+ # order to support RFC 3156 properly and correctly calculate signatures
+ # for multipart attachments (eg. 7bit or 8bit encoded attachments). For
+ # now, if content is already encoded as base64 or if it is encoded with
+ # some unknown encoding, we just pass.
+ if encoding in [None, 'quoted-printable', 'x-uuencode', 'uue', 'x-uue']:
+ orig = msg.get_payload(decode=True)
+ encdata = _bencode(orig)
+ msg.set_payload(encdata)
+ # replace or set the Content-Transfer-Encoding header.
+ try:
+ msg.replace_header('Content-Transfer-Encoding', 'base64')
+ except KeyError:
+ msg['Content-Transfer-Encoding'] = 'base64'
+ elif encoding is not 'base64':
+ log.err('Unknown content-transfer-encoding: %s' % encoding)
def encode_base64_rec(msg):