You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2019/05/30 18:24:14 UTC

[allura] 01/02: [#8289] fix inbound mail encoding issue

This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a commit to branch db/8289
in repository https://gitbox.apache.org/repos/asf/allura.git

commit 553a3f7130f2ff0151dafae07133545add8d265c
Author: Dave Brondsema <da...@brondsema.net>
AuthorDate: Thu May 30 13:50:48 2019 -0400

    [#8289] fix inbound mail encoding issue
---
 Allura/allura/lib/mail_util.py        |  5 +++-
 Allura/allura/tasks/mail_tasks.py     |  2 +-
 Allura/allura/tests/test_mail_util.py | 54 ++++++++++++++++++++++++++++++++++-
 3 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/Allura/allura/lib/mail_util.py b/Allura/allura/lib/mail_util.py
index ea906bf..7fbace5 100644
--- a/Allura/allura/lib/mail_util.py
+++ b/Allura/allura/lib/mail_util.py
@@ -23,6 +23,7 @@ from email.MIMEMultipart import MIMEMultipart
 from email.MIMEText import MIMEText
 from email import header
 
+import six
 import tg
 from paste.deploy.converters import asbool, asint, aslist
 from formencode import validators as fev
@@ -155,8 +156,10 @@ def parse_message(data):
     else:
         result['payload'] = msg.get_payload(decode=True)
         charset = msg.get_content_charset()
-        if charset:
+        # payload is sometimes already unicode (due to being saved in mongo?)
+        if isinstance(result['payload'], six.binary_type) and charset:
             result['payload'] = result['payload'].decode(charset)
+
     return result
 
 
diff --git a/Allura/allura/tasks/mail_tasks.py b/Allura/allura/tasks/mail_tasks.py
index d60533f..43a9f1a 100644
--- a/Allura/allura/tasks/mail_tasks.py
+++ b/Allura/allura/tasks/mail_tasks.py
@@ -62,7 +62,7 @@ def route_email(
     '''
     try:
         msg = mail_util.parse_message(data)
-    except:  # pragma no cover
+    except Exception:  # pragma no cover
         log.exception('Parse Error: (%r,%r,%r)', peer, mailfrom, rcpttos)
         return
     if mail_util.is_autoreply(msg):
diff --git a/Allura/allura/tests/test_mail_util.py b/Allura/allura/tests/test_mail_util.py
index 13b5b42..4f99840 100644
--- a/Allura/allura/tests/test_mail_util.py
+++ b/Allura/allura/tests/test_mail_util.py
@@ -22,7 +22,7 @@ from email.MIMEMultipart import MIMEMultipart
 from email.MIMEText import MIMEText
 
 import mock
-from nose.tools import raises, assert_equal, assert_false, assert_true
+from nose.tools import raises, assert_equal, assert_false, assert_true, assert_in
 from ming.orm import ThreadLocalORMSession
 from tg import config as tg_config
 
@@ -96,6 +96,58 @@ class TestReactor(unittest.TestCase):
         s_msg = msg1.as_string()
         msg2 = parse_message(s_msg)
         assert isinstance(msg2['payload'], unicode)
+        assert_in(u'всех', msg2['payload'])
+
+    def test_more_encodings(self):
+        # these are unicode strings to reflect behavior after loading 'route_email' tasks from mongo
+        s_msg = u"""Date: Sat, 25 May 2019 09:32:00 +1000
+From: <fo...@bar.com>
+To: <38...@bugs.proj.localhost>
+Subject: bugs
+Content-Type: text/plain; charset=GBK
+Content-Transfer-Encoding: base64
+
+VGhlIFNuYXA3IGFwcGxpY2F0aW9uKGJhc2VkIG9uIHNuYXA3LWZ1bGwtMS40LjIpIGhhcyBiZWVu
+IHJ1biBvdmVyIGEgd2VlayBvbiBRTlg2LjYuMCwKQnV0IHNvbWV0aW1lcyAsc3lzdGVtIHNjcmVl
+biB3aWxsIHByaW50CiJsZGQ6RkFUQUw6Y291bGQgbm90IGxvYWQgbGlicmFyeSBsaWJzb2NrZXQu
+c28uMyIsClRoZSBhcHBsaWNhdGlvbidzIGNvbW11bmljYXRpb24gd29yayB3ZWxsICxidXQgdGhl
+IGZ0cCx0ZWxuZXQscGluZyBjYW4ndCB3b3JrICEKCgpXaHk/
+"""
+        msg = parse_message(s_msg)
+        assert isinstance(msg['payload'], unicode)
+        assert_in(u'The Snap7 application', msg['payload'])
+
+        s_msg = u"""Date: Sat, 25 May 2019 09:32:00 +1000
+From: <fo...@bar.com>
+To: <38...@bugs.proj.localhost>
+Subject: bugs
+Content-Type: text/plain; charset=utf-8
+Content-Disposition: inline
+Content-Transfer-Encoding: 8bit
+
+> Status: closed
+> Created: Thu May 23, 2019 09:24 PM UTC by admin1
+> Attachments:
+> 
+>   • foo.txt (1.0 kB; text/plain)
+> 
+"""
+        msg = parse_message(s_msg)
+        assert isinstance(msg['payload'], unicode)
+        assert_in(u'• foo', msg['payload'])
+
+        s_msg = u"""Date: Sat, 25 May 2019 09:32:00 +1000
+From: <fo...@bar.com>
+To: <38...@bugs.proj.localhost>
+Subject: bugs
+Content-Type: TEXT/PLAIN; format=flowed; charset=ISO-8859-15
+Content-Transfer-Encoding: 8BIT
+
+programmed or èrogrammed ?
+"""
+        msg = parse_message(s_msg)
+        assert isinstance(msg['payload'], unicode)
+        assert_in(u'èrogrammed', msg['payload'])
 
     def test_unicode_complex_message(self):
         charset = 'utf-8'