Merge lp:~abompard/mailman/bug-1158721 into lp:mailman

Proposed by Aurélien Bompard
Status: Merged
Approved by: Barry Warsaw
Approved revision: 7270
Merged at revision: 7270
Proposed branch: lp:~abompard/mailman/bug-1158721
Merge into: lp:mailman
Diff against target: 54 lines (+35/-1)
2 files modified
src/mailman/rules/approved.py (+4/-1)
src/mailman/rules/tests/test_approved.py (+31/-0)
To merge this branch: bzr merge lp:~abompard/mailman/bug-1158721
Reviewer Review Type Date Requested Status
Barry Warsaw Approve
Review via email: mp+243229@code.launchpad.net

Description of the change

Emails without a text/plain part crash the Approved rule, this branch contains the fix for bug #1158721.

To post a comment you must log in.
Revision history for this message
Barry Warsaw (barry) wrote :

I can't help but tweak a little :) but LGTM, thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/mailman/rules/approved.py'
--- src/mailman/rules/approved.py 2014-01-01 14:59:42 +0000
+++ src/mailman/rules/approved.py 2014-11-30 10:31:24 +0000
@@ -73,7 +73,10 @@
73 stripped = False73 stripped = False
74 for part in typed_subpart_iterator(msg, 'text', 'plain'):74 for part in typed_subpart_iterator(msg, 'text', 'plain'):
75 break75 break
76 payload = part.get_payload(decode=True)76 if part is None:
77 payload = None
78 else:
79 payload = part.get_payload(decode=True)
77 if payload is not None:80 if payload is not None:
78 charset = part.get_content_charset('us-ascii')81 charset = part.get_content_charset('us-ascii')
79 payload = payload.decode(charset, 'replace')82 payload = payload.decode(charset, 'replace')
8083
=== modified file 'src/mailman/rules/tests/test_approved.py'
--- src/mailman/rules/tests/test_approved.py 2014-01-01 14:59:42 +0000
+++ src/mailman/rules/tests/test_approved.py 2014-11-30 10:31:24 +0000
@@ -491,3 +491,34 @@
491 self.assertFalse(result)491 self.assertFalse(result)
492 self.assertEqual(self._mlist.moderator_password,492 self.assertEqual(self._mlist.moderator_password,
493 b'{plaintext}super secret')493 b'{plaintext}super secret')
494
495
496class TestApprovedNoPlainText(unittest.TestCase):
497 """Test the approved handler with HTML-only messages."""
498
499 layer = ConfigLayer
500
501 def setUp(self):
502 self._mlist = create_list('test@example.com')
503 self._rule = approved.Approved()
504
505 def test_noplaintext(self):
506 # When the message body only contains HTML, the rule should not throw
507 # AttributeError: 'NoneType' object has no attribute 'get_payload'
508 # LP: #1158721
509 msg = mfs("""\
510From: anne@example.com
511To: test@example.com
512Subject: HTML only email
513Message-ID: <ant>
514MIME-Version: 1.0
515Content-Type: text/html; charset="Windows-1251"
516Content-Transfer-Encoding: 7bit
517
518<HTML>
519<BODY>
520<P>This message contains only HTML, no plain/text part</P>
521</BODY></HTML>
522""")
523 result = self._rule.check(self._mlist, msg, {})
524 self.assertFalse(result)