From 9b563f59c38e17451c786b407d3671605ac534c9 Mon Sep 17 00:00:00 2001
From: Timo Sirainen <timo.sirainen@open-xchange.com>
Date: Mon, 12 Dec 2022 00:12:49 +0200
Subject: [PATCH] global: Adjust to settings API changes

---
 src/lib-sieve-tool/sieve-tool.c               |  6 ++-
 src/lib-sieve/sieve-message.c                 |  5 +-
 src/lib-sieve/util/edit-mail.c                |  5 +-
 src/lib-sieve/util/mail-raw.c                 |  5 +-
 src/lib-sieve/util/test-edit-mail.c           |  2 +-
 src/managesieve-login/client.c                | 14 ++++--
 .../managesieve-login-settings.c              | 10 ++--
 .../managesieve-login-settings.h              |  3 +-
 src/managesieve/main.c                        | 21 +++------
 src/managesieve/managesieve-capabilities.c    | 46 +++----------------
 src/managesieve/managesieve-client.c          |  2 +
 src/managesieve/managesieve-settings.c        | 24 ++++++++--
 src/managesieve/managesieve-settings.h        |  7 +++
 src/plugins/doveadm-sieve/doveadm-sieve-cmd.c |  2 +-
 .../doveadm-sieve/doveadm-sieve-sync.c        |  2 +-
 .../imap-filter-sieve/imap-filter-sieve.c     | 13 ++----
 src/plugins/imapsieve/imap-sieve.c            | 12 ++---
 src/plugins/lda-sieve/lda-sieve-plugin.c      | 12 ++---
 src/testsuite/testsuite-mailstore.c           |  4 +-
 19 files changed, 87 insertions(+), 108 deletions(-)

diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c
index 5c60c6931..c2320f0e4 100644
--- a/src/lib-sieve-tool/sieve-tool.c
+++ b/src/lib-sieve-tool/sieve-tool.c
@@ -258,7 +258,7 @@ sieve_tool_init_finish(struct sieve_tool *tool, bool init_mailstore,
 	service_input.username = username;
 
 	tool->storage_service = mail_storage_service_init(
-		master_service, NULL, storage_service_flags);
+		master_service, storage_service_flags);
 	if (mail_storage_service_lookup_next(
 		tool->storage_service, &service_input,
 		&tool->mail_user_dovecot, &errstr) <= 0)
