imap-search.c revision cc2259f1d0a6672d9bd69e5d37cbfd00bd2855d3
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2002-2007 Dovecot authors, see the included COPYING file */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenimap_uidset_parse(pool_t pool, struct mailbox *box, const char *uidset,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_search_seqset **seqset_r, const char **error_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen *seqset_r = imap_messageset_parse(pool, uidset);
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen for (seqset = *seqset_r; seqset != NULL; seqset = seqset->next) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* last message, stays same */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mailbox_get_uids(box, seqset->seq1, seqset->seq2,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen /* we need special case for too_high_uid:* case */
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainensearch_arg_new(pool_t pool, enum mail_search_arg_type type)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen arg_new(data, args, next_sarg, type, TRUE, NULL)
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen arg_new(data, args, next_sarg, type, FALSE, NULL)
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen arg_new(data, args, next_sarg, type, TRUE, hdr_name)
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainenstatic bool arg_new(struct search_build_data *data,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen enum mail_search_arg_type type, bool have_value,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen *next_sarg = sarg = search_arg_new(data->pool, type);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen data->error = "Missing parameter for argument";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen data->error = "Invalid parameter for argument";
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen if (!imap_parse_date(IMAP_ARG_STR(*args), &sarg->value.time)) {
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen data->error = "Invalid search date parameter";
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen sarg->value.str = p_strdup(data->pool, IMAP_ARG_STR(*args));
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen sarg->hdr_field_name = p_strdup(data->pool, hdr_name);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainenstatic bool search_arg_build(struct search_build_data *data,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen const char *str;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen /* NIL not allowed */
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen const struct imap_arg *listargs = IMAP_ARG_LIST_ARGS(arg);
96308127e006bb3b1108093bcf4cc1fd9481cb7aTimo Sirainen *next_sarg = search_arg_new(data->pool, SEARCH_SUB);
8a13b020f90e080570658b18c042e7e352c8b14fTimo Sirainen if (!search_arg_build(data, &listargs, subargs))
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainen /* string argument - get the name and jump to next */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* <string> */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* <string> */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen return ARG_NEW_HEADER(SEARCH_HEADER_ADDRESS, str);
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen /* <string> */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen return ARG_NEW_HEADER(SEARCH_HEADER_ADDRESS, str);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* <string> */
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen return ARG_NEW_HEADER(SEARCH_HEADER_ADDRESS, str);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* <field-name> <string> */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen const char *key;
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen /* NEW == (RECENT UNSEEN) */
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen *next_sarg = search_arg_new(data->pool, SEARCH_SUB);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen *subargs = search_arg_new(data->pool, SEARCH_RECENT);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen /* <search-key1> <search-key2> */
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen *next_sarg = search_arg_new(data->pool, SEARCH_OR);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen /* <key> OR <key> OR ... <key> - put them all
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen under one SEARCH_OR list. */
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen /* OLD == NOT RECENT */
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen /* <string> */
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen /* <string> */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* <string> */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return ARG_NEW_HEADER(SEARCH_HEADER_ADDRESS, str);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* <message set> */
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen return imap_uidset_parse(data->pool, data->box,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen /* <string> */
2ebeb22b9a8a8bb7fbe2f2e2908478a220792b87Timo Sirainen /* <string> */
0cce885512b836ce021260a58e7b4f099b36d0f1Timo Sirainen if (*str == '*' || (*str >= '0' && *str <= '9')) {
e050e5c9b1688765f1fdfce9b7141f7b614383fdTimo Sirainen /* <message-set> */
4d527c363482be2b65dd0573d878ecda86cbb0bbTimo Sirainen seqset = imap_messageset_parse(data->pool, str);
a4f09749814b93e8ad3ec8a0dc18885b874d6f8cTimo Sirainen data->error = t_strconcat("Unknown argument ", str, NULL);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenimap_search_args_build(pool_t pool, struct mailbox *box,
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen const struct imap_arg *args, const char **error_r)
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen /* get the first arg */
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainenstatic int imap_search_get_msgset_arg(struct client_command_context *cmd,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen const char **error_r)
b83deefd2cf1e293373673eefb4d5cf60907978cTimo Sirainen arg = p_new(cmd->pool, struct mail_search_arg, 1);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen arg->value.seqset = imap_messageset_parse(cmd->pool, messageset);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* when there are no messages, all messagesets are invalid.
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen if there's at least one message:
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen - * gives seq1 = seq2 = (uint32_t)-1
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen - n:* should work if n <= messages_count
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen - n:m or m should work if m <= messages_count
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen if (arg->value.seqset == NULL || cmd->client->messages_count == 0 ||
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen (arg->value.seqset->seq1 > cmd->client->messages_count &&
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen (arg->value.seqset->seq2 > cmd->client->messages_count &&
error_r);
struct mail_search_arg *
const char *error;
int ret;
if (!uid) {
if (ret < 0) {
return NULL;
return search_arg;