diff options
Diffstat (limited to 'mail')
| -rw-r--r-- | mail/CHANGELOG | 6 | ||||
| -rw-r--r-- | mail/src/leap/mail/imap/server.py | 28 | ||||
| -rw-r--r-- | mail/src/leap/mail/smtp/__init__.py | 8 | 
3 files changed, 36 insertions, 6 deletions
| diff --git a/mail/CHANGELOG b/mail/CHANGELOG index fb62efd..45f1a7f 100644 --- a/mail/CHANGELOG +++ b/mail/CHANGELOG @@ -1,3 +1,9 @@ +0.3.4 Oct 4: +  o Improve charset handling when exposing mails to the mail +    client. Related to #3660. +  o Return Twisted's smtp Port object to be able to stop listening to +    it whenever we want. Related to #3873. +  0.3.3 Sep 20:    o Remove cleartext mail from logs. Closes: #3877. diff --git a/mail/src/leap/mail/imap/server.py b/mail/src/leap/mail/imap/server.py index ae76833..10d338a 100644 --- a/mail/src/leap/mail/imap/server.py +++ b/mail/src/leap/mail/imap/server.py @@ -18,7 +18,9 @@  Soledad-backed IMAP Server.  """  import copy +import email  import logging +import re  import StringIO  import cStringIO  import time @@ -693,6 +695,26 @@ class LeapMessage(WithMsgFields):      the more complex MIME-based interface.      """ +    def _get_charset(self, content): +        """ +        Mini parser to retrieve the charset of an email + +        :param content: mail contents +        :type content: unicode + +        :returns: the charset as parsed from the contents +        :rtype: str +        """ +        charset = "UTF-8" +        try: +            em = email.message_from_string(content.encode("utf-8")) +            # Miniparser for: Content-Type: <something>; charset=<charset> +            charset_re = r'''charset=(?P<charset>[\w|\d|-]*)''' +            charset = re.findall(charset_re, em["Content-Type"])[0] +        except Exception: +            pass +        return charset +      def open(self):          """          Return an file-like object opened for reading. @@ -704,7 +726,8 @@ class LeapMessage(WithMsgFields):          :rtype: StringIO          """          fd = cStringIO.StringIO() -        fd.write(str(self._doc.content.get(self.RAW_KEY, ''))) +        charset = self._get_charset(self._doc.content.get(self.RAW_KEY, '')) +        fd.write(self._doc.content.get(self.RAW_KEY, '').encode(charset))          fd.seek(0)          return fd @@ -723,7 +746,8 @@ class LeapMessage(WithMsgFields):          :rtype: StringIO          """          fd = StringIO.StringIO() -        fd.write(str(self._doc.content.get(self.RAW_KEY, ''))) +        charset = self._get_charset(self._doc.content.get(self.RAW_KEY, '')) +        fd.write(self._doc.content.get(self.RAW_KEY, '').encode(charset))          # SHOULD use a separate BODY FIELD ...          fd.seek(0)          return fd diff --git a/mail/src/leap/mail/smtp/__init__.py b/mail/src/leap/mail/smtp/__init__.py index 2a4abc5..4e5d2a0 100644 --- a/mail/src/leap/mail/smtp/__init__.py +++ b/mail/src/leap/mail/smtp/__init__.py @@ -54,7 +54,7 @@ def setup_smtp_relay(port, keymanager, smtp_host, smtp_port,                             or not.      :type encrypted_only: bool -    :returns: SMTPFactory +    :returns: tuple of SMTPFactory, twisted.internet.tcp.Port      """      # The configuration for the SMTP relay is a dict with the following      # format: @@ -77,10 +77,10 @@ def setup_smtp_relay(port, keymanager, smtp_host, smtp_port,      # configure the use of this service with twistd      factory = SMTPFactory(keymanager, config)      try: -        reactor.listenTCP(port, factory, -                          interface="localhost") +        tport = reactor.listenTCP(port, factory, +                                  interface="localhost")          signal(proto.SMTP_SERVICE_STARTED, str(smtp_port)) -        return factory +        return factory, tport      except CannotListenError:          logger.error("STMP Service failed to start: "                       "cannot listen in port %s" % ( | 
