]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
global: Reverse imapc feature detection
authorKarl Fleischmann <karl.fleischmann@open-xchange.com>
Wed, 7 Dec 2022 11:11:22 +0000 (12:11 +0100)
committerKarl Fleischmann <karl.fleischmann@open-xchange.com>
Mon, 19 Dec 2022 10:14:45 +0000 (11:14 +0100)
Auto-enable a selected subset of imapc features and reverse the feature
flags.

src/lib-storage/index/imapc/imapc-mail-fetch.c
src/lib-storage/index/imapc/imapc-mail.c
src/lib-storage/index/imapc/imapc-search.c
src/lib-storage/index/imapc/imapc-settings.c
src/lib-storage/index/imapc/imapc-settings.h
src/lib-storage/index/imapc/imapc-storage.c
src/plugins/imap-acl/imap-acl-plugin.c

index 3b4817ae7aacee31bda9c8e8d6d9cccb5a5a5f75..88c0ef0e04be6ac9e54215e1b8ad3b2b6d633c8f 100644 (file)
@@ -213,7 +213,7 @@ imapc_mail_send_fetch(struct mail *_mail, enum mail_fetch_field fields,
        unsigned int i;
 
        i_assert(headers == NULL ||
-                IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_HEADERS));
+                !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_HEADERS));
 
        if (!mbox->selected) {
                mail_storage_set_error(_mail->box->storage,
@@ -359,15 +359,15 @@ imapc_mail_get_wanted_fetch_fields(struct imapc_mail *mail)
        if ((data->wanted_fields & (MAIL_FETCH_PHYSICAL_SIZE |
                                    MAIL_FETCH_VIRTUAL_SIZE)) != 0 &&
            data->physical_size == UOFF_T_MAX &&
-           IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_SIZE))
+           !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_SIZE))
                fields |= MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE;
        if ((data->wanted_fields & MAIL_FETCH_IMAP_BODY) != 0 &&
            data->body == NULL &&
-           IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_BODYSTRUCTURE))
+           !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE))
                fields |= MAIL_FETCH_IMAP_BODY;
        if ((data->wanted_fields & MAIL_FETCH_IMAP_BODYSTRUCTURE) != 0 &&
            data->bodystructure == NULL &&
-           IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_BODYSTRUCTURE))
+           !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE))
                fields |= MAIL_FETCH_IMAP_BODYSTRUCTURE;
        if ((data->wanted_fields & MAIL_FETCH_GUID) != 0 &&
            data->guid == NULL && mbox->guid_fetch_field_name != NULL)
@@ -411,7 +411,7 @@ bool imapc_mail_prefetch(struct mail *_mail)
            (fields & MAIL_FETCH_STREAM_HEADER) == 0 &&
            !imapc_mail_has_headers_in_cache(&mail->imail, data->wanted_headers)) {
                /* fetch specific headers */
-               if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_HEADERS))
+               if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_HEADERS))
                        headers = data->wanted_headers->name;
                else
                        fields |= MAIL_FETCH_STREAM_HEADER;
@@ -590,7 +590,7 @@ void imapc_mail_init_stream(struct imapc_mail *mail)
                          t_strdup_printf("imapc mail uid=%u", _mail->uid));
        index_mail_set_read_buffer_size(_mail, imail->data.stream);
 
-       if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_SIZE)) {
+       if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_SIZE)) {
                /* enable filtering only when we're not passing through
                   RFC822.SIZE. otherwise we'll get size mismatches. */
                imapc_stream_filter(&imail->data.stream);
@@ -877,13 +877,13 @@ void imapc_mail_fetch_update(struct imapc_mail *mail,
                        }
                        match = TRUE;
                } else if (strcasecmp(key, "BODY") == 0) {
-                       if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_BODYSTRUCTURE)) {
+                       if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE)) {
                                mail->imail.data.body =
                                        imapc_args_to_bodystructure(mail, &args[i+1], FALSE);
                        }
                        match = TRUE;
                } else if (strcasecmp(key, "BODYSTRUCTURE") == 0) {
-                       if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_BODYSTRUCTURE)) {
+                       if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE)) {
                                mail->imail.data.bodystructure =
                                        imapc_args_to_bodystructure(mail, &args[i+1], TRUE);
                        }
@@ -891,7 +891,7 @@ void imapc_mail_fetch_update(struct imapc_mail *mail,
                } else if (strcasecmp(key, "RFC822.SIZE") == 0) {
                        if (imap_arg_get_atom(&args[i+1], &value) &&
                            str_to_uoff(value, &size) == 0 &&
-                           IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_SIZE)) {
+                           !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_SIZE)) {
                                mail->imail.data.physical_size = size;
                                mail->imail.data.virtual_size = size;
                                mail->imail.data.inexact_total_sizes = TRUE;
index d6bf9a1b891014337dd2a330d88f2119ac68dc15..0b0fdbf86dc05eb3429827ba7ff8978dd2fcf676 100644 (file)
@@ -180,7 +180,7 @@ static int imapc_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
                return 0;
        }
 
-       if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_SIZE) &&
+       if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_SIZE) &&
            data->stream == NULL) {
                /* Trust RFC822.SIZE to be correct enough to present to the
                   IMAP client. However, it can be wrong in some implementation
@@ -238,7 +238,7 @@ imapc_mail_get_header_stream(struct mail *_mail,
        int ret;
 
        if (mail->imail.data.access_part != 0 ||
-           !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_HEADERS)) {
+           IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_HEADERS)) {
                /* we're going to be reading the header/body anyway */
                return index_mail_get_header_stream(_mail, headers, stream_r);
        }
@@ -390,7 +390,7 @@ void imapc_mail_update_access_parts(struct index_mail *mail)
        if ((data->wanted_fields & (MAIL_FETCH_PHYSICAL_SIZE |
                                    MAIL_FETCH_VIRTUAL_SIZE)) != 0) {
                if (index_mail_get_physical_size(_mail, &size) < 0 &&
-                   !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_SIZE))
+                   IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_SIZE))
                        data->access_part |= READ_HDR | READ_BODY;
        }
        if ((data->wanted_fields & MAIL_FETCH_GUID) != 0)
@@ -401,14 +401,14 @@ void imapc_mail_update_access_parts(struct index_mail *mail)
                (void)index_mail_get_cached_bodystructure(mail, &str);
 
        if (data->access_part == 0 && data->wanted_headers != NULL &&
-           !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_HEADERS)) {
+           IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_HEADERS)) {
                /* see if all wanted headers exist in cache */
                if (!imapc_mail_has_headers_in_cache(mail, data->wanted_headers))
                        data->access_part |= PARSE_HDR;
        }
        if (data->access_part == 0 &&
            (data->wanted_fields & MAIL_FETCH_IMAP_ENVELOPE) != 0 &&
-           !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_HEADERS)) {
+           IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_HEADERS)) {
                /* the common code already checked this partially,
                   but we need a guaranteed correct answer */
                header_ctx = mailbox_header_lookup_init(_mail->box,
@@ -426,7 +426,7 @@ static void imapc_mail_set_seq(struct mail *_mail, uint32_t seq, bool saving)
        struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
 
        index_mail_set_seq(_mail, seq, saving);
-       if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_SIZE)) {
+       if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_SIZE)) {
                /* RFC822.SIZE may be read from vsize record or cache. It may
                   not be exactly correct. */
                mail->data.inexact_total_sizes = TRUE;
@@ -602,7 +602,7 @@ imapc_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
                                           "GmailId%"PRIx64, num);
                return 0;
        case MAIL_FETCH_IMAP_BODY:
-               if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_BODYSTRUCTURE))
+               if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE))
                        break;
 
                if (index_mail_get_cached_body(imail, value_r))
@@ -616,7 +616,7 @@ imapc_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
                *value_r = imail->data.body;
                return 0;
        case MAIL_FETCH_IMAP_BODYSTRUCTURE:
