static void cmd_id_finish(struct imap_client *client)
{
- const char *id_param_string;
-
if (!client->id_logged) {
client->id_logged = TRUE;
}
}
- 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 &&
}
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;
}
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),
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
};
"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,
.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),
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;
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)
#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,