mail-user.c revision 7afde4b6c600f86ef6f742ea3b01640075ce16a2
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody/* Copyright (c) 2008-2009 Dovecot authors, see the included COPYING file */
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainenstruct mail_user_module_register mail_user_module_register = { 0 };
b624773984e35dd894db8dff976c1a2114c70782Timo Sirainenvoid (*hook_mail_user_created)(struct mail_user *user) = NULL;
b624773984e35dd894db8dff976c1a2114c70782Timo Sirainenstatic struct auth_master_connection *auth_master_conn;
b624773984e35dd894db8dff976c1a2114c70782Timo Sirainenstatic void mail_user_deinit_base(struct mail_user *user)
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainenstruct mail_user *mail_user_alloc(const char *username,
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen pool = pool_alloconly_create("mail user", 8192);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen settings_dup(&mail_user_setting_parser_info, set, pool);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen user->set = settings_dup(&mail_user_setting_parser_info, set, pool);
788a0754cfd38dcfec1902844b085e4e84cfe7e6Timo Sirainen p_array_init(&user->module_contexts, user->pool, 5);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenmail_user_expand_plugins_envs(struct mail_user *user, const char **error_r)
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen unsigned int i, count;
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen if (!array_is_created(&user->set->plugin_envs))
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen envs = array_get_modifiable(&user->set->plugin_envs, &count);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen "userdb didn't return a home directory, "
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen "but plugin setting %s used it (%%h): %s",
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen var_expand(str, envs[i+1], mail_user_var_expand_table(user));
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainenint mail_user_init(struct mail_user *user, const char **error_r)
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen settings_vars_have_key(&mail_user_setting_parser_info, user->set,
31597236d79ac38a5cea7ab65a9d0a3df64ed201Timo Sirainen "userdb didn't return a home directory, "
7569ab8537418b7fc369265f26595b0ef9e4cb35Timo Sirainen settings_var_expand(&mail_user_setting_parser_info, user->set,
7569ab8537418b7fc369265f26595b0ef9e4cb35Timo Sirainen user->pool, mail_user_var_expand_table(user));
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen if (mail_user_expand_plugins_envs(user, error_r) < 0)
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen mail_set = mail_user_set_get_storage_set(user->set);
a138ac12134564b151f00fdef86fba9cd9ba8af0Timo Sirainenstruct mail_user *mail_user_find(struct mail_user *user, const char *name)
a138ac12134564b151f00fdef86fba9cd9ba8af0Timo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
a138ac12134564b151f00fdef86fba9cd9ba8af0Timo Sirainen if (ns->owner != NULL && strcmp(ns->owner->username, name) == 0)
a138ac12134564b151f00fdef86fba9cd9ba8af0Timo Sirainenvoid mail_user_set_vars(struct mail_user *user, uid_t uid, const char *service,
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen user->service = p_strdup(user->pool, service);
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen if (local_ip != NULL && local_ip->family != 0) {
31633d676642b83305b8d46da495d9bb4e2d1ff8Timo Sirainen user->local_ip = p_new(user->pool, struct ip_addr, 1);
b0e9375a1ff97c9c7d40655922af5ccc73ecaa76Timo Sirainen if (remote_ip != NULL && remote_ip->family != 0) {
b0e9375a1ff97c9c7d40655922af5ccc73ecaa76Timo Sirainen user->remote_ip = p_new(user->pool, struct ip_addr, 1);
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainenmail_user_var_expand_table(struct mail_user *user)
b0e9375a1ff97c9c7d40655922af5ccc73ecaa76Timo Sirainen static struct var_expand_table static_tab[] = {
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen tab = p_malloc(user->pool, sizeof(static_tab));
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen tab[1].value = p_strdup(user->pool, t_strcut(user->username, '@'));
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen tab[4].value = user->_home; /* don't look it up unless we need it */
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen tab[5].value = user->local_ip == NULL ? NULL :
ce6b6093957885a74fd6e85c18801dbb727d61ecTimo Sirainen p_strdup(user->pool, net_ip2addr(user->local_ip));
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen tab[6].value = user->remote_ip == NULL ? NULL :
31597236d79ac38a5cea7ab65a9d0a3df64ed201Timo Sirainen p_strdup(user->pool, net_ip2addr(user->remote_ip));
31597236d79ac38a5cea7ab65a9d0a3df64ed201Timo Sirainen tab[8].value = p_strdup(user->pool, dec2str(user->uid));
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid mail_user_set_home(struct mail_user *user, const char *home)
adc409a7ac9689d3baf811712ad5a5432cab2d87Timo Sirainenvoid mail_user_add_namespace(struct mail_user *user,
adc409a7ac9689d3baf811712ad5a5432cab2d87Timo Sirainen struct mail_namespace **tmp, *next, *ns = *namespaces;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen if (strlen(ns->prefix) < strlen((*tmp)->prefix))
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainenvoid mail_user_drop_useless_namespaces(struct mail_user *user)
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen for (ns = user->namespaces; ns != NULL; ns = next) {
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen if ((ns->flags & NAMESPACE_FLAG_USABLE) == 0 &&
2e29e4797a48d78d669821722bdb54fd0a1d3b94Timo Sirainen (ns->flags & NAMESPACE_FLAG_AUTOCREATED) != 0)
b0e9375a1ff97c9c7d40655922af5ccc73ecaa76Timo Sirainenconst char *mail_user_home_expand(struct mail_user *user, const char *path)
b0e9375a1ff97c9c7d40655922af5ccc73ecaa76Timo Sirainenint mail_user_get_home(struct mail_user *user, const char **home_r)
e2a700d0628e395d64cbcef4b5b4510816bf51c4Timo Sirainen userdb_pool = pool_alloconly_create("userdb lookup", 512);
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen ret = auth_master_user_lookup(auth_master_conn, user->username,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen auth_user_fields_parse(fields, userdb_pool, &reply);
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainenconst char *mail_user_plugin_getenv(struct mail_user *user, const char *name)
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen return mail_user_set_plugin_getenv(user->set, name);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenconst char *mail_user_set_plugin_getenv(const struct mail_user_settings *set,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen const char *const *envs;
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen unsigned int i, count;
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainenint mail_user_try_home_expand(struct mail_user *user, const char **pathp)
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen if (path[0] == '~' && (path[1] == '/' || path[1] == '\0')) {
ce6b6093957885a74fd6e85c18801dbb727d61ecTimo Sirainenconst char *mail_user_get_temp_prefix(struct mail_user *user)
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen const char *dir;
31597236d79ac38a5cea7ab65a9d0a3df64ed201Timo Sirainen return t_strconcat(user->_home, "/.temp.", my_hostname, ".",
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen ns = mail_namespace_find_inbox(user->namespaces);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen mailbox_list_get_temp_prefix(ns->list), NULL);
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainenconst char *mail_user_get_anvil_userip_ident(struct mail_user *user)
ce6b6093957885a74fd6e85c18801dbb727d61ecTimo Sirainen return t_strconcat(net_ip2addr(user->remote_ip), "/",
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainenvoid mail_users_init(const char *auth_socket_path, bool debug)