From: Timo Sirainen Date: Tue, 14 Oct 2014 16:39:50 +0000 (-0700) Subject: lib-storage: Added X-REAL-UID search parameter. X-Git-Tag: 2.2.14~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bacd4f6e62996e95d7aafd94716025b22a39d470;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added X-REAL-UID search parameter. --- diff --git a/src/lib-storage/index/index-search.c b/src/lib-storage/index/index-search.c index 9510f98a5e..baa51b962c 100644 --- a/src/lib-storage/index/index-search.c +++ b/src/lib-storage/index/index-search.c @@ -357,6 +357,13 @@ static int search_arg_match_cached(struct index_search_context *ctx, if (mail_get_special(ctx->cur_mail, MAIL_FETCH_GUID, &str) < 0) return -1; return strcmp(str, arg->value.str) == 0; + case SEARCH_REAL_UID: { + struct mail *real_mail; + + if (mail_get_backend_mail(ctx->cur_mail, &real_mail) < 0) + return -1; + return seq_range_exists(&arg->value.seqset, real_mail->uid); + } default: return -1; } @@ -1347,6 +1354,7 @@ static bool search_arg_is_static(struct mail_search_arg *arg) case SEARCH_MAILBOX: case SEARCH_MAILBOX_GUID: case SEARCH_MAILBOX_GLOB: + case SEARCH_REAL_UID: return TRUE; } return FALSE; diff --git a/src/lib-storage/mail-search-register-imap.c b/src/lib-storage/mail-search-register-imap.c index 60e6b663f1..231f385f88 100644 --- a/src/lib-storage/mail-search-register-imap.c +++ b/src/lib-storage/mail-search-register-imap.c @@ -501,6 +501,25 @@ imap_search_x_mailbox(struct mail_search_build_context *ctx) return sarg; } +static struct mail_search_arg * +imap_search_x_real_uid(struct mail_search_build_context *ctx) +{ + struct mail_search_arg *sarg; + + /* */ + sarg = mail_search_build_str(ctx, SEARCH_REAL_UID); + if (sarg == NULL) + return NULL; + + p_array_init(&sarg->value.seqset, ctx->pool, 16); + if (imap_seq_set_parse(sarg->value.str, + &sarg->value.seqset) < 0) { + ctx->_error = "Invalid X-REAL-UID messageset"; + return NULL; + } + return sarg; +} + static const struct mail_search_register_arg imap_register_args[] = { /* argument set operations */ { "NOT", imap_search_not }, @@ -572,7 +591,8 @@ static const struct mail_search_register_arg imap_register_args[] = { /* Other Dovecot extensions: */ { "INTHREAD", imap_search_inthread }, { "X-GUID", imap_search_x_guid }, - { "X-MAILBOX", imap_search_x_mailbox } + { "X-MAILBOX", imap_search_x_mailbox }, + { "X-REAL-UID", imap_search_x_real_uid } }; static struct mail_search_register *mail_search_register_init_imap(void) diff --git a/src/lib-storage/mail-search.c b/src/lib-storage/mail-search.c index a216f6acd4..017ba4d6eb 100644 --- a/src/lib-storage/mail-search.c +++ b/src/lib-storage/mail-search.c @@ -283,6 +283,7 @@ mail_search_arg_dup_one(pool_t pool, const struct mail_search_arg *arg) break; case SEARCH_SEQSET: case SEARCH_UIDSET: + case SEARCH_REAL_UID: p_array_init(&new_arg->value.seqset, pool, array_count(&arg->value.seqset)); array_append_array(&new_arg->value.seqset, &arg->value.seqset); @@ -759,6 +760,8 @@ static bool mail_search_arg_one_equals(const struct mail_search_arg *arg1, return FALSE; case SEARCH_UIDSET: return array_cmp(&arg1->value.seqset, &arg2->value.seqset); + case SEARCH_REAL_UID: + return array_cmp(&arg1->value.seqset, &arg2->value.seqset); case SEARCH_FLAGS: return arg1->value.flags == arg2->value.flags; diff --git a/src/lib-storage/mail-search.h b/src/lib-storage/mail-search.h index 2d2639788e..954a98e3a3 100644 --- a/src/lib-storage/mail-search.h +++ b/src/lib-storage/mail-search.h @@ -42,7 +42,8 @@ enum mail_search_arg_type { SEARCH_GUID, SEARCH_MAILBOX, SEARCH_MAILBOX_GUID, - SEARCH_MAILBOX_GLOB + SEARCH_MAILBOX_GLOB, + SEARCH_REAL_UID }; enum mail_search_date_type {