-               if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_BODYSTRUCTURE))
+               if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE))
                        break;
 
                if (index_mail_get_cached_bodystructure(imail, value_r))
index aeddfd8dbb1edd118c9d5486e6093259f07baeb1..768d78be73401903487b8f2898bb94a74e9c6f9d 100644 (file)
@@ -173,7 +173,7 @@ static bool imapc_build_search_query(struct imapc_mailbox *mbox,
 {
        string_t *str = t_str_new(128);
 
-       if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_SEARCH)) {
+       if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_SEARCH)) {
                /* SEARCH command passthrough not enabled */
                return FALSE;
        }
index 9c7484ddf901d32d30d24964fdf949182dbeb277..aa814093d84489c6106701384ad761db6864d801 100644 (file)
@@ -89,23 +89,23 @@ struct imapc_feature_list {
 };
 
 static const struct imapc_feature_list imapc_feature_list[] = {
-       { "fetch-size", IMAPC_FEATURE_FETCH_SIZE },
+       { "no-fetch-size", IMAPC_FEATURE_NO_FETCH_SIZE },
        { "guid-forced", IMAPC_FEATURE_GUID_FORCED },
-       { "fetch-headers", IMAPC_FEATURE_FETCH_HEADERS },
+       { "no-fetch-headers", IMAPC_FEATURE_NO_FETCH_HEADERS },
        { "gmail-migration", IMAPC_FEATURE_GMAIL_MIGRATION },
-       { "search", IMAPC_FEATURE_SEARCH },
+       { "no-search", IMAPC_FEATURE_NO_SEARCH },
        { "zimbra-workarounds", IMAPC_FEATURE_ZIMBRA_WORKAROUNDS },
        { "no-examine", IMAPC_FEATURE_NO_EXAMINE },
        { "proxyauth", IMAPC_FEATURE_PROXYAUTH },
        { "fetch-msn-workarounds", IMAPC_FEATURE_FETCH_MSN_WORKAROUNDS },
        { "fetch-fix-broken-mails", IMAPC_FEATURE_FETCH_FIX_BROKEN_MAILS },
-       { "modseq", IMAPC_FEATURE_MODSEQ },
-       { "delay-login", IMAPC_FEATURE_DELAY_LOGIN },
-       { "fetch-bodystructure", IMAPC_FEATURE_FETCH_BODYSTRUCTURE },
+       { "no-modseq", IMAPC_FEATURE_NO_MODSEQ },
+       { "no-delay-login", IMAPC_FEATURE_NO_DELAY_LOGIN },
+       { "no-fetch-bodystructure", IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE },
        { "send-id", IMAPC_FEATURE_SEND_ID },
        { "fetch-empty-is-expunged", IMAPC_FEATURE_FETCH_EMPTY_IS_EXPUNGED },
        { "no-msn-updates", IMAPC_FEATURE_NO_MSN_UPDATES },
-       { "acl", IMAPC_FEATURE_ACL },
+       { "no-acl", IMAPC_FEATURE_NO_ACL },
        { NULL, 0 }
 };
 
