]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mail-storage-service-user - Add master_user
authorAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 20 Nov 2023 10:01:24 +0000 (12:01 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
Returns the master_user field, or username if not
available.

src/lib-storage/mail-storage-service.c
src/lib-storage/mail-user.c
src/lib-storage/mail-user.h

index 8377e1f25b9a1fb60a3ba760f0f7337693a2ac08..727ea21c5b3e12ac5dc0a4cd0e2d2e4245bddd49 100644 (file)
@@ -67,6 +67,7 @@ struct mail_storage_service_user {
        struct event *event;
        struct ioloop_context *ioloop_ctx;
        const char *log_prefix, *auth_mech, *auth_token, *auth_user;
+       const char *master_user;
        const char *local_name;
 
        const char *system_groups_user, *uid_source, *gid_source;
@@ -324,6 +325,15 @@ static bool parse_gid(const char *str, gid_t *gid_r, const char **error_r)
        }
 }
 
+static const char *get_master_user(const char *const *fields)
+{
+       const char *value;
+       for (; *fields != NULL; fields++)
+               if (str_begins(*fields, "master=", &value))
+                       return value;
+       return NULL;
+}
+
 static const struct var_expand_table *
 get_var_expand_table(struct master_service *service,
                     struct mail_storage_service_user *user,
@@ -332,17 +342,23 @@ get_var_expand_table(struct master_service *service,
        const char *username = t_strcut(input->username, '@');
        const char *domain = i_strchr_to_next(input->username, '@');
        const char *local_name = NULL;
-
+       const char *master_user;
        const char *auth_user, *auth_username, *auth_domain;
+
        if (user == NULL || user->auth_user == NULL) {
                auth_user = input->username;
                auth_username = username;
                auth_domain = domain;
+               if (input->userdb_fields != NULL)
+                       master_user = get_master_user(input->userdb_fields);
+               else
+                       master_user = NULL;
        } else {
                auth_user = user->auth_user;
                auth_username = t_strcut(user->auth_user, '@');
                auth_domain = i_strchr_to_next(user->auth_user, '@');
                local_name = user->local_name;
+               master_user = user->master_user;
        }
 
        const char *service_name = input->service != NULL ?
@@ -375,6 +391,7 @@ get_var_expand_table(struct master_service *service,
                { '\0', hostname, "hostname" },
                { '\0', local_name, "local_name" },
                { '\0', protocol, "protocol" },
+               { '\0', master_user, "master_user" },
                /* aliases: */
                { '\0', net_ip2addr(&input->local_ip), "local_ip" },
                { '\0', net_ip2addr(&input->remote_ip), "remote_ip" },
@@ -647,6 +664,8 @@ mail_storage_service_init_post(struct mail_storage_service_ctx *ctx,
 
        mail_user->userdb_fields = user->input.userdb_fields == NULL ? NULL :
                p_strarray_dup(mail_user->pool, user->input.userdb_fields);
+       if (mail_user->userdb_fields != NULL)
+               mail_user->master_user = get_master_user(mail_user->userdb_fields);
        mail_user_add_event_fields(mail_user);
 
        string_t *str = t_str_new(64);
index d0eb0ec3302404d219064d5c17c6c1a9fb7c2115..393f7a1e9d7ecd3b304b38474815ba04a4e1027e 100644 (file)
@@ -327,6 +327,7 @@ mail_user_var_expand_table(struct mail_user *user)
                { '\0', user->username, "owner_user" },
                { '\0', username, "owner_username" },
                { '\0', domain, "owner_domain" },
+               { '\0', user->master_user, "master_user" },
                /* aliases: */
                { '\0', local_ip, "local_ip" },
                { '\0', remote_ip, "remote_ip" },
index adcd23cd8800982bfa69ba6711f3d1620868beaa..b3a908bebfbbc279116ad1887431a669707e981b 100644 (file)
@@ -50,6 +50,7 @@ struct mail_user {
        const char *session_id;
        struct mail_user_connection_data conn;
        const char *auth_mech, *auth_token, *auth_user;
+       const char *master_user;
        const char *const *userdb_fields;
        const char *const *_alt_usernames;
        /* Timestamp when this session was initially created. Most importantly