mail-storage-service.c revision 85779ec11f23eb8efeb8993b1e0b9aad62c4122a
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2009-2014 Dovecot authors, see the included COPYING file */
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen/* If time moves backwards more than this, kill ourself instead of sleeping. */
e93184a9055c2530366dfe617e07199603c399ddMartti Rannanjärvi "Invalid user settings. Refer to server log for more information."
a9a928e40e3b691924c8e5e444e3e1a4320aa3bdStephan Bosch struct auth_master_connection *conn, *iter_conn;
a9a928e40e3b691924c8e5e444e3e1a4320aa3bdStephan Bosch const char *set_cache_module, *set_cache_service;
a9a928e40e3b691924c8e5e444e3e1a4320aa3bdStephan Bosch struct master_service_settings_cache *set_cache;
10c96a244935de4add8213ba0b894178dfb889a5Timo Sirainen const char *const **userdb_next_fieldsp;
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen const char *log_prefix, *auth_token, *auth_user;
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen const char *system_groups_user, *uid_source, *gid_source;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstruct module *mail_storage_service_modules = NULL;
1a0ece3e873e3864269ed7eaed957dc10c56d25fTimo Sirainenmail_user_set_get_mail_debug(const struct setting_parser_info *user_info,
1a0ece3e873e3864269ed7eaed957dc10c56d25fTimo Sirainen mail_set = mail_user_set_get_driver_settings(user_info, user_set,
46ce4d9273e6df12ef1912bbdb1c8b84b104f394Timo Sirainenstatic void set_keyval(struct mail_storage_service_ctx *ctx,
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen struct setting_parser_context *set_parser = user->set_parser;
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen const char *str;
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen if (master_service_set_has_config_override(ctx->service, key)) {
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen /* this setting was already overridden with -o parameter */
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen if (mail_user_set_get_mail_debug(user->user_info,
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen i_debug("Ignoring overridden (-o) userdb setting: %s",
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (settings_parse_line(set_parser, str) < 0) {
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainenstatic int set_line(struct mail_storage_service_ctx *ctx,
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen struct setting_parser_context *set_parser = user->set_parser;
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen const char *key, *orig_key, *append_value = NULL;
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen unsigned int len;
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen mail_debug = mail_user_set_get_mail_debug(user->user_info,
e0fab14602b73ff590b2a9c5d9e67e2dfb5d1f9eTimo Sirainen /* key+=value */
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen if (!settings_parse_is_valid_key(set_parser, key)) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* assume it's a plugin setting */
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen if (master_service_set_has_config_override(ctx->service, key)) {
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen /* this setting was already overridden with -o parameter */
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen i_debug("Ignoring overridden (-o) userdb setting: %s",
4b9f99761df5014c659cd87fddaf6854af428cfcTimo Sirainen value = settings_parse_get_value(set_parser, key, &type);
1bc075e2e4ed422f9590c95c3ae223422b97ce6aTimo Sirainen "'+' can only be used for strings.", orig_key);
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen /* possibly a password field (e.g. imapc_password).
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen hide the value. */
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen "Unknown userdb setting: %s" :
4106a25399703eb6cbb166dcbd5bb932cb2f7ad2Timo Sirainenstatic bool validate_chroot(const struct mail_user_settings *user_set,
4106a25399703eb6cbb166dcbd5bb932cb2f7ad2Timo Sirainen const char *dir)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *const *chroot_dirs;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen chroot_dirs = t_strsplit(user_set->valid_chroot_dirs, ":");
09142ea11662746ea07475b1a4f69a6a406fb996Phil Carmody strncmp(dir, *chroot_dirs, strlen(*chroot_dirs)) == 0)
09142ea11662746ea07475b1a4f69a6a406fb996Phil Carmodyuser_reply_handle(struct mail_storage_service_ctx *ctx,
09142ea11662746ea07475b1a4f69a6a406fb996Phil Carmody const char **error_r)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int i, count;
4c096615cb86a826fda377b87df22c579bfe5525Timo Sirainen set_keyval(ctx, user, "mail_uid", dec2str(reply->uid));
for (i = 0; i < count; i++) {
#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 *
const char *str)
const char **error_r)
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 **error_r)
T_BEGIN {
} T_END;
user);
if (diff > 0) {
diff++;
struct mail_storage_service_ctx *
const char *version;
unsigned int count;
geteuid() != 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)
void **sets;
geteuid() != 0) {
&error) < 0) {
error_r);
if (ret <= 0) {
return ret;
if (ret > 0) {
return ret;
const char *error;
unsigned int len;
bool disallow_root =
bool temp_priv_drop =
bool use_chroot;
if (use_chroot) {
if (!temp_priv_drop ||
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;
flags);
const char **username_r)
const struct mail_storage_settings *
const struct mail_storage_service_input *
struct setting_parser_context *
T_BEGIN {
} T_END;
return set;