]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Change "mail_plugins" setting to boolean-list
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 7 Jun 2023 11:09:31 +0000 (14:09 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:09 +0000 (12:34 +0200)
src/doveadm/doveadm-mail.c
src/doveadm/doveadm-settings.c
src/doveadm/doveadm-settings.h
src/lib-storage/mail-storage-hooks.c
src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage-settings.c
src/lib-storage/mail-storage-settings.h
src/lib-storage/mail-user.c
src/lmtp/lmtp-client.c
src/lmtp/lmtp-settings.c
src/lmtp/lmtp-settings.h

index 7162ebde08a69051114a49f61979a662f5852a84..f704597c66dbf0abd93b0cb4f8bbbf45cd605143 100644 (file)
@@ -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();
index 8b518759278170ea24651bcc1d11bef4ff528105..17b2695ea30a80aafeb9dd15b9ffa0600aa0d7af 100644 (file)
@@ -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,
index 84adf52d5505c107f130f905fb4f043ef3e6849b..e54023cff19234b2abe2680c8f54f3ecc65d47a9 100644 (file)
@@ -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;
index aa1d8496a788e848f50b5d8f0c12a07b7cad01fc..98a256d878b2e3f3da2b683d9af590e77537d865 100644 (file)
@@ -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);
index 967a8a6cae6ed1841114ede9971d1883b49bf894..f00fdd7faf905f9fa6ca1010514796a85b7ec3ee 100644 (file)
@@ -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
index 90ede81df6afac816be36fd62986722ccbfde93a..95cbe1b361d28f9154a5c179ba41b532fbefb72a 100644 (file)
@@ -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",
index 39bbc0e3eafedec3ac34fe129ed17ffb81642a92..a047a452a1abc8cf918cb1c10eca6b5e62a356ee 100644 (file)
@@ -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;
index e6e41ab09147f30d6277ce4ed8a7535acc330ee7..d5b09878c2ccceed4c8a7442c742758f0923f169 100644 (file)
@@ -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;
 }
index b31bc081e4d5623c9ae0fd2f8aa913f0b1c31b49..d1431dd3e779f375a3ee00b723e97f2b9d09f818 100644 (file)
@@ -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);
 }
index e876808cbbb5c453c69311c13ac69573031725d9..3b9919f654e5a187f06867dcc34d75a21fc87c49 100644 (file)
@@ -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,
 };
 
index c6b16fb73abc532496ef63915fa85fbfffde18b0..6ff96dd2b4a224826ce9dc5f02dc59cc7ffbafe1 100644 (file)
@@ -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;