From 82660dff9a45a38e4a5034311643d6343ff167ff Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Wed, 19 Sep 2018 20:24:16 -0700 Subject: [PATCH 1/5] issue34138: fix implementation of utf8 append --- Lib/imaplib.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Lib/imaplib.py b/Lib/imaplib.py index e451413acf5a21..dd95eb7f9c4972 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -397,8 +397,6 @@ def append(self, mailbox, flags, date_time, message): else: date_time = None literal = MapCRLF.sub(CRLF, message) - if self.utf8_enabled: - literal = b'UTF8 (' + literal + b')' self.literal = literal return self._simple_command(name, mailbox, flags, date_time) @@ -967,7 +965,11 @@ def _command(self, name, *args): literator = literal else: literator = None - data = data + bytes(' {%s}' % len(literal), self._encoding) + if self.utf8_enabled: + data = data + bytes('UTF8 (~{%s}' % len(literal), self._encoding) + literal = literal + b')' + else: + data = data + bytes(' {%s}' % len(literal), self._encoding) if __debug__: if self.debug >= 4: From 085544f90dd1223e3cd46255edb407a611dd3607 Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Wed, 19 Sep 2018 20:26:06 -0700 Subject: [PATCH 2/5] issue34138: fix implementation of utf8 append --- Lib/imaplib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/imaplib.py b/Lib/imaplib.py index dd95eb7f9c4972..e636e17c110edd 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -966,7 +966,7 @@ def _command(self, name, *args): else: literator = None if self.utf8_enabled: - data = data + bytes('UTF8 (~{%s}' % len(literal), self._encoding) + data = data + bytes(' UTF8 (~{%s}' % len(literal), self._encoding) literal = literal + b')' else: data = data + bytes(' {%s}' % len(literal), self._encoding) From 5a9249919832a70ff91be34c6bca4ef2170d6827 Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Mon, 13 Feb 2023 20:35:35 -0800 Subject: [PATCH 3/5] Add NEWS for UTF8 IMAP APPEND fix. --- .../next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst diff --git a/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst b/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst new file mode 100644 index 00000000000000..cc8a6e73942203 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst @@ -0,0 +1 @@ +UTF8 support for the IMAP APPEND command has been made RFC compliant. From 81faa3c1aff37eded4ff2c2f72b381977103e4d6 Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Mon, 13 Feb 2023 20:25:27 -0800 Subject: [PATCH 4/5] issue34138: fix implementation of utf8 append and tests --- Lib/test/test_imaplib.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 7626d9572e1e96..62bfd918454909 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -311,7 +311,11 @@ def cmd_AUTHENTICATE(self, tag, args): self._send_tagged(tag, 'OK', 'FAKEAUTH successful') def cmd_APPEND(self, tag, args): self._send_textline('+') - self.server.response = yield + self.server.response = args + literal = yield + self.server.response.append(literal) + literal = yield + self.server.response.append(literal) self._send_tagged(tag, 'OK', 'okay') client, server = self._setup(UTF8AppendServer) self.assertEqual(client._encoding, 'ascii') @@ -322,10 +326,13 @@ def cmd_APPEND(self, tag, args): self.assertEqual(code, 'OK') self.assertEqual(client._encoding, 'utf-8') msg_string = 'Subject: üñí©öðé' - typ, data = client.append(None, None, None, msg_string.encode('utf-8')) + typ, data = client.append( + None, None, None, (msg_string + '\n').encode('utf-8')) self.assertEqual(typ, 'OK') self.assertEqual(server.response, - ('UTF8 (%s)\r\n' % msg_string).encode('utf-8')) + ['INBOX', 'UTF8', + '(~{25}', ('%s\r\n' % msg_string).encode('utf-8'), + b')\r\n' ]) def test_search_disallows_charset_in_utf8_mode(self): class UTF8Server(SimpleIMAPHandler): @@ -759,7 +766,11 @@ def test_enable_UTF8_True_append(self): class UTF8AppendServer(self.UTF8Server): def cmd_APPEND(self, tag, args): self._send_textline('+') - self.server.response = yield + self.server.response = args + literal = yield + self.server.response.append(literal) + literal = yield + self.server.response.append(literal) self._send_tagged(tag, 'OK', 'okay') with self.reaped_pair(UTF8AppendServer) as (server, client): @@ -773,12 +784,12 @@ def cmd_APPEND(self, tag, args): self.assertEqual(client._encoding, 'utf-8') msg_string = 'Subject: üñí©öðé' typ, data = client.append( - None, None, None, msg_string.encode('utf-8')) + None, None, None, (msg_string + '\n').encode('utf-8')) self.assertEqual(typ, 'OK') - self.assertEqual( - server.response, - ('UTF8 (%s)\r\n' % msg_string).encode('utf-8') - ) + self.assertEqual(server.response, + ['INBOX', 'UTF8', + '(~{25}', ('%s\r\n' % msg_string).encode('utf-8'), + b')\r\n' ]) # XXX also need a test that makes sure that the Literal and Untagged_status # regexes uses unicode in UTF8 mode instead of the default ASCII. From 44b7acb4de856409707d070f29950eb4decfc8ae Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Sat, 25 Feb 2023 16:07:33 -0800 Subject: [PATCH 5/5] Empty commit ; re-run tests