diff options
| -rw-r--r-- | Mailman/Handlers/CookHeaders.py | 23 | ||||
| -rw-r--r-- | Mailman/testing/test_handlers.py | 84 |
2 files changed, 77 insertions, 30 deletions
diff --git a/Mailman/Handlers/CookHeaders.py b/Mailman/Handlers/CookHeaders.py index 11f08acc8..7b5579fad 100644 --- a/Mailman/Handlers/CookHeaders.py +++ b/Mailman/Handlers/CookHeaders.py @@ -281,27 +281,10 @@ def prefix_subject(mlist, msg, msgdata): prefix = prefix % mlist.post_id except TypeError: pass - # If charset is 'us-ascii', try to concatnate as string because there - # is some weirdness in Header module (TK) - if cset == 'us-ascii': - try: - if old_style: - h = u' '.join([recolon, prefix, subject]) - else: - h = u' '.join([prefix, recolon, subject]) - h = h.encode('us-ascii') - h = uheader(mlist, h, 'Subject', continuation_ws=ws) - del msg['subject'] - msg['Subject'] = h - ss = u' '.join([recolon, subject]) - ss = ss.encode('us-ascii') - ss = uheader(mlist, ss, 'Subject', continuation_ws=ws) - msgdata['stripped_subject'] = ss - return - except UnicodeError: - pass # Get the header as a Header instance, with proper unicode conversion - if old_style: + if not recolon: + h = uheader(mlist, prefix, 'Subject', continuation_ws=ws) + elif old_style: h = uheader(mlist, recolon, 'Subject', continuation_ws=ws) h.append(prefix) else: diff --git a/Mailman/testing/test_handlers.py b/Mailman/testing/test_handlers.py index 931a7ca44..59fd4de08 100644 --- a/Mailman/testing/test_handlers.py +++ b/Mailman/testing/test_handlers.py @@ -580,6 +580,70 @@ Subject: Re: [XTEST] About Mailman... CookHeaders.process(self._mlist, msg, {}) self.assertEqual(msg['subject'], 'Re: [XTEST] About Mailman...') + def test_subject_munging_i18n(self): + self._mlist.subject_prefix = '[XTEST]' + msg = Message.Message() + msg['Subject'] = '=?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?=' + CookHeaders.process(self._mlist, msg, {}) + self.assertEqual(unicode(msg['subject']), + u'[XTEST] \u30e1\u30fc\u30eb\u30de\u30f3') + self.assertEqual(msg['subject'], + '[XTEST] =?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?=') + self._mlist.subject_prefix = '[XTEST %d]' + self._mlist.post_id = 456 + msg = Message.Message() + msg['Subject'] = '=?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?=' + CookHeaders.process(self._mlist, msg, {}) + self.assertEqual(unicode(msg['subject']), + u'[XTEST 456] \u30e1\u30fc\u30eb\u30de\u30f3') + self.assertEqual(msg['subject'], + '[XTEST 456] =?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?=') + msg = Message.Message() + msg['Subject' + ] = 'Re: [XTEST 123] =?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?=' + CookHeaders.process(self._mlist, msg, {}) + # next code suceeds if python email patch tracker #1681333 is applied. + #self.assertEqual(unicode(msg['subject']), + # u'[XTEST 456] Re: \u30e1\u30fc\u30eb\u30de\u30f3') + self.assertEqual(msg['subject'], + '[XTEST 456] Re: =?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?=') + + def test_subject_munging_prefix_number(self): + self._mlist.subject_prefix = '[XTEST %d]' + self._mlist.post_id = 456 + msg = Message.Message() + msg['Subject'] = 'About Mailman...' + CookHeaders.process(self._mlist, msg, {}) + self.assertEqual(msg['subject'], '[XTEST 456] About Mailman...') + msg = Message.Message() + msg['Subject'] = 'Re: [XTEST 123] About Mailman...' + CookHeaders.process(self._mlist, msg, {}) + self.assertEqual(msg['subject'], '[XTEST 456] Re: About Mailman...') + + def test_subject_munging_prefix_newstyle(self): + self._mlist.subject_prefix = '[XTEST]' + config.OLD_STYLE_PREFIXING = False + msg = Message.Message() + msg['Subject'] = 'Re: [XTEST] About Mailman...' + CookHeaders.process(self._mlist, msg, {}) + self.assertEqual(msg['subject'], '[XTEST] Re: About Mailman...') + + def test_subject_munging_prefix_crooked(self): + # In this test case, we get an extra space between the prefix and + # the original subject. It's because the original is crooked. + # Note that isubject starting by '\n ' is generated by some version of + # Eudora Japanese edition. + self._mlist.subject_prefix = '[XTEST]' + msg = Message.Message() + msg['Subject'] = '\n About Mailman...' + CookHeaders.process(self._mlist, msg, {}) + self.assertEqual(str(msg['subject']), '[XTEST] About Mailman...') + del msg['subject'] + msg['Subject'] = '\n =?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?=' + CookHeaders.process(self._mlist, msg, {}) + self.assertEqual(str(msg['subject']), + '[XTEST] =?iso-2022-jp?b?IBskQiVhITwlayVeJXMbKEI=?=') + def test_reply_to_list(self): eq = self.assertEqual mlist = self._mlist @@ -1609,7 +1673,7 @@ Here is message %(i)d def test_send_i18n_digest(self): eq = self.assertEqual mlist = self._mlist - mlist.preferred_language = 'fr' + mlist.preferred_language = 'fr' msg = email.message_from_string("""\ From: aperson@example.org To: _xtest@example.com @@ -1622,23 +1686,23 @@ Content-Transfer-Encoding: 7bit """) mlist.digest_size_threshhold = 0 ToDigest.process(mlist, msg, {}) - files = self._sb.files() + files = self._sb.files() eq(len(files), 2) for filebase in files: - qmsg, qdata = self._sb.dequeue(filebase) + qmsg, qdata = self._sb.dequeue(filebase) if qmsg.get_content_maintype() == 'multipart': mimemsg = qmsg mimedata = qdata else: rfc1153msg = qmsg rfc1153data = qdata - eq(rfc1153msg.get_content_type(), 'text/plain') - eq(rfc1153msg.get_content_charset(), 'utf-8') - eq(rfc1153msg['content-transfer-encoding'], 'base64') - toc = mimemsg.get_payload()[1] - eq(toc.get_content_type(), 'text/plain') - eq(toc.get_content_charset(), 'utf-8') - eq(toc['content-transfer-encoding'], 'base64') + eq(rfc1153msg.get_content_type(), 'text/plain') + eq(rfc1153msg.get_content_charset(), 'utf-8') + eq(rfc1153msg['content-transfer-encoding'], 'base64') + toc = mimemsg.get_payload()[1] + eq(toc.get_content_type(), 'text/plain') + eq(toc.get_content_charset(), 'utf-8') + eq(toc['content-transfer-encoding'], 'base64') |
