Commit 1e949890 authored by R David Murray's avatar R David Murray

#17369: Improve handling of broken RFC2231 values in get_filename.

This fixes a regression relative to python2.
parent bd3a11ba
......@@ -337,6 +337,10 @@ def collapse_rfc2231_value(value, errors='replace',
# object. We do not want bytes() normal utf-8 decoder, we want a straight
# interpretation of the string as character bytes.
charset, language, text = value
if charset is None:
# Issue 17369: if charset/lang is None, decode_rfc2231 couldn't parse
# the value, so use the fallback_charset.
charset = fallback_charset
rawbytes = bytes(text, 'raw-unicode-escape')
try:
return str(rawbytes, charset, errors)
......
......@@ -5018,6 +5018,26 @@ Content-Type: application/x-foo; name*0=\"Frank's\"; name*1=\" Document\"
self.assertNotIsInstance(param, tuple)
self.assertEqual(param, "Frank's Document")
def test_rfc2231_missing_tick(self):
m = '''\
Content-Disposition: inline;
\tfilename*0*="'This%20is%20broken";
'''
msg = email.message_from_string(m)
self.assertEqual(
msg.get_filename(),
"'This is broken")
def test_rfc2231_missing_tick_with_encoded_non_ascii(self):
m = '''\
Content-Disposition: inline;
\tfilename*0*="'This%20is%E2broken";
'''
msg = email.message_from_string(m)
self.assertEqual(
msg.get_filename(),
"'This is\ufffdbroken")
# test_headerregistry.TestContentTypeHeader.rfc2231_single_quote_in_value_with_charset_and_lang
def test_rfc2231_tick_attack_extended(self):
eq = self.assertEqual
......
......@@ -45,6 +45,10 @@ Core and Builtins
Library
-------
- Issue #17369: get_filename was raising an exception if the filename
parameter's RFC2231 encoding was broken in certain ways. This was
a regression relative to python2.
- Issue #20013: Some imap servers disconnect if the current mailbox is
deleted, and imaplib did not handle that case gracefully. Now it
handles the 'bye' correctly.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment