mail-user.c revision 87ca4b209c10954826b878da165d303d9b4dc5a2
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* Copyright (c) 2008-2012 Dovecot authors, see the included COPYING file */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkstruct mail_user_module_register mail_user_module_register = { 0 };
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkstruct auth_master_connection *mail_user_auth_master_conn;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkstatic void mail_user_deinit_base(struct mail_user *user)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkstruct mail_user *mail_user_alloc(const char *username,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk const char *error;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk pool = pool_alloconly_create("mail user", 16*1024);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk user->unexpanded_set = settings_dup(set_info, set, pool);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk user->service = master_service_get_name(master_service);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk user->default_normalizer = uni_utf8_to_decomposed_titlecase;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk /* check settings so that the duplicated structure will again
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk contain the parsed fields */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk if (!settings_check(set_info, pool, user->set, &error))
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk i_panic("Settings check unexpectedly failed: %s", error);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk p_array_init(&user->module_contexts, user->pool, 5);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkmail_user_expand_plugins_envs(struct mail_user *user, const char **error_r)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk unsigned int i, count;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk envs = array_get_modifiable(&user->set->plugin_envs, &count);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk "userdb didn't return a home directory, "
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk "but plugin setting %s used it (%%h): %s",
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk var_expand(str, envs[i+1], mail_user_var_expand_table(user));
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkint mail_user_init(struct mail_user *user, const char **error_r)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk settings_vars_have_key(user->set_info, user->set,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk /* expand mail_home setting before calling mail_user_get_home() */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk if (need_home_dir && mail_user_get_home(user, &home) <= 0) {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk "userdb didn't return a home directory, "
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk if (mail_user_expand_plugins_envs(user, error_r) < 0)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk /* call deinit() with refcount=1, otherwise we may assert-crash in
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk mail_user_ref() that is called by some deinit() handler. */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkstruct mail_user *mail_user_find(struct mail_user *user, const char *name)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk for (ns = user->namespaces; ns != NULL; ns = ns->next) {
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk if (ns->owner != NULL && strcmp(ns->owner->username, name) == 0)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkvoid mail_user_set_vars(struct mail_user *user, const char *service,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk if (local_ip != NULL && local_ip->family != 0) {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk user->local_ip = p_new(user->pool, struct ip_addr, 1);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk if (remote_ip != NULL && remote_ip->family != 0) {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk user->remote_ip = p_new(user->pool, struct ip_addr, 1);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkmail_user_var_expand_table(struct mail_user *user)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk /* use a cached table, unless home directory has been set afterwards */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk tab[1].value = p_strdup(user->pool, t_strcut(user->username, '@'));
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk tab[4].value = user->_home; /* don't look it up unless we need it */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk p_strdup(user->pool, net_ip2addr(user->local_ip));
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk p_strdup(user->pool, net_ip2addr(user->remote_ip));
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk tab[8].value = p_strdup(user->pool, dec2str(user->uid));
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk tab[9].value = p_strdup(user->pool, dec2str(user->gid));
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkvoid mail_user_set_home(struct mail_user *user, const char *home)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkvoid mail_user_add_namespace(struct mail_user *user,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk struct mail_namespace **tmp, *next, *ns = *namespaces;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk if (strlen(ns->prefix) < strlen((*tmp)->prefix))
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkvoid mail_user_drop_useless_namespaces(struct mail_user *user)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk for (ns = user->namespaces; ns != NULL; ns = next) {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkconst char *mail_user_home_expand(struct mail_user *user, const char *path)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkstatic int mail_user_userdb_lookup_home(struct mail_user *user)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk userdb_pool = pool_alloconly_create("userdb lookup", 2048);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk ret = auth_master_user_lookup(mail_user_auth_master_conn,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk auth_user_fields_parse(fields, userdb_pool, &reply);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkint mail_user_get_home(struct mail_user *user, const char **home_r)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk if (ret > 0 && user->_home == NULL && *user->set->mail_home != '\0') {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk /* no home in userdb, fallback to mail_home setting */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkbool mail_user_is_plugin_loaded(struct mail_user *user, struct module *module)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk const char *const *plugins;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk plugins = t_strsplit_spaces(user->set->mail_plugins, ", ");
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk ret = str_array_find(plugins, module_get_plugin_name(module));
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkconst char *mail_user_plugin_getenv(struct mail_user *user, const char *name)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk return mail_user_set_plugin_getenv(user->set, name);
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkconst char *mail_user_set_plugin_getenv(const struct mail_user_settings *set,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk const char *name)
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk const char *const *envs;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk unsigned int i, count;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkint mail_user_try_home_expand(struct mail_user *user, const char **pathp)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk /* no need to expand home */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkvoid mail_user_set_get_temp_prefix(string_t *dest,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk str_append(dest, master_service_get_name(master_service));
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkconst char *mail_user_get_anvil_userip_ident(struct mail_user *user)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk return t_strconcat(net_ip2addr(user->remote_ip), "/",
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkbool mail_user_is_path_mounted(struct mail_user *user, const char *path,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk const char **error_r)
const char *mounts_path;
return TRUE;
return FALSE;
return TRUE;
struct mail_storage *
return storage;
return NULL;
return storage;