Skip to content

Commit

Permalink
global: Reverse imapc feature detection
Browse files Browse the repository at this point in the history
Auto-enable a selected subset of imapc features and reverse the feature
flags.
  • Loading branch information
fleischie committed Dec 19, 2022
1 parent e52d56d commit 7810b38
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 36 deletions.
18 changes: 9 additions & 9 deletions src/lib-storage/index/imapc/imapc-mail-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -877,21 +877,21 @@ 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);
}
match = TRUE;
} 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;
Expand Down
16 changes: 8 additions & 8 deletions src/lib-storage/index/imapc/imapc-mail.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)
Expand All @@ -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,
Expand All @@ -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;
Expand Down Expand Up @@ -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))
Expand All @@ -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))
Expand Down
2 changes: 1 addition & 1 deletion src/lib-storage/index/imapc/imapc-search.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
14 changes: 7 additions & 7 deletions src/lib-storage/index/imapc/imapc-settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
};

Expand Down
14 changes: 7 additions & 7 deletions src/lib-storage/index/imapc/imapc-settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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> */

Expand Down
6 changes: 3 additions & 3 deletions src/lib-storage/index/imapc/imapc-storage.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/imap-acl/imap-acl-plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 7810b38

Please sign in to comment.