]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master, lib-storage: Move key+=append and plugin/ handling to lib-master
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 7 Mar 2023 12:19:20 +0000 (14:19 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:20:55 +0000 (14:20 +0200)
This is necessary because all settings roots won't be known after following
changes. The plugin/ handling should eventually go away once all plugin
settings have been converted.

src/lib-master/master-service-settings.c
src/lib-storage/mail-storage-service.c

index a24f97e4b7d02a0bcf7feec3389dd4cae9748eba..87526ab5fa73d91f0d7176a6da347af8dddf3ce1 100644 (file)
@@ -1053,6 +1053,31 @@ int master_service_set(struct master_service_settings_instance *instance,
                return 1;
        }
 
+       const char *append_value = NULL;
+       size_t len = strlen(key);
+       if (len > 0 && key[len-1] == '+') {
+               /* key+=value */
+               append_value = value;
+               key = t_strndup(key, len-1);
+       }
+
+       enum setting_type value_type;
+       const void *old_value =
+               master_service_settings_find(instance, key, &value_type);
+       if (old_value == NULL && !str_begins_with(key, "plugin/")) {
+               /* assume it's a plugin setting */
+               key = t_strconcat("plugin/", key, NULL);
+               old_value = master_service_settings_find(instance, key, &value_type);
+       }
+
+       if (append_value != NULL) {
+               if (old_value == NULL || value_type != SET_STR) {
+                       *error_r = "'+' can only be used for strings";
+                       return -1;
+               }
+               const char *const *strp = old_value;
+               value = t_strconcat(*strp, append_value, NULL);
+       }
 
        ret = settings_parse_keyvalue(instance->parser, key, value);
        if (ret <= 0)
index 07c2c37150527741b8e4ab0d4f366ec974ccbf4f..cd720b3aea0471d2a96b0097d0694c3891a4bdc4 100644 (file)
@@ -108,38 +108,12 @@ static int set_keyvalue(struct mail_storage_service_user *user,
                        const char *key, const char *value,
                        const char **error_r)
 {
-       const char *append_value = NULL;
-       const void *old_value;
-       enum setting_type type;
-       size_t len;
        int ret;
 
-       len = strlen(key);
-       if (len > 0 && key[len-1] == '+') {
-               /* key+=value */
-               append_value = value;
-               key = t_strndup(key, len-1);
-       }
        /* Ignore empty keys rather than prepend 'plugin/=' to them. */
        if (*key == '\0')
                return 1;
 
-       old_value = master_service_settings_find(user->set_instance, key, &type);
-       if (old_value == NULL && !str_begins_with(key, "plugin/")) {
-               /* assume it's a plugin setting */
-               key = t_strconcat("plugin/", key, NULL);
-               old_value = master_service_settings_find(user->set_instance, key, &type);
-       }
-
-       if (append_value != NULL) {
-               if (old_value == NULL || type != SET_STR) {
-                       *error_r = "'+' can only be used for strings";
-                       return -1;
-               }
-               const char *const *strp = old_value;
-               value = t_strconcat(*strp, append_value, NULL);
-       }
-
        ret = master_service_set(user->set_instance, key, value,
                                 MASTER_SERVICE_SET_TYPE_USERDB, error_r);
        if (ret < 0)