From: Timo Sirainen Date: Thu, 23 Apr 2015 16:37:25 +0000 (+0300) Subject: imapc: Don't write SEARCH YOUNGER/OLDER queries if server doesn't support WITHIN... X-Git-Tag: 2.2.17.rc1~162 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45a3ea3347dd42fccc84a3efafb6331e7baeb404;p=thirdparty%2Fdovecot%2Fcore.git imapc: Don't write SEARCH YOUNGER/OLDER queries if server doesn't support WITHIN extension --- diff --git a/src/lib-imap-client/imapc-client.c b/src/lib-imap-client/imapc-client.c index 763652c1f1..5647e79191 100644 --- a/src/lib-imap-client/imapc-client.c +++ b/src/lib-imap-client/imapc-client.c @@ -25,6 +25,7 @@ const struct imapc_capability_name imapc_capability_names[] = { { "NAMESPACE", IMAPC_CAPABILITY_NAMESPACE }, { "UNSELECT", IMAPC_CAPABILITY_UNSELECT }, { "ESEARCH", IMAPC_CAPABILITY_ESEARCH }, + { "WITHIN", IMAPC_CAPABILITY_WITHIN }, { "IMAP4REV1", IMAPC_CAPABILITY_IMAP4REV1 }, { NULL, 0 } diff --git a/src/lib-imap-client/imapc-client.h b/src/lib-imap-client/imapc-client.h index dd0be4a3f8..d1fca88f39 100644 --- a/src/lib-imap-client/imapc-client.h +++ b/src/lib-imap-client/imapc-client.h @@ -24,6 +24,7 @@ enum imapc_capability { IMAPC_CAPABILITY_NAMESPACE = 0x200, IMAPC_CAPABILITY_UNSELECT = 0x400, IMAPC_CAPABILITY_ESEARCH = 0x800, + IMAPC_CAPABILITY_WITHIN = 0x1000, IMAPC_CAPABILITY_IMAP4REV1 = 0x40000000 }; diff --git a/src/lib-storage/index/imapc/imapc-search.c b/src/lib-storage/index/imapc/imapc-search.c index 110c0ee238..a04c957ec0 100644 --- a/src/lib-storage/index/imapc/imapc-search.c +++ b/src/lib-storage/index/imapc/imapc-search.c @@ -98,13 +98,24 @@ imapc_build_search_query_arg(struct imapc_mailbox *mbox, imap_write_seq_range(str, &uids); } T_END; return TRUE; + case SEARCH_BEFORE: + case SEARCH_SINCE: + if ((capa & IMAPC_CAPABILITY_WITHIN) == 0) { + /* a bit kludgy way to check this.. */ + unsigned int pos = str_len(str); + if (!mail_search_arg_to_imap(str, arg, &error)) + return FALSE; + if (strncasecmp(str_c(str) + pos, "OLDER", 5) == 0 || + strncasecmp(str_c(str) + pos, "YOUNGER", 7) == 0) + return FALSE; + return TRUE; + } + /* fall thrugh */ case SEARCH_ALL: case SEARCH_UIDSET: case SEARCH_FLAGS: case SEARCH_KEYWORDS: - case SEARCH_BEFORE: case SEARCH_ON: - case SEARCH_SINCE: case SEARCH_SMALLER: case SEARCH_LARGER: case SEARCH_HEADER: