mail-storage-service.c revision 24ff040448e018738515f7bfcc6f1a6e5d08c10d
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2009-2017 Dovecot authors, see the included COPYING file */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen/* If time moves backwards more than this, kill ourself instead of sleeping. */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen "Invalid user settings. Refer to server log for more information."
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct auth_master_connection *conn, *iter_conn;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char *set_cache_module, *set_cache_service;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct master_service_settings_cache *set_cache;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char *const **userdb_next_fieldsp;
a943ed0f901e312445fd393249b91932797bba79Josef 'Jeff' Sipek struct mail_storage_service_ctx *service_ctx;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char *log_prefix, *auth_token, *auth_user;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char *system_groups_user, *uid_source, *gid_source;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstruct module *mail_storage_service_modules = NULL;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenmail_storage_service_var_expand(struct mail_storage_service_ctx *ctx,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const struct mail_storage_service_input *input,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const struct mail_storage_service_privileges *priv,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char **error_r);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenmail_user_set_get_mail_debug(const struct setting_parser_info *user_info,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen mail_set = mail_user_set_get_driver_settings(user_info, user_set,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic void set_keyval(struct mail_storage_service_ctx *ctx,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct setting_parser_context *set_parser = user->set_parser;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (master_service_set_has_config_override(ctx->service, key)) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen /* this setting was already overridden with -o parameter */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (mail_user_set_get_mail_debug(user->user_info,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen i_debug("Ignoring overridden (-o) userdb setting: %s",
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (settings_parse_keyvalue(set_parser, key, value) < 0) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen i_fatal("Invalid userdb input %s=%s: %s", key, value,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic int set_line(struct mail_storage_service_ctx *ctx,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct setting_parser_context *set_parser = user->set_parser;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char *key, *orig_key, *append_value = NULL;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen mail_debug = mail_user_set_get_mail_debug(user->user_info,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen /* key+=value */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (!settings_parse_is_valid_key(set_parser, key)) {
8a68b403f982d0f1b2d628ea826ea5385771a787Timo Sirainen /* assume it's a plugin setting */
cbd6cad82e1c9ad60869ad71ae6c42e1af8b10a8Timo Sirainen if (master_service_set_has_config_override(ctx->service, key)) {
cbd6cad82e1c9ad60869ad71ae6c42e1af8b10a8Timo Sirainen /* this setting was already overridden with -o parameter */
abb404575a238f27ea03b6049880f30f1656ddc4Timo Sirainen i_debug("Ignoring overridden (-o) userdb setting: %s",
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen value = settings_parse_get_value(set_parser, key, &type);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen "'+' can only be used for strings.", orig_key);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen /* possibly a password field (e.g. imapc_password).
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen hide the value. */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen "Unknown userdb setting: %s" :
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic bool validate_chroot(const struct mail_user_settings *user_set,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char *dir)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char *const *chroot_dirs;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen chroot_dirs = t_strsplit(user_set->valid_chroot_dirs, ":");
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen strncmp(dir, *chroot_dirs, strlen(*chroot_dirs)) == 0)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenuser_reply_handle(struct mail_storage_service_ctx *ctx,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char **error_r)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen unsigned int i, count;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen set_keyval(ctx, user, "mail_uid", dec2str(reply->uid));
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen set_keyval(ctx, user, "mail_gid", dec2str(reply->gid));
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen /* wu-ftpd like <chroot>/./<home> - check only if there's even
3d7590a656f4f746b2adc6e00fa607eba5d2412dTimo Sirainen a possibility of using them (non-empty valid_chroot_dirs) */
3d7590a656f4f746b2adc6e00fa607eba5d2412dTimo Sirainen if (!validate_chroot(user->user_set, chroot)) {
46b823ac3bce2c0f9f0fc73911e48d3a77b04fbeTimo Sirainen "userdb returned invalid chroot directory: %s "
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen str = array_get(&reply->extra_fields, &count);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen for (i = 0; i < count; i++) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (strncmp(line, "system_groups_user=", 19) == 0) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen user->chdir_path = p_strdup(user->pool, line+6);
#ifdef HAVE_SETPRIORITY
} else T_BEGIN {
} T_END;
if (ret < 0)
if (ret < 0) {
return ret;
const char *const **fields_r,
const char **error_r)
const char *new_username;
int ret;
if (ret > 0) {
} else if (ret == 0)
return ret;
return TRUE;
return FALSE;
return FALSE;
return TRUE;
return TRUE;
return FALSE;
return FALSE;
return TRUE;
static const struct var_expand_table *
return tab;
const struct var_expand_table *
int ret;
return TRUE;
return ret > 0;
const char **error_r)
const char *error;
static void mail_storage_service_seteuid_root(void)
if (seteuid(0) < 0) {
&error)) {
if (disallow_root &&
if (keep_setuid_root) {
if (current_euid != 0) {
if (!setenv_only) {
const char *session_id_suffix,
const char **error_r)
if (p == NULL)
const char *const *fields)
const char **value_r,
const char **error_r)
const char *error;
T_BEGIN {
} T_END;
user);
if (diff > 0) {
diff++;
struct mail_storage_service_ctx *
const char *version;
unsigned int count;
getuid() != 0) {
count = 0;
return ctx;
struct auth_master_connection *
static enum mail_storage_service_flags
return flags;
const char **error_r)
i_unreached();
const char **error_r)
const char *error;
bool update_log_prefix,
const char **error_r)
void **sets;
geteuid() != 0) {
error_r) < 0) {
if (update_log_prefix)
if (ret <= 0) {
return ret;
if (ret > 0) {
error_r) < 0) {
return ret;
const char **error_r)
bool update_log_prefix;
int ret;
const char *session_id =
return ret;
const char *session_id_suffix,
const char **error_r)
const char *error;
bool disallow_root =
bool temp_priv_drop =
bool use_chroot;
if (use_chroot) {
if (!temp_priv_drop ||
const char **error_r)
user,
NULL,
error_r);
const char *session_id_suffix,
const char **error_r)
int ret;
return ret;
const char *error;
const char **error_r)
int ret;
if (ret <= 0)
return ret;
if (ret < 0) {
return ret;
const char *error;
void **sets;
&error) < 0)
int ret = 0;
return ret;
const char *user_mask_hint)
flags);
const char **username_r)
const struct mail_storage_settings *
const struct mail_storage_service_input *
struct setting_parser_context *
struct mail_storage_service_ctx *
T_BEGIN {
} T_END;
return set;
const char *key,
const char *value,
const char **error_r)
return ret;