]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: Add struct fts_settings (Convert plugin settings to regular settings)
authorMarco Bettini <marco.bettini@open-xchange.com>
Fri, 24 Nov 2023 17:01:02 +0000 (17:01 +0000)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
src/plugins/fts/Makefile.am
src/plugins/fts/fts-settings.c [new file with mode: 0644]
src/plugins/fts/fts-settings.h [new file with mode: 0644]
src/plugins/fts/fts-storage.h

index b2a02c093131d6a33205586cf8c4810c0c7e3f6c..8831a74cfea7f538b19085d05c0f19385888fdbe 100644 (file)
@@ -36,6 +36,7 @@ lib20_fts_plugin_la_SOURCES = \
        fts-search.c \
        fts-search-args.c \
        fts-search-serialize.c \
+       fts-settings.c \
        fts-storage.c \
        fts-user.c
 
@@ -43,6 +44,7 @@ pkginc_libdir=$(pkgincludedir)
 pkginc_lib_HEADERS = \
        fts-api.h \
        fts-api-private.h \
+       fts-settings.h \
        fts-indexer.h \
        fts-parser.h \
        fts-storage.h \
diff --git a/src/plugins/fts/fts-settings.c b/src/plugins/fts/fts-settings.c
new file mode 100644 (file)
index 0000000..e7e878f
--- /dev/null
@@ -0,0 +1,161 @@
+/* Copyright (c) 2023 Dovecot Oy, see the included COPYING file */
+
+#include "lib.h"
+#include "array.h"
+#include "settings.h"
+#include "settings-parser.h"
+#include "fts-settings.h"
+
+#undef DEF
+#define DEF(_type, name) SETTING_DEFINE_STRUCT_##_type( \
+       FTS_FILTER"_"#name, name, struct fts_settings)
+
+static const struct setting_define fts_setting_defines[] = {
+       { .type = SET_FILTER_NAME, .key = FTS_FILTER },
+       DEF(BOOL,    autoindex),
+       DEF(UINT,    autoindex_max_recent_msgs),
+       DEF(ENUM,    decoder_driver),
+       DEF(STR,     decoder_script_socket_path),
+       { .type = SET_FILTER_NAME, .key = FTS_FILTER_DECODER_TIKA },
+       DEF(STR,     decoder_tika_url),
+       DEF(STR,     driver),
+       DEF(ENUM,    enforced),
+       DEF(BOOLLIST,header_excludes),
+       DEF(BOOLLIST,header_includes),
+       DEF(TIME,    index_timeout),
+       DEF(SIZE,    message_max_size),
+       SETTING_DEFINE_LIST_END
+};
+
+/* <settings checks> */
+
+#define FTS_ENFORCE_KEYWORD_NO     "no"
+#define FTS_ENFORCE_KEYWORD_YES    "yes"
+#define FTS_ENFORCE_KEYWORD_BODY   "body"
+
+#define FTS_DECODER_KEYWORD_NONE   ""
+#define FTS_DECODER_KEYWORD_TIKA   "tika"
+#define FTS_DECODER_KEYWORD_SCRIPT "script"
+
+static bool fts_settings_check(void *set, pool_t pool, const char **error_r);
+
+/* </settings checks> */
+
+static const struct fts_settings fts_default_settings = {
+       .autoindex = FALSE,
+       .autoindex_max_recent_msgs = 0,
+       .decoder_driver = FTS_DECODER_KEYWORD_NONE
+                      ":"FTS_DECODER_KEYWORD_TIKA
+                      ":"FTS_DECODER_KEYWORD_SCRIPT,
+       .decoder_script_socket_path = "",
+       .decoder_tika_url = "",
+       .driver = "",
+       .enforced = FTS_ENFORCE_KEYWORD_NO
+                ":"FTS_ENFORCE_KEYWORD_YES
+                ":"FTS_ENFORCE_KEYWORD_BODY,
+       .index_timeout = 0,
+       .message_max_size = SET_SIZE_UNLIMITED,
+};
+
+static const struct setting_keyvalue fts_default_settings_keyvalue[] = {
+       { FTS_FILTER_DECODER_TIKA"/http_client_max_idle_time", "100ms" },
+       { FTS_FILTER_DECODER_TIKA"/http_client_max_parallel_connections", "1" },
+       { FTS_FILTER_DECODER_TIKA"/http_client_max_pipelined_requests", "1" },
+       { FTS_FILTER_DECODER_TIKA"/http_client_request_max_redirects", "1" },
+       { FTS_FILTER_DECODER_TIKA"/http_client_request_max_attempts", "3" },
+       { FTS_FILTER_DECODER_TIKA"/http_client_connect_timeout", "5s" },
+       { FTS_FILTER_DECODER_TIKA"/http_client_request_timeout", "60s" },
+       { NULL, NULL }
+};
+
+const struct setting_parser_info fts_setting_parser_info = {
+       .name = FTS_FILTER,
+
+       .defines = fts_setting_defines,
+       .defaults = &fts_default_settings,
+       .default_settings = fts_default_settings_keyvalue,
+       .check_func = fts_settings_check,
+
+       .struct_size = sizeof(struct fts_settings),
+       .pool_offset1 = 1 + offsetof(struct fts_settings, pool),
+};
+
+/* <settings checks> */
+
+struct fts_settings_enum_table {
+       const char *key;
+       int value;
+};
+
+static int fts_settings_parse_enum(struct fts_settings_enum_table *table,
+                                  const char *key)
+{
+       for (; table->key != NULL; table++)
+               if (strcasecmp(key, table->key) == 0)
+                       return table->value;
+       i_unreached();
+}
+
+static enum fts_decoder fts_settings_parse_decoder(const char *key)
+{
+       static struct fts_settings_enum_table table[] = {
+               { FTS_DECODER_KEYWORD_NONE,   FTS_DECODER_NO },
+               { FTS_DECODER_KEYWORD_TIKA,   FTS_DECODER_TIKA },
+               { FTS_DECODER_KEYWORD_SCRIPT, FTS_DECODER_SCRIPT },
+               { NULL, 0 }
+       };
+       return fts_settings_parse_enum(table, key);
+}
+
+static enum fts_enforced fts_settings_parse_enforced(const char *key)
+{
+       static struct fts_settings_enum_table table[] = {
+               { FTS_ENFORCE_KEYWORD_NO,   FTS_ENFORCED_NO },
+               { FTS_ENFORCE_KEYWORD_YES,  FTS_ENFORCED_YES },
+               { FTS_ENFORCE_KEYWORD_BODY, FTS_ENFORCED_BODY },
+               { NULL, 0 }
+       };
+       return fts_settings_parse_enum(table, key);
+}
+
+static bool fts_settings_check_decoder(struct fts_settings *set,
+                                      const char **error_r)
+{
+       switch (set->parsed_decoder_driver) {
+       case FTS_DECODER_SCRIPT:
+               if (*set->decoder_script_socket_path != '\0')
+                       return TRUE;
+               *error_r = "decoder_script_socket_path is required "
+                          "when fts_decoder_driver = script";
+               return FALSE;
+       case FTS_DECODER_NO:
+       case FTS_DECODER_TIKA:
+               return TRUE;
+       default:
+               i_unreached();
+       }
+
+       if(*set->decoder_script_socket_path != '\0' &&
+          set->parsed_decoder_driver != FTS_DECODER_SCRIPT) {
+               *error_r = "fts_decoder_driver = script is required "
+                          "when using decoder_script_socket_path";
+               return FALSE;
+       }
+       if(*set->decoder_tika_url != '\0' &&
+          set->parsed_decoder_driver != FTS_DECODER_TIKA) {
+               *error_r = "fts_decoder_script = tika is required "
+                          "when using decoder_tika_url";
+               return FALSE;
+       }
+}
+
+static bool fts_settings_check(void *_set, pool_t pool ATTR_UNUSED,
+                              const char **error_r)
+{
+       struct fts_settings *set = _set;
+       set->parsed_enforced = fts_settings_parse_enforced(set->enforced);
+       set->parsed_decoder_driver = fts_settings_parse_decoder(set->decoder_driver);
+       return fts_settings_check_decoder(set, error_r);
+}
+
+/* </settings checks> */
diff --git a/src/plugins/fts/fts-settings.h b/src/plugins/fts/fts-settings.h
new file mode 100644 (file)
index 0000000..96ceb5d
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef FTS_SETTINGS_H
+#define FTS_SETTINGS_H
+
+
+/* <settings checks> */
+#define FTS_FILTER             "fts"
+#define FTS_FILTER_DECODER_TIKA        "fts_decoder_tika"
+
+enum fts_enforced {
+       FTS_ENFORCED_NO,
+       FTS_ENFORCED_YES,
+       FTS_ENFORCED_BODY,
+};
+enum fts_decoder {
+       FTS_DECODER_NO,
+       FTS_DECODER_TIKA,
+       FTS_DECODER_SCRIPT,
+};
+/* </settings checks> */
+
+struct fts_settings {
+       pool_t pool;
+       ARRAY_TYPE(const_string) header_excludes;
+       ARRAY_TYPE(const_string) header_includes;
+       const char *decoder_driver;
+       const char *decoder_script_socket_path;
+       const char *decoder_tika_url;
+       const char *driver;
+       const char *enforced;
+       unsigned int autoindex_max_recent_msgs;
+       unsigned int index_timeout;
+       uoff_t message_max_size;
+       bool autoindex;
+
+       enum fts_enforced parsed_enforced;
+       enum fts_decoder parsed_decoder_driver;
+};
+
+extern const struct setting_parser_info fts_setting_parser_info;
+
+#endif
index 5df3da8d55984b2ddbb055897d544ab8cb512b3e..dad0b826429a2f99a3e6240753c6f6f643f5b1ce 100644 (file)
@@ -3,12 +3,7 @@
 
 #include "mail-storage-private.h"
 #include "fts-api.h"
-
-enum fts_enforced {
-       FTS_ENFORCED_NO,
-       FTS_ENFORCED_YES,
-       FTS_ENFORCED_BODY,
-};
+#include "fts-settings.h"
 
 struct fts_scores {
        int refcount;