Abhilash Raj pushed to branch master at GNU Mailman / Mailman Core


Commits:
234b16f7 by Mark Sapiro at 2019-07-29T02:26:12Z
Decode message body for html_to_plaintext.

- - - - -
941991be by Abhilash Raj at 2019-07-29T02:26:12Z
Merge branch 'mimedel' into 'master'

Decode message body for html_to_plaintext.

Closes #616

See merge request mailman/mailman!542
- - - - -


3 changed files:

- src/mailman/docs/NEWS.rst
- src/mailman/handlers/mime_delete.py
- src/mailman/handlers/tests/test_mimedel.py


Changes:

=====================================
src/mailman/docs/NEWS.rst
=====================================
@@ -35,6 +35,8 @@ Bugs
   with a string object instead of bytes.  (Closes #613)
 * A post with a Reply-To: the list address will no longer be shunted.
   (Closes #614)
+* Encoded (base64 or quoted-printable) HTML message bodies are now decoded for
+  ``html_to_plaintext``.  (Closes #616)
 
 Command line
 ------------


=====================================
src/mailman/handlers/mime_delete.py
=====================================
@@ -274,8 +274,10 @@ def to_plaintext(msg):
         resources.callback(shutil.rmtree, tempdir)
         for subpart in typed_subpart_iterator(msg, 'text', 'html'):
             filename = os.path.join(tempdir, '{}.html'.format(next(counter)))
+            ctype = msg.get_content_charset('utf-8')
             with open(filename, 'w', encoding='utf-8') as fp:
-                fp.write(subpart.get_payload())
+                fp.write(subpart.get_payload(decode=True).decode(ctype,
+                         errors='replace'))
             template = Template(config.mailman.html_to_plain_text_command)
             command = template.safe_substitute(filename=filename).split()
             try:


=====================================
src/mailman/handlers/tests/test_mimedel.py
=====================================
@@ -61,6 +61,7 @@ if len(sys.argv) > 2:
     sys.exit(1)
 print('Converted text/html to text/plain')
 print('Filename:', sys.argv[1])
+print(open(sys.argv[1]).readlines()[0])
 """, file=fp)
         config.push('dummy script', """\
 [mailman]
@@ -239,6 +240,27 @@ MIME-Version: 1.0
         payload_lines = msg.get_payload().splitlines()
         self.assertEqual(payload_lines[0], 'Converted text/html to text/plain')
 
+    def test_convert_html_to_plaintext_base64(self):
+        # Converting to plain text calls a command line script with decoded
+        # message body.
+        msg = mfs("""\
+From: aper...@example.com
+Content-Type: text/html
+Content-Transfer-Encoding: base64
+MIME-Version: 1.0
+
+PGh0bWw+PGhlYWQ+PC9oZWFkPgo8Ym9keT48L2JvZHk+PC9odG1sPgo=
+""")
+        process = config.handlers['mime-delete'].process
+        with dummy_script():
+            process(self._mlist, msg, {})
+        self.assertEqual(msg.get_content_type(), 'text/plain')
+        self.assertTrue(
+            msg['x-content-filtered-by'].startswith('Mailman/MimeDel'))
+        payload_lines = msg.get_payload().splitlines()
+        self.assertEqual(payload_lines[0], 'Converted text/html to text/plain')
+        self.assertEqual(payload_lines[2], '<html><head></head>')
+
     def test_convert_html_to_plaintext_error_return(self):
         # Calling a script which returns an error status is properly logged.
         msg = mfs("""\



View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/d2adb78eb5abe40d89bf3336c8ed0ea6ce4a93ff...941991bebc5c882c96d5f09c0e3a54a5e76f2104

-- 
View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/d2adb78eb5abe40d89bf3336c8ed0ea6ce4a93ff...941991bebc5c882c96d5f09c0e3a54a5e76f2104
You're receiving this email because of your account on gitlab.com.


_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to