mail-storage-service.c revision 48ada47cce07fb7195a3437224c7c25f542326b0
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen/* If time moves backwards more than this, kill ourself instead of sleeping. */
806cb455553b71934314da98f1b4a694a3aa152eTimo Sirainenstatic void set_keyval(struct setting_parser_context *set_parser,
806cb455553b71934314da98f1b4a694a3aa152eTimo Sirainen const char *str;
806cb455553b71934314da98f1b4a694a3aa152eTimo Sirainen if (settings_parse_line(set_parser, str) < 0) {
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenstatic bool validate_chroot(const struct mail_user_settings *user_set,
806cb455553b71934314da98f1b4a694a3aa152eTimo Sirainen const char *dir)
806cb455553b71934314da98f1b4a694a3aa152eTimo Sirainen const char *const *chroot_dirs;
22535a9e685e29214082878e37a267157044618eTimo Sirainen chroot_dirs = t_strsplit(user_set->valid_chroot_dirs, ":");
22535a9e685e29214082878e37a267157044618eTimo Sirainen strncmp(dir, *chroot_dirs, strlen(*chroot_dirs)) == 0)
22535a9e685e29214082878e37a267157044618eTimo Sirainenuser_reply_handle(struct mail_storage_service_user *user,
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen const char **error_r)
e15f1d736c225c7ce6f3d08a37c1b2ae66b57c50Timo Sirainen struct setting_parser_context *set_parser = user->set_parser;
806cb455553b71934314da98f1b4a694a3aa152eTimo Sirainen unsigned int i, count;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen set_keyval(set_parser, "mail_uid", dec2str(reply->uid));
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen set_keyval(set_parser, "mail_gid", dec2str(reply->gid));
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen set_keyval(set_parser, "mail_home", reply->home);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (!validate_chroot(user->user_set, reply->chroot)) {
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen "userdb returned invalid chroot directory: %s "
22535a9e685e29214082878e37a267157044618eTimo Sirainen "(see valid_chroot_dirs setting)",
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen set_keyval(set_parser, "mail_chroot", reply->chroot);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen str = array_get(&reply->extra_fields, &count);
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen if (strncmp(line, "system_groups_user=", 19) == 0) {
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (n != 0) {
806cb455553b71934314da98f1b4a694a3aa152eTimo Sirainen if (!settings_parse_is_valid_key(set_parser, key)) {
806cb455553b71934314da98f1b4a694a3aa152eTimo Sirainen /* assume it's a plugin setting */
dd93aba1901a457346990f49c54a738947dc7128Timo Sirainen *error_r = t_strdup_printf("Invalid userdb input '%s': %s",
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen str[i], settings_parser_get_error(set_parser));
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainenservice_auth_userdb_lookup(struct mail_storage_service_ctx *ctx,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen const struct mail_storage_service_input *input,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen const char *const **fields_r,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen const char **error_r)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen ret = auth_master_user_lookup(ctx->conn, *user, &info, pool,
if (ret > 0) {
} else if (ret == 0)
return ret;
return TRUE;
return FALSE;
return TRUE;
return TRUE;
return FALSE;
return TRUE;
const char *system_groups_user,
if (disallow_root &&
if (keep_setuid_root) {
if (current_euid != 0) {
if (seteuid(0) < 0)
if (setuid_uid != 0) {
const char **error_r)
static const struct var_expand_table *
return tab;
void **sets;
T_BEGIN {
} T_END;
if (diff > 0) {
diff++;
struct mail_storage_service_ctx *
unsigned int count;
count = 0;
return ctx;
struct auth_master_connection *
unsigned int i, count;
for (i = 0; i < count; i++) {
static struct setting_parser_info *
unsigned int i, count;
for (i = 0; i < count; i++) {
for (i = 0; i < count; i++) {
return new_parent;
const char **error_r)
error_r) < 0) {
*error_r);
i_unreached();
const char *version;
version);
const char **error_r)
const char *const *userdb_fields;
void **sets;
error_r);
if (ret <= 0) {
return ret;
return ret;
const char **error_r)
unsigned int len;
bool temp_priv_drop =
if (!temp_priv_drop ||
if (!temp_priv_drop) {
const char **error_r)
const char *error;
int ret;
if (ret <= 0) {
return ret;
const char *error;
void **sets;
const char **username_r)
const struct mail_storage_service_input *
struct setting_parser_context *
T_BEGIN {
} T_END;
return set;