]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: Convert imap_id_send to a strlist setting
authorKarl Fleischmann <karl.fleischmann@open-xchange.com>
Tue, 16 Jan 2024 12:32:42 +0000 (13:32 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:12 +0000 (12:34 +0200)
src/imap-login/imap-login-cmd-id.c
src/imap/cmd-id.c
src/imap/imap-settings.c
src/imap/imap-settings.h
src/lib-imap/imap-id.c
src/lib-imap/imap-id.h

index 77ce670b81252e5233edb14bda53bd4bf836f021..572f933da64d5b3b99baa40f6f420c7afb39aa7e 100644 (file)
@@ -287,8 +287,6 @@ static void cmd_id_copy_params(struct imap_client *client,
 
 static void cmd_id_finish(struct imap_client *client)
 {
-       const char *id_param_string;
-
        if (!client->id_logged) {
                client->id_logged = TRUE;
 
@@ -301,10 +299,9 @@ static void cmd_id_finish(struct imap_client *client)
                }
        }
 
-       id_param_string = t_array_const_string_join(&client->set->imap_id_send, " ");
        client_send_raw(&client->common,
                t_strdup_printf("* ID %s\r\n",
-                       imap_id_reply_generate(id_param_string)));
+                       imap_id_reply_generate(&client->set->imap_id_send)));
        const char *msg = "ID completed.";
        if (client->common.connection_trusted) {
                if (client->cmd_id->params->multiplex &&
index 70212d9f46666989838d8d4723b5bcf8540b0e0f..39af3158cff88ee3258e228f7ebc689a568a4034 100644 (file)
@@ -64,7 +64,7 @@ bool cmd_id(struct client_command_context *cmd)
        }
 
        client_send_line(cmd->client, t_strdup_printf(
-               "* ID %s", imap_id_reply_generate(set->imap_id_send)));
+               "* ID %s", imap_id_reply_generate(&set->imap_id_send)));
        client_send_tagline(cmd, "OK ID completed.");
        return TRUE;
 }
