From: Marco Bettini Date: Fri, 24 Nov 2023 17:01:02 +0000 (+0000) Subject: fts: Add struct fts_settings (Convert plugin settings to regular settings) X-Git-Tag: 2.4.1~1127 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a5b7fefaac43947747fb7818843989148ce0f28e;p=thirdparty%2Fdovecot%2Fcore.git fts: Add struct fts_settings (Convert plugin settings to regular settings) --- diff --git a/src/plugins/fts/Makefile.am b/src/plugins/fts/Makefile.am index b2a02c0931..8831a74cfe 100644 --- a/src/plugins/fts/Makefile.am +++ b/src/plugins/fts/Makefile.am @@ -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 index 0000000000..e7e878fa58 --- /dev/null +++ b/src/plugins/fts/fts-settings.c @@ -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 +}; + +/* */ + +#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); + +/* */ + +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), +}; + +/* */ + +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); +} + +/* */ diff --git a/src/plugins/fts/fts-settings.h b/src/plugins/fts/fts-settings.h new file mode 100644 index 0000000000..96ceb5d290 --- /dev/null +++ b/src/plugins/fts/fts-settings.h @@ -0,0 +1,41 @@ +#ifndef FTS_SETTINGS_H +#define FTS_SETTINGS_H + + +/* */ +#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, +}; +/* */ + +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 diff --git a/src/plugins/fts/fts-storage.h b/src/plugins/fts/fts-storage.h index 5df3da8d55..dad0b82642 100644 --- a/src/plugins/fts/fts-storage.h +++ b/src/plugins/fts/fts-storage.h @@ -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;