bpo-38332: Catch KeyError from unknown cte in encoded-word. (GH-16503)
KeyError should cause a failure in parsing the encoded word and should be caught and raised as a _InvalidEWError instead.
This commit is contained in:
parent
3faf826e58
commit
65dcc8a8dc
|
@ -1057,7 +1057,7 @@ def get_encoded_word(value):
|
||||||
value = ''.join(remainder)
|
value = ''.join(remainder)
|
||||||
try:
|
try:
|
||||||
text, charset, lang, defects = _ew.decode('=?' + tok + '?=')
|
text, charset, lang, defects = _ew.decode('=?' + tok + '?=')
|
||||||
except ValueError:
|
except (ValueError, KeyError):
|
||||||
raise _InvalidEwError(
|
raise _InvalidEwError(
|
||||||
"encoded word format invalid: '{}'".format(ew.cte))
|
"encoded word format invalid: '{}'".format(ew.cte))
|
||||||
ew.charset = charset
|
ew.charset = charset
|
||||||
|
|
|
@ -58,6 +58,8 @@ class TestDecode(TestEmailBase):
|
||||||
_ew.decode('=?')
|
_ew.decode('=?')
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
_ew.decode('')
|
_ew.decode('')
|
||||||
|
with self.assertRaises(KeyError):
|
||||||
|
_ew.decode('=?utf-8?X?somevalue?=')
|
||||||
|
|
||||||
def _test(self, source, result, charset='us-ascii', lang='', defects=[]):
|
def _test(self, source, result, charset='us-ascii', lang='', defects=[]):
|
||||||
res, char, l, d = _ew.decode(source)
|
res, char, l, d = _ew.decode(source)
|
||||||
|
|
|
@ -89,6 +89,10 @@ class TestParser(TestParserMixin, TestEmailBase):
|
||||||
with self.assertRaises(errors.HeaderParseError):
|
with self.assertRaises(errors.HeaderParseError):
|
||||||
parser.get_encoded_word('=?abc?=')
|
parser.get_encoded_word('=?abc?=')
|
||||||
|
|
||||||
|
def test_get_encoded_word_invalid_cte(self):
|
||||||
|
with self.assertRaises(errors.HeaderParseError):
|
||||||
|
parser.get_encoded_word('=?utf-8?X?somevalue?=')
|
||||||
|
|
||||||
def test_get_encoded_word_valid_ew(self):
|
def test_get_encoded_word_valid_ew(self):
|
||||||
self._test_get_x(parser.get_encoded_word,
|
self._test_get_x(parser.get_encoded_word,
|
||||||
'=?us-ascii?q?this_is_a_test?= bird',
|
'=?us-ascii?q?this_is_a_test?= bird',
|
||||||
|
@ -399,6 +403,14 @@ class TestParser(TestParserMixin, TestEmailBase):
|
||||||
[],
|
[],
|
||||||
'')
|
'')
|
||||||
|
|
||||||
|
def test_get_unstructured_invalid_ew_cte(self):
|
||||||
|
self._test_get_x(self._get_unst,
|
||||||
|
'=?utf-8?X?=somevalue?=',
|
||||||
|
'=?utf-8?X?=somevalue?=',
|
||||||
|
'=?utf-8?X?=somevalue?=',
|
||||||
|
[],
|
||||||
|
'')
|
||||||
|
|
||||||
# get_qp_ctext
|
# get_qp_ctext
|
||||||
|
|
||||||
def test_get_qp_ctext_only(self):
|
def test_get_qp_ctext_only(self):
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Prevent :exc:`KeyError` thrown by :func:`_encoded_words.decode` when given
|
||||||
|
an encoded-word with invalid content-type encoding from propagating all the
|
||||||
|
way to :func:`email.message.get`.
|
Loading…
Reference in New Issue