diff --git a/src/lib-sieve/plugins/duplicate/Makefile.am b/src/lib-sieve/plugins/duplicate/Makefile.am index 7469b987f79143feff6884e66f6cbbb59762e07e..8f786d35126cf9ee4069335b2aba29ebdfb3494f 100644 --- a/src/lib-sieve/plugins/duplicate/Makefile.am +++ b/src/lib-sieve/plugins/duplicate/Makefile.am @@ -13,8 +13,10 @@ extensions = \ libsieve_ext_duplicate_la_SOURCES = \ $(tests) \ $(extensions) \ + ext-duplicate-settings.c \ ext-duplicate-common.c noinst_HEADERS = \ + ext-duplicate-settings.h \ ext-duplicate-common.h diff --git a/src/lib-sieve/plugins/duplicate/ext-duplicate-common.c b/src/lib-sieve/plugins/duplicate/ext-duplicate-common.c index c8fe7c3bb6d4730d40b014d7761d08f7dedceb52..a82c7c771394871aa7f67d7824820bfab021febf 100644 --- a/src/lib-sieve/plugins/duplicate/ext-duplicate-common.c +++ b/src/lib-sieve/plugins/duplicate/ext-duplicate-common.c @@ -7,9 +7,9 @@ #include "str.h" #include "str-sanitize.h" #include "array.h" +#include "settings.h" #include "sieve-common.h" -#include "sieve-settings.old.h" #include "sieve-error.h" #include "sieve-extensions.h" #include "sieve-message.h" @@ -19,32 +19,28 @@ #include "sieve-actions.h" #include "sieve-result.h" +#include "ext-duplicate-settings.h" #include "ext-duplicate-common.h" /* * Extension configuration */ -#define EXT_DUPLICATE_DEFAULT_PERIOD (12*60*60) -#define EXT_DUPLICATE_DEFAULT_MAX_PERIOD (2*24*60*60) - int ext_duplicate_load(const struct sieve_extension *ext, void **context_r) { struct sieve_instance *svinst = ext->svinst; + const struct ext_duplicate_settings *set; struct ext_duplicate_context *extctx; - sieve_number_t default_period, max_period; - - if (!sieve_setting_get_duration_value( - svinst, "sieve_duplicate_default_period", &default_period)) - default_period = EXT_DUPLICATE_DEFAULT_PERIOD; - if (!sieve_setting_get_duration_value( - svinst, "sieve_duplicate_max_period", &max_period)) { - max_period = EXT_DUPLICATE_DEFAULT_MAX_PERIOD; + const char *error; + + if (settings_get(svinst->event, &ext_duplicate_setting_parser_info, 0, + &set, &error) < 0) { + e_error(svinst->event, "%s", error); + return -1; } extctx = i_new(struct ext_duplicate_context, 1); - extctx->default_period = default_period; - extctx->max_period = max_period; + extctx->set = set; *context_r = extctx; return 0; @@ -54,6 +50,9 @@ void ext_duplicate_unload(const struct sieve_extension *ext) { struct ext_duplicate_context *extctx = ext->context; + if (extctx == NULL) + return; + settings_free(extctx->set); i_free(extctx); } diff --git a/src/lib-sieve/plugins/duplicate/ext-duplicate-common.h b/src/lib-sieve/plugins/duplicate/ext-duplicate-common.h index 3ad0b790754fd007f592927ae51a199d495c92f8..b4cb7a30362855e3e9699756e8aecc7bf8b3ffc5 100644 --- a/src/lib-sieve/plugins/duplicate/ext-duplicate-common.h +++ b/src/lib-sieve/plugins/duplicate/ext-duplicate-common.h @@ -8,8 +8,7 @@ */ struct ext_duplicate_context { - unsigned int default_period; - unsigned int max_period; + const struct ext_duplicate_settings *set; }; int ext_duplicate_load(const struct sieve_extension *ext, void **context_r); diff --git a/src/lib-sieve/plugins/duplicate/ext-duplicate-settings.c b/src/lib-sieve/plugins/duplicate/ext-duplicate-settings.c new file mode 100644 index 0000000000000000000000000000000000000000..e1cea5a6aa9a3ef0364589fd5a414b1436117a5f --- /dev/null +++ b/src/lib-sieve/plugins/duplicate/ext-duplicate-settings.c @@ -0,0 +1,37 @@ +/* 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-duplicate-settings.h" + +#undef DEF +#define DEF(type, name) \ + SETTING_DEFINE_STRUCT_##type("sieve_duplicate_"#name, name, \ + struct ext_duplicate_settings) + +static const struct setting_define ext_duplicate_setting_defines[] = { + DEF(TIME, default_period), + DEF(TIME, max_period), + + SETTING_DEFINE_LIST_END, +}; + +static const struct ext_duplicate_settings ext_duplicate_default_settings = { + .default_period = (12*60*60), + .max_period = (2*24*60*60), +}; + +const struct setting_parser_info ext_duplicate_setting_parser_info = { + .name = "sieve_duplicate", + + .defines = ext_duplicate_setting_defines, + .defaults = &ext_duplicate_default_settings, + + .struct_size = sizeof(struct ext_duplicate_settings), + + .pool_offset1 = 1 + offsetof(struct ext_duplicate_settings, pool), +}; diff --git a/src/lib-sieve/plugins/duplicate/ext-duplicate-settings.h b/src/lib-sieve/plugins/duplicate/ext-duplicate-settings.h new file mode 100644 index 0000000000000000000000000000000000000000..2c2271476f60886300fb7689d6462b4f9c2c5cb4 --- /dev/null +++ b/src/lib-sieve/plugins/duplicate/ext-duplicate-settings.h @@ -0,0 +1,13 @@ +#ifndef EXT_DUPLICATE_SETTINGS_H +#define EXT_DUPLICATE_SETTINGS_H + +struct ext_duplicate_settings { + pool_t pool; + + unsigned int default_period; + unsigned int max_period; +}; + +extern const struct setting_parser_info ext_duplicate_setting_parser_info; + +#endif diff --git a/src/lib-sieve/plugins/duplicate/tst-duplicate.c b/src/lib-sieve/plugins/duplicate/tst-duplicate.c index 12b18f05304e692df9d5ff6dffe6f9d2d9c6ce7d..666366b260eef373115b1ef92a30b39de5d2c55a 100644 --- a/src/lib-sieve/plugins/duplicate/tst-duplicate.c +++ b/src/lib-sieve/plugins/duplicate/tst-duplicate.c @@ -13,6 +13,7 @@ #include "sieve-interpreter.h" #include "sieve-dump.h" +#include "ext-duplicate-settings.h" #include "ext-duplicate-common.h" /* Duplicate test @@ -135,8 +136,8 @@ tst_duplicate_validate_number_tag(struct sieve_validator *valdtr, seconds = sieve_ast_argument_number(*arg); /* Enforce :days <= max_period */ - if (extctx->max_period > 0 && seconds > extctx->max_period) { - seconds = extctx->max_period; + if (extctx->set->max_period > 0 && seconds > extctx->set->max_period) { + seconds = extctx->set->max_period; sieve_argument_validate_warning( valdtr, *arg, @@ -315,7 +316,7 @@ tst_duplicate_operation_execute(const struct sieve_runtime_env *renv, string_t *handle = NULL, *header = NULL, *uniqueid = NULL; const char *val = NULL; size_t val_len = 0; - sieve_number_t seconds = extctx->default_period; + sieve_number_t seconds = extctx->set->default_period; bool last = FALSE, duplicate = FALSE; int ret;