@@ -350,9 +350,11 @@ void sieve_tool_init_mail_user(struct sieve_tool *tool,
 	struct mail_namespace *ns = NULL;
 	const char *home = NULL, *errstr = NULL;
 
+	struct master_service_settings_instance *set_instance =
+		mail_storage_service_user_get_settings_instance(mail_user_dovecot->service_user);
 	struct mail_storage_service_input input = {
 		.username = username,
-		.unexpanded_set_parser = mail_user_dovecot->unexpanded_set_parser,
+		.set_instance = set_instance,
 		.no_userdb_lookup = TRUE,
 	};
 	if (mail_storage_service_lookup_next(tool->storage_service, &input,
diff --git a/src/lib-sieve/sieve-message.c b/src/lib-sieve/sieve-message.c
index 229b2ea7b..0169ce204 100644
--- a/src/lib-sieve/sieve-message.c
+++ b/src/lib-sieve/sieve-message.c
@@ -347,9 +347,10 @@ int sieve_message_substitute
 		struct mail_storage_service_ctx *storage_service =
 			mail_storage_service_user_get_service_ctx(
 				mail_user->service_user);
+		struct master_service_settings_instance *set_instance =
+			mail_storage_service_user_get_settings_instance(mail_user->service_user);
 		msgctx->raw_mail_user =
-			raw_storage_create_from_set(storage_service,
-				mail_user->unexpanded_set_parser);
+			raw_storage_create_from_set(storage_service, set_instance);
 	}
 
 	i_stream_seek(input, 0);
diff --git a/src/lib-sieve/util/edit-mail.c b/src/lib-sieve/util/edit-mail.c
index e5c525c9d..d4ad6395b 100644
--- a/src/lib-sieve/util/edit-mail.c
+++ b/src/lib-sieve/util/edit-mail.c
@@ -52,9 +52,10 @@ static struct mail_user *edit_mail_raw_storage_get(struct mail_user *mail_user)
 		struct mail_storage_service_ctx *storage_service =
 			mail_storage_service_user_get_service_ctx(
 				mail_user->service_user);
+		struct master_service_settings_instance *set_instance =
+			mail_storage_service_user_get_settings_instance(mail_user->service_user);
 		edit_mail_user =
-			raw_storage_create_from_set(storage_service,
-				mail_user->unexpanded_set_parser);
+			raw_storage_create_from_set(storage_service, set_instance);
 	}
 
 	edit_mail_refcount++;
diff --git a/src/lib-sieve/util/mail-raw.c b/src/lib-sieve/util/mail-raw.c
index 8a33b04ed..0ef20592a 100644
--- a/src/lib-sieve/util/mail-raw.c
+++ b/src/lib-sieve/util/mail-raw.c
@@ -140,8 +140,9 @@ struct mail_user *mail_raw_user_create(struct mail_user *mail_user)
 	struct mail_storage_service_ctx *storage_service =
 		mail_storage_service_user_get_service_ctx(
 			mail_user->service_user);
-	return raw_storage_create_from_set(storage_service,
-					   mail_user->unexpanded_set_parser);
+	struct master_service_settings_instance *set_instance =
+		mail_storage_service_user_get_settings_instance(mail_user->service_user);
+	return raw_storage_create_from_set(storage_service, set_instance);
 }
 
 /*
diff --git a/src/lib-sieve/util/test-edit-mail.c b/src/lib-sieve/util/test-edit-mail.c
index 0ead824c8..4051d664a 100644
--- a/src/lib-sieve/util/test-edit-mail.c
+++ b/src/lib-sieve/util/test-edit-mail.c
@@ -64,7 +64,7 @@ static int test_init_mail_user(void)
 	};
 
 	mail_storage_service = mail_storage_service_init(
-		master_service, NULL,
+		master_service,
 		(MAIL_STORAGE_SERVICE_FLAG_NO_RESTRICT_ACCESS |
 		 MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT |
 		 MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS));
diff --git a/src/managesieve-login/client.c b/src/managesieve-login/client.c
index eaad9f7c8..1f4788896 100644
--- a/src/managesieve-login/client.c
+++ b/src/managesieve-login/client.c
@@ -11,6 +11,7 @@
 #include "strescape.h"
 #include "base64.h"
 #include "master-service.h"
+#include "master-service-settings.h"
 #include "auth-client.h"
 
 #include "managesieve-parser.h"
@@ -373,15 +374,22 @@ static struct client *managesieve_client_alloc(pool_t pool)
 	return &msieve_client->common;
 }
 
-static void managesieve_client_create(struct client *client, void **other_sets)
+static int managesieve_client_create(struct client *client)
 {
 	struct managesieve_client *msieve_client =
 		(struct managesieve_client *)client;
+	const char *error;
 
-	msieve_client->set = other_sets[0];
+	if (master_service_settings_get(client->event,
+			&managesieve_login_setting_parser_info, 0,
+			&msieve_client->set, &error) < 0) {
+		e_error(client->event, "%s", error);
+		return -1;
+	}
 	msieve_client->parser = managesieve_parser_create(
 		msieve_client->common.input, MAX_MANAGESIEVE_LINE);
 	client->io = io_add(client->fd, IO_READ, client_input, client);
+	return 0;
 }
 
 static void managesieve_client_destroy(struct client *client)
@@ -390,6 +398,7 @@ static void managesieve_client_destroy(struct client *client)
 		(struct managesieve_client *)client;
 
 	managesieve_parser_destroy(&managesieve_client->parser);
+	master_service_settings_free(managesieve_client->set);
 }
 
 static void managesieve_client_notify_auth_ready(struct client *client)
@@ -499,7 +508,6 @@ managesieve_client_notify_disconnect(struct client *client,
 
 static void managesieve_login_preinit(void)
 {
-	login_set_roots = managesieve_login_settings_set_roots;
 }
 
 static void managesieve_login_init(void)
diff --git a/src/managesieve-login/managesieve-login-settings.c b/src/managesieve-login/managesieve-login-settings.c
index 811c10565..440b1b58d 100644
--- a/src/managesieve-login/managesieve-login-settings.c
+++ b/src/managesieve-login/managesieve-login-settings.c
@@ -104,22 +104,20 @@ static const struct setting_parser_info *managesieve_login_setting_dependencies[
 	NULL
 };
 
-static const struct setting_parser_info managesieve_login_setting_parser_info = {
-	.module_name = "managesieve-login",
+const struct setting_parser_info managesieve_login_setting_parser_info = {
+	.name = "managesieve_login",
+
 	.defines = managesieve_login_setting_defines,
 	.defaults = &managesieve_login_default_settings,
 
-	.type_offset = (size_t)-1,
 	.struct_size = sizeof(struct managesieve_login_settings),
-
-	.parent_offset = (size_t)-1,
+	.pool_offset1 = 1 + offsetof(struct managesieve_login_settings, pool),
 	.parent = NULL,
 
 	.dependencies = managesieve_login_setting_dependencies
 };
 
 const struct setting_parser_info *managesieve_login_settings_set_roots[] = {
-	&login_setting_parser_info,
 	&managesieve_login_setting_parser_info,
 	NULL
 };
diff --git a/src/managesieve-login/managesieve-login-settings.h b/src/managesieve-login/managesieve-login-settings.h
index c6f4826e0..aef5472ba 100644
--- a/src/managesieve-login/managesieve-login-settings.h
+++ b/src/managesieve-login/managesieve-login-settings.h
@@ -2,12 +2,13 @@
 #define MANAGESIEVE_LOGIN_SETTINGS_H
 
 struct managesieve_login_settings {
+	pool_t pool;
 	const char *managesieve_implementation_string;
 	const char *managesieve_sieve_capability;
 	const char *managesieve_notify_capability;
 };
 
-extern const struct setting_parser_info *managesieve_login_settings_set_roots[];
+extern const struct setting_parser_info managesieve_login_setting_parser_info;
 
 #ifdef _CONFIG_PLUGIN
 void managesieve_login_settings_init(void);
diff --git a/src/managesieve/main.c b/src/managesieve/main.c
index 4ce612deb..7c280b5f3 100644
--- a/src/managesieve/main.c
+++ b/src/managesieve/main.c
@@ -149,7 +149,6 @@ client_create_from_input(const struct mail_storage_service_input *input,
 	struct client *client;
 	struct managesieve_settings *set;
 	struct event *event;
-	const char *error;
 
 	event = event_create(NULL);
 	event_add_category(event, &event_category_managesieve);
@@ -168,18 +167,16 @@ client_create_from_input(const struct mail_storage_service_input *input,
 	}
 	restrict_access_allow_coredumps(TRUE);
 
-	set = master_service_settings_get_root_set(master_service,
-		&managesieve_setting_parser_info);
-	if (set->verbose_proctitle)
-		verbose_proctitle = TRUE;
-
-	if (mail_user_var_expand(mail_user, &managesieve_setting_parser_info,
-				 set, &error) <= 0) {
-		e_error(event, "Failed to expand settings: %s", error);
+	if (master_service_settings_instance_get(mail_user->event,
+			mail_user->set_instance,
+			&managesieve_setting_parser_info, 0,
+			&set, error_r) < 0) {
 		mail_user_unref(&mail_user);
 		event_unref(&event);
 		return -1;
 	}
+	if (set->verbose_proctitle)
+		verbose_proctitle = TRUE;
 
 	client = client_create(fd_in, fd_out, input->session_id,
 			       event, mail_user, set);
@@ -302,10 +299,6 @@ static void client_connected(struct master_service_connection *conn)
 
 int main(int argc, char *argv[])
 {
-	static const struct setting_parser_info *set_roots[] = {
-		&managesieve_setting_parser_info,
-		NULL
-	};
 	struct login_server_settings login_set;
 	enum master_service_flags service_flags = 0;
 	enum mail_storage_service_flags storage_service_flags = 0;
@@ -382,7 +375,7 @@ int main(int argc, char *argv[])
 
 	storage_service =
 		mail_storage_service_init(master_service,
-					  set_roots, storage_service_flags);
+					  storage_service_flags);
 	master_service_init_finish(master_service);
 	/* NOTE: login_set.*_socket_path are now invalid due to data stack
 	   having been freed */
