]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap-client, imapc: Automatically register no-CAPABILITY values for imapc_features
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 3 Dec 2025 21:07:56 +0000 (23:07 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 3 Dec 2025 21:09:46 +0000 (23:09 +0200)
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
src/lib-imap-client/imapc-settings.c
src/lib-imap-client/imapc-settings.h
src/lib-storage/index/imapc/imapc-attribute.c

index 50a42c226584a3919a0b8bf3edfdbfae839758af..d17ead5c38cb4846c5b456da744c998c293309c6 100644 (file)
@@ -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;
 }
index acdc31f8740fab268f78f6921d2e14fb7d937ecf..efb57f3c7b9391d4904429dabc1b4dd589e68695 100644 (file)
@@ -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);
index 468bdf0280303bcd3beacf2da6993c4e49a124b9..0df5d9b2bae0b4a33f46ef152847eb60f43ac336 100644 (file)
@@ -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;
 
+/* <settings checks> */
 enum imapc_capability imapc_capability_lookup(const char *str);
+/* </settings checks> */
 
 #endif
index 259a1102bb953326020bbe89a2c0ff7bae2976f7..cc625124701b2981303f55b4340b3f5f82ed95ba 100644 (file)
@@ -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;