From: Timo Sirainen Date: Mon, 22 Apr 2024 09:01:07 +0000 (+0300) Subject: imapc, lib-imap-client: Add imapc_features=no-qresync to disable QRESYNC X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e90bd8a7e51d12fd759aa7e9f47b36268f365ec5;p=thirdparty%2Fdovecot%2Fcore.git imapc, lib-imap-client: Add imapc_features=no-qresync to disable QRESYNC This can be used to silently work around the Zimbra bug of not sending [CLOSED] imap-resp-code. --- diff --git a/src/lib-imap-client/imapc-client.c b/src/lib-imap-client/imapc-client.c index 5806a80c50..18d85af97a 100644 --- a/src/lib-imap-client/imapc-client.c +++ b/src/lib-imap-client/imapc-client.c @@ -73,6 +73,7 @@ imapc_client_init(const struct imapc_client_settings *set, client->set.sasl_mechanisms = p_strdup(pool, set->sasl_mechanisms); client->set.session_id_prefix = p_strdup(pool, set->session_id_prefix); client->set.use_proxyauth = set->use_proxyauth; + client->set.no_qresync = set->no_qresync; client->set.dns_client_socket_path = p_strdup(pool, set->dns_client_socket_path); client->set.temp_path_prefix = diff --git a/src/lib-imap-client/imapc-client.h b/src/lib-imap-client/imapc-client.h index 5c81be616c..4feac18ed2 100644 --- a/src/lib-imap-client/imapc-client.h +++ b/src/lib-imap-client/imapc-client.h @@ -87,6 +87,7 @@ struct imapc_client_settings { order). The default is to use only LOGIN command or SASL PLAIN. */ const char *sasl_mechanisms; bool use_proxyauth; /* Use Sun/Oracle PROXYAUTH command */ + bool no_qresync; /* Don't use QRESYNC extension */ unsigned int max_idle_time; /* If ID capability is advertised, send a unique "x-session-ext-id", which begins with this prefix. */ diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index 30e8afef02..4c3b6f3985 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -787,6 +787,8 @@ imapc_connection_parse_capability(struct imapc_connection *conn, "CAPABILITY list is missing IMAP4REV1"); return -1; } + if (conn->client->set.no_qresync) + conn->capabilities &= ENUM_NEGATE(IMAPC_CAPABILITY_QRESYNC); return 0; } diff --git a/src/lib-storage/index/imapc/imapc-settings.c b/src/lib-storage/index/imapc/imapc-settings.c index 6183f8f21d..e5753be23b 100644 --- a/src/lib-storage/index/imapc/imapc-settings.c +++ b/src/lib-storage/index/imapc/imapc-settings.c @@ -106,6 +106,7 @@ static const struct imapc_feature_list imapc_feature_list[] = { { "fetch-empty-is-expunged", IMAPC_FEATURE_FETCH_EMPTY_IS_EXPUNGED }, { "no-msn-updates", IMAPC_FEATURE_NO_MSN_UPDATES }, { "acl", IMAPC_FEATURE_ACL }, + { "no-qresync", IMAPC_FEATURE_NO_QRESYNC }, { NULL, 0 } }; diff --git a/src/lib-storage/index/imapc/imapc-settings.h b/src/lib-storage/index/imapc/imapc-settings.h index e4c1da1740..09ca6ae8db 100644 --- a/src/lib-storage/index/imapc/imapc-settings.h +++ b/src/lib-storage/index/imapc/imapc-settings.h @@ -22,6 +22,7 @@ enum imapc_features { IMAPC_FEATURE_FETCH_EMPTY_IS_EXPUNGED = 0x4000, IMAPC_FEATURE_NO_MSN_UPDATES = 0x8000, IMAPC_FEATURE_ACL = 0x10000, + IMAPC_FEATURE_NO_QRESYNC = 0x40000, }; /* */ diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index 2c9fcdfa4d..ddc3e08d93 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -334,6 +334,7 @@ int imapc_storage_client_create(struct mail_namespace *ns, } set.sasl_mechanisms = imapc_set->imapc_sasl_mechanisms; set.use_proxyauth = (imapc_set->parsed_features & IMAPC_FEATURE_PROXYAUTH) != 0; + set.no_qresync = (imapc_set->parsed_features & IMAPC_FEATURE_NO_QRESYNC) != 0; set.cmd_timeout_msecs = imapc_set->imapc_cmd_timeout * 1000; set.connect_retry_count = imapc_set->imapc_connection_retry_count; set.connect_retry_interval_msecs = imapc_set->imapc_connection_retry_interval;