]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Get mail_storage_settings with master_service_settings_parser_get()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 20 Jan 2023 20:01:13 +0000 (22:01 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:20:55 +0000 (14:20 +0200)
This also changes the %variable expansion to happen via the mail_user event.

src/lib-storage/mail-namespace.c
src/lib-storage/mail-storage-settings.c
src/lib-storage/mail-user.c
src/lib-storage/mail-user.h

index 7df3daf50db9e5517806923d6a2ec3c8020c0df6..ec92be9bad060ece6fe04fae15a9313d2acdc99b 100644 (file)
@@ -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) {
index df6292c2a8aa3b895a3de98e15ef32bb832ac4a3..80dcbde3ad85fd6c58b8c065d69446e67ea95cdf 100644 (file)
@@ -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
index 1e27bd812f6c0abc04bd87523c861c89bae57191..85aa5fa9c12d87b0c9e2da65ff35243aa5e3ca19 100644 (file)
@@ -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);
index 42dec21029bdaffeeb368cd81b47af1d29d50cab..a69c5d4d344f88b0606480a7538cfc2702de8a93 100644 (file)
@@ -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;