From 88a8842ab138af4c27bf3a5f02b09a78f986372b Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 3 Dec 2025 23:07:56 +0200 Subject: [PATCH] lib-imap-client, imapc: Automatically register no-CAPABILITY values for imapc_features Remove explicit no-metadata, no-qresync and no-imap4rev2 features, since they're now automatically added. no-acl was left for now, because it's used regardless of the advertised ACL CAPABILITY. This should probably be changed. --- src/lib-imap-client/imapc-connection.c | 13 ++++--------- src/lib-imap-client/imapc-settings.c | 11 ++++++++--- src/lib-imap-client/imapc-settings.h | 7 ++++--- src/lib-storage/index/imapc/imapc-attribute.c | 16 ++++++---------- 4 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index 50a42c2265..d17ead5c38 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -800,17 +800,12 @@ imapc_connection_parse_capability(struct imapc_connection *conn, "CAPABILITY list is missing IMAP4REV1"); return -1; } - if ((conn->client->set->parsed_features & IMAPC_FEATURE_NO_QRESYNC) != 0) - conn->capabilities &= ENUM_NEGATE(IMAPC_CAPABILITY_QRESYNC); - if ((conn->client->set->parsed_features & IMAPC_FEATURE_NO_IMAP4REV2) != 0) - conn->capabilities &= ENUM_NEGATE(IMAPC_CAPABILITY_IMAP4REV2); - else { + conn->capabilities &= ENUM_NEGATE(conn->client->set->parsed_disabled_capabilities); #ifndef EXPERIMENTAL_IMAP4REV2 - e_debug(conn->event, - "Disable IMAP4REV2 capability, as it is not supported with this build"); - conn->capabilities &= ENUM_NEGATE(IMAPC_CAPABILITY_IMAP4REV2); + e_debug(conn->event, + "Disable IMAP4REV2 capability, as it is not supported with this build"); + conn->capabilities &= ENUM_NEGATE(IMAPC_CAPABILITY_IMAP4REV2); #endif - } return 0; } diff --git a/src/lib-imap-client/imapc-settings.c b/src/lib-imap-client/imapc-settings.c index acdc31f874..efb57f3c7b 100644 --- a/src/lib-imap-client/imapc-settings.c +++ b/src/lib-imap-client/imapc-settings.c @@ -149,9 +149,6 @@ 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 }, { "no-acl", IMAPC_FEATURE_NO_ACL }, - { "no-metadata", IMAPC_FEATURE_NO_METADATA }, - { "no-qresync", IMAPC_FEATURE_NO_QRESYNC }, - { "no-imap4rev2", IMAPC_FEATURE_NO_IMAP4REV2 }, { NULL, 0 } }; @@ -194,6 +191,14 @@ imapc_settings_parse_features(struct imapc_settings *set, return -1; continue; } + if (str_begins(*str, "no-", &value)) { + enum imapc_capability capa = + imapc_capability_lookup(value); + if (capa != 0) { + set->parsed_disabled_capabilities |= capa; + continue; + } + } if (list->name == NULL) { *error_r = t_strdup_printf("imapc_features: " "Unknown feature: %s", *str); diff --git a/src/lib-imap-client/imapc-settings.h b/src/lib-imap-client/imapc-settings.h index 468bdf0280..0df5d9b2ba 100644 --- a/src/lib-imap-client/imapc-settings.h +++ b/src/lib-imap-client/imapc-settings.h @@ -25,9 +25,6 @@ enum imapc_features { IMAPC_FEATURE_FETCH_EMPTY_IS_EXPUNGED = 0x4000, IMAPC_FEATURE_NO_MSN_UPDATES = 0x8000, IMAPC_FEATURE_NO_ACL = 0x10000, - IMAPC_FEATURE_NO_METADATA = 0x20000, - IMAPC_FEATURE_NO_QRESYNC = 0x40000, - IMAPC_FEATURE_NO_IMAP4REV2 = 0x80000, }; enum imapc_capability { @@ -89,6 +86,8 @@ struct imapc_settings { const char *pop3_deleted_flag; enum imapc_features parsed_features; + enum imapc_capability parsed_disabled_capabilities; + unsigned int throttle_init_msecs; unsigned int throttle_max_msecs; unsigned int throttle_shrink_min_msecs; @@ -96,6 +95,8 @@ struct imapc_settings { extern const struct setting_parser_info imapc_setting_parser_info; +/* */ enum imapc_capability imapc_capability_lookup(const char *str); +/* */ #endif diff --git a/src/lib-storage/index/imapc/imapc-attribute.c b/src/lib-storage/index/imapc/imapc-attribute.c index 259a1102bb..cc62512470 100644 --- a/src/lib-storage/index/imapc/imapc-attribute.c +++ b/src/lib-storage/index/imapc/imapc-attribute.c @@ -234,17 +234,13 @@ imapc_storage_attribute_handling(struct mailbox *box, /* If we got here then we want to access metadata in the imapc backend. Check if that is possible. */ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box); - enum imapc_capability capabilities = 0; - - if (!IMAPC_HAS_FEATURE(mbox->storage, IMAPC_FEATURE_NO_METADATA)) { - if (mbox->capabilities == 0 && - imapc_client_get_capabilities(mbox->storage->client->client, - &mbox->capabilities) < 0) - return HANDLE_ERROR; - capabilities = mbox->capabilities; - } - if (!HAS_ALL_BITS(capabilities, IMAPC_CAPABILITY_METADATA)) { + if (mbox->capabilities == 0 && + imapc_client_get_capabilities(mbox->storage->client->client, + &mbox->capabilities) < 0) + return HANDLE_ERROR; + + if (!HAS_ALL_BITS(mbox->capabilities, IMAPC_CAPABILITY_METADATA)) { mail_storage_set_error(box->storage, MAIL_ERROR_UNAVAILABLE, "Can't access metadata on imapc backend"); return HANDLE_UNAVAILABLE; -- 2.47.3