From: Aki Tuomi Date: Mon, 20 Nov 2023 10:01:24 +0000 (+0200) Subject: lib-storage: mail-storage-service-user - Add master_user X-Git-Tag: 2.4.1~1175 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=174c86a79f427fe461bdf51269577a1aa8b9d682;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: mail-storage-service-user - Add master_user Returns the master_user field, or username if not available. --- diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 8377e1f25b..727ea21c5b 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -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); diff --git a/src/lib-storage/mail-user.c b/src/lib-storage/mail-user.c index d0eb0ec330..393f7a1e9d 100644 --- a/src/lib-storage/mail-user.c +++ b/src/lib-storage/mail-user.c @@ -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" }, diff --git a/src/lib-storage/mail-user.h b/src/lib-storage/mail-user.h index adcd23cd88..b3a908bebf 100644 --- a/src/lib-storage/mail-user.h +++ b/src/lib-storage/mail-user.h @@ -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