Skip to content

Commit 89a7b05

Browse files
[3.14] gh-78319: Fix implementation of IMAP APPEND UTF8 (GH-9436) (GH-139406)
Make UTF8 support for the IMAP APPEND command RFC 6855 compliant. (cherry picked from commit 408154d) Co-authored-by: Gordon Messmer <[email protected]>
1 parent f0f0566 commit 89a7b05

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

Lib/imaplib.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -497,8 +497,6 @@ def append(self, mailbox, flags, date_time, message):
497497
else:
498498
date_time = None
499499
literal = MapCRLF.sub(CRLF, message)
500-
if self.utf8_enabled:
501-
literal = b'UTF8 (' + literal + b')'
502500
self.literal = literal
503501
return self._simple_command(name, mailbox, flags, date_time)
504502

@@ -1119,7 +1117,11 @@ def _command(self, name, *args):
11191117
literator = literal
11201118
else:
11211119
literator = None
1122-
data = data + bytes(' {%s}' % len(literal), self._encoding)
1120+
if self.utf8_enabled:
1121+
data = data + bytes(' UTF8 (~{%s}' % len(literal), self._encoding)
1122+
literal = literal + b')'
1123+
else:
1124+
data = data + bytes(' {%s}' % len(literal), self._encoding)
11231125

11241126
if __debug__:
11251127
if self.debug >= 4:

Lib/test/test_imaplib.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,11 @@ def cmd_AUTHENTICATE(self, tag, args):
373373
self._send_tagged(tag, 'OK', 'FAKEAUTH successful')
374374
def cmd_APPEND(self, tag, args):
375375
self._send_textline('+')
376-
self.server.response = yield
376+
self.server.response = args
377+
literal = yield
378+
self.server.response.append(literal)
379+
literal = yield
380+
self.server.response.append(literal)
377381
self._send_tagged(tag, 'OK', 'okay')
378382
client, server = self._setup(UTF8AppendServer)
379383
self.assertEqual(client._encoding, 'ascii')
@@ -384,10 +388,13 @@ def cmd_APPEND(self, tag, args):
384388
self.assertEqual(code, 'OK')
385389
self.assertEqual(client._encoding, 'utf-8')
386390
msg_string = 'Subject: üñí©öðé'
387-
typ, data = client.append(None, None, None, msg_string.encode('utf-8'))
391+
typ, data = client.append(
392+
None, None, None, (msg_string + '\n').encode('utf-8'))
388393
self.assertEqual(typ, 'OK')
389394
self.assertEqual(server.response,
390-
('UTF8 (%s)\r\n' % msg_string).encode('utf-8'))
395+
['INBOX', 'UTF8',
396+
'(~{25}', ('%s\r\n' % msg_string).encode('utf-8'),
397+
b')\r\n' ])
391398

392399
def test_search_disallows_charset_in_utf8_mode(self):
393400
class UTF8Server(SimpleIMAPHandler):
@@ -887,7 +894,11 @@ def test_enable_UTF8_True_append(self):
887894
class UTF8AppendServer(self.UTF8Server):
888895
def cmd_APPEND(self, tag, args):
889896
self._send_textline('+')
890-
self.server.response = yield
897+
self.server.response = args
898+
literal = yield
899+
self.server.response.append(literal)
900+
literal = yield
901+
self.server.response.append(literal)
891902
self._send_tagged(tag, 'OK', 'okay')
892903

893904
with self.reaped_pair(UTF8AppendServer) as (server, client):
@@ -901,12 +912,12 @@ def cmd_APPEND(self, tag, args):
901912
self.assertEqual(client._encoding, 'utf-8')
902913
msg_string = 'Subject: üñí©öðé'
903914
typ, data = client.append(
904-
None, None, None, msg_string.encode('utf-8'))
915+
None, None, None, (msg_string + '\n').encode('utf-8'))
905916
self.assertEqual(typ, 'OK')
906-
self.assertEqual(
907-
server.response,
908-
('UTF8 (%s)\r\n' % msg_string).encode('utf-8')
909-
)
917+
self.assertEqual(server.response,
918+
['INBOX', 'UTF8',
919+
'(~{25}', ('%s\r\n' % msg_string).encode('utf-8'),
920+
b')\r\n' ])
910921

911922
# XXX also need a test that makes sure that the Literal and Untagged_status
912923
# regexes uses unicode in UTF8 mode instead of the default ASCII.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
UTF8 support for the IMAP APPEND command has been made RFC compliant.

0 commit comments

Comments
 (0)