From: Timo Sirainen Date: Mon, 18 Mar 2024 19:59:23 +0000 (+0200) Subject: fts: Add fts named list filter and require using it X-Git-Tag: 2.4.1~895 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a5c79a2c9925aa75de3993e1044406dad2c3471e;p=thirdparty%2Fdovecot%2Fcore.git fts: Add fts named list filter and require using it It's no longer possible to simply specify fts_driver setting without fts named list filter. --- diff --git a/src/plugins/fts/fts-settings.c b/src/plugins/fts/fts-settings.c index 6186b895e7..cb8c74cdd6 100644 --- a/src/plugins/fts/fts-settings.c +++ b/src/plugins/fts/fts-settings.c @@ -11,7 +11,9 @@ FTS_FILTER"_"#name, name, struct fts_settings) static const struct setting_define fts_setting_defines[] = { - { .type = SET_FILTER_NAME, .key = FTS_FILTER }, + { .type = SET_FILTER_ARRAY, .key = FTS_FILTER, + .offset = offsetof(struct fts_settings, fts), + .filter_array_field_name = "fts_driver", }, DEF(BOOL, autoindex), DEF(UINT, autoindex_max_recent_msgs), DEF(ENUM, decoder_driver), @@ -42,6 +44,7 @@ static bool fts_settings_check(void *set, pool_t pool, const char **error_r); /* */ static const struct fts_settings fts_default_settings = { + .fts = ARRAY_INIT, .autoindex = FALSE, .autoindex_max_recent_msgs = 0, .decoder_driver = FTS_DECODER_KEYWORD_NONE diff --git a/src/plugins/fts/fts-settings.h b/src/plugins/fts/fts-settings.h index b5af719a67..4e07a8f684 100644 --- a/src/plugins/fts/fts-settings.h +++ b/src/plugins/fts/fts-settings.h @@ -15,6 +15,7 @@ enum fts_decoder { struct fts_settings { pool_t pool; + ARRAY_TYPE(const_string) fts; ARRAY_TYPE(const_string) header_excludes; ARRAY_TYPE(const_string) header_includes; const char *decoder_driver; diff --git a/src/plugins/fts/fts-storage.c b/src/plugins/fts/fts-storage.c index 08f5dd37be..965a672c39 100644 --- a/src/plugins/fts/fts-storage.c +++ b/src/plugins/fts/fts-storage.c @@ -869,11 +869,43 @@ fts_init_namespace(struct fts_mailbox_list *flist, struct mail_namespace *ns) &set, &error) < 0) { flist->failed = TRUE; e_error(ns->list->event, "fts: %s", error); - } else if (set->driver[0] == '\0') { + return; + } + if (array_is_empty(&set->fts)) { e_debug(ns->list->event, - "fts: No fts_driver setting - plugin disabled"); - } else if (fts_backend_init(set->driver, ns, ns->list->event, - &error, &backend) < 0) { + "fts: No fts { .. } named list filter - plugin disabled"); + settings_free(set); + return; + } + + const char *fts_name_first = + t_strdup(array_idx_elem(&set->fts, 0)); + if (array_count(&set->fts) > 1) { + /* Currently only a single fts is supported */ + const char *fts_name_extra = array_idx_elem(&set->fts, 1); + e_error(ns->list->event, + "fts: Extra fts %s { .. } named list filter - " + "only one is currently supported, and " + "fts %s { .. } is already set", + fts_name_extra, fts_name_first); + flist->failed = TRUE; + settings_free(set); + return; + } + + /* Get settings for the first fts list filter */ + struct event *event = event_create(ns->list->event); + event_add_str(event, "fts", fts_name_first); + settings_free(set); + if (settings_get(event, &fts_setting_parser_info, 0, + &set, &error) < 0) { + flist->failed = TRUE; + e_error(ns->list->event, "fts: %s", error); + event_unref(&event); + return; + } + + if (fts_backend_init(set->driver, ns, event, &error, &backend) < 0) { flist->failed = TRUE; e_error(ns->list->event, "fts: Failed to initialize backend '%s': %s", @@ -883,6 +915,7 @@ fts_init_namespace(struct fts_mailbox_list *flist, struct mail_namespace *ns) if ((flist->backend->flags & FTS_BACKEND_FLAG_FUZZY_SEARCH) != 0) ns->user->fuzzy_search = TRUE; } + event_unref(&event); settings_free(set); }