mod_set.binary_name = "doveadm";
/* load all configured mail plugins */
- mail_storage_service_modules =
- module_dir_load_missing(mail_storage_service_modules,
- doveadm_settings->mail_plugin_dir,
- t_strsplit_spaces(doveadm_settings->mail_plugins, ", "),
- &mod_set);
+ if (array_is_created(&doveadm_settings->mail_plugins) &&
+ array_not_empty(&doveadm_settings->mail_plugins)) {
+ mail_storage_service_modules =
+ module_dir_load_missing(mail_storage_service_modules,
+ doveadm_settings->mail_plugin_dir,
+ array_front(&doveadm_settings->mail_plugins),
+ &mod_set);
+ }
/* keep mail_storage_init() referenced so that its _deinit() doesn't
try to free doveadm plugins' hooks too early. */
mail_storage_init();
static const struct setting_define doveadm_setting_defines[] = {
DEF(STR_HIDDEN, base_dir),
DEF(STR_HIDDEN, libexec_dir),
- DEF(STR, mail_plugins),
+ DEF(BOOLLIST, mail_plugins),
DEF(STR, mail_plugin_dir),
DEF(STR, mail_temp_dir),
DEF(BOOL, auth_debug),
const struct doveadm_settings doveadm_default_settings = {
.base_dir = PKG_RUNDIR,
.libexec_dir = PKG_LIBEXECDIR,
- .mail_plugins = "",
+ .mail_plugins = ARRAY_INIT,
.mail_plugin_dir = MODULEDIR,
.mail_temp_dir = "/tmp",
.auth_debug = FALSE,
pool_t pool;
const char *base_dir;
const char *libexec_dir;
- const char *mail_plugins;
+ ARRAY_TYPE(const_string) mail_plugins;
const char *mail_plugin_dir;
const char *mail_temp_dir;
bool auth_debug;
{
const struct mail_storage_module_hooks *module_hook;
ARRAY(struct mail_storage_module_hooks) tmp_hooks;
- const char *const *plugins, *name;
+ const char *name;
/* first get all hooks wanted by the user */
t_array_init(&tmp_hooks, array_count(&module_hooks));
- plugins = t_strsplit_spaces(user->set->mail_plugins, ", ");
array_foreach(&module_hooks, module_hook) {
if (!module_hook->forced) {
name = module_get_plugin_name(module_hook->module);
- if (!str_array_find(plugins, name))
+ if (!array_is_created(&user->set->mail_plugins) ||
+ array_lsearch(&user->set->mail_plugins, &name,
+ i_strcmp_p) == NULL)
continue;
}
array_push_back(&tmp_hooks, module_hook);
{
struct module_dir_load_settings mod_set;
- if (*user_set->mail_plugins == '\0')
+ if (!array_is_created(&user_set->mail_plugins) ||
+ array_is_empty(&user_set->mail_plugins))
return 0;
if ((ctx->flags & MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS) != 0)
return 0;
return module_dir_try_load_missing(&mail_storage_service_modules,
user_set->mail_plugin_dir,
- t_strsplit_spaces(user_set->mail_plugins, ", "),
+ array_front(&user_set->mail_plugins),
&mod_set, error_r);
}
}
}
if ((ctx->flags & MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS) != 0 &&
- user_set->mail_plugins[0] != '\0') {
+ array_is_created(&user_set->mail_plugins) &&
+ array_not_empty(&user_set->mail_plugins)) {
/* mail_storage_service_load_modules() already avoids loading
plugins when the _NO_PLUGINS flag is set. However, it's
possible that the plugins are already loaded, because the
DEF(UINT, first_valid_gid),
DEF(UINT, last_valid_gid),
- DEF(STR, mail_plugins),
+ DEF(BOOLLIST, mail_plugins),
DEF(STR, mail_plugin_dir),
DEF(STR, mail_log_prefix),
.first_valid_gid = 1,
.last_valid_gid = 0,
- .mail_plugins = "",
+ .mail_plugins = ARRAY_INIT,
.mail_plugin_dir = MODULEDIR,
.mail_log_prefix = "%s(%u)<%{process:pid}><%{session}>: ",
(void)parse_postmaster_address(set->postmaster_address, pool,
set, &error);
#else
- if (*set->mail_plugins != '\0' &&
+ if (array_is_created(&set->mail_plugins) &&
+ array_not_empty(&set->mail_plugins) &&
faccessat(AT_FDCWD, set->mail_plugin_dir, R_OK | X_OK, AT_EACCESS) < 0) {
*error_r = t_strdup_printf(
"mail_plugin_dir: access(%s) failed: %m",
unsigned int first_valid_uid, last_valid_uid;
unsigned int first_valid_gid, last_valid_gid;
- const char *mail_plugins;
+ ARRAY_TYPE(const_string) mail_plugins;
const char *mail_plugin_dir;
const char *mail_log_prefix;
bool mail_user_is_plugin_loaded(struct mail_user *user, struct module *module)
{
- const char *const *plugins;
bool ret;
- T_BEGIN {
- plugins = t_strsplit_spaces(user->set->mail_plugins, ", ");
- ret = str_array_find(plugins, module_get_plugin_name(module));
+ if (!array_is_created(&user->set->mail_plugins))
+ ret = FALSE;
+ else T_BEGIN {
+ const char *name = module_get_plugin_name(module);
+ ret = array_lsearch(&user->set->mail_plugins, &name,
+ i_strcmp_p) != NULL;
} T_END;
return ret;
}
{
struct module_dir_load_settings mod_set;
+ if (!array_is_created(&client->lmtp_set->mail_plugins) ||
+ array_is_empty(&client->lmtp_set->mail_plugins))
+ return;
i_zero(&mod_set);
mod_set.abi_version = DOVECOT_ABI_VERSION;
mod_set.require_init_funcs = TRUE;
mail_storage_service_modules =
module_dir_load_missing(mail_storage_service_modules,
client->lmtp_set->mail_plugin_dir,
- t_strsplit_spaces(client->lmtp_set->mail_plugins, ", "),
+ array_front(&client->lmtp_set->mail_plugins),
&mod_set);
module_dir_init(mail_storage_service_modules);
}
DEF(STR_HIDDEN, login_greeting),
DEF(STR, login_trusted_networks),
- DEF(STR, mail_plugins),
+ DEF(BOOLLIST, mail_plugins),
DEF(STR, mail_plugin_dir),
SETTING_DEFINE_LIST_END
.login_greeting = PACKAGE_NAME" ready.",
.login_trusted_networks = "",
- .mail_plugins = "",
+ .mail_plugins = ARRAY_INIT,
.mail_plugin_dir = MODULEDIR,
};
const char *login_greeting;
const char *login_trusted_networks;
- const char *mail_plugins;
+ ARRAY_TYPE(const_string) mail_plugins;
const char *mail_plugin_dir;
enum lmtp_hdr_delivery_address parsed_lmtp_hdr_delivery_address;