From 9d7fac168e43d31829f1b05b9a3d0da739a3b24c Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Sun, 29 Sep 2024 00:37:17 +0200
Subject: [PATCH] plugins: imapsieve: Migrate plugin settings to new config
 structure

---
 src/plugins/imapsieve/Makefile.am           |  2 +
 src/plugins/imapsieve/imap-sieve-settings.c | 60 +++++++++++++++++++++
 src/plugins/imapsieve/imap-sieve-settings.h | 13 +++++
 src/plugins/imapsieve/imap-sieve-storage.c  | 27 +++++-----
 4 files changed, 90 insertions(+), 12 deletions(-)
 create mode 100644 src/plugins/imapsieve/imap-sieve-settings.c
 create mode 100644 src/plugins/imapsieve/imap-sieve-settings.h

diff --git a/src/plugins/imapsieve/Makefile.am b/src/plugins/imapsieve/Makefile.am
index 1fea23e5e..6a22cd15c 100644
--- a/src/plugins/imapsieve/Makefile.am
+++ b/src/plugins/imapsieve/Makefile.am
@@ -20,6 +20,7 @@ lib95_imap_sieve_plugin_la_SOURCES = \
 	ext-imapsieve.c \
 	ext-imapsieve-environment.c \
 	imap-sieve.c \
+	imap-sieve-settings.c \
 	imap-sieve-storage.c \
 	imap-sieve-plugin.c
 lib95_imap_sieve_plugin_la_LIBADD = \
@@ -35,6 +36,7 @@ lib90_sieve_imapsieve_plugin_la_CPPFLAGS = \
 noinst_HEADERS = \
 	ext-imapsieve-common.h \
 	imap-sieve.h \
+	imap-sieve-settings.h \
 	imap-sieve-storage.h \
 	imap-sieve-plugin.h \
 	sieve-imapsieve-plugin.h
diff --git a/src/plugins/imapsieve/imap-sieve-settings.c b/src/plugins/imapsieve/imap-sieve-settings.c
new file mode 100644
index 000000000..19ca54042
--- /dev/null
+++ b/src/plugins/imapsieve/imap-sieve-settings.c
@@ -0,0 +1,60 @@
+/* Copyright (c) 2024 Pigeonhole authors, see the included COPYING file
+ */
+
+#include "lib.h"
+#include "array.h"
+#include "settings.h"
+#include "settings-parser.h"
+
+#include "imap-sieve-settings.h"
+
+#undef DEF
+#define DEF(type, name) \
+	SETTING_DEFINE_STRUCT_##type("imapsieve_"#name, name, \
+				     struct imap_sieve_settings)
+
+static const struct setting_define imap_sieve_setting_defines[] = {
+	DEF(STR, url),
+	DEF(BOOL, expunge_discarded),
+
+	SETTING_DEFINE_LIST_END,
+};
+
+static const struct imap_sieve_settings imap_sieve_default_settings = {
+	.url = "",
+	.expunge_discarded = FALSE,
+};
+
+static bool
+imap_sieve_settings_check(void *_set ATTR_UNUSED, pool_t pool ATTR_UNUSED,
+			  const char **error_r ATTR_UNUSED);
+
+const struct setting_parser_info imap_sieve_setting_parser_info = {
+	.name = "imapsieve",
+
+	.defines = imap_sieve_setting_defines,
+	.defaults = &imap_sieve_default_settings,
+
+	.struct_size = sizeof(struct imap_sieve_settings),
+
+	.check_func = imap_sieve_settings_check,
+
+	.pool_offset1 = 1 + offsetof(struct imap_sieve_settings, pool),
+};
+
+/* <settings checks> */
+static bool
+imap_sieve_settings_check(void *_set, pool_t pool ATTR_UNUSED,
+			  const char **error_r)
+{
+	struct imap_sieve_settings *set = _set;
+
+	if (*set->url != '\0' && !str_begins_icase_with(set->url, "sieve:")) {
+		*error_r = "Invalid URL for imapsieve_url setting: "
+			"Not a Sieve URL";
+		return FALSE;
+	}
+
+	return TRUE;
+}
+/* </settings checks> */
diff --git a/src/plugins/imapsieve/imap-sieve-settings.h b/src/plugins/imapsieve/imap-sieve-settings.h
new file mode 100644
index 000000000..3b4eb52f5
--- /dev/null
+++ b/src/plugins/imapsieve/imap-sieve-settings.h
@@ -0,0 +1,13 @@
+#ifndef IMAP_SIEVE_SETTINGS_H
+#define IMAP_SIEVE_SETTINGS_H
+
+struct imap_sieve_settings {
+	pool_t pool;
+
+	const char *url;
+	bool expunge_discarded;
+};
+
+extern const struct setting_parser_info imap_sieve_setting_parser_info;
+
+#endif
diff --git a/src/plugins/imapsieve/imap-sieve-storage.c b/src/plugins/imapsieve/imap-sieve-storage.c
index afa6e09e7..4b0e6c9a2 100644
--- a/src/plugins/imapsieve/imap-sieve-storage.c
+++ b/src/plugins/imapsieve/imap-sieve-storage.c
@@ -7,6 +7,7 @@
 #include "istream.h"
 #include "ostream.h"
 #include "module-context.h"
+#include "settings.h"
 #include "mail-user.h"
 #include "mail-storage-private.h"
 #include "mailbox-attribute.h"
@@ -15,6 +16,7 @@
 #include "imap-util.h"
 
 #include "imap-sieve.h"
+#include "imap-sieve-settings.h"
 #include "imap-sieve-storage.h"
 
 #define MAILBOX_ATTRIBUTE_IMAPSIEVE_SCRIPT "imapsieve/script"
@@ -1175,23 +1177,24 @@ void imap_sieve_storage_client_created(struct client *client)
 {
 	struct mail_user *user = client->user;
 	struct imap_sieve_user *isuser = IMAP_SIEVE_USER_CONTEXT_REQUIRE(user);
-	const char *url, *set;
+	const struct imap_sieve_settings *set;
+	const char *error;
 
-	url = mail_user_plugin_getenv(user, "imapsieve_url");
-	// FIXME: parse the URL and report error if it is bad
-	if (url != NULL && str_begins_icase_with(url, "sieve:")) {
+	if (settings_get(client->event, &imap_sieve_setting_parser_info, 0,
+			 &set, &error) < 0) {
+		e_error(client->event, "%s", error);
+		return;
+	}
+
+	if (*set->url != '\0') {
 		client_add_capability(client,
-			t_strconcat("IMAPSIEVE=", url, NULL));
-	} else {
-		url = NULL;
+			t_strconcat("IMAPSIEVE=", set->url, NULL));
 	}
 
 	isuser->client = client;
-	isuser->user_script = (url != NULL && *url != '\0');
-
-	set = mail_user_plugin_getenv(user, "imapsieve_expunge_discarded");
-	isuser->expunge_discarded = (set != NULL &&
-				     strcasecmp(set, "yes") == 0);
+	isuser->user_script = (*set->url != '\0');
+	isuser->expunge_discarded = set->expunge_discarded;
+	settings_free(set);
 }
 
 /*
-- 
GitLab