/* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */
#include "lib.h"
-#include "array.h"
#include "net.h"
#include "str.h"
#include "strescape.h"
#include "write-full.h"
-#include "wildcard-match.h"
#include "mail-search-build.h"
#include "mail-storage-private.h"
#include "mailbox-list-private.h"
#include "fts-build-mail.h"
#include "fts-search-serialize.h"
#include "fts-plugin.h"
+#include "fts-user.h"
#include "fts-storage.h"
return 0;
}
-static const char *const *fts_exclude_get_patterns(struct mail_user *user)
-{
- ARRAY_TYPE(const_string) patterns;
- const char *str;
- char set_name[21 + MAX_INT_STRLEN];
- unsigned int i;
-
- str = mail_user_plugin_getenv(user, "fts_autoindex_exclude");
- if (str == NULL)
- return NULL;
-
- t_array_init(&patterns, 16);
- for (i = 2; str != NULL; i++) {
- array_push_back(&patterns, &str);
-
- if (i_snprintf(set_name, sizeof(set_name),
- "fts_autoindex_exclude%u", i) < 0)
- i_unreached();
- str = mail_user_plugin_getenv(user, set_name);
- }
- array_append_zero(&patterns);
- return array_front(&patterns);
-}
-
-static bool fts_autoindex_exclude_match(struct mailbox *box)
-{
- const char *const *exclude_list;
- unsigned int i;
- const struct mailbox_settings *set;
- const char *const *special_use;
- struct mail_user *user = box->storage->user;
-
- exclude_list = fts_exclude_get_patterns(user);
- if (exclude_list == NULL)
- return FALSE;
-
- set = mailbox_settings_find(mailbox_get_namespace(box),
- mailbox_get_vname(box));
- special_use = set == NULL ? NULL :
- t_strsplit_spaces(set->special_use, " ");
- for (i = 0; exclude_list[i] != NULL; i++) {
- if (exclude_list[i][0] == '\\') {
- /* \Special-use flag */
- if (special_use != NULL &&
- str_array_icase_find(special_use, exclude_list[i]))
- return TRUE;
- } else {
- /* mailbox name with wildcards */
- if (wildcard_match(box->name, exclude_list[i]))
- return TRUE;
- }
- }
- return FALSE;
-}
-
void fts_mailbox_allocated(struct mailbox *box)
{
struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(box->list);
fbox = p_new(box->pool, struct fts_mailbox, 1);
fbox->module_ctx.super = *v;
box->vlast = &fbox->module_ctx.super;
- fbox->fts_mailbox_excluded = fts_autoindex_exclude_match(box);
+ fbox->fts_mailbox_excluded = fts_user_autoindex_exclude(box);
v->get_status = fts_mailbox_get_status;
v->search_init = fts_mailbox_search_init;
#include "lib.h"
#include "module-context.h"
#include "mail-user.h"
+#include "mail-storage-private.h"
+#include "mailbox-match-plugin.h"
#include "fts-language.h"
#include "fts-filter.h"
#include "fts-tokenizer.h"
struct fts_language_list *lang_list;
struct fts_user_language *data_lang;
ARRAY_TYPE(fts_user_language) languages, data_languages;
+
+ struct mailbox_match_plugin *autoindex_exclude;
};
static MODULE_CONTEXT_DEFINE_INIT(fts_user_module,
return fuser->data_lang;
}
+bool fts_user_autoindex_exclude(struct mailbox *box)
+{
+ struct fts_user *fuser = FTS_USER_CONTEXT(box->storage->user);
+
+ return mailbox_match_plugin_exclude(fuser->autoindex_exclude, box);
+}
+
static void fts_user_language_free(struct fts_user_language *user_lang)
{
if (user_lang->filter != NULL)
array_foreach_elem(&fuser->languages, user_lang)
fts_user_language_free(user_lang);
}
+ mailbox_match_plugin_deinit(&fuser->autoindex_exclude);
}
static int
return -1;
}
}
+ fuser->autoindex_exclude =
+ mailbox_match_plugin_init(user, "fts_autoindex_exclude");
MODULE_CONTEXT_SET(user, fts_user_module, fuser);
return 0;