fts-storage.c (dovecot-2.3.16) | : | fts-storage.c (dovecot-2.3.17) | ||
---|---|---|---|---|
/* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */ | /* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */ | |||
#include "lib.h" | #include "lib.h" | |||
#include "array.h" | ||||
#include "net.h" | #include "net.h" | |||
#include "str.h" | #include "str.h" | |||
#include "strescape.h" | #include "strescape.h" | |||
#include "write-full.h" | #include "write-full.h" | |||
#include "wildcard-match.h" | ||||
#include "mail-search-build.h" | #include "mail-search-build.h" | |||
#include "mail-storage-private.h" | #include "mail-storage-private.h" | |||
#include "mailbox-list-private.h" | #include "mailbox-list-private.h" | |||
#include "fts-api-private.h" | #include "fts-api-private.h" | |||
#include "fts-tokenizer.h" | #include "fts-tokenizer.h" | |||
#include "fts-indexer.h" | #include "fts-indexer.h" | |||
#include "fts-build-mail.h" | #include "fts-build-mail.h" | |||
#include "fts-search-serialize.h" | #include "fts-search-serialize.h" | |||
#include "fts-plugin.h" | #include "fts-plugin.h" | |||
#include "fts-user.h" | ||||
#include "fts-storage.h" | #include "fts-storage.h" | |||
#define FTS_CONTEXT(obj) \ | #define FTS_CONTEXT(obj) \ | |||
MODULE_CONTEXT(obj, fts_storage_module) | MODULE_CONTEXT(obj, fts_storage_module) | |||
#define FTS_CONTEXT_REQUIRE(obj) \ | #define FTS_CONTEXT_REQUIRE(obj) \ | |||
MODULE_CONTEXT_REQUIRE(obj, fts_storage_module) | MODULE_CONTEXT_REQUIRE(obj, fts_storage_module) | |||
#define FTS_MAIL_CONTEXT(obj) \ | #define FTS_MAIL_CONTEXT(obj) \ | |||
MODULE_CONTEXT_REQUIRE(obj, fts_mail_module) | MODULE_CONTEXT_REQUIRE(obj, fts_mail_module) | |||
#define FTS_LIST_CONTEXT(obj) \ | #define FTS_LIST_CONTEXT(obj) \ | |||
MODULE_CONTEXT(obj, fts_mailbox_list_module) | MODULE_CONTEXT(obj, fts_mailbox_list_module) | |||
skipping to change at line 793 | skipping to change at line 792 | |||
{ | { | |||
struct fts_transaction_context *ft = FTS_CONTEXT_REQUIRE(ctx->transaction ); | struct fts_transaction_context *ft = FTS_CONTEXT_REQUIRE(ctx->transaction ); | |||
struct fts_mailbox *fbox = FTS_CONTEXT_REQUIRE(ctx->transaction->box); | struct fts_mailbox *fbox = FTS_CONTEXT_REQUIRE(ctx->transaction->box); | |||
if (fbox->module_ctx.super.copy(ctx, mail) < 0) | if (fbox->module_ctx.super.copy(ctx, mail) < 0) | |||
return -1; | return -1; | |||
ft->mails_saved = TRUE; | ft->mails_saved = TRUE; | |||
return 0; | 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) | void fts_mailbox_allocated(struct mailbox *box) | |||
{ | { | |||
struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(box->list); | struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(box->list); | |||
struct mailbox_vfuncs *v = box->vlast; | struct mailbox_vfuncs *v = box->vlast; | |||
struct fts_mailbox *fbox; | struct fts_mailbox *fbox; | |||
if (flist == NULL || flist->failed) | if (flist == NULL || flist->failed) | |||
return; | return; | |||
fbox = p_new(box->pool, struct fts_mailbox, 1); | fbox = p_new(box->pool, struct fts_mailbox, 1); | |||
fbox->module_ctx.super = *v; | fbox->module_ctx.super = *v; | |||
box->vlast = &fbox->module_ctx.super; | 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->get_status = fts_mailbox_get_status; | |||
v->search_init = fts_mailbox_search_init; | v->search_init = fts_mailbox_search_init; | |||
v->search_next_nonblock = fts_mailbox_search_next_nonblock; | v->search_next_nonblock = fts_mailbox_search_next_nonblock; | |||
v->search_next_update_seq = fts_mailbox_search_next_update_seq; | v->search_next_update_seq = fts_mailbox_search_next_update_seq; | |||
v->search_deinit = fts_mailbox_search_deinit; | v->search_deinit = fts_mailbox_search_deinit; | |||
v->transaction_begin = fts_transaction_begin; | v->transaction_begin = fts_transaction_begin; | |||
v->transaction_rollback = fts_transaction_rollback; | v->transaction_rollback = fts_transaction_rollback; | |||
v->transaction_commit = fts_transaction_commit; | v->transaction_commit = fts_transaction_commit; | |||
v->sync_notify = fts_mailbox_sync_notify; | v->sync_notify = fts_mailbox_sync_notify; | |||
End of changes. 5 change blocks. | ||||
58 lines changed or deleted | 2 lines changed or added |