const char *const *userdb_fields, *error;
struct auth_user_reply reply;
struct setting_parser_context *set_parser;
- pool_t user_pool, temp_pool;
+ pool_t temp_pool;
int ret = 1;
- user_pool = pool_alloconly_create(MEMPOOL_GROWING"mail storage service user", 1024*6);
flags = mail_storage_service_input_get_flags(ctx, input);
if ((flags & MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP) != 0 &&
config socket before dropping privileges */
i_fatal("%s", *error_r);
}
- pool_unref(&user_pool);
return -1;
}
will be used for that. */
struct event *event = event_create(input->event_parent);
- user_set = settings_parser_get_root_set(set_parser,
- &mail_user_setting_parser_info);
+ if (master_service_settings_parser_get(event, set_parser,
+ &mail_user_setting_parser_info,
+ MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
+ &user_set, error_r) < 0) {
+ event_unref(&event);
+ return -1;
+ }
if (update_log_prefix)
mail_storage_service_set_log_prefix(ctx, user_set, NULL, input, NULL);
mail_storage_service_first_init(ctx, user_set, flags);
/* load global plugins */
if (mail_storage_service_load_modules(ctx, user_set, error_r) < 0) {
- pool_unref(&user_pool);
+ master_service_settings_free(user_set);
event_unref(&event);
return -1;
}
event_set_forced_debug(event,
ctx->debug || (flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0);
+ pool_t user_pool = pool_alloconly_create(MEMPOOL_GROWING"mail storage service user", 1024*6);
const char *session_id = input->session_id != NULL ?
p_strdup(user_pool, input->session_id) :
mail_storage_service_generate_session_id(
ctx, input, temp_pool, event,
&username, &userdb_fields, error_r);
if (ret <= 0) {
+ master_service_settings_free(user_set);
event_unref(&event);
pool_unref(&temp_pool);
pool_unref(&user_pool);
user->flags = flags;
user->set_parser = settings_parser_dup(set_parser, user_pool);
-
- user->user_set = settings_parser_get_root_set(user->set_parser,
- &mail_user_setting_parser_info);
+ user->user_set = user_set;
user->gid_source = "mail_gid setting";
user->uid_source = "mail_uid setting";
ret = -2;
}
}
- if (ret > 0 && !settings_parser_check(user->set_parser, user_pool, &error)) {
- *error_r = t_strdup_printf(
- "Invalid settings (probably caused by userdb): %s", error);
- ret = -2;
- }
- pool_unref(&temp_pool);
-
- /* load per-user plugins */
- if (ret > 0) {
- if (mail_storage_service_load_modules(ctx, user->user_set,
- error_r) < 0) {
- ret = -2;
- }
- }
if ((ctx->flags & MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS) != 0 &&
user_set->mail_plugins[0] != '\0') {
/* mail_storage_service_load_modules() already avoids loading
to do this is just to clear out the mail_plugins setting: */
(void)settings_parse_line(user->set_parser, "mail_plugins=");
}
+ if (ret > 0) {
+ /* Settings may have changed in the parser */
+ if (master_service_settings_parser_get(event, user->set_parser,
+ &mail_user_setting_parser_info,
+ MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
+ &user_set, &error) < 0) {
+ *error_r = t_strdup_printf(
+ "%s (probably caused by userdb)", error);
+ ret = -2;
+ } else {
+ master_service_settings_free(user->user_set);
+ user->user_set = user_set;
+ }
+ }
+ pool_unref(&temp_pool);
+
+ /* load per-user plugins */
+ if (ret > 0) {
+ if (mail_storage_service_load_modules(ctx, user->user_set,
+ error_r) < 0) {
+ ret = -2;
+ }
+ }
if (ret < 0)
mail_storage_service_user_unref(&user);
if (user->master_service_user_set)
master_service_set_current_user(master_service, NULL);
+ master_service_settings_free(user->user_set);
settings_parser_unref(&user->set_parser);
event_unref(&user->event);
pool_unref(&user->pool);
if (mail_storage_service_read_settings(ctx, input,
&set_parser, &error) < 0)
i_fatal("%s", error);
- user_set = settings_parser_get_root_set(set_parser,
- &mail_user_setting_parser_info);
+ struct event *event = input == NULL ? NULL : input->event_parent;
+ if (master_service_settings_parser_get(event, set_parser,
+ &mail_user_setting_parser_info,
+ MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
+ &user_set, &error) < 0)
+ i_fatal("%s", error);
mail_storage_service_first_init(ctx, user_set, ctx->flags);
+ master_service_settings_free(user_set);
}
static int