From: Karl Fleischmann Date: Tue, 16 Jan 2024 12:32:42 +0000 (+0100) Subject: imap: Convert imap_id_send to a strlist setting X-Git-Tag: 2.4.1~1045 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e5251e98c354d2bbf60e31a7b99d913ce41fb2c;p=thirdparty%2Fdovecot%2Fcore.git imap: Convert imap_id_send to a strlist setting --- diff --git a/src/imap-login/imap-login-cmd-id.c b/src/imap-login/imap-login-cmd-id.c index 77ce670b81..572f933da6 100644 --- a/src/imap-login/imap-login-cmd-id.c +++ b/src/imap-login/imap-login-cmd-id.c @@ -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 && diff --git a/src/imap/cmd-id.c b/src/imap/cmd-id.c index 70212d9f46..39af3158cf 100644 --- a/src/imap/cmd-id.c +++ b/src/imap/cmd-id.c @@ -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; } diff --git a/src/imap/imap-settings.c b/src/imap/imap-settings.c index b4621134be..98d58399cd 100644 --- a/src/imap/imap-settings.c +++ b/src/imap/imap-settings.c @@ -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), diff --git a/src/imap/imap-settings.h b/src/imap/imap-settings.h index ef62eae02b..dfa583bf5d 100644 --- a/src/imap/imap-settings.h +++ b/src/imap/imap-settings.h @@ -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; diff --git a/src/lib-imap/imap-id.c b/src/lib-imap/imap-id.c index b32061c44a..24cdb56574 100644 --- a/src/lib-imap/imap-id.c +++ b/src/lib-imap/imap-id.c @@ -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) diff --git a/src/lib-imap/imap-id.h b/src/lib-imap/imap-id.h index ddf73d7cbd..cc7adfb2a2 100644 --- a/src/lib-imap/imap-id.h +++ b/src/lib-imap/imap-id.h @@ -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,