From: Karl Fleischmann Date: Wed, 7 Dec 2022 11:11:22 +0000 (+0100) Subject: global: Reverse imapc feature detection X-Git-Tag: 2.4.0~3266 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7810b38d30b7dbb2155f78873fe760bc9e2e6212;p=thirdparty%2Fdovecot%2Fcore.git global: Reverse imapc feature detection Auto-enable a selected subset of imapc features and reverse the feature flags. --- diff --git a/src/lib-storage/index/imapc/imapc-mail-fetch.c b/src/lib-storage/index/imapc/imapc-mail-fetch.c index 3b4817ae7a..88c0ef0e04 100644 --- a/src/lib-storage/index/imapc/imapc-mail-fetch.c +++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c @@ -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; diff --git a/src/lib-storage/index/imapc/imapc-mail.c b/src/lib-storage/index/imapc/imapc-mail.c index d6bf9a1b89..0b0fdbf86d 100644 --- a/src/lib-storage/index/imapc/imapc-mail.c +++ b/src/lib-storage/index/imapc/imapc-mail.c @@ -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)) diff --git a/src/lib-storage/index/imapc/imapc-search.c b/src/lib-storage/index/imapc/imapc-search.c index aeddfd8dbb..768d78be73 100644 --- a/src/lib-storage/index/imapc/imapc-search.c +++ b/src/lib-storage/index/imapc/imapc-search.c @@ -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; } diff --git a/src/lib-storage/index/imapc/imapc-settings.c b/src/lib-storage/index/imapc/imapc-settings.c index 9c7484ddf9..aa814093d8 100644 --- a/src/lib-storage/index/imapc/imapc-settings.c +++ b/src/lib-storage/index/imapc/imapc-settings.c @@ -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 } }; diff --git a/src/lib-storage/index/imapc/imapc-settings.h b/src/lib-storage/index/imapc/imapc-settings.h index a82b951b78..c9aa811d27 100644 --- a/src/lib-storage/index/imapc/imapc-settings.h +++ b/src/lib-storage/index/imapc/imapc-settings.h @@ -5,23 +5,23 @@ /* */ 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, }; /* */ diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index 7e748aa4a3..2f09c975d3 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -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; } diff --git a/src/plugins/imap-acl/imap-acl-plugin.c b/src/plugins/imap-acl/imap-acl-plugin.c index ab602a92e9..c22382d632 100644 --- a/src/plugins/imap-acl/imap-acl-plugin.c +++ b/src/plugins/imap-acl/imap-acl-plugin.c @@ -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;