mail-user.c revision a2150da2dc906c26a26219cbefbe28a119aafee2
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen/* Copyright (c) 2008-2011 Dovecot authors, see the included COPYING file */
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "array.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "hostpid.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "network.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "module-dir.h"
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen#include "home-expand.h"
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen#include "str.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "strescape.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "var-expand.h"
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen#include "settings-parser.h"
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen#include "auth-master.h"
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen#include "master-service.h"
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen#include "mail-storage-settings.h"
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen#include "mail-storage-private.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-namespace.h"
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen#include "mail-storage.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-user.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include <stdlib.h>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainenstruct mail_user_module_register mail_user_module_register = { 0 };
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct auth_master_connection *mail_user_auth_master_conn;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void mail_user_deinit_base(struct mail_user *user)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen{
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen mail_namespaces_deinit(&user->namespaces);
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen}
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainenstruct mail_user *mail_user_alloc(const char *username,
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen const struct setting_parser_info *set_info,
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen const struct mail_user_settings *set)
2d3aac5be07b96f72cf0551fac35ac74a4f07770Timo Sirainen{
2d3aac5be07b96f72cf0551fac35ac74a4f07770Timo Sirainen struct mail_user *user;
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen const char *error;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen pool_t pool;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen i_assert(username != NULL);
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen i_assert(*username != '\0');
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen pool = pool_alloconly_create("mail user", 16*1024);
a205d315b0978985ba77d871f44e4a98273612e6Timo Sirainen user = p_new(pool, struct mail_user, 1);
a205d315b0978985ba77d871f44e4a98273612e6Timo Sirainen user->pool = pool;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen user->refcount = 1;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen user->username = p_strdup(pool, username);
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen user->set_info = set_info;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen user->unexpanded_set = settings_dup(set_info, set, pool);
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen user->set = settings_dup(set_info, set, pool);
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen /* check settings so that the duplicated structure will again
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen contain the parsed fields */
a6a2b38d806f3ab3198160e39240a8200775e525Timo Sirainen if (!settings_check(set_info, pool, user->set, &error))
a6a2b38d806f3ab3198160e39240a8200775e525Timo Sirainen i_panic("Settings check unexpectedly failed: %s", error);
a6a2b38d806f3ab3198160e39240a8200775e525Timo Sirainen
fb2e0bbb7737f3223b16aa41e4b40fb0cd5f288fTimo Sirainen user->v.deinit = mail_user_deinit_base;
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen p_array_init(&user->module_contexts, user->pool, 5);
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen return user;
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen}
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainenstatic int
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainenmail_user_expand_plugins_envs(struct mail_user *user, const char **error_r)
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen{
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen const char **envs, *home;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen string_t *str;
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen unsigned int i, count;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen if (!array_is_created(&user->set->plugin_envs))
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen return 0;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen str = t_str_new(256);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen envs = array_get_modifiable(&user->set->plugin_envs, &count);
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen i_assert((count % 2) == 0);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen for (i = 0; i < count; i += 2) {
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if (user->_home == NULL &&
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen var_has_key(envs[i+1], 'h', "home") &&
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen mail_user_get_home(user, &home) <= 0) {
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen *error_r = t_strdup_printf(
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen "userdb didn't return a home directory, "
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen "but plugin setting %s used it (%%h): %s",
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen envs[i], envs[i+1]);
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen return -1;
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen }
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen str_truncate(str, 0);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen var_expand(str, envs[i+1], mail_user_var_expand_table(user));
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen envs[i+1] = p_strdup(user->pool, str_c(str));
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen }
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return 0;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen}
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainenint mail_user_init(struct mail_user *user, const char **error_r)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen{
e5759add4dc24b96606dccc4a989838e260f2a12Timo Sirainen const struct mail_storage_settings *mail_set;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen const char *home, *key, *value;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if (user->_home == NULL &&
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen settings_vars_have_key(user->set_info, user->set,
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen 'h', "home", &key, &value) &&
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen mail_user_get_home(user, &home) <= 0) {
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen *error_r = t_strdup_printf(
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen "userdb didn't return a home directory, "
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen "but %s used it (%%h): %s", key, value);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return -1;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen }
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen settings_var_expand(user->set_info, user->set,
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen user->pool, mail_user_var_expand_table(user));
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if (mail_user_expand_plugins_envs(user, error_r) < 0)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return -1;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen mail_set = mail_user_set_get_storage_set(user);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen user->mail_debug = mail_set->mail_debug;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen user->service = master_service_get_name(master_service);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen user->initialized = TRUE;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen hook_mail_user_created(user);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen if (user->error != NULL) {
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen *error_r = t_strdup(user->error);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return -1;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen }
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen return 0;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen}
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenvoid mail_user_ref(struct mail_user *user)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen i_assert(user->refcount > 0);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->refcount++;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen}
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenvoid mail_user_unref(struct mail_user **_user)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct mail_user *user = *_user;
197ad81605dc0f6d2ebc9ad99994db5ca6d76699Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen i_assert(user->refcount > 0);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen *_user = NULL;
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen if (user->refcount > 1) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->refcount--;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* call deinit() with refcount=1, otherwise we may assert-crash in
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen mail_user_ref() that is called by some deinit() handler. */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->v.deinit(user);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen i_assert(user->refcount == 1);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen pool_unref(&user->pool);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen}
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenstruct mail_user *mail_user_find(struct mail_user *user, const char *name)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct mail_namespace *ns;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (ns->owner != NULL && strcmp(ns->owner->username, name) == 0)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return ns->owner;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen return NULL;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen}
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenvoid mail_user_set_vars(struct mail_user *user, uid_t uid, gid_t gid,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen const char *service, const struct ip_addr *local_ip,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen const struct ip_addr *remote_ip)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->uid = uid;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->gid = gid;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->service = p_strdup(user->pool, service);
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen if (local_ip != NULL && local_ip->family != 0) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->local_ip = p_new(user->pool, struct ip_addr, 1);
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen *user->local_ip = *local_ip;
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (remote_ip != NULL && remote_ip->family != 0) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->remote_ip = p_new(user->pool, struct ip_addr, 1);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen *user->remote_ip = *remote_ip;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen}
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenconst struct var_expand_table *
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenmail_user_var_expand_table(struct mail_user *user)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen static struct var_expand_table static_tab[] = {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { 'u', NULL, "user" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { 'n', NULL, "username" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { 'd', NULL, "domain" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { 's', NULL, "service" },
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen { 'h', NULL, "home" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { 'l', NULL, "lip" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { 'r', NULL, "rip" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { 'p', NULL, "pid" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { 'i', NULL, "uid" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { '\0', NULL, "gid" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { '\0', NULL, NULL }
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen };
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen struct var_expand_table *tab;
33ae95df45c9b5ec51332a6b39eb5322038686b9Timo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen if (user->var_expand_table != NULL)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen return user->var_expand_table;
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen tab = p_malloc(user->pool, sizeof(static_tab));
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen tab[0].value = user->username;
bf301a34ffbfd049be583094019b2644884b6d0bTimo Sirainen tab[1].value = p_strdup(user->pool, t_strcut(user->username, '@'));
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen tab[2].value = strchr(user->username, '@');
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen if (tab[2].value != NULL) tab[2].value++;
58eb2cb24dbeadd94500670acad7ceb1c8b0d9b4Timo Sirainen tab[3].value = user->service;
bf301a34ffbfd049be583094019b2644884b6d0bTimo Sirainen tab[4].value = user->_home; /* don't look it up unless we need it */
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen tab[5].value = user->local_ip == NULL ? NULL :
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen p_strdup(user->pool, net_ip2addr(user->local_ip));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen tab[6].value = user->remote_ip == NULL ? NULL :
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen p_strdup(user->pool, net_ip2addr(user->remote_ip));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen tab[7].value = my_pid;
1e76a5b92f9d82d557f81f080f3dfad1c9d8f200Timo Sirainen tab[8].value = p_strdup(user->pool, dec2str(user->uid));
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen user->var_expand_table = tab;
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen return user->var_expand_table;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainenvoid mail_user_set_home(struct mail_user *user, const char *home)
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen user->_home = p_strdup(user->pool, home);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen user->home_looked_up = TRUE;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_user_add_namespace(struct mail_user *user,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_namespace **namespaces)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_namespace **tmp, *next, *ns = *namespaces;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen for (; ns != NULL; ns = next) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen next = ns->next;
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen tmp = &user->namespaces;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (; *tmp != NULL; tmp = &(*tmp)->next) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (strlen(ns->prefix) < strlen((*tmp)->prefix))
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen break;
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen }
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen ns->next = *tmp;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen *tmp = ns;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen *namespaces = user->namespaces;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenvoid mail_user_drop_useless_namespaces(struct mail_user *user)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_namespace *ns, *next;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (ns = user->namespaces; ns != NULL; ns = next) {
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen next = ns->next;
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ((ns->flags & NAMESPACE_FLAG_USABLE) == 0 &&
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen (ns->flags & NAMESPACE_FLAG_AUTOCREATED) != 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_namespace_destroy(ns);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenconst char *mail_user_home_expand(struct mail_user *user, const char *path)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (void)mail_user_try_home_expand(user, &path);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return path;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_user_get_home(struct mail_user *user, const char **home_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct auth_user_info info;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct auth_user_reply reply;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen pool_t userdb_pool;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen const char *username, *const *fields;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen int ret;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen memset(&info, 0, sizeof(info));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen info.service = "lib-storage";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (user->local_ip != NULL)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen info.local_ip = *user->local_ip;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if (user->remote_ip != NULL)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen info.remote_ip = *user->remote_ip;
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if (user->home_looked_up) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *home_r = user->_home;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return user->_home != NULL ? 1 : 0;
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen }
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen *home_r = NULL;
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen if (mail_user_auth_master_conn == NULL)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return 0;
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen userdb_pool = pool_alloconly_create("userdb lookup", 2048);
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen ret = auth_master_user_lookup(mail_user_auth_master_conn,
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen user->username, &info, userdb_pool,
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen &username, &fields);
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen if (ret >= 0) {
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen auth_user_fields_parse(fields, userdb_pool, &reply);
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen user->_home = ret == 0 ? NULL :
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen p_strdup(user->pool, reply.home);
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen user->home_looked_up = TRUE;
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen ret = user->_home != NULL ? 1 : 0;
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen *home_r = user->_home;
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen }
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen pool_unref(&userdb_pool);
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen return ret;
92139717fd109c34692670df54d157d8c4df9b71Timo Sirainen}
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenbool mail_user_is_plugin_loaded(struct mail_user *user, struct module *module)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen const char *const *plugins;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen bool ret;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen T_BEGIN {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen plugins = t_strsplit_spaces(user->set->mail_plugins, ", ");
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen ret = str_array_find(plugins, module_get_plugin_name(module));
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen } T_END;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return ret;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen}
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenconst char *mail_user_plugin_getenv(struct mail_user *user, const char *name)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return mail_user_set_plugin_getenv(user->set, name);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen}
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenconst char *mail_user_set_plugin_getenv(const struct mail_user_settings *set,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen const char *name)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen const char *const *envs;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen unsigned int i, count;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (!array_is_created(&set->plugin_envs))
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return NULL;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen envs = array_get(&set->plugin_envs, &count);
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen for (i = 0; i < count; i += 2) {
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen if (strcmp(envs[i], name) == 0)
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen return envs[i+1];
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen return NULL;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen}
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainenint mail_user_try_home_expand(struct mail_user *user, const char **pathp)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen const char *home, *path = *pathp;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (mail_user_get_home(user, &home) < 0)
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen return -1;
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen path = home_expand_tilde(path, home);
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen if (path == NULL)
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen return -1;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen *pathp = path;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen return 0;
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen}
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainenvoid mail_user_set_get_temp_prefix(string_t *dest,
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen const struct mail_user_settings *set)
bf301a34ffbfd049be583094019b2644884b6d0bTimo Sirainen{
51ff0538ab38def8045b3f7feb43e1e069cbe037Timo Sirainen str_append(dest, set->mail_temp_dir);
58eb2cb24dbeadd94500670acad7ceb1c8b0d9b4Timo Sirainen str_append(dest, "/dovecot.");
bf301a34ffbfd049be583094019b2644884b6d0bTimo Sirainen str_append(dest, master_service_get_name(master_service));
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen str_append_c(dest, '.');
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen}
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainenconst char *mail_user_get_anvil_userip_ident(struct mail_user *user)
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen{
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen if (user->remote_ip == NULL)
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen return NULL;
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen return t_strconcat(net_ip2addr(user->remote_ip), "/",
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen str_tabescape(user->username), NULL);
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen}
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen