dovecot-2.2: lib-storage: Added %{userdb:*} expansion to mail se...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Aug 28 13:46:27 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/65b88128c7eb
changeset: 19032:65b88128c7eb
user: Timo Sirainen <tss at iki.fi>
date: Fri Aug 28 15:44:34 2015 +0200
description:
lib-storage: Added %{userdb:*} expansion to mail settings.
diffstat:
src/lib-storage/mail-storage-service.c | 50 ++++++++++++++++++++++++++++++---
src/lib-storage/mail-user.c | 36 ++++++++++++++++++++++--
src/lib-storage/mail-user.h | 2 +
3 files changed, 80 insertions(+), 8 deletions(-)
diffs (171 lines):
diff -r 224f0f61d03f -r 65b88128c7eb src/lib-storage/mail-storage-service.c
--- 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) {
diff -r 224f0f61d03f -r 65b88128c7eb src/lib-storage/mail-user.c
--- 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;
diff -r 224f0f61d03f -r 65b88128c7eb src/lib-storage/mail-user.h
--- 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,
More information about the dovecot-cvs
mailing list