From: Timo Sirainen Date: Tue, 25 Apr 2017 09:39:04 +0000 (+0300) Subject: imapc: Use UID SEARCH instead of SEARCH X-Git-Tag: 2.3.0.rc1~1697 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1e88ab82d698707d79c60c73872bd901a30bc50e;p=thirdparty%2Fdovecot%2Fcore.git imapc: Use UID SEARCH instead of SEARCH UIDs work better for some broken IMAP servers, so it's safer to use it. Keep using sequences for ESEARCH, since servers supporting it aren't at least yet known to be broken and the search result with sequences is smaller. --- diff --git a/src/lib-storage/index/imapc/imapc-search.c b/src/lib-storage/index/imapc/imapc-search.c index 7f30c86644..05c16c7b57 100644 --- a/src/lib-storage/index/imapc/imapc-search.c +++ b/src/lib-storage/index/imapc/imapc-search.c @@ -6,6 +6,7 @@ #include "imap-seqset.h" #include "imap-util.h" #include "mail-search.h" +#include "imapc-msgmap.h" #include "imapc-storage.h" #include "imapc-search.h" @@ -173,7 +174,7 @@ static bool imapc_build_search_query(struct imapc_mailbox *mbox, if ((mbox->capabilities & IMAPC_CAPABILITY_ESEARCH) != 0) str_append(str, "SEARCH RETURN (ALL) "); else - str_append(str, "SEARCH "); + str_append(str, "UID SEARCH "); if (!imapc_build_search_query_args(mbox, args->args, FALSE, str)) return FALSE; *query_r = str_c(str); @@ -279,21 +280,25 @@ int imapc_search_deinit(struct mail_search_context *ctx) void imapc_search_reply_search(const struct imap_arg *args, struct imapc_mailbox *mbox) { + struct imapc_msgmap *msgmap = + imapc_client_mailbox_get_msgmap(mbox->client_box); const char *atom; - uint32_t seq; + uint32_t uid, rseq; if (mbox->search_ctx == NULL) { i_error("Unexpected SEARCH reply"); return; } + /* we're doing UID SEARCH, so need to convert UIDs to sequences */ for (unsigned int i = 0; args[i].type != IMAP_ARG_EOL; i++) { if (!imap_arg_get_atom(&args[i], &atom) || - str_to_uint32(atom, &seq) < 0 || seq == 0) { + str_to_uint32(atom, &uid) < 0 || uid == 0) { i_error("Invalid SEARCH reply"); break; } - seq_range_array_add(&mbox->search_ctx->rseqs, seq); + if (imapc_msgmap_uid_to_rseq(msgmap, uid, &rseq)) + seq_range_array_add(&mbox->search_ctx->rseqs, rseq); } }