bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2010-2018 Dovecot authors, see the included COPYING file */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#include "lib.h"
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#include "ioloop.h"
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#include "array.h"
5e6042124b6429d60b352eaf951ee67e0a311a8cTimo Sirainen#include "str.h"
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen#include "unichar.h"
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#include "settings-parser.h"
d81bbb6948b4d758e87206acb8da4cc4366fd478Timo Sirainen#include "mail-storage.h"
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#include "mail-search-register.h"
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen#include "mail-search-parser.h"
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#include "mail-search-build.h"
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#include <time.h>
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#include <ctype.h>
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstruct mail_search_register *mail_search_register_human;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_or(struct mail_search_build_context *ctx)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen struct mail_search_arg *sarg;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* this changes the parent arg to be an OR block instead of AND block */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen ctx->parent->type = SEARCH_OR;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen if (mail_search_build_key(ctx, ctx->parent, &sarg) < 0)
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return NULL;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return sarg;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenarg_new_human_date(struct mail_search_build_context *ctx,
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen enum mail_search_arg_type type,
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen enum mail_search_date_type date_type)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen struct mail_search_arg *sarg;
d81bbb6948b4d758e87206acb8da4cc4366fd478Timo Sirainen const char *value;
2fc91862fa8b14dba1ab18c7c7a88e451df46ed0Timo Sirainen bool utc;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen sarg = mail_search_build_new(ctx, type);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen if (mail_search_parse_string(ctx->parser, &value) < 0)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen return NULL;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
2fc91862fa8b14dba1ab18c7c7a88e451df46ed0Timo Sirainen if (mail_parse_human_timestamp(value, &sarg->value.time, &utc) < 0)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen sarg->value.time = (time_t)-1;
2fc91862fa8b14dba1ab18c7c7a88e451df46ed0Timo Sirainen if (utc)
6264b51bcce8ae98efdcda3e55a765d7a13d15edTimo Sirainen sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_UTC_TIMES;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen if (sarg->value.time == (time_t)-1) {
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen ctx->_error = p_strconcat(ctx->pool,
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen "Invalid search date parameter: ", value, NULL);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen return NULL;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen }
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen sarg->value.date_type = date_type;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen return sarg;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#define CALLBACK_DATE(_func, _type, _date_type) \
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *\
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_##_func(struct mail_search_build_context *ctx) \
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{ \
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return arg_new_human_date(ctx, _type, _date_type); \
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(before, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(on, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_RECEIVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(since, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(sentbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SENT)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(sentsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SENT)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenarg_new_human_size(struct mail_search_build_context *ctx,
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen enum mail_search_arg_type type)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen struct mail_search_arg *sarg;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen const char *value, *error;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen sarg = mail_search_build_new(ctx, type);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen if (mail_search_parse_string(ctx->parser, &value) < 0)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen return NULL;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen if (settings_get_size(value, &sarg->value.size, &error) < 0) {
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen ctx->_error = p_strdup(ctx->pool, error);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen return NULL;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen }
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen return sarg;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_larger(struct mail_search_build_context *ctx)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return arg_new_human_size(ctx, SEARCH_LARGER);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_smaller(struct mail_search_build_context *ctx)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return arg_new_human_size(ctx, SEARCH_SMALLER);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_guid(struct mail_search_build_context *ctx)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return mail_search_build_str(ctx, SEARCH_GUID);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_mailbox(struct mail_search_build_context *ctx)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{
5e6042124b6429d60b352eaf951ee67e0a311a8cTimo Sirainen struct mail_search_arg *sarg;
5e6042124b6429d60b352eaf951ee67e0a311a8cTimo Sirainen
e85148f6f86714bc3999e7cf42df47a9665a2628Timo Sirainen sarg = mail_search_build_str(ctx, SEARCH_MAILBOX);
c7e0416937128aa2607cbc1e6b77618e4cddb1f2Timo Sirainen if (sarg == NULL)
c7e0416937128aa2607cbc1e6b77618e4cddb1f2Timo Sirainen return NULL;
c7e0416937128aa2607cbc1e6b77618e4cddb1f2Timo Sirainen
e85148f6f86714bc3999e7cf42df47a9665a2628Timo Sirainen if (strchr(sarg->value.str, '*') != NULL ||
e85148f6f86714bc3999e7cf42df47a9665a2628Timo Sirainen strchr(sarg->value.str, '%') != NULL)
e85148f6f86714bc3999e7cf42df47a9665a2628Timo Sirainen sarg->type = SEARCH_MAILBOX_GLOB;
e85148f6f86714bc3999e7cf42df47a9665a2628Timo Sirainen
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen if (!uni_utf8_str_is_valid(sarg->value.str)) {
51379a5d323a361622f1d8cd7c40e168c9302a0cTimo Sirainen ctx->_error = p_strconcat(ctx->pool,
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen "Mailbox name not valid UTF-8: ",
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen sarg->value.str, NULL);
51379a5d323a361622f1d8cd7c40e168c9302a0cTimo Sirainen return NULL;
51379a5d323a361622f1d8cd7c40e168c9302a0cTimo Sirainen }
5e6042124b6429d60b352eaf951ee67e0a311a8cTimo Sirainen return sarg;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainenstatic struct mail_search_arg *
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainenhuman_search_mailbox_guid(struct mail_search_build_context *ctx)
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainen{
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainen return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID);
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainen}
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainen
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainenstatic struct mail_search_arg *
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainenhuman_search_oldestonly(struct mail_search_build_context *ctx)
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainen{
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainen ctx->args->stop_on_nonmatch = TRUE;
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainen return mail_search_build_new(ctx, SEARCH_ALL);
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainen}
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic const struct mail_search_register_arg human_register_args[] = {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "OR", human_search_or },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* dates */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "BEFORE", human_search_before },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "ON", human_search_on },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "SINCE", human_search_since },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "SENTBEFORE", human_search_sentbefore },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "SENTON", human_search_senton },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "SENTSINCE", human_search_sentsince },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "SAVEDBEFORE", human_search_savedbefore },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "SAVEDON", human_search_savedon },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "SAVEDSINCE", human_search_savedsince },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "X-SAVEDBEFORE", human_search_savedbefore },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "X-SAVEDON", human_search_savedon },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "X-SAVEDSINCE", human_search_savedsince },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* sizes */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "LARGER", human_search_larger },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "SMALLER", human_search_smaller },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* Other Dovecot extensions: */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "GUID", human_search_guid },
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainen { "MAILBOX", human_search_mailbox },
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainen { "MAILBOX-GUID", human_search_mailbox_guid },
ce763c83d556eea9b74fc63e5d41f3b71a7e72deTimo Sirainen { "OLDESTONLY", human_search_oldestonly }
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen};
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainenstatic struct mail_search_register *
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenmail_search_register_init_human(struct mail_search_register *imap_register)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen{
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen struct mail_search_register *reg;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen mail_search_register_fallback_t *fallback;
025e4dfc239a749ebd80b882fd39962b9c24fed7Timo Sirainen ARRAY(struct mail_search_register_arg) copy_args;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen const struct mail_search_register_arg *human_args, *imap_args;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen unsigned int i, j, human_count, imap_count;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen int ret;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen reg = mail_search_register_init();
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen mail_search_register_add(reg, human_register_args,
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen N_ELEMENTS(human_register_args));
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* find and register args in imap that don't exist in human */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen imap_args = mail_search_register_get(imap_register, &imap_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen human_args = mail_search_register_get(reg, &human_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen t_array_init(&copy_args, imap_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen for (i = j = 0; i < imap_count && j < human_count; ) {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen ret = strcmp(imap_args[i].key, human_args[j].key);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen if (ret < 0) {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen array_append(&copy_args, &imap_args[i], 1);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen i++;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen } else if (ret > 0) {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen j++;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen } else {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen i++; j++;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen }
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen }
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen for (; i < imap_count; i++)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen array_append(&copy_args, &imap_args[i], 1);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen imap_args = array_get(&copy_args, &imap_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen mail_search_register_add(reg, imap_args, imap_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen if (mail_search_register_get_fallback(imap_register, &fallback))
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen mail_search_register_fallback(reg, fallback);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen return reg;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen}
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainenstruct mail_search_register *mail_search_register_get_human(void)
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen{
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen if (mail_search_register_human == NULL) {
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen struct mail_search_register *imap_reg =
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen mail_search_register_get_imap();
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen mail_search_register_human =
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen mail_search_register_init_human(imap_reg);
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen }
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen return mail_search_register_human;
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen}