]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Don't write SEARCH YOUNGER/OLDER queries if server doesn't support WITHIN...
authorTimo Sirainen <tss@iki.fi>
Thu, 23 Apr 2015 16:37:25 +0000 (19:37 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 23 Apr 2015 16:37:25 +0000 (19:37 +0300)
src/lib-imap-client/imapc-client.c
src/lib-imap-client/imapc-client.h
src/lib-storage/index/imapc/imapc-search.c

index 763652c1f134d70e94a808c88a0f3e11822a9989..5647e7919125d58aff12b10926d9e9a5d74d1c12 100644 (file)
@@ -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 }
index dd0be4a3f8159307ae2276b9a2e937c7262fc615..d1fca88f397234a8d834396b394d4beb3fc68217 100644 (file)
@@ -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
 };
index 110c0ee2381341c80228e0353b3d5e8a19060b51..a04c957ec0d71c0578e2286735853ab153499a31 100644 (file)
@@ -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: