Mercurial > dovecot > core-2.2
changeset 19032:65b88128c7eb
lib-storage: Added %{userdb:*} expansion to mail settings.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 28 Aug 2015 15:44:34 +0200 |
parents | 224f0f61d03f |
children | a8e01e385e90 |
files | src/lib-storage/mail-storage-service.c src/lib-storage/mail-user.c src/lib-storage/mail-user.h |
diffstat | 3 files changed, 80 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/mail-storage-service.c Fri Aug 28 15:43:45 2015 +0200 +++ b/src/lib-storage/mail-storage-service.c Fri Aug 28 15:44:34 2015 +0200 @@ -651,6 +651,8 @@ mail_user->auth_user = p_strdup(mail_user->pool, user->auth_user); mail_user->session_id = p_strdup(mail_user->pool, user->input.session_id); + mail_user->userdb_fields = user->input.userdb_fields == NULL ? NULL : + p_strarray_dup(mail_user->pool, user->input.userdb_fields); mail_set = mail_user_set_get_storage_set(mail_user); @@ -713,6 +715,42 @@ i_set_failure_prefix("%s", ctx->default_log_prefix); } +static const char * +mail_storage_service_input_var_userdb(const char *data, void *context) +{ + struct mail_storage_service_user *user = context; + const char *field_name = data; + unsigned int i, field_name_len; + + if (user == NULL || user->input.userdb_fields == NULL) + return NULL; + + field_name_len = strlen(field_name); + for (i = 0; user->input.userdb_fields[i] != NULL; i++) { + if (strncmp(user->input.userdb_fields[i], field_name, + field_name_len) == 0 && + user->input.userdb_fields[i][field_name_len] == '=') + return user->input.userdb_fields[i] + field_name_len+1; + } + return NULL; +} + +static void +mail_storage_service_var_expand(struct mail_storage_service_ctx *ctx, + string_t *str, const char *format, + struct mail_storage_service_user *user, + const struct mail_storage_service_input *input, + const struct mail_storage_service_privileges *priv) +{ + static const struct var_expand_func_table func_table[] = { + { "userdb", mail_storage_service_input_var_userdb }, + { NULL, NULL } + }; + var_expand_with_funcs(str, format, + get_var_expand_table(ctx->service, user, input, priv), + func_table, user); +} + static void mail_storage_service_init_log(struct mail_storage_service_ctx *ctx, struct mail_storage_service_user *user, @@ -723,8 +761,9 @@ string_t *str; str = t_str_new(256); - var_expand(str, user->user_set->mail_log_prefix, - get_var_expand_table(ctx->service, user, &user->input, priv)); + mail_storage_service_var_expand(ctx, str, + user->user_set->mail_log_prefix, + user, &user->input, priv); user->log_prefix = p_strdup(user->pool, str_c(str)); } T_END; @@ -1020,8 +1059,8 @@ string_t *str; str = t_str_new(256); - var_expand(str, user_set->mail_log_prefix, - get_var_expand_table(ctx->service, user, input, priv)); + mail_storage_service_var_expand(ctx, str, user_set->mail_log_prefix, + user, input, priv); i_set_failure_prefix("%s", str_c(str)); } @@ -1135,7 +1174,8 @@ user->service_ctx = ctx; user->pool = user_pool; user->input = *input; - user->input.userdb_fields = NULL; + user->input.userdb_fields = userdb_fields == NULL ? NULL : + p_strarray_dup(user_pool, userdb_fields); user->input.username = p_strdup(user_pool, username); user->input.session_id = p_strdup(user_pool, input->session_id); if (user->input.session_id == NULL) {
--- a/src/lib-storage/mail-user.c Fri Aug 28 15:43:45 2015 +0200 +++ b/src/lib-storage/mail-user.c Fri Aug 28 15:44:34 2015 +0200 @@ -99,7 +99,9 @@ return; } str_truncate(str, 0); - var_expand(str, envs[i+1], mail_user_var_expand_table(user)); + var_expand_with_funcs(str, envs[i+1], + mail_user_var_expand_table(user), + mail_user_var_expand_func_table, user); envs[i+1] = p_strdup(user->pool, str_c(str)); } } @@ -115,8 +117,9 @@ 'h', "home", &key, &value); /* expand mail_home setting before calling mail_user_get_home() */ - settings_var_expand(user->set_info, user->set, - user->pool, mail_user_var_expand_table(user)); + settings_var_expand_with_funcs(user->set_info, user->set, + user->pool, mail_user_var_expand_table(user), + mail_user_var_expand_func_table, user); if (need_home_dir && mail_user_get_home(user, &home) <= 0) { user->error = p_strdup_printf(user->pool, @@ -258,6 +261,26 @@ return user->var_expand_table; } +static const char * +mail_user_var_expand_func_userdb(const char *data, void *context) +{ + struct mail_user *user = context; + const char *field_name = data; + unsigned int i, field_name_len; + + if (user->userdb_fields == NULL) + return NULL; + + field_name_len = strlen(field_name); + for (i = 0; user->userdb_fields[i] != NULL; i++) { + if (strncmp(user->userdb_fields[i], field_name, + field_name_len) == 0 && + user->userdb_fields[i][field_name_len] == '=') + return user->userdb_fields[i] + field_name_len+1; + } + return NULL; +} + void mail_user_set_home(struct mail_user *user, const char *home) { user->_home = p_strdup(user->pool, home); @@ -534,3 +557,10 @@ { user->v.stats_fill(user, stats); } + +static const struct var_expand_func_table mail_user_var_expand_func_table_arr[] = { + { "userdb", mail_user_var_expand_func_userdb }, + { NULL, NULL } +}; +const struct var_expand_func_table *mail_user_var_expand_func_table = + mail_user_var_expand_func_table_arr;
--- a/src/lib-storage/mail-user.h Fri Aug 28 15:43:45 2015 +0200 +++ b/src/lib-storage/mail-user.h Fri Aug 28 15:44:34 2015 +0200 @@ -34,6 +34,7 @@ const char *session_id; struct ip_addr *local_ip, *remote_ip; const char *auth_token, *auth_user; + const char *const *userdb_fields; const struct var_expand_table *var_expand_table; /* If non-NULL, fail the user initialization with this error. @@ -92,6 +93,7 @@ }; extern struct mail_user_module_register mail_user_module_register; extern struct auth_master_connection *mail_user_auth_master_conn; +extern const struct var_expand_func_table *mail_user_var_expand_func_table; struct mail_user *mail_user_alloc(const char *username, const struct setting_parser_info *set_info,