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

Reply via email to