mail-user.c revision 7b64db32b95286235612eebb5d37d296a49306f7
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2008-2013 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_user_module_register mail_user_module_register = { 0 };
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainenstruct auth_master_connection *mail_user_auth_master_conn;
e2d268e9531227ead6a98466ecf3c046c857ef70Timo Sirainenstatic void mail_user_deinit_base(struct mail_user *user)
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainenstruct mail_user *mail_user_alloc(const char *username,
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen pool = pool_alloconly_create("mail user", 16*1024);
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen user->unexpanded_set = settings_dup(set_info, set, pool);
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen user->set = settings_dup(set_info, set, pool);
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen user->service = master_service_get_name(master_service);
900bb5e316d030cdebff7ee128ce65881dfb27f7Timo Sirainen user->default_normalizer = uni_utf8_to_decomposed_titlecase;
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen /* check settings so that the duplicated structure will again
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen contain the parsed fields */
01937f71b3ae0d5b30b813372f44a3e7e86c89dcTimo Sirainen if (!settings_check(set_info, pool, user->set, &error))
e2d268e9531227ead6a98466ecf3c046c857ef70Timo Sirainen i_panic("Settings check unexpectedly failed: %s", error);
e2d268e9531227ead6a98466ecf3c046c857ef70Timo Sirainen p_array_init(&user->module_contexts, user->pool, 5);
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainenmail_user_expand_plugins_envs(struct mail_user *user)
900bb5e316d030cdebff7ee128ce65881dfb27f7Timo Sirainen unsigned int i, count;
900bb5e316d030cdebff7ee128ce65881dfb27f7Timo Sirainen if (!array_is_created(&user->set->plugin_envs))
897368f75a68f97e172ba76540759a10c557f1c3Timo Sirainen envs = array_get_modifiable(&user->set->plugin_envs, &count);
e2d268e9531227ead6a98466ecf3c046c857ef70Timo Sirainen "userdb didn't return a home directory, "
e2d268e9531227ead6a98466ecf3c046c857ef70Timo Sirainen "but plugin setting %s used it (%%h): %s",
103b44c67f38862d1e72c9bfdf11f067b4670675Timo Sirainen var_expand(str, envs[i+1], mail_user_var_expand_table(user));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_user_init(struct mail_user *user, const char **error_r)
acfeae4e2b5c2acdab88a1377ff6cd4a9b5f0a3aTimo Sirainen settings_vars_have_key(user->set_info, user->set,
acfeae4e2b5c2acdab88a1377ff6cd4a9b5f0a3aTimo Sirainen /* expand mail_home setting before calling mail_user_get_home() */
acfeae4e2b5c2acdab88a1377ff6cd4a9b5f0a3aTimo Sirainen settings_var_expand(user->set_info, user->set,
897368f75a68f97e172ba76540759a10c557f1c3Timo Sirainen user->pool, mail_user_var_expand_table(user));
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainen if (need_home_dir && mail_user_get_home(user, &home) <= 0) {
01937f71b3ae0d5b30b813372f44a3e7e86c89dcTimo Sirainen "userdb didn't return a home directory, "
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen /* autocreated users for shared mailboxes need to be fully initialized
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen if they don't exist, since they're going to be used anyway */
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen if (user->error == NULL || user->nonexistent) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen mail_set = mail_user_set_get_storage_set(user);
a341c4cdbd4b93ba479f465ad3f569dc82f57312Timo Sirainen /* call deinit() with refcount=1, otherwise we may assert-crash in
013e3b3942e9550fde619a0b3ce6bdd04edc4268Timo Sirainen mail_user_ref() that is called by some deinit() handler. */
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainenstruct mail_user *mail_user_find(struct mail_user *user, const char *name)
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen if (ns->owner != NULL && strcmp(ns->owner->username, name) == 0)
ab9a91eb05a54f7675e0bf861aca53f417e1980dTimo Sirainenvoid mail_user_set_vars(struct mail_user *user, const char *service,
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen user->service = p_strdup(user->pool, service);
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen if (local_ip != NULL && local_ip->family != 0) {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen user->local_ip = p_new(user->pool, struct ip_addr, 1);
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen if (remote_ip != NULL && remote_ip->family != 0) {
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen user->remote_ip = p_new(user->pool, struct ip_addr, 1);
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainenmail_user_var_expand_table(struct mail_user *user)
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen static struct var_expand_table static_tab[] = {
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen /* use a cached table, unless home directory has been set afterwards */
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen user->var_expand_table[4].value == user->_home)
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen tab = p_malloc(user->pool, sizeof(static_tab));
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen tab[1].value = p_strdup(user->pool, t_strcut(user->username, '@'));
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen tab[4].value = user->_home; /* don't look it up unless we need it */
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen tab[5].value = user->local_ip == NULL ? NULL :
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen p_strdup(user->pool, net_ip2addr(user->local_ip));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen tab[6].value = user->remote_ip == NULL ? NULL :
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen p_strdup(user->pool, net_ip2addr(user->remote_ip));
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen tab[8].value = p_strdup(user->pool, dec2str(user->uid));
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen tab[9].value = p_strdup(user->pool, dec2str(user->gid));
return path;
int ret;
if (ret > 0) {
return ret;
int ret;
} else if (ret == 0) {
const char *const *plugins;
bool ret;
T_BEGIN {
} T_END;
return ret;
const char *name)
const char *const *envs;
unsigned int i, count;
return NULL;
return NULL;
return NULL;
const char **error_r)
const char *mounts_path;
return TRUE;
return FALSE;
return TRUE;
struct mail_storage *
return storage;
return NULL;
return storage;