]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Resolve SF bug 1409403: email.Message should supress warning from uu.decode.
authorBarry Warsaw <barry@python.org>
Thu, 9 Feb 2006 04:03:22 +0000 (04:03 +0000)
committerBarry Warsaw <barry@python.org>
Thu, 9 Feb 2006 04:03:22 +0000 (04:03 +0000)
However, the patch in that tracker item is elaborated such that the newly
included unit test pass on Python 2.1 through 2.5.  Note that Python 2.1's
uu.decode() does not have a 'quiet' argument, so we have to be sneaky.

Will port to email 3.0 (although without the backward compatible sneakiness).

Lib/email/Message.py
Lib/email/_compat21.py
Lib/email/_compat22.py
Lib/email/test/test_email.py

index bb8718fe23b07c270cdda2718521873bffca8b4e..1f23965c911499ec0ba199b3dccb29c573aedb1b 100644 (file)
@@ -23,6 +23,12 @@ except NameError:
     True = 1
     False = 0
 
+try:
+    from email._compat22 import quiet_uu_decode
+except SyntaxError:
+    from email._compat21 import quiet_uu_decode
+
+
 # Regular expression used to split header parameters.  BAW: this may be too
 # simple.  It isn't strictly RFC 2045 (section 5.1) compliant, but it catches
 # most headers found in the wild.  We may eventually need a full fledged
@@ -220,7 +226,7 @@ class Message:
             elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'):
                 sfp = StringIO()
                 try:
-                    uu.decode(StringIO(payload+'\n'), sfp)
+                    quiet_uu_decode(StringIO(payload+'\n'), sfp, quiet=True)
                     payload = sfp.getvalue()
                 except uu.Error:
                     # Some decoding problem
index 1e1f66692feb74efdc6f2ddde08bb0978c7d5f09..0cd987fe318e20bd98311d4ff6222da46490b845 100644 (file)
@@ -1,8 +1,10 @@
-# Copyright (C) 2002 Python Software Foundation
-# Author: barry@zope.com
+# Copyright (C) 2002-2006 Python Software Foundation
+# Author: barry@python.org
 
-"""Module containing compatibility functions for Python 2.1.
-"""
+"""Module containing compatibility functions for Python 2.1."""
+
+import uu
+import sys
 
 from cStringIO import StringIO
 from types import StringType, UnicodeType
@@ -67,3 +69,14 @@ def typed_subpart_iterator(msg, maintype='text', subtype=None):
             if subtype is None or subpart.get_content_subtype() == subtype:
                 parts.append(subpart)
     return parts
+
+
+\f
+def quiet_uu_decode(in_file, out_file, quiet):
+    # In Python 2.1, uu.decode() does not support the quiet flag.  Cheat.
+    old_stderr = sys.stderr
+    try:
+        sys.stderr = StringIO()
+        uu.decode(in_file, out_file)
+    finally:
+        sys.stderr = old_stderr
index fc1d32a5559c0c90337bfbffa5f44c452f22a2eb..85d4f9e1e67f2d8ec5730eb7335efa58a817905f 100644 (file)
@@ -1,7 +1,8 @@
-# Copyright (C) 2002 Python Software Foundation
-# Author: barry@zope.com
+# Copyright (C) 2002-2006 Python Software Foundation
+# Author: barry@python.org
 
-"""Module containing compatibility functions for Python 2.2.
+"""Module containing compatibility functions for Python 2.2 (and possibly
+beyond.
 """
 
 from __future__ import generators
@@ -9,6 +10,8 @@ from __future__ import division
 from cStringIO import StringIO
 from types import StringTypes
 
+import uu
+
 # Python 2.2.x where x < 1 lacks True/False
 try:
     True, False
@@ -68,3 +71,8 @@ def typed_subpart_iterator(msg, maintype='text', subtype=None):
         if subpart.get_content_maintype() == maintype:
             if subtype is None or subpart.get_content_subtype() == subtype:
                 yield subpart
+
+
+\f
+def quiet_uu_decode(in_file, out_file, quiet):
+    uu.decode(in_file, out_file, quiet=quiet)
index edb65e32a884bda13709587541bc9cb8bd6886b0..fb2e488a1b9e23bb23ee53572abf34f56ff77960 100644 (file)
@@ -222,6 +222,19 @@ class TestMessageAPI(TestEmailBase):
         msg.set_payload('foo')
         eq(msg.get_payload(decode=True), 'foo')
 
+    def test_decode_bogus_uu_payload_quietly(self):
+        msg = Message()
+        msg.set_payload('begin 664 foo.txt\n%<W1F=0000H \n \nend\n')
+        msg['Content-Transfer-Encoding'] = 'x-uuencode'
+        old_stderr = sys.stderr
+        try:
+            sys.stderr = sfp = StringIO()
+            # We don't care about the payload
+            msg.get_payload(decode=True)
+        finally:
+            sys.stderr = old_stderr
+        self.assertEqual(sfp.getvalue(), '')
+
     def test_decoded_generator(self):
         eq = self.assertEqual
         msg = self._msgobj('msg_07.txt')