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