From 8a418ca5dd6f56e10af49889c3e5e18115fb79ba Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Wed, 21 Aug 2024 02:19:19 +0200 Subject: [PATCH] lib-sieve: include extension: Migrate settings to new config structure --- src/lib-sieve/plugins/include/Makefile.am | 2 + .../plugins/include/ext-include-binary.c | 4 +- .../plugins/include/ext-include-common.c | 35 +++++++++-------- .../plugins/include/ext-include-common.h | 5 ++- .../plugins/include/ext-include-settings.c | 38 +++++++++++++++++++ .../plugins/include/ext-include-settings.h | 13 +++++++ 6 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 src/lib-sieve/plugins/include/ext-include-settings.c create mode 100644 src/lib-sieve/plugins/include/ext-include-settings.h diff --git a/src/lib-sieve/plugins/include/Makefile.am b/src/lib-sieve/plugins/include/Makefile.am index 5ce1599be..b5d728d3f 100644 --- a/src/lib-sieve/plugins/include/Makefile.am +++ b/src/lib-sieve/plugins/include/Makefile.am @@ -12,12 +12,14 @@ cmds = \ libsieve_ext_include_la_SOURCES = \ $(cmds) \ + ext-include-settings.c \ ext-include-common.c \ ext-include-binary.c \ ext-include-variables.c \ ext-include.c noinst_HEADERS = \ + ext-include-settings.h \ ext-include-common.h \ ext-include-limits.h \ ext-include-binary.h \ diff --git a/src/lib-sieve/plugins/include/ext-include-binary.c b/src/lib-sieve/plugins/include/ext-include-binary.c index 57017bf50..92174cdcb 100644 --- a/src/lib-sieve/plugins/include/ext-include-binary.c +++ b/src/lib-sieve/plugins/include/ext-include-binary.c @@ -318,12 +318,12 @@ ext_include_binary_open(const struct sieve_extension *ext, } /* Check include limit */ - if (depcount > extctx->max_includes) { + if (depcount > extctx->set->max_includes) { e_error(svinst->event, "include: binary %s includes too many scripts " "(%u > %u)", sieve_binary_path(sbin), depcount, - extctx->max_includes); + extctx->set->max_includes); return FALSE; } diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c index b2aee1de8..7a20535d4 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.c +++ b/src/lib-sieve/plugins/include/ext-include-common.c @@ -5,9 +5,9 @@ #include "array.h" #include "str-sanitize.h" #include "home-expand.h" +#include "settings.h" #include "sieve-common.h" -#include "sieve-settings.old.h" #include "sieve-error.h" #include "sieve-script.h" #include "sieve-storage.h" @@ -19,7 +19,6 @@ #include "sieve-interpreter.h" #include "ext-include-common.h" -#include "ext-include-limits.h" #include "ext-include-binary.h" #include "ext-include-variables.h" @@ -77,26 +76,23 @@ int ext_include_load(const struct sieve_extension *ext, void **context_r) { struct sieve_instance *svinst = ext->svinst; const struct sieve_extension *var_ext; + const struct ext_include_settings *set; struct ext_include_context *extctx; - unsigned long long int uint_setting; + const char *error; /* Extension dependencies */ if (sieve_ext_variables_get_extension(ext->svinst, &var_ext) < 0) return -1; + if (settings_get(svinst->event, &ext_include_setting_parser_info, 0, + &set, &error) < 0) { + e_error(svinst->event, "%s", error); + return -1; + } + extctx = i_new(struct ext_include_context, 1); extctx->var_ext = var_ext; - - /* Get limits */ - extctx->max_nesting_depth = EXT_INCLUDE_DEFAULT_MAX_NESTING_DEPTH; - extctx->max_includes = EXT_INCLUDE_DEFAULT_MAX_INCLUDES; - - if (sieve_setting_get_uint_value( - svinst, "sieve_include_max_nesting_depth", &uint_setting)) - extctx->max_nesting_depth = (unsigned int)uint_setting; - if (sieve_setting_get_uint_value( - svinst, "sieve_include_max_includes", &uint_setting)) - extctx->max_includes = (unsigned int)uint_setting; + extctx->set = set; *context_r = extctx; return 0; @@ -106,7 +102,10 @@ void ext_include_unload(const struct sieve_extension *ext) { struct ext_include_context *extctx = ext->context; + if (extctx == NULL) + return; sieve_storage_unref(&extctx->personal_storage); + settings_free(extctx->set); i_free(extctx); } @@ -507,11 +506,11 @@ int ext_include_generate_include( return -1; /* Limit nesting level */ - if (ctx->nesting_depth >= extctx->max_nesting_depth) { + if (ctx->nesting_depth >= extctx->set->max_nesting_depth) { sieve_command_generate_error( gentr, cmd, "cannot nest includes deeper than %d levels", - extctx->max_nesting_depth); + extctx->set->max_nesting_depth); return -1; } @@ -562,12 +561,12 @@ int ext_include_generate_include( /* Check whether include limit is exceeded */ if (ext_include_binary_script_get_count(binctx) >= - extctx->max_includes) { + extctx->set->max_includes) { sieve_command_generate_error( gentr, cmd, "failed to include script '%s': " "no more than %u includes allowed", str_sanitize(script_name, 80), - extctx->max_includes); + extctx->set->max_includes); return -1; } diff --git a/src/lib-sieve/plugins/include/ext-include-common.h b/src/lib-sieve/plugins/include/ext-include-common.h index 6f82a4f1a..c7a61e621 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.h +++ b/src/lib-sieve/plugins/include/ext-include-common.h @@ -8,6 +8,8 @@ #include "sieve-extensions.h" #include "sieve-storage.h" +#include "ext-include-settings.h" + /* * Forward declarations */ @@ -101,8 +103,7 @@ struct ext_include_context { struct sieve_storage *personal_storage; - unsigned int max_nesting_depth; - unsigned int max_includes; + const struct ext_include_settings *set; }; static inline struct ext_include_context * diff --git a/src/lib-sieve/plugins/include/ext-include-settings.c b/src/lib-sieve/plugins/include/ext-include-settings.c new file mode 100644 index 000000000..aad6ed15b --- /dev/null +++ b/src/lib-sieve/plugins/include/ext-include-settings.c @@ -0,0 +1,38 @@ +/* Copyright (c) 2024 Pigeonhole authors, see the included COPYING file + */ + +#include "lib.h" +#include "array.h" +#include "settings.h" +#include "settings-parser.h" + +#include "ext-include-limits.h" +#include "ext-include-settings.h" + +#undef DEF +#define DEF(type, name) \ + SETTING_DEFINE_STRUCT_##type("sieve_include_"#name, name, \ + struct ext_include_settings) + +static const struct setting_define ext_include_setting_defines[] = { + DEF(UINT, max_nesting_depth), + DEF(UINT, max_includes), + + SETTING_DEFINE_LIST_END, +}; + +static const struct ext_include_settings ext_include_default_settings = { + .max_nesting_depth = EXT_INCLUDE_DEFAULT_MAX_NESTING_DEPTH, + .max_includes = EXT_INCLUDE_DEFAULT_MAX_INCLUDES, +}; + +const struct setting_parser_info ext_include_setting_parser_info = { + .name = "sieve_include", + + .defines = ext_include_setting_defines, + .defaults = &ext_include_default_settings, + + .struct_size = sizeof(struct ext_include_settings), + + .pool_offset1 = 1 + offsetof(struct ext_include_settings, pool), +}; diff --git a/src/lib-sieve/plugins/include/ext-include-settings.h b/src/lib-sieve/plugins/include/ext-include-settings.h new file mode 100644 index 000000000..6afe9ee1b --- /dev/null +++ b/src/lib-sieve/plugins/include/ext-include-settings.h @@ -0,0 +1,13 @@ +#ifndef EXT_INCLUDE_SETTINGS_H +#define EXT_INCLUDE_SETTINGS_H + +struct ext_include_settings { + pool_t pool; + + unsigned int max_nesting_depth; + unsigned int max_includes; +}; + +extern const struct setting_parser_info ext_include_setting_parser_info; + +#endif -- GitLab