From: Timo Sirainen Date: Wed, 7 Jun 2023 11:09:31 +0000 (+0300) Subject: lib-storage: Change "mail_plugins" setting to boolean-list X-Git-Tag: 2.4.1~1557 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56dbbbb75067b31df41f16ff37ff4def96870fa9;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Change "mail_plugins" setting to boolean-list --- diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 7162ebde08..f704597c66 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -839,11 +839,14 @@ void doveadm_mail_init_finish(void) 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(); diff --git a/src/doveadm/doveadm-settings.c b/src/doveadm/doveadm-settings.c index 8b51875927..17b2695ea3 100644 --- a/src/doveadm/doveadm-settings.c +++ b/src/doveadm/doveadm-settings.c @@ -57,7 +57,7 @@ const struct setting_keyvalue doveadm_service_settings_defaults[] = { 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), @@ -87,7 +87,7 @@ static const struct setting_define doveadm_setting_defines[] = { 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, diff --git a/src/doveadm/doveadm-settings.h b/src/doveadm/doveadm-settings.h index 84adf52d55..e54023cff1 100644 --- a/src/doveadm/doveadm-settings.h +++ b/src/doveadm/doveadm-settings.h @@ -16,7 +16,7 @@ struct doveadm_settings { 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; diff --git a/src/lib-storage/mail-storage-hooks.c b/src/lib-storage/mail-storage-hooks.c index aa1d8496a7..98a256d878 100644 --- a/src/lib-storage/mail-storage-hooks.c +++ b/src/lib-storage/mail-storage-hooks.c @@ -127,15 +127,16 @@ static void mail_user_add_plugin_hooks(struct mail_user *user) { 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); diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 967a8a6cae..f00fdd7faf 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -938,7 +938,8 @@ mail_storage_service_load_modules(struct mail_storage_service_ctx *ctx, { 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; @@ -952,7 +953,7 @@ mail_storage_service_load_modules(struct mail_storage_service_ctx *ctx, 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); } @@ -1211,7 +1212,8 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx, } } 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 diff --git a/src/lib-storage/mail-storage-settings.c b/src/lib-storage/mail-storage-settings.c index 90ede81df6..95cbe1b361 100644 --- a/src/lib-storage/mail-storage-settings.c +++ b/src/lib-storage/mail-storage-settings.c @@ -285,7 +285,7 @@ static const struct setting_define mail_user_setting_defines[] = { 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), @@ -315,7 +315,7 @@ static const struct mail_user_settings mail_user_default_settings = { .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}>: ", @@ -836,7 +836,8 @@ static bool mail_user_settings_check(void *_set, pool_t pool ATTR_UNUSED, (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", diff --git a/src/lib-storage/mail-storage-settings.h b/src/lib-storage/mail-storage-settings.h index 39bbc0e3ea..a047a452a1 100644 --- a/src/lib-storage/mail-storage-settings.h +++ b/src/lib-storage/mail-storage-settings.h @@ -137,7 +137,7 @@ struct mail_user_settings { 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; diff --git a/src/lib-storage/mail-user.c b/src/lib-storage/mail-user.c index e6e41ab091..d5b09878c2 100644 --- a/src/lib-storage/mail-user.c +++ b/src/lib-storage/mail-user.c @@ -494,12 +494,14 @@ int mail_user_get_home(struct mail_user *user, const char **home_r) 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; } diff --git a/src/lmtp/lmtp-client.c b/src/lmtp/lmtp-client.c index b31bc081e4..d1431dd3e7 100644 --- a/src/lmtp/lmtp-client.c +++ b/src/lmtp/lmtp-client.c @@ -84,6 +84,9 @@ static void client_load_modules(struct client *client) { 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; @@ -93,7 +96,7 @@ static void client_load_modules(struct client *client) 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); } diff --git a/src/lmtp/lmtp-settings.c b/src/lmtp/lmtp-settings.c index e876808cbb..3b9919f654 100644 --- a/src/lmtp/lmtp-settings.c +++ b/src/lmtp/lmtp-settings.c @@ -64,7 +64,7 @@ static const struct setting_define lmtp_setting_defines[] = { 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 @@ -86,7 +86,7 @@ static const struct lmtp_settings lmtp_default_settings = { .login_greeting = PACKAGE_NAME" ready.", .login_trusted_networks = "", - .mail_plugins = "", + .mail_plugins = ARRAY_INIT, .mail_plugin_dir = MODULEDIR, }; diff --git a/src/lmtp/lmtp-settings.h b/src/lmtp/lmtp-settings.h index c6b16fb73a..6ff96dd2b4 100644 --- a/src/lmtp/lmtp-settings.h +++ b/src/lmtp/lmtp-settings.h @@ -35,7 +35,7 @@ struct lmtp_settings { 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;