diff --git a/src/managesieve/managesieve-capabilities.c b/src/managesieve/managesieve-capabilities.c
index 68ddf0f05..24042af95 100644
--- a/src/managesieve/managesieve-capabilities.c
+++ b/src/managesieve/managesieve-capabilities.c
@@ -11,6 +11,7 @@
 
 #include "sieve.h"
 
+#include "managesieve-settings.h"
 #include "managesieve-capabilities.h"
 
 #include <stddef.h>
@@ -20,52 +21,16 @@
  * Global plugin settings
  */
 
-struct plugin_settings {
-	ARRAY(const char *) plugin_envs;
-};
-
-static const struct setting_parser_info **plugin_set_roots;
-
-static const struct setting_define plugin_setting_defines[] = {
-	{ .type = SET_STRLIST, .key = "plugin",
-	  .offset = offsetof(struct plugin_settings, plugin_envs) },
-
-	SETTING_DEFINE_LIST_END
-};
-
-static const struct setting_parser_info plugin_setting_parser_info = {
-	.module_name = "managesieve",
-	.defines = plugin_setting_defines,
-
-	.type_offset = (size_t)-1,
-	.struct_size = sizeof(struct plugin_settings),
-
-	.parent_offset = (size_t)-1,
-};
-
-static const struct setting_parser_info *default_plugin_set_roots[] = {
-	&plugin_setting_parser_info,
-	NULL
-};
-
-static const struct setting_parser_info **plugin_set_roots =
-	default_plugin_set_roots;
 
