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