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