From dc74e34e24d01323cfb89a0a5c11416f85adebd0 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Thu, 9 Feb 2006 04:03:22 +0000 Subject: [PATCH] Resolve SF bug 1409403: email.Message should supress warning from uu.decode. 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 | 8 +++++++- Lib/email/_compat21.py | 21 +++++++++++++++++---- Lib/email/_compat22.py | 14 +++++++++++--- Lib/email/test/test_email.py | 13 +++++++++++++ 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/Lib/email/Message.py b/Lib/email/Message.py index bb8718fe23b0..1f23965c9114 100644 --- a/Lib/email/Message.py +++ b/Lib/email/Message.py @@ -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 diff --git a/Lib/email/_compat21.py b/Lib/email/_compat21.py index 1e1f66692feb..0cd987fe318e 100644 --- a/Lib/email/_compat21.py +++ b/Lib/email/_compat21.py @@ -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 + + + +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 diff --git a/Lib/email/_compat22.py b/Lib/email/_compat22.py index fc1d32a5559c..85d4f9e1e67f 100644 --- a/Lib/email/_compat22.py +++ b/Lib/email/_compat22.py @@ -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 + + + +def quiet_uu_decode(in_file, out_file, quiet): + uu.decode(in_file, out_file, quiet=quiet) diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index edb65e32a884..fb2e488a1b9e 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -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%