mail-storage-service.c revision 5d2a93f2dd0392193b790bf94b8c22b0c2feae3a
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
62d0db14d2c5008758983c28d242ec158baabf9eTimo Sirainen/* If time moves backwards more than this, kill ourself instead of sleeping. */
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainenstatic void set_keyval(struct setting_parser_context *set_parser,
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen const char *str;
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen if (settings_parse_line(set_parser, str) < 0) {
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainenstatic bool validate_chroot(const struct mail_user_settings *user_set,
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen const char *dir)
7358272563d8ef77366447708ab0e58c0cff4151Timo Sirainen const char *const *chroot_dirs;
29f138b4b9bc037b21dfaa6b8e458943a99d5db2Timo Sirainen chroot_dirs = t_strsplit(user_set->valid_chroot_dirs, ":");
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen strncmp(dir, *chroot_dirs, strlen(*chroot_dirs)) == 0)
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenuser_reply_handle(struct setting_parser_context *set_parser,
ad58b50aef8125981ebdbc89513236558bcccf60Timo Sirainen const char **system_groups_user_r, const char **error_r)
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen unsigned int i, count;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen set_keyval(set_parser, "mail_uid", dec2str(reply->uid));
5685e60e62a8e0d368bd28a1526056f97bbba022Timo Sirainen set_keyval(set_parser, "mail_gid", dec2str(reply->gid));
72bc08129fb0aaec8144cc183a998ccc426fef9eTimo Sirainen set_keyval(set_parser, "mail_home", reply->home);
c14c5561e85853d91280235a7611b6050feaebb2Timo Sirainen if (!validate_chroot(user_set, reply->chroot)) {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen "userdb returned invalid chroot directory: %s "
72bc08129fb0aaec8144cc183a998ccc426fef9eTimo Sirainen "(see valid_chroot_dirs setting)",
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen set_keyval(set_parser, "mail_chroot", reply->chroot);
97437f768d1a3e6134fed1971202803fd250eef2Timo Sirainen str = array_get(&reply->extra_fields, &count);
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen if (strncmp(line, "system_groups_user=", 19) == 0)
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (!settings_parse_is_valid_key(set_parser, key)) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen /* assume it's a plugin setting */
2a15ce3abe14099b94535f6dfc2d4ee023a7c455Timo Sirainen *error_r = t_strdup_printf("Invalid userdb input '%s': %s",
6eb7938cd366fc087b39fc9a901e7de426131384Timo Sirainen str[i], settings_parser_get_error(set_parser));
2a15ce3abe14099b94535f6dfc2d4ee023a7c455Timo Sirainenservice_auth_userdb_lookup(struct auth_master_connection *conn,
2a15ce3abe14099b94535f6dfc2d4ee023a7c455Timo Sirainen const struct mail_storage_service_input *input,
2a15ce3abe14099b94535f6dfc2d4ee023a7c455Timo Sirainen const char *const **fields_r,
2a15ce3abe14099b94535f6dfc2d4ee023a7c455Timo Sirainen const char **error_r)
if (ret > 0) {
} else if (ret == 0)
return ret;
return TRUE;
return FALSE;
return TRUE;
return TRUE;
return FALSE;
return TRUE;
if (disallow_root &&
if (keep_setuid_root) {
if (current_euid != 0) {
if (seteuid(0) < 0)
if (setuid_uid != 0) {
bool preserve_home)
const char *error;
const char *home,
bool setuid_root,
const char **error_r)
if (setuid_root) {
static const struct var_expand_table *
return tab;
void **sets;
T_BEGIN {
} T_END;
if (diff > 0) {
diff++;
static struct mail_user *
void **sets;
unsigned int len;
bool userdb_lookup;
if (userdb_lookup) {
if (!userdb_lookup) {
FALSE);
return mail_user;
struct mail_user *
T_BEGIN {
} T_END;
return user;
void mail_storage_service_deinit_user(void)
struct mail_storage_service_multi_ctx *
void **sets;
return ctx;
struct auth_master_connection *
int ret;
if (ret <= 0)
return ret;
if (ret <= 0)
return ret;
const char **error_r)
void **sets;
const char **error_r)
const char *home;
unsigned int len;
TRUE);
} else if (len > 0) {
const char **username_r)
T_BEGIN {
} T_END;
return set;