The following commits change %{home} to stop working in mail_user_settings.
Also, it makes more sense that namespaces are storage-related settings.
return 0;
}
+static int
+get_default_replica_location(struct dsync_cmd_context *ctx,
+ struct mail_storage_service_user *service_user,
+ const char **error_r)
+{
+ struct setting_parser_context *set_parser =
+ mail_storage_service_user_get_settings_parser(service_user);
+ const struct mail_storage_settings *mail_set;
+ if (master_service_settings_parser_get(NULL, set_parser,
+ &mail_storage_setting_parser_info,
+ MASTER_SERVICE_SETTINGS_GET_FLAG_NO_CHECK |
+ MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
+ &mail_set, error_r) < 0)
+ return -1;
+ ctx->local_location = p_strdup(ctx->ctx.pool,
+ mail_user_set_plugin_getenv(mail_set, "mail_replica"));
+ master_service_settings_free(mail_set);
+ return 0;
+}
+
static int cmd_dsync_prerun(struct doveadm_mail_cmd_context *_ctx,
struct mail_storage_service_user *service_user,
const char **error_r)
container_of(_ctx, struct dsync_cmd_context, ctx);
const char *const *remote_cmd_args = NULL;
- const struct mail_user_settings *user_set;
const char *username = "";
- user_set = mail_storage_service_user_get_set(service_user);
-
ctx->fd_in = -1;
ctx->fd_out = -1;
ctx->fd_err = -1;
ctx->remote_name = "remote";
if (ctx->default_replica_location) {
- ctx->local_location =
- mail_user_set_plugin_getenv(user_set, "mail_replica");
+ if (get_default_replica_location(ctx, service_user, error_r) < 0)
+ return -1;
+
if (ctx->local_location == NULL ||
*ctx->local_location == '\0') {
*error_r = "User has no mail_replica in userdb";
*/
/* no namespaces => no special use flags */
- if (!array_is_created(&user->set->namespaces))
+ const struct mail_storage_settings *mail_set =
+ mail_user_set_get_storage_set(user);
+ if (!array_is_created(&mail_set->namespaces))
return FALSE;
- array_foreach_elem(&user->set->namespaces, ns_set) {
+ array_foreach_elem(&mail_set->namespaces, ns_set) {
struct mailbox_settings *box_set;
/* no mailboxes => no special use flags */
namespaces = NULL; ns_p = &namespaces;
- if (array_is_created(&user->set->namespaces))
- ns_set = array_get(&user->set->namespaces, &count);
+ const struct mail_storage_settings *mail_set =
+ mail_user_set_get_storage_set(user);
+ if (array_is_created(&mail_set->namespaces))
+ ns_set = array_get(&mail_set->namespaces, &count);
else {
ns_set = NULL;
count = 0;
static bool mail_user_settings_expand_check(void *_set, pool_t pool ATTR_UNUSED, const char **error_r);
#undef DEF
+#undef DEFLIST_UNIQUE
#define DEF(type, name) \
SETTING_DEFINE_STRUCT_##type(#name, name, struct mail_storage_settings)
+#define DEFLIST_UNIQUE(field, name, defines) \
+ { .type = SET_DEFLIST_UNIQUE, .key = name, \
+ .offset = offsetof(struct mail_storage_settings, field), \
+ .list_info = defines }
static const struct setting_define mail_storage_setting_defines[] = {
DEF(STR_VARS, mail_location),
DEF(STR, recipient_delimiter),
+ DEFLIST_UNIQUE(namespaces, "namespace", &mail_namespace_setting_parser_info),
+ { .type = SET_STRLIST, .key = "plugin",
+ .offset = offsetof(struct mail_storage_settings, plugin_envs) },
+
SETTING_DEFINE_LIST_END
};
.pop3_uidl_format = "%08Xu%08Xv",
.recipient_delimiter = "+",
+
+ .namespaces = ARRAY_INIT,
+ .plugin_envs = ARRAY_INIT,
};
const struct setting_parser_info mail_storage_setting_parser_info = {
.type_offset1 = 1 + offsetof(struct mail_namespace_settings, name),
.struct_size = sizeof(struct mail_namespace_settings),
- .parent_offset1 = 1 + offsetof(struct mail_namespace_settings, user_set),
- .parent = &mail_user_setting_parser_info,
+ .parent_offset1 = 1 + offsetof(struct mail_namespace_settings, mail_set),
+ .parent = &mail_storage_setting_parser_info,
.check_func = namespace_settings_check
};
#undef DEF
-#undef DEFLIST_UNIQUE
#define DEF(type, name) \
SETTING_DEFINE_STRUCT_##type(#name, name, struct mail_user_settings)
-#define DEFLIST_UNIQUE(field, name, defines) \
- { .type = SET_DEFLIST_UNIQUE, .key = name, \
- .offset = offsetof(struct mail_user_settings, field), \
- .list_info = defines }
static const struct setting_define mail_user_setting_defines[] = {
DEF(STR, base_dir),
DEF(STR, hostname),
DEF(STR_VARS, postmaster_address),
- DEFLIST_UNIQUE(namespaces, "namespace", &mail_namespace_setting_parser_info),
- { .type = SET_STRLIST, .key = "plugin",
- .offset = offsetof(struct mail_user_settings, plugin_envs) },
-
SETTING_DEFINE_LIST_END
};
.hostname = "",
.postmaster_address = "postmaster@%{if;%d;ne;;%d;%{hostname}}",
-
- .namespaces = ARRAY_INIT,
- .plugin_envs = ARRAY_INIT
};
const struct setting_parser_info mail_user_setting_parser_info = {
}
if (ns->alias_for != NULL && !ns->disabled) {
- if (array_is_created(&ns->user_set->namespaces)) {
- namespaces = array_get(&ns->user_set->namespaces,
+ if (array_is_created(&ns->mail_set->namespaces)) {
+ namespaces = array_get(&ns->mail_set->namespaces,
&count);
} else {
namespaces = NULL;
const char *mail_attachment_detection_options;
+ ARRAY(struct mail_namespace_settings *) namespaces;
+ ARRAY(const char *) plugin_envs;
+
enum file_lock_method parsed_lock_method;
enum fsync_mode parsed_fsync_mode;
const char *unexpanded_mail_location;
unsigned int order;
ARRAY(struct mailbox_settings *) mailboxes;
- struct mail_user_settings *user_set;
+ struct mail_storage_settings *mail_set;
const char *unexpanded_location;
};
const char *hostname;
const char *postmaster_address;
- ARRAY(struct mail_namespace_settings *) namespaces;
- ARRAY(const char *) plugin_envs;
-
/* May be NULL - use mail_storage_get_postmaster_address() instead of
directly accessing this. */
const struct message_address *_parsed_postmaster_address;
}
static void
-mail_user_expand_plugins_envs(struct mail_user *user)
+mail_user_expand_plugins_envs(struct mail_user *user,
+ struct mail_storage_settings *set)
{
const char **envs, *home, *error;
string_t *str;
unsigned int i, count;
- if (!array_is_created(&user->set->plugin_envs))
+ if (!array_is_created(&set->plugin_envs))
return;
str = t_str_new(256);
- envs = array_get_modifiable(&user->set->plugin_envs, &count);
+ envs = array_get_modifiable(&set->plugin_envs, &count);
i_assert((count % 2) == 0);
for (i = 0; i < count; i += 2) {
if (user->_home == NULL &&
}
}
+ struct mail_storage_settings *mail_set =
+ settings_parser_get_root_set(user->set_parser,
+ &mail_storage_setting_parser_info);
user->settings_expanded = TRUE;
- mail_user_expand_plugins_envs(user);
+ mail_user_expand_plugins_envs(user, mail_set);
user->ssl_set = p_new(user->pool, struct ssl_iostream_settings, 1);
if (user->error == NULL &&
bool mail_user_plugin_getenv_bool(struct mail_user *user, const char *name)
{
- return mail_user_set_plugin_getenv_bool(user->set, name);
+ const struct mail_storage_settings *mail_set =
+ mail_user_set_get_storage_set(user);
+ return mail_user_set_plugin_getenv_bool(mail_set, name);
}
-bool mail_user_set_plugin_getenv_bool(const struct mail_user_settings *set,
+bool mail_user_set_plugin_getenv_bool(const struct mail_storage_settings *set,
const char *name)
{
const char *env = mail_user_set_plugin_getenv(set, name);
const char *mail_user_plugin_getenv(struct mail_user *user, const char *name)
{
- return mail_user_set_plugin_getenv(user->set, name);
+ const struct mail_storage_settings *mail_set =
+ mail_user_set_get_storage_set(user);
+ return mail_user_set_plugin_getenv(mail_set, name);
}
-const char *mail_user_set_plugin_getenv(const struct mail_user_settings *set,
+const char *mail_user_set_plugin_getenv(const struct mail_storage_settings *set,
const char *name)
{
const char *const *envs;
/* If name exists in plugin_envs, return its value. */
const char *mail_user_plugin_getenv(struct mail_user *user, const char *name);
bool mail_user_plugin_getenv_bool(struct mail_user *user, const char *name);
-const char *mail_user_set_plugin_getenv(const struct mail_user_settings *set,
+const char *mail_user_set_plugin_getenv(const struct mail_storage_settings *set,
const char *name);
-bool mail_user_set_plugin_getenv_bool(const struct mail_user_settings *set,
+bool mail_user_set_plugin_getenv_bool(const struct mail_storage_settings *set,
const char *name);
/* Add more namespaces to user's namespaces. The ->next pointers may be
};
struct mail_storage_service_input input;
struct setting_parser_context *set_parser;
- const struct mail_user_settings *user_set;
+ const struct mail_storage_settings *mail_set;
const char *value, *error;
clients = connection_list_init(&client_set, &client_vfuncs);
i_fatal("%s", error);
if (master_service_settings_parser_get(NULL, set_parser,
- &mail_user_setting_parser_info,
+ &mail_storage_setting_parser_info,
MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
- &user_set, &error) < 0)
+ &mail_set, &error) < 0)
i_fatal("%s", error);
quota_status_settings = master_service_settings_get_or_fatal(NULL,
"a_status_setting_parser_info);
- value = mail_user_set_plugin_getenv(user_set, "quota_status_nouser");
+ value = mail_user_set_plugin_getenv(mail_set, "quota_status_nouser");
nouser_reply = i_strdup(value != NULL ? value : "REJECT Unknown user");
- master_service_settings_free(user_set);
+ master_service_settings_free(mail_set);
}
static void main_deinit(void)