From c066aaa33822e23202e5b4630160820766dcd9c0 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Wed, 21 Aug 2024 23:38:36 +0200
Subject: [PATCH] lib-sieve: duplicate extension: Migrate settings to new
 config structure

---
 src/lib-sieve/plugins/duplicate/Makefile.am   |  2 +
 .../plugins/duplicate/ext-duplicate-common.c  | 27 +++++++-------
 .../plugins/duplicate/ext-duplicate-common.h  |  3 +-
 .../duplicate/ext-duplicate-settings.c        | 37 +++++++++++++++++++
 .../duplicate/ext-duplicate-settings.h        | 13 +++++++
 .../plugins/duplicate/tst-duplicate.c         |  7 ++--
 6 files changed, 70 insertions(+), 19 deletions(-)
 create mode 100644 src/lib-sieve/plugins/duplicate/ext-duplicate-settings.c
 create mode 100644 src/lib-sieve/plugins/duplicate/ext-duplicate-settings.h

diff --git a/src/lib-sieve/plugins/duplicate/Makefile.am b/src/lib-sieve/plugins/duplicate/Makefile.am
index 7469b987f..8f786d351 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 c8fe7c3bb..a82c7c771 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 3ad0b7907..b4cb7a303 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 000000000..e1cea5a6a
--- /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 000000000..2c2271476
--- /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 12b18f053..666366b26 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;
 
-- 
GitLab