user_set = master_service_settings_get_root_set(master_service,
&mail_user_setting_parser_info);
- raw_mail_user = raw_storage_create_from_set(dinput->rcpt_user->set_info,
+ raw_mail_user = raw_storage_create_from_set(dinput->rcpt_user->unexpanded_set_parser,
+ dinput->rcpt_user->set_info,
user_set);
mail_from = (dinput->mail_from != NULL ?
extern struct mailbox raw_mailbox;
struct mail_user *
-raw_storage_create_from_set(const struct setting_parser_info *set_info,
+raw_storage_create_from_set(const struct setting_parser_context *unexpanded_set_parser,
+ const struct setting_parser_info *set_info,
const struct mail_user_settings *set)
{
struct mail_user *user;
/* Don't include raw user's events in statistics or anything else.
They would just cause confusion. */
event_disable_callbacks(event);
- user = mail_user_alloc(event, "raw mail user", set_info, set);
+ user = mail_user_alloc(event, "raw mail user", unexpanded_set_parser, set_info, set);
event_unref(&event);
user->autocreated = TRUE;
#include "index-storage.h"
+struct setting_parser_context;
+
#define RAW_STORAGE_NAME "raw"
#define RAW_SUBSCRIPTION_FILE_NAME "subscriptions"
extern struct mail_vfuncs raw_mail_vfuncs;
struct mail_user *
-raw_storage_create_from_set(const struct setting_parser_info *set_info,
+raw_storage_create_from_set(const struct setting_parser_context *unexpanded_set_parser,
+ const struct setting_parser_info *set_info,
const struct mail_user_settings *set);
int raw_mailbox_alloc_stream(struct mail_user *user, struct istream *input,
}
owner = mail_user_alloc(event_get_parent(user->event), userdomain,
- user->set_info, user->unexpanded_set);
+ user->unexpanded_set_parser, user->set_info,
+ user->unexpanded_set);
owner->_service_user = user->_service_user;
mail_storage_service_user_ref(owner->_service_user);
owner->creator = user;
/* NOTE: if more user initialization is added, add it also to
mail_user_dup() */
mail_user = mail_user_alloc_nodup_set(user->event, user->input.username,
- user->user_info, user->user_set);
+ user->set_parser, user->user_info,
+ user->user_set);
mail_user->_service_user = user;
mail_storage_service_user_ref(user);
mail_user_set_home(mail_user, *home == '\0' ? NULL : home);
static struct mail_user *
mail_user_alloc_int(struct event *parent_event,
const char *username,
+ const struct setting_parser_context *unexpanded_set_parser,
const struct setting_parser_info *set_info,
const struct mail_user_settings *set, pool_t pool)
{
user->pool = pool;
user->refcount = 1;
user->username = p_strdup(pool, username);
+ user->unexpanded_set_parser = unexpanded_set_parser;
+ user->set_parser = settings_parser_dup(unexpanded_set_parser, pool);
user->set_info = set_info;
user->unexpanded_set = set;
- user->set = settings_dup_with_pointers(set_info, user->unexpanded_set, pool);
+ user->set = settings_parser_get_root_set(user->set_parser,
+ &mail_user_setting_parser_info);
user->service = master_service_get_name(master_service);
user->default_normalizer = uni_utf8_to_decomposed_titlecase;
user->session_create_time = ioloop_time;
struct mail_user *
mail_user_alloc_nodup_set(struct event *parent_event,
const char *username,
+ const struct setting_parser_context *unexpanded_set_parser,
const struct setting_parser_info *set_info,
const struct mail_user_settings *set)
{
pool_t pool;
pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
- return mail_user_alloc_int(parent_event, username, set_info, set, pool);
+ return mail_user_alloc_int(parent_event, username,
+ unexpanded_set_parser, set_info, set, pool);
}
struct mail_user *mail_user_alloc(struct event *parent_event,
const char *username,
+ const struct setting_parser_context *unexpanded_set_parser,
const struct setting_parser_info *set_info,
const struct mail_user_settings *set)
{
pool_t pool;
pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
- return mail_user_alloc_int(parent_event, username, set_info,
+ return mail_user_alloc_int(parent_event, username,
+ settings_parser_dup(unexpanded_set_parser, pool),
+ set_info,
settings_dup(set_info, set, pool), pool);
}
struct mail_user *user2;
user2 = mail_user_alloc(event_get_parent(user->event), user->username,
- user->set_info, user->unexpanded_set);
+ user->unexpanded_set_parser, user->set_info,
+ user->unexpanded_set);
if (user2->_service_user != NULL) {
user2->_service_user = user->_service_user;
mail_storage_service_user_ref(user2->_service_user);
This could be set by plugins that need to fail the initialization. */
const char *error;
+ const struct setting_parser_context *unexpanded_set_parser;
+ const struct setting_parser_context *set_parser;
const struct setting_parser_info *set_info;
const struct mail_user_settings *unexpanded_set;
struct mail_user_settings *set;
struct mail_user *mail_user_alloc(struct event *parent_event,
const char *username,
+ const struct setting_parser_context *unexpanded_set_parser,
const struct setting_parser_info *set_info,
const struct mail_user_settings *set);
struct mail_user *
mail_user_alloc_nodup_set(struct event *parent_event,
const char *username,
+ const struct setting_parser_context *set_parser,
const struct setting_parser_info *set_info,
const struct mail_user_settings *set);
/* Returns -1 if settings were invalid. */
module_dir_init(mail_storage_service_modules);
}
-static void client_raw_user_create(struct client *client)
+static void
+client_raw_user_create(struct client *client,
+ const struct setting_parser_context *set_parser)
{
const struct mail_user_settings *user_set;
user_set = master_service_settings_get_root_set(master_service,
&mail_user_setting_parser_info);
client->raw_mail_user =
- raw_storage_create_from_set(client->user_set_info, user_set);
+ raw_storage_create_from_set(set_parser,
+ client->user_set_info, user_set);
}
static void client_read_settings(struct client *client, bool ssl)
&set_parser, &error) < 0)
i_fatal("%s", error);
+ /* create raw user before duplicating the settings parser */
+ client_raw_user_create(client, set_parser);
+
set_parser = settings_parser_dup(set_parser, client->pool);
lmtp_settings_get(set_parser, client->pool, &lmtp_set, &lda_set);
const struct var_expand_table *tab =
event_add_category(client->event, &event_category_lmtp);
client_read_settings(client, conn_tls);
- client_raw_user_create(client);
client_load_modules(client);
client->my_domain = client->unexpanded_lda_set->hostname;