]> git.ozlabs.org Git - patchwork/blobdiff - apps/patchwork/bin/parsemail.py
[parser] Decode From: headers
[patchwork] / apps / patchwork / bin / parsemail.py
index b0f1497656ab8ac4170c93f34975454b4f9b0fad..07554bcb3cbffeaada7ddb3741667379ca5db295 100755 (executable)
@@ -26,11 +26,11 @@ import time
 import operator
 from email import message_from_file
 try:
-    from email.header import Header
+    from email.header import Header, decode_header
     from email.utils import parsedate_tz, mktime_tz
 except ImportError:
     # Python 2.4 compatibility
-    from email.Header import Header
+    from email.Header import Header, decode_header
     from email.Utils import parsedate_tz, mktime_tz
 
 from patchwork.parser import parse_patch
@@ -38,6 +38,17 @@ from patchwork.models import Patch, Project, Person, Comment
 
 list_id_headers = ['List-ID', 'X-Mailing-List']
 
+def clean_header(header):
+    """ Decode (possibly non-ascii) headers """
+
+    def decode(str, fragment):
+        (frag_str, frag_encoding) = fragment
+        if frag_encoding:
+            return str + frag_str.decode(frag_encoding)
+        return str + frag_str.decode()
+
+    return reduce(decode, decode_header(header), u'').strip()
+
 def find_project(mail):
     project = None
     listid_re = re.compile('.*<([^>]+)>.*', re.S)
@@ -60,7 +71,7 @@ def find_project(mail):
 
 def find_author(mail):
 
-    from_header = mail.get('From').strip()
+    from_header = clean_header(mail.get('From'))
     (name, email) = (None, None)
 
     # tuple of (regex, fn)