mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
[3.11] gh-121284: Fix email address header folding with parsed encoded-word (GH-122754) (GH-131405)
Email generators using email.policy.default may convert an RFC 2047
encoded-word to unencoded form during header refolding. In a structured
header, this could allow 'specials' chars outside a quoted-string,
leading to invalid address headers and enabling spoofing. This change
ensures a parsed encoded-word that contains specials is kept as an
encoded-word while the header is refolded.
[Better fix from @bitdancer.]
(cherry picked from commit 295b53df2a
)
Co-authored-by: Mike Edmunds <medmunds@gmail.com>
Co-authored-by: R David Murray <rdmurray@bitdance.com>
Co-authored-by: Petr Viktorin <encukou@gmail.com>
This commit is contained in:
parent
4588712773
commit
0a66052d8d
3 changed files with 37 additions and 5 deletions
|
@ -1047,7 +1047,7 @@ def get_fws(value):
|
|||
fws = WhiteSpaceTerminal(value[:len(value)-len(newvalue)], 'fws')
|
||||
return fws, newvalue
|
||||
|
||||
def get_encoded_word(value):
|
||||
def get_encoded_word(value, terminal_type='vtext'):
|
||||
""" encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
|
||||
|
||||
"""
|
||||
|
@ -1086,7 +1086,7 @@ def get_encoded_word(value):
|
|||
ew.append(token)
|
||||
continue
|
||||
chars, *remainder = _wsp_splitter(text, 1)
|
||||
vtext = ValueTerminal(chars, 'vtext')
|
||||
vtext = ValueTerminal(chars, terminal_type)
|
||||
_validate_xtext(vtext)
|
||||
ew.append(vtext)
|
||||
text = ''.join(remainder)
|
||||
|
@ -1128,7 +1128,7 @@ def get_unstructured(value):
|
|||
valid_ew = True
|
||||
if value.startswith('=?'):
|
||||
try:
|
||||
token, value = get_encoded_word(value)
|
||||
token, value = get_encoded_word(value, 'utext')
|
||||
except _InvalidEwError:
|
||||
valid_ew = False
|
||||
except errors.HeaderParseError:
|
||||
|
@ -1157,7 +1157,7 @@ def get_unstructured(value):
|
|||
# the parser to go in an infinite loop.
|
||||
if valid_ew and rfc2047_matcher.search(tok):
|
||||
tok, *remainder = value.partition('=?')
|
||||
vtext = ValueTerminal(tok, 'vtext')
|
||||
vtext = ValueTerminal(tok, 'utext')
|
||||
_validate_xtext(vtext)
|
||||
unstructured.append(vtext)
|
||||
value = ''.join(remainder)
|
||||
|
@ -2792,7 +2792,7 @@ def _refold_parse_tree(parse_tree, *, policy):
|
|||
continue
|
||||
tstr = str(part)
|
||||
if not want_encoding:
|
||||
if part.token_type == 'ptext':
|
||||
if part.token_type in ('ptext', 'vtext'):
|
||||
# Encode if tstr contains special characters.
|
||||
want_encoding = not SPECIALSNL.isdisjoint(tstr)
|
||||
else:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue