commit ee9fd2f5c7ad4db9906b006a18d5dc2fc08a6982 Author: Oswald Buddenhagen <o...@users.sf.net> Date: Fri May 20 09:54:50 2022 +0200
workaround iCloud IMAP bug thanks to Sabahattin Gucukoglu <listse...@me.com> for the thorough investigation. REFMAIL: 29c5e84d-5fe7-47bb-9a14-2ec34d392...@me.com src/drv_imap.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/drv_imap.c b/src/drv_imap.c index 064761cd..0cbfed09 100644 --- a/src/drv_imap.c +++ b/src/drv_imap.c @@ -126,6 +126,7 @@ union imap_store { enum { FetchNone, FetchMsgs, FetchUidNext } fetch_sts; uint got_namespace:1; uint has_forwarded:1; + uint capability_hack:1; char delimiter[2]; // Hierarchy delimiter char *ns_prefix, ns_delimiter; // NAMESPACE info string_list_t *boxes; // _list results @@ -1311,6 +1312,8 @@ parse_response_code( imap_store_t *ctx, imap_cmd_t *cmd, char *s ) } *p = 0; parse_capability( ctx, s ); + if (strstr( p + 1, "mac.com IMAP4 service (Oracle Communications Messaging Server" )) + ctx->capability_hack = 1; } else if (!strcmp( "ALERT]", arg )) { /* RFC2060 says that these messages MUST be displayed * to the user @@ -2519,7 +2522,13 @@ imap_open_store_authenticate2_p2( imap_store_t *ctx, imap_cmd_t *cmd ATTR_UNUSED if (response == RESP_NO) { imap_open_store_bail( ctx, FAIL_FINAL ); } else if (response == RESP_OK) { - if (!ctx->caps) + // iCloud (imap.mail.me.com) apparently runs the real server behind a + // proxy that injects XAPPLEPUSHSERVICE into (and deletes STARTTLS from) + // the server's outgoing data stream following occurrences of CAPABILITY. + // This process is rather indiscriminate, so it will mess up IMAP + // literals if it is not deactivated in time by issuing a (redundant) + // CAPABILITY command after logging in. + if (!ctx->caps || ctx->capability_hack) imap_exec( ctx, NULL, imap_open_store_authenticate2_p3, "CAPABILITY" ); else imap_open_store_compress( ctx ); _______________________________________________ isync-devel mailing list isync-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/isync-devel