2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "lib.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "ioloop.h"
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen#include "str.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "utc-offset.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "imap-date.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "imap-util.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "imap-quote.h"
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen#include "mail-search.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "mail-search-mime.h"
9522aa5f33cc37fe8ccd0d647cc51dd3ba6a9b55Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/*
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic struct mail_search_mime_arg *
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainenmail_search_mime_arg_dup_one(pool_t pool,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct mail_search_mime_arg *arg)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_search_mime_arg *new_arg;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen new_arg = p_new(pool, struct mail_search_mime_arg, 1);
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen new_arg->type = arg->type;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen new_arg->match_not = arg->match_not;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen new_arg->match_always = arg->match_always;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen new_arg->nonmatch_always = arg->nonmatch_always;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen switch (arg->type) {
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_OR:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_SUB:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen new_arg->value.subargs =
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen mail_search_mime_arg_dup(pool, arg->value.subargs);
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_SIZE_EQUAL:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_SIZE_LARGER:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_SIZE_SMALLER:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen new_arg->value.size = arg->value.size;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen break;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_HEADER:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen new_arg->field_name = p_strdup(pool, arg->field_name);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* fall through */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_DESCRIPTION:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_DISPOSITION_TYPE:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_DISPOSITION_PARAM:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_ENCODING:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_ID:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_LANGUAGE:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_LOCATION:
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen case SEARCH_MIME_MD5:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_TYPE:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_SUBTYPE:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_PARAM:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_BODY:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_TEXT:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_CC:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_BCC:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_FROM:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_IN_REPLY_TO:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_MESSAGE_ID:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_REPLY_TO:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_SENDER:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_SUBJECT:
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen case SEARCH_MIME_TO:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_FILENAME_IS:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_FILENAME_CONTAINS:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_FILENAME_BEGINS:
093b42b11c1236a687d3da564b26a324e2189ae6Timo Sirainen case SEARCH_MIME_FILENAME_ENDS:
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen new_arg->value.str =
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen p_strdup(pool, arg->value.str);
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen break;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_SENTBEFORE:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_SENTON:
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen case SEARCH_MIME_SENTSINCE:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen new_arg->value.time = arg->value.time;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen break;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen case SEARCH_MIME_PARENT:
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen case SEARCH_MIME_CHILD:
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen if (new_arg->value.subargs != NULL) {
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen new_arg->value.subargs =
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen mail_search_mime_arg_dup(pool, arg->value.subargs);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen }
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen break;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen case SEARCH_MIME_DEPTH_EQUAL:
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi case SEARCH_MIME_DEPTH_MIN:
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi case SEARCH_MIME_DEPTH_MAX:
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi case SEARCH_MIME_INDEX:
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen new_arg->value.number = arg->value.number;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen break;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen }
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen return new_arg;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen}
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainenstruct mail_search_mime_arg *
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainenmail_search_mime_arg_dup(pool_t pool,
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen const struct mail_search_mime_arg *arg)
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen{
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen struct mail_search_mime_arg *new_arg = NULL, **dest = &new_arg;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen for (; arg != NULL; arg = arg->next) {
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen *dest = mail_search_mime_arg_dup_one(pool, arg);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen dest = &(*dest)->next;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen }
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen return new_arg;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen}
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainenstruct mail_search_mime_part *
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainenmail_search_mime_part_dup(pool_t pool,
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen const struct mail_search_mime_part *mpart)
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen{
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen struct mail_search_mime_part *new_mpart;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen new_mpart = p_new(pool, struct mail_search_mime_part, 1);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen new_mpart->simplified = mpart->simplified;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen new_mpart->args = mail_search_mime_arg_dup(pool, mpart->args);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen return new_mpart;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen}
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen/*
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen *
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen */
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainenvoid mail_search_mime_args_reset(struct mail_search_mime_arg *args,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen bool full_reset)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen{
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen while (args != NULL) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (args->type == SEARCH_MIME_OR || args->type == SEARCH_MIME_SUB)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen mail_search_mime_args_reset(args->value.subargs, full_reset);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (args->match_always) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (!full_reset)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen args->result = 1;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen else {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen args->match_always = FALSE;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen args->result = -1;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen } else if (args->nonmatch_always) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (!full_reset)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen args->result = 0;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen else {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen args->nonmatch_always = FALSE;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen args->result = -1;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen } else {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen args->result = -1;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen args = args->next;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen}
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainenstatic void search_mime_arg_foreach(struct mail_search_mime_arg *arg,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen mail_search_mime_foreach_callback_t *callback,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen void *context)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen{
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen struct mail_search_mime_arg *subarg;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (arg->result != -1)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen return;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (arg->type == SEARCH_MIME_SUB) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen /* sublist of conditions */
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen i_assert(arg->value.subargs != NULL);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen arg->result = 1;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen subarg = arg->value.subargs;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen while (subarg != NULL) {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (subarg->result == -1)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen search_mime_arg_foreach(subarg, callback, context);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (subarg->result == -1)
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen arg->result = -1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen else if (subarg->result == 0) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* didn't match */
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen arg->result = 0;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen break;
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen }
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen subarg = subarg->next;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen }
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen if (arg->match_not && arg->result != -1)
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen arg->result = arg->result > 0 ? 0 : 1;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen } else if (arg->type == SEARCH_MIME_OR) {
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen /* OR-list of conditions */
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen i_assert(arg->value.subargs != NULL);
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen subarg = arg->value.subargs;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen arg->result = 0;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen while (subarg != NULL) {
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen if (subarg->result == -1)
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen search_mime_arg_foreach(subarg, callback, context);
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen if (subarg->result == -1)
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen arg->result = -1;
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen else if (subarg->result > 0) {
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen /* matched */
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen arg->result = 1;
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen break;
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen subarg = subarg->next;
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen }
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (arg->match_not && arg->result != -1)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen arg->result = arg->result > 0 ? 0 : 1;
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen } else {
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen /* just a single condition */
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen callback(arg, context);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#undef mail_search_mime_args_foreach
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_search_mime_args_foreach(struct mail_search_mime_arg *args,
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen mail_search_mime_foreach_callback_t *callback,
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen void *context)
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen{
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen int result;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen result = 1;
009217abb57a24a4076092e8e4e165545747839eStephan Bosch for (; args != NULL; args = args->next) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen search_mime_arg_foreach(args, callback, context);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
49ec317299dedfbc27be79ab97d5b7a8ba7a4eacTimo Sirainen if (args->result == 0) {
009217abb57a24a4076092e8e4e165545747839eStephan Bosch /* didn't match */
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen return 0;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (args->result == -1)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen result = -1;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen return result;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen}
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen/*
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen *
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen */
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainenbool mail_search_mime_arg_one_equals(const struct mail_search_mime_arg *arg1,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen const struct mail_search_mime_arg *arg2)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen{
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (arg1->type != arg2->type ||
009217abb57a24a4076092e8e4e165545747839eStephan Bosch arg1->match_not != arg2->match_not)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen return FALSE;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
49ec317299dedfbc27be79ab97d5b7a8ba7a4eacTimo Sirainen switch (arg1->type) {
009217abb57a24a4076092e8e4e165545747839eStephan Bosch case SEARCH_MIME_OR:
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen case SEARCH_MIME_SUB:
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen return mail_search_mime_arg_equals(arg1->value.subargs,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen arg2->value.subargs);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen case SEARCH_MIME_SIZE_EQUAL:
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen case SEARCH_MIME_SIZE_LARGER:
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen case SEARCH_MIME_SIZE_SMALLER:
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen return arg1->value.size == arg2->value.size;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen case SEARCH_MIME_HEADER:
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen case SEARCH_MIME_DISPOSITION_PARAM:
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen case SEARCH_MIME_PARAM:
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (strcasecmp(arg1->field_name, arg2->field_name) != 0)
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen return FALSE;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen /* fall through */
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen case SEARCH_MIME_DESCRIPTION:
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen case SEARCH_MIME_DISPOSITION_TYPE:
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen case SEARCH_MIME_ENCODING:
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen case SEARCH_MIME_ID:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_LANGUAGE:
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen case SEARCH_MIME_LOCATION:
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen case SEARCH_MIME_MD5:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_TYPE:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_SUBTYPE:
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen case SEARCH_MIME_BODY:
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_TEXT:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_CC:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_BCC:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_FROM:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_IN_REPLY_TO:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_MESSAGE_ID:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_REPLY_TO:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_SENDER:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_SUBJECT:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_TO:
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen case SEARCH_MIME_FILENAME_IS:
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen case SEARCH_MIME_FILENAME_CONTAINS:
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen case SEARCH_MIME_FILENAME_BEGINS:
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen case SEARCH_MIME_FILENAME_ENDS:
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen /* don't bother doing case-insensitive comparison. we should support
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen full i18n case-insensitivity (or the active comparator
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen in future). */
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen return strcmp(arg1->value.str, arg2->value.str) == 0;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case SEARCH_MIME_SENTBEFORE:
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen case SEARCH_MIME_SENTON:
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen case SEARCH_MIME_SENTSINCE:
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen return arg1->value.time == arg2->value.time;
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen case SEARCH_MIME_PARENT:
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen case SEARCH_MIME_CHILD:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen if (arg1->value.subargs == NULL)
9058f3006fffd25835ad701e1b2c3c8faafd3c80Timo Sirainen return arg2->value.subargs == NULL;
9058f3006fffd25835ad701e1b2c3c8faafd3c80Timo Sirainen if (arg2->value.subargs == NULL)
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen return FALSE;
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen return mail_search_mime_arg_equals(arg1->value.subargs,
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen arg2->value.subargs);
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen case SEARCH_MIME_DEPTH_EQUAL:
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen case SEARCH_MIME_DEPTH_MIN:
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen case SEARCH_MIME_DEPTH_MAX:
87842f621233257b7a7945d994ba931508b34877Timo Sirainen case SEARCH_MIME_INDEX:
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen return arg1->value.number == arg2->value.number;
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen }
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen i_unreached();
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainenbool mail_search_mime_arg_equals(const struct mail_search_mime_arg *arg1,
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen const struct mail_search_mime_arg *arg2)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen while (arg1 != NULL && arg2 != NULL) {
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen if (!mail_search_mime_arg_one_equals(arg1, arg2))
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen return FALSE;
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen arg1 = arg1->next;
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen arg2 = arg2->next;
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen }
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen return arg1 == NULL && arg2 == NULL;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen}
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainenbool mail_search_mime_parts_equal(const struct mail_search_mime_part *mpart1,
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen const struct mail_search_mime_part *mpart2)
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen{
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen i_assert(mpart1->simplified == mpart2->simplified);
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen return mail_search_mime_arg_equals(mpart1->args, mpart2->args);
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen}
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen/*
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen *
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen */
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainenvoid mail_search_mime_simplify(struct mail_search_mime_part *mpart)
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen{
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen mpart->simplified = TRUE;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen // FIXME: implement and use
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen}
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen/*
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen *
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen */
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainenstatic bool
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainenmail_search_mime_subargs_to_imap(string_t *dest,
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen const struct mail_search_mime_arg *args,
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen const char *prefix, const char **error_r)
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen{
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen const struct mail_search_mime_arg *arg;
87842f621233257b7a7945d994ba931508b34877Timo Sirainen
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen if (prefix[0] == '\0')
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen str_append_c(dest, '(');
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen for (arg = args; arg != NULL; arg = arg->next) {
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen if (arg->next != NULL)
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen str_append(dest, prefix);
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen if (!mail_search_mime_arg_to_imap(dest, arg, error_r))
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen return FALSE;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen if (arg->next != NULL)
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen str_append_c(dest, ' ');
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (prefix[0] == '\0')
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen str_append_c(dest, ')');
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return TRUE;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainenstatic bool
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainenmail_search_mime_arg_to_imap_date(string_t *dest,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct mail_search_mime_arg *arg)
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen time_t timestamp = arg->value.time;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen const char *str;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct tm *tm;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen int tz_offset;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen tm = localtime(&timestamp);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen tz_offset = utc_offset(tm, timestamp);
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen timestamp -= tz_offset * 60;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (!imap_to_date(timestamp, &str))
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen return FALSE;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen str_printfa(dest, " \"%s\"", str);
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen return TRUE;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen}
9ffd3c8ca82bd2af8ca4f7e167339820ddcf1fe3Timo Sirainen
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainenbool mail_search_mime_arg_to_imap(string_t *dest,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen const struct mail_search_mime_arg *arg, const char **error_r)
9ffd3c8ca82bd2af8ca4f7e167339820ddcf1fe3Timo Sirainen{
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (arg->match_not)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen str_append(dest, "NOT ");
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen switch (arg->type) {
9ffd3c8ca82bd2af8ca4f7e167339820ddcf1fe3Timo Sirainen case SEARCH_MIME_OR:
9ffd3c8ca82bd2af8ca4f7e167339820ddcf1fe3Timo Sirainen if (!mail_search_mime_subargs_to_imap
9ffd3c8ca82bd2af8ca4f7e167339820ddcf1fe3Timo Sirainen (dest, arg->value.subargs, "OR ", error_r))
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen return FALSE;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen break;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen case SEARCH_MIME_SUB:
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen if (!mail_search_mime_subargs_to_imap
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen (dest, arg->value.subargs, "", error_r))
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen return FALSE;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen break;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen case SEARCH_MIME_SIZE_EQUAL:
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen str_printfa(dest, "SIZE %"PRIuUOFF_T, arg->value.size);
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen break;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen case SEARCH_MIME_SIZE_LARGER:
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen str_printfa(dest, "SIZE LARGER %"PRIuUOFF_T, arg->value.size);
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen break;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen case SEARCH_MIME_SIZE_SMALLER:
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen str_printfa(dest, "SIZE SMALLER %"PRIuUOFF_T, arg->value.size);
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen break;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen case SEARCH_MIME_DESCRIPTION:
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen str_append(dest, "DESCRIPTION ");
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen imap_append_astring(dest, arg->value.str);
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen break;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen case SEARCH_MIME_DISPOSITION_TYPE:
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen str_append(dest, "DISPOSITION TYPE ");
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen imap_append_astring(dest, arg->value.str);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen break;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen case SEARCH_MIME_DISPOSITION_PARAM:
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen str_append(dest, "DISPOSITION PARAM ");
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen imap_append_astring(dest, arg->field_name);
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen str_append_c(dest, ' ');
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_ENCODING:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "ENCODING ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi case SEARCH_MIME_ID:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "ID ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_LANGUAGE:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "LANGUAGE ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen case SEARCH_MIME_LOCATION:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "LOCATION ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen case SEARCH_MIME_MD5:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "MD5 ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_TYPE:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "TYPE ");
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen imap_append_astring(dest, arg->value.str);
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_SUBTYPE:
1f7f4294207557edf83171642ef62ce4922ffc9dTimo Sirainen str_append(dest, "SUBTYPE ");
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi imap_append_astring(dest, arg->value.str);
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi break;
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen case SEARCH_MIME_PARAM:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "PARAM ");
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen imap_append_astring(dest, arg->field_name);
093b42b11c1236a687d3da564b26a324e2189ae6Timo Sirainen str_append_c(dest, ' ');
093b42b11c1236a687d3da564b26a324e2189ae6Timo Sirainen imap_append_astring(dest, arg->value.str);
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_HEADER:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "HEADER ");
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen imap_append_astring(dest, arg->field_name);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append_c(dest, ' ');
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_BODY:
1f7f4294207557edf83171642ef62ce4922ffc9dTimo Sirainen str_append(dest, "BODY ");
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen imap_append_astring(dest, arg->value.str);
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_TEXT:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "TEXT ");
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_CC:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "CC ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen case SEARCH_MIME_BCC:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "BCC ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_FROM:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "FROM ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_IN_REPLY_TO:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "IN-REPLY-TO ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_MESSAGE_ID:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "MESSAGE-ID ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_REPLY_TO:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "REPLY-TO ");
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen imap_append_astring(dest, arg->value.str);
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen case SEARCH_MIME_SENDER:
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen str_append(dest, "SENDER ");
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen imap_append_astring(dest, arg->value.str);
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_SENTBEFORE:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "SENTBEFORE");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen if (!mail_search_mime_arg_to_imap_date(dest, arg)) {
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen *error_r = t_strdup_printf(
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "SENTBEFORE can't be written as IMAP MIMEPART key "
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen "for timestamp %"PRIdTIME_T, arg->value.time);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen return FALSE;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen }
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen case SEARCH_MIME_SENTON:
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen str_append(dest, "SENTON");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen if (!mail_search_mime_arg_to_imap_date(dest, arg)) {
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen *error_r = t_strdup_printf(
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "SENTON can't be written as IMAP MIMEPART key "
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "for timestamp %"PRIdTIME_T, arg->value.time);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen return FALSE;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen }
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_SENTSINCE:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "SENTSINCE");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen if (!mail_search_mime_arg_to_imap_date(dest, arg)) {
9954af4b72850a7c3158c99b444d49a529109c4dTimo Sirainen *error_r = t_strdup_printf(
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "SENTSINCE can't be written as IMAP MIMEPART key "
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "for timestamp %"PRIdTIME_T, arg->value.time);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen return FALSE;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen }
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_SUBJECT:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "SUBJECT ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_TO:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_append(dest, "TO ");
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen imap_append_astring(dest, arg->value.str);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_DEPTH_EQUAL:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_printfa(dest, "DEPTH %u", arg->value.number);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_DEPTH_MIN:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_printfa(dest, "DEPTH MIN %u", arg->value.number);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen case SEARCH_MIME_DEPTH_MAX:
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_printfa(dest, "DEPTH MAX %u", arg->value.number);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen break;
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen case SEARCH_MIME_INDEX:
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen str_printfa(dest, "INDEX %u", arg->value.number);
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen break;
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen case SEARCH_MIME_PARENT:
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen str_append(dest, "PARENT ");
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen if (arg->value.subargs == NULL)
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen str_append(dest, "EXISTS");
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen else if (!mail_search_mime_subargs_to_imap
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen (dest, arg->value.subargs, "", error_r))
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen return FALSE;
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen break;
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen case SEARCH_MIME_CHILD:
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi str_append(dest, "CHILD ");
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen if (arg->value.subargs == NULL)
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen str_append(dest, "EXISTS");
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen else if (!mail_search_mime_subargs_to_imap
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen (dest, arg->value.subargs, "", error_r))
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen return FALSE;
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen break;
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen case SEARCH_MIME_FILENAME_IS:
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen str_append(dest, "FILENAME IS ");
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen imap_append_astring(dest, arg->value.str);
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen break;
de92873c366becfaea1554642f89b9169d7955e2Timo Sirainen case SEARCH_MIME_FILENAME_CONTAINS:
de92873c366becfaea1554642f89b9169d7955e2Timo Sirainen str_append(dest, "FILENAME CONTAINS ");
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen imap_append_astring(dest, arg->value.str);
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen break;
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen case SEARCH_MIME_FILENAME_BEGINS:
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen str_append(dest, "FILENAME BEGINS ");
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen imap_append_astring(dest, arg->value.str);
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen break;
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi case SEARCH_MIME_FILENAME_ENDS:
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi str_append(dest, "FILENAME ENDS ");
b44033e45e9f48f8a6e1ac5905234fec5de6d6ccAki Tuomi imap_append_astring(dest, arg->value.str);
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen break;
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen }
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen return TRUE;
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen}
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainenbool mail_search_mime_part_to_imap(string_t *dest,
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen const struct mail_search_mime_part *mpart, const char **error_r)
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen{
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen const struct mail_search_mime_arg *arg;
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen i_assert(mpart->args != NULL);
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen if (mpart->args->next == NULL) {
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen if (!mail_search_mime_arg_to_imap(dest, mpart->args, error_r))
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen return FALSE;
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen } else {
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen str_append_c(dest, '(');
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen for (arg = mpart->args; arg != NULL; arg = arg->next) {
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen if (!mail_search_mime_arg_to_imap(dest, arg, error_r))
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen return FALSE;
a99dcacb7cb6e0288f8642483f395f8e4a7aa79cTimo Sirainen if (arg->next != NULL)
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen str_append_c(dest, ' ');
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen }
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen str_append_c(dest, ')');
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen }
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen return TRUE;
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen}
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen