From: Timo Sirainen Date: Fri, 20 Jan 2023 20:01:13 +0000 (+0200) Subject: lib-storage: Get mail_storage_settings with master_service_settings_parser_get() X-Git-Tag: 2.4.0~2272 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6d291e1b8f9366286dce394775e27dc9f747189;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Get mail_storage_settings with master_service_settings_parser_get() This also changes the %variable expansion to happen via the mail_user event. --- diff --git a/src/lib-storage/mail-namespace.c b/src/lib-storage/mail-namespace.c index 7df3daf50d..ec92be9bad 100644 --- a/src/lib-storage/mail-namespace.c +++ b/src/lib-storage/mail-namespace.c @@ -94,8 +94,7 @@ int mail_namespace_alloc(struct mail_user *user, ns->user = user; ns->prefix = i_strdup(ns_set->prefix); ns->set = ns_set; - ns->mail_set = settings_parser_get_root_set(user->set_parser, - &mail_storage_setting_parser_info); + ns->mail_set = mail_user_set_get_storage_set(user); i_array_init(&ns->all_storages, 2); if (strcmp(ns_set->type, "private") == 0) { diff --git a/src/lib-storage/mail-storage-settings.c b/src/lib-storage/mail-storage-settings.c index df6292c2a8..80dcbde3ad 100644 --- a/src/lib-storage/mail-storage-settings.c +++ b/src/lib-storage/mail-storage-settings.c @@ -345,8 +345,8 @@ const struct setting_parser_info mail_user_setting_parser_info = { const struct mail_storage_settings * mail_user_set_get_storage_set(struct mail_user *user) { - return settings_parser_get_root_set(user->set_parser, - &mail_storage_setting_parser_info); + i_assert(user->_mail_set != NULL); + return user->_mail_set; } static void diff --git a/src/lib-storage/mail-user.c b/src/lib-storage/mail-user.c index 1e27bd812f..85aa5fa9c1 100644 --- a/src/lib-storage/mail-user.c +++ b/src/lib-storage/mail-user.c @@ -19,6 +19,7 @@ #include "fs-api.h" #include "auth-master.h" #include "master-service.h" +#include "master-service-settings.h" #include "master-service-ssl-settings.h" #include "dict.h" #include "mail-storage-settings.h" @@ -61,6 +62,19 @@ void mail_user_add_event_fields(struct mail_user *user) } } +static void +mail_user_var_expand_callback(struct event *event, + const struct var_expand_table **tab_r, + const struct var_expand_func_table **func_tab_r) +{ + struct mail_user *user = + event_get_ptr(event, MASTER_SERVICE_VAR_EXPAND_FUNC_CONTEXT); + i_assert(user != NULL); + + *tab_r = mail_user_var_expand_table(user); + *func_tab_r = mail_user_var_expand_func_table; +} + struct mail_user * mail_user_alloc(struct mail_storage_service_user *service_user) { @@ -89,6 +103,12 @@ mail_user_alloc(struct mail_storage_service_user *service_user) event_add_category(user->event, &event_category_storage); event_add_str(user->event, "user", username); + /* Register %variable expansion callback function for settings + lookups. */ + event_set_ptr(user->event, MASTER_SERVICE_VAR_EXPAND_CALLBACK, + mail_user_var_expand_callback); + event_set_ptr(user->event, MASTER_SERVICE_VAR_EXPAND_FUNC_CONTEXT, user); + user->v.deinit = mail_user_deinit_base; user->v.deinit_pre = mail_user_deinit_pre_base; p_array_init(&user->module_contexts, user->pool, 5); @@ -139,6 +159,11 @@ int mail_user_init(struct mail_user *user, const char **error_r) i_assert(!user->initialized); + if (master_service_settings_parser_get(user->event, user->set_parser, + &mail_storage_setting_parser_info, 0, + &user->_mail_set, &error) < 0) + user->error = p_strdup(user->pool, error); + struct mail_storage_service_ctx *service_ctx = mail_storage_service_user_get_service_ctx(user->service_user); const struct setting_parser_info *const *set_roots = @@ -162,10 +187,8 @@ int mail_user_init(struct mail_user *user, const char **error_r) } } - struct mail_storage_settings *mail_set = - settings_parser_get_root_set(user->set_parser, - &mail_storage_setting_parser_info); - mail_user_expand_plugins_envs(user, mail_set); + if (user->error == NULL) + mail_user_expand_plugins_envs(user, user->_mail_set); user->ssl_set = p_new(user->pool, struct ssl_iostream_settings, 1); if (user->error == NULL && @@ -243,6 +266,7 @@ void mail_user_unref(struct mail_user **_user) user->v.deinit(user); } T_END; settings_parser_unref(&user->set_parser); + master_service_settings_free(user->_mail_set); event_unref(&user->event); i_assert(user->refcount == 1); pool_unref(&user->pool); diff --git a/src/lib-storage/mail-user.h b/src/lib-storage/mail-user.h index 42dec21029..a69c5d4d34 100644 --- a/src/lib-storage/mail-user.h +++ b/src/lib-storage/mail-user.h @@ -59,6 +59,7 @@ struct mail_user { struct setting_parser_context *set_parser; const struct mail_user_settings *set; + struct mail_storage_settings *_mail_set; struct ssl_iostream_settings *ssl_set; struct mail_namespace *namespaces; struct mail_storage *storages;