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