mail-user.c revision 96f2533c48ce5def0004931606a2fdf275578880
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2008 Dovecot authors, see the included COPYING file */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#include "lib.h"
62ccd8152d2f0142ab3301da4f5270b9d4f06718Timo Sirainen#include "array.h"
7f97ca94363c9e38fbbaaef204d6d01c54af6fc4Timo Sirainen#include "mail-namespace.h"
181c1aff950e6f8e0556f8974e79d0747845ac0fTimo Sirainen#include "mail-user.h"
70afae43cc78ea6ecca83f6c587072c442a15ec1Timo Sirainen
6dc4af35c045e10609b13fe80f9cf33f3a06c3ceTimo Sirainenstruct mail_user_module_register mail_user_module_register = { 0 };
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenvoid (*hook_mail_user_created)(struct mail_user *user) = NULL;
8ed8c821ba8aab0b4ed0375f87d48737ef0e0d8eTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstatic void mail_user_deinit_base(struct mail_user *user)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen{
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen mail_namespaces_deinit(&user->namespaces);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen pool_unref(&user->pool);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen}
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstruct mail_user *mail_user_init(const char *username, const char *home)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen{
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen struct mail_user *user;
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen pool_t pool;
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen i_assert(username != NULL);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen pool = pool_alloconly_create("mail user", 512);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen user = p_new(pool, struct mail_user, 1);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen user->pool = pool;
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen user->username = p_strdup(pool, username);
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen user->home = p_strdup(pool, home);
9d6dec796909384293006e4289436579089d88d5Timo Sirainen user->v.deinit = mail_user_deinit_base;
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen p_array_init(&user->module_contexts, user->pool, 5);
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen if (hook_mail_user_created != NULL)
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen hook_mail_user_created(user);
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen return user;
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen}
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen
7f97ca94363c9e38fbbaaef204d6d01c54af6fc4Timo Sirainenvoid mail_user_deinit(struct mail_user **_user)
7f97ca94363c9e38fbbaaef204d6d01c54af6fc4Timo Sirainen{
7f97ca94363c9e38fbbaaef204d6d01c54af6fc4Timo Sirainen struct mail_user *user = *_user;
7f97ca94363c9e38fbbaaef204d6d01c54af6fc4Timo Sirainen
7f97ca94363c9e38fbbaaef204d6d01c54af6fc4Timo Sirainen *_user = NULL;
7f97ca94363c9e38fbbaaef204d6d01c54af6fc4Timo Sirainen user->v.deinit(user);
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen}
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainenconst char *mail_user_home_expand(struct mail_user *user, const char *path)
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen{
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen (void)mail_user_try_home_expand(user, &path);
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen return path;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen}
181c1aff950e6f8e0556f8974e79d0747845ac0fTimo Sirainen
7f97ca94363c9e38fbbaaef204d6d01c54af6fc4Timo Sirainenint mail_user_try_home_expand(struct mail_user *user, const char **pathp)
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen{
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen const char *path = *pathp;
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen if (path[0] == '~' && (path[1] == '/' || path[1] == '\0')) {
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen if (user->home == NULL)
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen return -1;
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen *pathp = t_strconcat(user->home, path + 1, NULL);
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen }
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen return 0;
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen}
9d6dec796909384293006e4289436579089d88d5Timo Sirainen