Skip to content

Commit 93aa404

Browse files
committed
gh-43702: Replace existing CTE in encode_base64() and encode_quopri()
Both encoders added a Content-Transfer-Encoding header without removing an existing one, so re-encoding a message that already had one left two such headers. Delete the old header first. encode_7or8bit() is left alone because it does not change the payload.
1 parent 499dff1 commit 93aa404

3 files changed

Lines changed: 20 additions & 0 deletions

File tree

‎Lib/email/encoders.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def encode_base64(msg):
3030
orig = msg.get_payload(decode=True)
3131
encdata = str(_bencode(orig), 'ascii')
3232
msg.set_payload(encdata)
33+
del msg['Content-Transfer-Encoding']
3334
msg['Content-Transfer-Encoding'] = 'base64'
3435

3536

@@ -41,6 +42,7 @@ def encode_quopri(msg):
4142
orig = msg.get_payload(decode=True)
4243
encdata = _qencode(orig)
4344
msg.set_payload(encdata)
45+
del msg['Content-Transfer-Encoding']
4446
msg['Content-Transfer-Encoding'] = 'quoted-printable'
4547

4648

‎Lib/test/test_email/test_email.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,20 @@ def test_default_cte(self):
916916
msg = MIMEText('hello \xf8 world', _charset='iso-8859-1')
917917
eq(msg['content-transfer-encoding'], 'quoted-printable')
918918

919+
def test_encode_replaces_existing_cte(self):
920+
# gh-43702: re-encoding must replace the old Content-Transfer-Encoding
921+
# header, not add a second one.
922+
for charset, encoder, cte in (
923+
('iso-8859-1', encoders.encode_base64, 'base64'),
924+
('utf-8', encoders.encode_quopri, 'quoted-printable')):
925+
with self.subTest(cte=cte):
926+
msg = MIMEText('h\xe9llo', _charset=charset)
927+
encoder(msg)
928+
self.assertEqual(msg.get_all('content-transfer-encoding'),
929+
[cte])
930+
self.assertEqual(msg.get_payload(decode=True),
931+
'h\xe9llo'.encode(charset))
932+
919933
def test_encode7or8bit(self):
920934
# Make sure a charset whose input character set is 8bit but
921935
# whose output character set is 7bit gets a transfer-encoding
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Fix :func:`email.encoders.encode_base64` and
2+
:func:`email.encoders.encode_quopri` adding a second
3+
:mailheader:`Content-Transfer-Encoding` header when they re-encode a
4+
message that already has one.

0 commit comments

Comments
 (0)