]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: Add fts named list filter and require using it
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 18 Mar 2024 19:59:23 +0000 (21:59 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:12 +0000 (12:34 +0200)
It's no longer possible to simply specify fts_driver setting without
fts named list filter.

src/plugins/fts/fts-settings.c
src/plugins/fts/fts-settings.h
src/plugins/fts/fts-storage.c

index 6186b895e75204cbc996c9e4725e6196a5889cb4..cb8c74cdd61a26cdaa802526d9d1976fa0ef4505 100644 (file)
@@ -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);
 /* </settings checks> */
 
 static const struct fts_settings fts_default_settings = {
+       .fts = ARRAY_INIT,
        .autoindex = FALSE,
        .autoindex_max_recent_msgs = 0,
        .decoder_driver = FTS_DECODER_KEYWORD_NONE
index b5af719a67e49addb5777d2377861132556af2c1..4e07a8f6842d24a5733851f0c1aaaa477688dc99 100644 (file)
@@ -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;
index 08f5dd37be4f798d56010a94c501fddf59b804ab..965a672c392cf04305d7be787e8e39636d3b91f4 100644 (file)
@@ -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);
 }