-static struct plugin_settings *plugin_settings_read(void)
+static const struct plugin_settings *plugin_settings_read(void)
 {
-	struct master_service_settings_input input;
-	struct master_service_settings_output output;
 	const char *error;
 
-	i_zero(&input);
-	input.roots = plugin_set_roots;
-	input.disable_check_settings = TRUE;
-	if (master_service_settings_read(master_service, &input,
-					 &output, &error) < 0)
+	if (master_service_settings_read_simple(master_service, &error) < 0)
 		i_fatal("Error reading configuration: %s", error);
 
-	return master_service_settings_get_root_set(master_service,
-				plugin_set_roots[0]);
+	return master_service_settings_get_or_fatal(NULL,
+		&managesieve_plugin_setting_parser_info);
 }
 
 static const char *
@@ -136,5 +101,6 @@ void managesieve_capabilities_dump(void)
 		       sieve_get_capabilities(svinst, "notify"));
 	}
 
+	master_service_settings_free(global_plugin_settings);
 	sieve_deinit(&svinst);
 }
diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index 53cfd2117..90630afdb 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -14,6 +14,7 @@
 #include "var-expand.h"
 #include "time-util.h"
 #include "master-service.h"
+#include "master-service-settings.h"
 #include "mail-storage-service.h"
 #include "mail-namespace.h"
 
@@ -280,6 +281,7 @@ void client_destroy(struct client *client, const char *reason)
 
 	event_unref(&client->cmd.event);
 	pool_unref(&client->cmd.pool);
+	master_service_settings_free(client->set);
 
 	managesieve_client_count--;
 	DLLIST_REMOVE(&managesieve_clients, client);
diff --git a/src/managesieve/managesieve-settings.c b/src/managesieve/managesieve-settings.c
index 7b0fae5a1..7580a2479 100644
--- a/src/managesieve/managesieve-settings.c
+++ b/src/managesieve/managesieve-settings.c
@@ -108,22 +108,38 @@ static const struct setting_parser_info *managesieve_setting_dependencies[] = {
 };
 
 const struct setting_parser_info managesieve_setting_parser_info = {
-	.module_name = "managesieve",
+	.name = "managesieve",
+
 	.defines = managesieve_setting_defines,
 	.defaults = &managesieve_default_settings,
 
-	.type_offset = (size_t)-1,
 	.struct_size = sizeof(struct managesieve_settings),
-
-	.parent_offset = (size_t)-1,
+	.pool_offset1 = 1 + offsetof(struct managesieve_settings, pool),
 	.parent = NULL,
 
 	.check_func = managesieve_settings_verify,
 	.dependencies = managesieve_setting_dependencies
 };
 
+static const struct setting_define plugin_setting_defines[] = {
+	{ .type = SET_STRLIST, .key = "plugin",
+	  .offset = offsetof(struct plugin_settings, plugin_envs) },
+
+	SETTING_DEFINE_LIST_END
+};
+
+const struct setting_parser_info managesieve_plugin_setting_parser_info = {
+	.name = "managesieve_plugin",
+
+	.defines = plugin_setting_defines,
+
+	.struct_size = sizeof(struct plugin_settings),
+	.pool_offset1 = 1 + offsetof(struct plugin_settings, pool),
+};
+
 const struct setting_parser_info *managesieve_settings_set_roots[] = {
 	&managesieve_setting_parser_info,
+	&managesieve_plugin_setting_parser_info,
 	NULL
 };
 
