]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport r50840 to Python 2.4:
authorBarry Warsaw <barry@python.org>
Fri, 28 Jul 2006 03:18:56 +0000 (03:18 +0000)
committerBarry Warsaw <barry@python.org>
Fri, 28 Jul 2006 03:18:56 +0000 (03:18 +0000)
    Forward port some fixes that were in email 2.5 but for some reason didn't
    make it into email 4.0.  Specifically, in Message.get_content_charset(),
    handle RFC 2231 headers that contain an encoding not known to Python, or a
    character in the data that isn't in the charset encoding.  Also forward
    port the appropriate unit tests.

Also, this resolves SF bug #1414018.

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

index a5a8ff2856db916564c673f41f5d44db0fdd28d8..0996eb5bcde8bbe03fc254be2ea67b1ee2abc6fa 100644 (file)
@@ -788,7 +788,18 @@ class Message:
         if isinstance(charset, tuple):
             # RFC 2231 encoded, so decode it, and it better end up as ascii.
             pcharset = charset[0] or 'us-ascii'
-            charset = unicode(charset[2], pcharset).encode('us-ascii')
+            try:
+                # LookupError will be raised if the charset isn't known to
+                # Python.  UnicodeError will be raised if the encoded text
+                # contains a character not in the charset.
+                charset = unicode(charset[2], pcharset).encode('us-ascii')
+            except (LookupError, UnicodeError):
+                charset = charset[2]
+        # charset character must be in us-ascii range
+        try:
+            charset = unicode(charset, 'us-ascii').encode('us-ascii')
+        except UnicodeError:
+            return failobj
         # RFC 2046, $4.1.2 says charsets are not case sensitive
         return charset.lower()
 
index 24c6efa5fdfbec6df049e4cfae86a5f6ffd0f4ef..5a2f9acb97175cf4e2314b1202140d4d249402ea 100644 (file)
@@ -3078,6 +3078,50 @@ Content-Type: text/plain;
         self.assertEqual(msg.get_content_charset(),
                          'this is even more ***fun*** is it not.pdf')
 
+    def test_rfc2231_bad_encoding_in_filename(self):
+        m = '''\
+Content-Disposition: inline;
+\tfilename*0*="bogus'xx'This%20is%20even%20more%20";
+\tfilename*1*="%2A%2A%2Afun%2A%2A%2A%20";
+\tfilename*2="is it not.pdf"
+
+'''
+        msg = email.message_from_string(m)
+        self.assertEqual(msg.get_filename(),
+                         'This is even more ***fun*** is it not.pdf')
+
+    def test_rfc2231_bad_encoding_in_charset(self):
+        m = """\
+Content-Type: text/plain; charset*=bogus''utf-8%E2%80%9D
+
+"""
+        msg = email.message_from_string(m)
+        # This should return None because non-ascii characters in the charset
+        # are not allowed.
+        self.assertEqual(msg.get_content_charset(), None)
+
+    def test_rfc2231_bad_character_in_charset(self):
+        m = """\
+Content-Type: text/plain; charset*=ascii''utf-8%E2%80%9D
+
+"""
+        msg = email.message_from_string(m)
+        # This should return None because non-ascii characters in the charset
+        # are not allowed.
+        self.assertEqual(msg.get_content_charset(), None)
+
+    def test_rfc2231_bad_character_in_filename(self):
+        m = '''\
+Content-Disposition: inline;
+\tfilename*0*="ascii'xx'This%20is%20even%20more%20";
+\tfilename*1*="%2A%2A%2Afun%2A%2A%2A%20";
+\tfilename*2*="is it not.pdf%E2"
+
+'''
+        msg = email.message_from_string(m)
+        self.assertEqual(msg.get_filename(),
+                         u'This is even more ***fun*** is it not.pdf\ufffd')
+
     def test_rfc2231_unknown_encoding(self):
         m = """\
 Content-Transfer-Encoding: 8bit