dovecot-2.1: shared mailboxes: If successful userdb lookup doesn...

dovecot at dovecot.org dovecot at dovecot.org
Fri May 4 22:55:39 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/6dabd9545d48
changeset: 14504:6dabd9545d48
user:      Timo Sirainen <tss at iki.fi>
date:      Fri May 04 22:55:29 2012 +0300
description:
shared mailboxes: If successful userdb lookup doesn't return home, fallback to mail_home setting for %%h.

diffstat:

 src/lib-storage/index/shared/shared-storage.c |  14 +++---
 src/lib-storage/mail-user.c                   |  57 ++++++++++++++++++---------
 2 files changed, 45 insertions(+), 26 deletions(-)

diffs (139 lines):

diff -r 4a3bf567da54 -r 6dabd9545d48 src/lib-storage/index/shared/shared-storage.c
--- a/src/lib-storage/index/shared/shared-storage.c	Fri May 04 21:52:05 2012 +0300
+++ b/src/lib-storage/index/shared/shared-storage.c	Fri May 04 22:55:29 2012 +0300
@@ -256,6 +256,13 @@
 	owner = mail_user_alloc(userdomain, user->set_info,
 				user->unexpanded_set);
 	owner->autocreated = TRUE;
+	if (mail_user_init(owner, &error) < 0) {
+		mailbox_list_set_critical(list,
+			"Couldn't create namespace '%s' for user %s: %s",
+			ns->prefix, userdomain, error);
+		mail_user_unref(&owner);
+		return -1;
+	}
 	if (!var_has_key(storage->location, 'h', "home"))
 		ret = 1;
 	else {
@@ -268,13 +275,6 @@
 			return -1;
 		}
 	}
-	if (mail_user_init(owner, &error) < 0) {
-		mailbox_list_set_critical(list,
-			"Couldn't create namespace '%s' for user %s: %s",
-			ns->prefix, userdomain, error);
-		mail_user_unref(&owner);
-		return -1;
-	}
 
 	/* create the new namespace */
 	new_ns = i_new(struct mail_namespace, 1);
diff -r 4a3bf567da54 -r 6dabd9545d48 src/lib-storage/mail-user.c
--- a/src/lib-storage/mail-user.c	Fri May 04 21:52:05 2012 +0300
+++ b/src/lib-storage/mail-user.c	Fri May 04 22:55:29 2012 +0300
@@ -96,19 +96,23 @@
 {
 	const struct mail_storage_settings *mail_set;
 	const char *home, *key, *value;
+	bool need_home_dir;
 
-	if (user->_home == NULL &&
-	    settings_vars_have_key(user->set_info, user->set,
-				   'h', "home", &key, &value) &&
-	    mail_user_get_home(user, &home) <= 0) {
+	need_home_dir = user->_home == NULL &&
+		settings_vars_have_key(user->set_info, user->set,
+				       '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));
+
+	if (need_home_dir && mail_user_get_home(user, &home) <= 0) {
 		*error_r = t_strdup_printf(
 			"userdb didn't return a home directory, "
 			"but %s used it (%%h): %s", key, value);
 		return -1;
 	}
 
-	settings_var_expand(user->set_info, user->set,
-			    user->pool, mail_user_var_expand_table(user));
 	if (mail_user_expand_plugins_envs(user, error_r) < 0)
 		return -1;
 
@@ -265,7 +269,7 @@
 	return path;
 }
 
-int mail_user_get_home(struct mail_user *user, const char **home_r)
+static int mail_user_userdb_lookup_home(struct mail_user *user)
 {
 	struct auth_user_info info;
 	struct auth_user_reply reply;
@@ -273,6 +277,8 @@
 	const char *username, *const *fields;
 	int ret;
 
+	i_assert(!user->home_looked_up);
+
 	memset(&info, 0, sizeof(info));
 	info.service = user->service;
 	if (user->local_ip != NULL)
@@ -280,12 +286,6 @@
 	if (user->remote_ip != NULL)
 		info.remote_ip = *user->remote_ip;
 
-	if (user->home_looked_up) {
-		*home_r = user->_home;
-		return user->_home != NULL ? 1 : 0;
-	}
-	*home_r = NULL;
-
 	if (mail_user_auth_master_conn == NULL)
 		return 0;
 
@@ -293,18 +293,37 @@
 	ret = auth_master_user_lookup(mail_user_auth_master_conn,
 				      user->username, &info, userdb_pool,
 				      &username, &fields);
-	if (ret >= 0) {
+	if (ret > 0) {
 		auth_user_fields_parse(fields, userdb_pool, &reply);
-		user->_home = ret == 0 ? NULL :
-			p_strdup(user->pool, reply.home);
-		user->home_looked_up = TRUE;
-		ret = user->_home != NULL ? 1 : 0;
-		*home_r = user->_home;
+		user->_home = p_strdup(user->pool, reply.home);
 	}
 	pool_unref(&userdb_pool);
 	return ret;
 }
 
+int mail_user_get_home(struct mail_user *user, const char **home_r)
+{
+	int ret;
+
+	if (user->home_looked_up) {
+		*home_r = user->_home;
+		return user->_home != NULL ? 1 : 0;
+	}
+
+	ret = mail_user_userdb_lookup_home(user);
+	if (ret < 0)
+		return -1;
+
+	if (ret > 0 && user->_home == NULL && *user->set->mail_home != '\0') {
+		/* no home in userdb, fallback to mail_home setting */
+		user->_home = user->set->mail_home;
+	}
+	user->home_looked_up = TRUE;
+
+	*home_r = user->_home;
+	return user->_home != NULL ? 1 : 0;
+}
+
 bool mail_user_is_plugin_loaded(struct mail_user *user, struct module *module)
 {
 	const char *const *plugins;


More information about the dovecot-cvs mailing list