diff --git a/src/managesieve/managesieve-settings.h b/src/managesieve/managesieve-settings.h
index a72338b90..b00905af9 100644
--- a/src/managesieve/managesieve-settings.h
+++ b/src/managesieve/managesieve-settings.h
@@ -10,6 +10,7 @@ enum managesieve_client_workarounds {
 /* </settings checks> */
 
 struct managesieve_settings {
+	pool_t pool;
 	bool mail_debug;
 	bool verbose_proctitle;
 	const char *rawlog_dir;
@@ -24,6 +25,12 @@ struct managesieve_settings {
 	enum managesieve_client_workarounds parsed_workarounds;
 };
 
+struct plugin_settings {
+	pool_t pool;
+	ARRAY(const char *) plugin_envs;
+};
+
 extern const struct setting_parser_info managesieve_setting_parser_info;
+extern const struct setting_parser_info managesieve_plugin_setting_parser_info;
 
 #endif
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
index 662c977a3..14b4fcd9a 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
@@ -113,7 +113,7 @@ doveadm_sieve_cmd_run(struct doveadm_mail_cmd_context *_ctx,
 	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;
 
 	ctx->svinst = sieve_init(&svenv, &sieve_callbacks, (void *)ctx,
-				 user->mail_debug);
+				 user->set->mail_debug);
 
 	ctx->storage = sieve_storage_create_main(
 		ctx->svinst, user, SIEVE_STORAGE_FLAG_READWRITE, &error);
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
index eab140447..f540bbea2 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
@@ -93,7 +93,7 @@ mail_sieve_user_init(struct mail_user *user, struct sieve_storage **svstorage_r)
 	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;
 
 	suser->svinst = sieve_init(&svenv, &mail_sieve_callbacks,
-				   user, user->mail_debug);
+				   user, user->set->mail_debug);
 	suser->sieve_storage =
 		sieve_storage_create_main(suser->svinst, user,
 					  storage_flags, NULL);
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index 62519f4c7..32ccf5f90 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -79,20 +79,17 @@ imap_filter_sieve_get_svinst(struct imap_filter_sieve_context *sctx)
 	struct imap_filter_sieve_user *ifsuser =
 		IMAP_FILTER_SIEVE_USER_CONTEXT_REQUIRE(user);
 	struct sieve_environment svenv;
-	const struct mail_storage_settings *mail_set;
-	bool debug = user->mail_debug;
+	bool debug = user->set->mail_debug;
 
 	if (ifsuser->svinst != NULL)
 		return ifsuser->svinst;
 
-	mail_set = mail_user_set_get_storage_set(user);
-
 	ifsuser->dup_db = mail_duplicate_db_init(user, DUPLICATE_DB_NAME);
 
 	i_zero(&svenv);
 	svenv.username = user->username;
 	(void)mail_user_get_home(user, &svenv.home_dir);
-	svenv.hostname = mail_set->hostname;
+	svenv.hostname = user->set->hostname;
 	svenv.base_dir = user->set->base_dir;
 	svenv.event_parent = ifsuser->client->event;
 	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;
@@ -570,14 +567,10 @@ imap_filter_sieve_smtp_start(const struct sieve_script_env *senv,
 	struct imap_filter_sieve_user *ifsuser =
 		IMAP_FILTER_SIEVE_USER_CONTEXT_REQUIRE(user);
 	const struct smtp_submit_settings *smtp_set = ifsuser->client->smtp_set;
-	struct ssl_iostream_settings ssl_set;
 	struct smtp_submit_input submit_input;
 
-	i_zero(&ssl_set);
-	mail_user_init_ssl_client_settings(user, &ssl_set);
-
 	i_zero(&submit_input);
-	submit_input.ssl = &ssl_set;
+	submit_input.ssl = user->ssl_set;
 
 	return (void *)smtp_submit_init_simple(&submit_input, smtp_set,
 					       mail_from);
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index e6cc24a51..9b259dc90 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -67,9 +67,7 @@ struct imap_sieve *imap_sieve_init(struct client *client)
 	struct sieve_environment svenv;
 	struct imap_sieve *isieve;
 	struct mail_user *user = client->user;
-	const struct mail_storage_settings *mail_set =
-		mail_user_set_get_storage_set(user);
-	bool debug = user->mail_debug;
+	bool debug = user->set->mail_debug;
 	pool_t pool;
 
 	pool = pool_alloconly_create("imap_sieve", 256);
@@ -82,7 +80,7 @@ struct imap_sieve *imap_sieve_init(struct client *client)
 	i_zero(&svenv);
 	svenv.username = user->username;
 	(void)mail_user_get_home(user, &svenv.home_dir);
-	svenv.hostname = mail_set->hostname;
+	svenv.hostname = user->set->hostname;
 	svenv.base_dir = user->set->base_dir;
 	svenv.event_parent = client->event;
 	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;
@@ -164,14 +162,10 @@ imap_sieve_smtp_start(const struct sieve_script_env *senv,
 	struct imap_sieve *isieve = isctx->isieve;
 	struct mail_user *user = isieve->client->user;
 	const struct smtp_submit_settings *smtp_set = isieve->client->smtp_set;
-	struct ssl_iostream_settings ssl_set;
 	struct smtp_submit_input submit_input;
 	
-	i_zero(&ssl_set);
-	mail_user_init_ssl_client_settings(user, &ssl_set);
-
 	i_zero(&submit_input);
-	submit_input.ssl = &ssl_set;
+	submit_input.ssl = user->ssl_set;
 
 	return smtp_submit_init_simple(&submit_input, smtp_set, mail_from);
 }
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 4e79c1f1b..1eb0a35c2 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -81,14 +81,10 @@ lda_sieve_smtp_start(const struct sieve_script_env *senv,
 	struct mail_deliver_context *dctx =
 		(struct mail_deliver_context *)senv->script_context;
 	struct mail_user *user = dctx->rcpt_user;
-	struct ssl_iostream_settings ssl_set;
 	struct smtp_submit_input submit_input;
-	
-	i_zero(&ssl_set);
-	mail_user_init_ssl_client_settings(user, &ssl_set);
 
 	i_zero(&submit_input);
-	submit_input.ssl = &ssl_set;
+	submit_input.ssl = user->ssl_set;
 
 	return (void *)smtp_submit_init_simple(&submit_input, dctx->smtp_set,
 					       mail_from);
@@ -1049,9 +1045,7 @@ lda_sieve_deliver_mail(struct mail_deliver_context *mdctx,
 		       struct mail_storage **storage_r)
 {
 	struct lda_sieve_run_context srctx;
-	const struct mail_storage_settings *mail_set =
-		mail_user_set_get_storage_set(mdctx->rcpt_user);
-	bool debug = mdctx->rcpt_user->mail_debug;
+	bool debug = mdctx->rcpt_user->set->mail_debug;
 	struct sieve_environment svenv;
 	int ret = 0;
 
@@ -1066,7 +1060,7 @@ lda_sieve_deliver_mail(struct mail_deliver_context *mdctx,
 	memset((void*)&svenv, 0, sizeof(svenv));
 	svenv.username = mdctx->rcpt_user->username;
 	svenv.home_dir = srctx.home_dir;
-	svenv.hostname = mail_set->hostname;
+	svenv.hostname = mdctx->rcpt_user->set->hostname;
 	svenv.base_dir = mdctx->rcpt_user->set->base_dir;
 	svenv.temp_dir = mdctx->rcpt_user->set->mail_temp_dir;
 	svenv.event_parent = mdctx->event;
diff --git a/src/testsuite/testsuite-mailstore.c b/src/testsuite/testsuite-mailstore.c
index bcf99606b..e456bbba6 100644
--- a/src/testsuite/testsuite-mailstore.c
+++ b/src/testsuite/testsuite-mailstore.c
@@ -86,9 +86,11 @@ void testsuite_mailstore_init(void)
 		t_strconcat("home=", cwd, NULL),
 		NULL,
 	};
+	struct master_service_settings_instance *set_instance =
+		mail_storage_service_user_get_settings_instance(mail_user_dovecot->service_user);
 	struct mail_storage_service_input input = {
 		.username = "testsuite-mail-user@example.org",
-		.unexpanded_set_parser = mail_user_dovecot->unexpanded_set_parser,
+		.set_instance = set_instance,
 		.no_userdb_lookup = TRUE,
 		.userdb_fields = userdb_fields,
 	};
-- 
GitLab