index a82b951b7869cd4f2ecad9b8dadc00960c31e7b2..c9aa811d270dac805be8d545fa0e79e913ba2c50 100644 (file)
@@ -5,23 +5,23 @@
 
 /* <settings checks> */
 enum imapc_features {
-       IMAPC_FEATURE_FETCH_SIZE                = 0x01,
+       IMAPC_FEATURE_NO_FETCH_SIZE             = 0x01,
        IMAPC_FEATURE_GUID_FORCED               = 0x02,
-       IMAPC_FEATURE_FETCH_HEADERS             = 0x04,
+       IMAPC_FEATURE_NO_FETCH_HEADERS          = 0x04,
        IMAPC_FEATURE_GMAIL_MIGRATION           = 0x08,
-       IMAPC_FEATURE_SEARCH                    = 0x10,
+       IMAPC_FEATURE_NO_SEARCH                 = 0x10,
        IMAPC_FEATURE_ZIMBRA_WORKAROUNDS        = 0x20,
        IMAPC_FEATURE_NO_EXAMINE                = 0x40,
        IMAPC_FEATURE_PROXYAUTH                 = 0x80,
        IMAPC_FEATURE_FETCH_MSN_WORKAROUNDS     = 0x100,
        IMAPC_FEATURE_FETCH_FIX_BROKEN_MAILS    = 0x200,
-       IMAPC_FEATURE_MODSEQ                    = 0x400,
-       IMAPC_FEATURE_DELAY_LOGIN               = 0x800,
-       IMAPC_FEATURE_FETCH_BODYSTRUCTURE       = 0x1000,
+       IMAPC_FEATURE_NO_MODSEQ                 = 0x400,
+       IMAPC_FEATURE_NO_DELAY_LOGIN            = 0x800,
+       IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE    = 0x1000,
        IMAPC_FEATURE_SEND_ID                   = 0x2000,
        IMAPC_FEATURE_FETCH_EMPTY_IS_EXPUNGED   = 0x4000,
        IMAPC_FEATURE_NO_MSN_UPDATES            = 0x8000,
-       IMAPC_FEATURE_ACL                       = 0x10000,
+       IMAPC_FEATURE_NO_ACL                    = 0x10000,
 };
 /* </settings checks> */
 
index 7e748aa4a3d0e3d2bed709c4dae537b9df242088..2f09c975d323171d25a2154864cb2b85357263d0 100644 (file)
@@ -97,7 +97,7 @@ bool imapc_mailbox_has_modseqs(struct imapc_mailbox *mbox)
 {
        return (mbox->capabilities & (IMAPC_CAPABILITY_CONDSTORE |
                                      IMAPC_CAPABILITY_QRESYNC)) != 0 &&
-               IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_MODSEQ);
+               !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_NO_MODSEQ);
 }
 
 static struct mail_storage *imapc_storage_alloc(void)
@@ -380,7 +380,7 @@ int imapc_storage_client_create(struct mail_namespace *ns,
        imapc_client_set_login_callback(client->client, imapc_storage_client_login_callback, client);
 
        if ((ns->flags & NAMESPACE_FLAG_LIST_PREFIX) != 0 &&
-           (imapc_set->parsed_features & IMAPC_FEATURE_DELAY_LOGIN) == 0) {
+           (imapc_set->parsed_features & IMAPC_FEATURE_NO_DELAY_LOGIN) != 0) {
                /* start logging in immediately */
                imapc_storage_client_login(client, ns->user, set.host);
        }
@@ -451,7 +451,7 @@ imapc_storage_create(struct mail_storage *_storage,
        }
        storage->client->_storage = storage;
        p_array_init(&storage->remote_namespaces, _storage->pool, 4);
-       if (IMAPC_HAS_FEATURE(storage, IMAPC_FEATURE_FETCH_BODYSTRUCTURE)) {
+       if (!IMAPC_HAS_FEATURE(storage, IMAPC_FEATURE_NO_FETCH_BODYSTRUCTURE)) {
                _storage->nonbody_access_fields |=
                        MAIL_FETCH_IMAP_BODY | MAIL_FETCH_IMAP_BODYSTRUCTURE;
        }
index ab602a92e9aa476b9e7475b5426dfbe6ae620af7..c22382d632e3bf7e30cbe6a3b72f989b63b320bb 100644 (file)
@@ -539,7 +539,7 @@ static bool imap_acl_proxy_cmd(struct mailbox *box,
        }
 
        struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
-       if (!IMAPC_HAS_FEATURE(mbox->storage, IMAPC_FEATURE_ACL)) {
+       if (IMAPC_HAS_FEATURE(mbox->storage, IMAPC_FEATURE_NO_ACL)) {
                /* Storage is "imapc" but no proxying of ACL commands should
                   be done. */
                return FALSE;