index b4621134be01810ea34224b8b80975e5b49271f3..98d58399cd0f9e96ee98bbc27e7012373c738fae 100644 (file)
@@ -63,7 +63,6 @@ static const struct setting_define imap_setting_defines[] = {
        DEF(STR, imap_capability),
        DEF(STR, imap_client_workarounds),
        DEF(STR_NOVARS, imap_logout_format),
-       DEF(STR, imap_id_send),
        DEF(ENUM, imap_fetch_failure),
        DEF(BOOL, imap_metadata),
        DEF(BOOL, imap_literal_minus),
@@ -74,6 +73,9 @@ static const struct setting_define imap_setting_defines[] = {
        DEF(STR, imap_urlauth_host),
        DEF(IN_PORT, imap_urlauth_port),
 
+       { .type = SET_STRLIST, .key = "imap_id_send",
+         .offset = offsetof(struct imap_settings, imap_id_send) },
+
        SETTING_DEFINE_LIST_END
 };
 
@@ -92,7 +94,7 @@ static const struct imap_settings imap_default_settings = {
                "expunged=%{expunged} trashed=%{trashed} "
                "hdr_count=%{fetch_hdr_count} hdr_bytes=%{fetch_hdr_bytes} "
                "body_count=%{fetch_body_count} body_bytes=%{fetch_body_bytes}",
-       .imap_id_send = "name *",
+       .imap_id_send = ARRAY_INIT,
        .imap_fetch_failure = "disconnect-immediately:disconnect-after:no-after",
        .imap_metadata = FALSE,
        .imap_literal_minus = FALSE,
@@ -106,11 +108,17 @@ static const struct imap_settings imap_default_settings = {
        .imap_urlauth_port = 143
 };
 
+static const struct setting_keyvalue imap_default_settings_keyvalue[] = {
+       { "imap_id_send/name", DOVECOT_NAME },
+       { NULL, NULL },
+};
+
 const struct setting_parser_info imap_setting_parser_info = {
        .name = "imap",
 
        .defines = imap_setting_defines,
        .defaults = &imap_default_settings,
+       .default_settings = imap_default_settings_keyvalue,
 
        .struct_size = sizeof(struct imap_settings),
        .pool_offset1 = 1 + offsetof(struct imap_settings, pool),
index ef62eae02b795a32c23cfa37c221ed951484e1b9..dfa583bf5da9d34af74702fea187d4762293524c 100644 (file)
@@ -30,11 +30,11 @@ struct imap_settings {
        const char *imap_capability;
        const char *imap_client_workarounds;
        const char *imap_logout_format;
-       const char *imap_id_send;
        const char *imap_fetch_failure;
        bool imap_metadata;
        bool imap_literal_minus;
        unsigned int imap_hibernate_timeout;
+       ARRAY_TYPE(const_string) imap_id_send;
 
        /* imap urlauth: */
        const char *imap_urlauth_host;
index b32061c44a042670975cad7c08ab658ece1995c7..24cdb56574bd3281bc36939323bc58191caf29a3 100644 (file)
@@ -51,81 +51,34 @@ static const char *imap_id_get_default(const char *key)
        return imap_id_get_uname(key);
 }
 
-static const char *
-imap_id_reply_generate_from_imap_args(const struct imap_arg *args)
+const char *imap_id_reply_generate(const ARRAY_TYPE(const_string) *args)
 {
-       string_t *str;
-       const char *key, *value;
-
-       if (IMAP_ARG_IS_EOL(args))
+       if (array_is_empty(args))
                return "NIL";
 
-       str = t_str_new(256);
+       string_t *str = t_str_new(256);
        str_append_c(str, '(');
-       for (; !IMAP_ARG_IS_EOL(args); args++) {
-               if (!imap_arg_get_astring(args, &key)) {
-                       /* broken input */
-                       if (IMAP_ARG_IS_EOL(&args[1]))
-                               break;
-                       args++;
-               } else {
-                       /* key */
-                       if (str_len(str) > 1)
-                               str_append_c(str, ' ');
-                       imap_append_quoted(str, key);
+       unsigned int count;
+       const char *const *kv = array_get(args, &count);
+       for (unsigned int i = 0; i < count; i += 2) {
+               if (i > 0)
                        str_append_c(str, ' ');
-                       /* value */
-                       if (IMAP_ARG_IS_EOL(&args[1])) {
-                               str_append(str, "NIL");
-                               break;
-                       }
-                       args++;
-                       if (!imap_arg_get_astring(args, &value))
-                               value = NULL;
-                       else {
-                               if (strcmp(value, "*") == 0)
-                                       value = imap_id_get_default(key);
+               imap_append_quoted(str, kv[i]);
+               str_append_c(str, ' ');
+               const char *value = kv[i + 1];
+               if (strcmp(value, "*") == 0)
+                       value = imap_id_get_default(kv[i]);
 #if defined(DOVECOT_EDITION)
-                               else if (strcasecmp(key, "name") == 0 &&
-                                        strcmp(DOVECOT_EDITION, "Pro") == 0)
-                                       value = imap_id_get_default(key);
+               else if (strcasecmp(kv[i], "name") == 0 &&
+                        strcmp(DOVECOT_EDITION, "Pro") == 0)
+                       value = imap_id_get_default(kv[i]);
 #endif
-                       }
-                       imap_append_nstring(str, value);
-               }
-       }
-       if (str_len(str) == 1) {
-               /* broken */
-               return "NIL";
+               imap_append_nstring(str, value);
        }
        str_append_c(str, ')');
        return str_c(str);
 }
 
-const char *imap_id_reply_generate(const char *settings)
-{
-       struct istream *input;
-       struct imap_parser *parser;
-       const struct imap_arg *args;
-       const char *ret;
-
-       if (settings == NULL)
-               return "NIL";
-
-       input = i_stream_create_from_data(settings, strlen(settings));
-       (void)i_stream_read(input);
-
-       parser = imap_parser_create(input, NULL, SIZE_MAX);
-       if (imap_parser_finish_line(parser, 0, 0, &args) <= 0)
-               ret = "NIL";
-       else
-               ret = imap_id_reply_generate_from_imap_args(args);
-
-       imap_parser_unref(&parser);
-       i_stream_destroy(&input);
-       return ret;
-}
-
 void
 imap_id_add_log_entry(struct imap_id_log_entry *log_entry, const char *key,
                      const char *value)
index ddf73d7cbd1c4c066c9c14022c96e7e5ca160fd2..cc7adfb2a23c93846f94d8e94741d00ca1f6f685 100644 (file)
@@ -19,7 +19,7 @@ struct imap_id_log_entry {
 #define IMAP_ID_PARAMS_LOG_MAX_LEN 1024
 
 /* Return ID reply based on given settings. */
-const char *imap_id_reply_generate(const char *settings);
+const char *imap_id_reply_generate(const ARRAY_TYPE(const_string) *args);
 /* Format the IMAP ID parameters into string-fields of the given event, and
    into a printable log message. */
 void imap_id_add_log_entry(struct imap_id_log_entry *log_entry,