ssoma-mda: Decode RFC-2047-encoded Subject: headers
authorW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 06:59:47 +0000 (22:59 -0800)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 06:59:47 +0000 (22:59 -0800)
For example, get [1]:

  'If you can read this you understand the example.'

from a message with:

  Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=
    =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=

[1]: http://tools.ietf.org/html/rfc2047.html#section-8

ssoma-mda

index 39bed3eb2ad187ddc317be65da993c69ac2a210a..abae18065c60c47c7308959c6bbdaacb6b527eea 100755 (executable)
--- a/ssoma-mda
+++ b/ssoma-mda
@@ -44,6 +44,7 @@ from __future__ import unicode_literals
 
 import argparse as _argparse
 import email as _email
+import email.header as _email_header
 import email.message as _email_message
 import email.policy as _email_policy
 import email.utils as _email_utils
@@ -218,6 +219,16 @@ def message_id_path(message_id):
     return _os_path.join(hash[:2], hash[2:])
 
 
+def get_commit_message(message):
+    """Unwrap and decode the message subject for use as a commit message."""
+    commit_message = message.get('Subject', '<no subject>')
+    commit_message = _FOLDING_WHITESPACE_REGEX.sub(' ', commit_message)
+    commit_message = ''.join(
+        str(decoded, charset) for decoded, charset
+        in _email_header.decode_header(commit_message))
+    return commit_message
+
+
 def get_author(message):
     """Create a pygit2.Signature for the message author."""
     author_name, author_email = _email_utils.parseaddr(
@@ -259,9 +270,7 @@ def deliver(message=None, message_bytes=None, **kwargs):
     message_id = message.get('Message-ID', '')
     path = message_id_path(message_id=message_id)
     _LOG.info('deliver {} to {}'.format(message_id, path))
-    commit_message = message.get('Subject', '<no subject>')
-    if '\n' in commit_message:
-        commit_message = _FOLDING_WHITESPACE_REGEX.sub(' ', commit_message)
+    commit_message = get_commit_message(message=message)
     author = get_author(message=message)
     repository = _pygit2.Repository(_os_path.curdir)
     append(