} else {
str_append_c(client->common.client_id, ' ');
}
- imap_append_quoted(client->common.client_id, key);
+ imap_append_quoted(client->common.client_id, key, 0);
str_append_c(client->common.client_id, ' ');
if (value == NULL)
str_append(client->common.client_id, "NIL");
else
- imap_append_quoted(client->common.client_id, value);
+ imap_append_quoted(client->common.client_id, value, 0);
}
if (!is_login_id_param)
if (client->common.local_name != NULL) {
str_append(str, " \"x-connected-name\" ");
- imap_append_nstring(str, client->common.local_name);
+ imap_append_nstring(str, client->common.local_name, 0);
}
/* append any forward_ variables to request */
NULL);
const char *val = i_strchr_to_next(suffix, '=');
str_append_c(str, ' ');
- imap_append_string(str, key);
+ imap_append_string(str, key, 0);
str_append_c(str, ' ');
- imap_append_nstring(str, val);
+ imap_append_nstring(str, val, 0);
}
}
return -1;
}
str_append(str, "L LOGIN ");
- imap_append_string(str, client->common.proxy_user);
+ imap_append_string(str, client->common.proxy_user, 0);
str_append_c(str, ' ');
- imap_append_string(str, client->common.proxy_password);
+ imap_append_string(str, client->common.proxy_password, 0);
str_append(str, "\r\n");
client->proxy_sent_state |= IMAP_PROXY_SENT_STATE_LOGIN;
}
str_append_c(response, ' ');
- imap_append_astring(response, url);
+ imap_append_astring(response, url, 0);
}
client_send_line(cmd->client, str_c(response));
} else {
if (imap_utf8_to_utf7(mailbox_get_vname(ctx->box), mailbox_mutf7) < 0)
i_unreached();
- imap_append_astring(str, str_c(mailbox_mutf7));
+ imap_append_astring(str, str_c(mailbox_mutf7), 0);
}
str_append(str, " (");
} else {
str_append_c(str, ' ');
}
- imap_append_astring(str, entry);
+ imap_append_astring(str, entry, 0);
return str;
}
list_reply_append_ns_sep_param(str,
mail_namespace_get_sep(info->ns));
str_append_c(str, ' ');
- imap_append_astring(str, str_c(mutf7_name));
+ imap_append_astring(str, str_c(mutf7_name), 0);
mailbox_childinfo2str(ctx, str, flags);
/* send LIST/LSUB response */
str_printfa(str, "%c\" ", ns_sep);
if (*ns_prefix != '\0') {
/* non-hidden namespace, use it as the root name */
- imap_append_astring(str, ns_prefix);
+ imap_append_astring(str, ns_prefix, 0);
} else {
/* Hidden namespace or empty namespace prefix. We could just
return an empty root name, but it's safer to emulate what
if (p == NULL)
str_append(str, "\"\"");
else
- imap_append_astring(str, t_strdup_until(ref, p + 1));
+ imap_append_astring(str, t_strdup_until(ref, p + 1), 0);
}
client_send_line(client, str_c(str));
}
no->ns->prefix);
}
- imap_append_string(str, str_c(mutf7_prefix));
+ imap_append_string(str, str_c(mutf7_prefix), 0);
str_append(str, " \"");
if (ns_sep == '\\')
str_append_c(str, '\\');
str_append_c(str, ns_sep);
str_append(str, "\" ");
- imap_append_astring(str, vname);
+ imap_append_astring(str, vname, 0);
client_send_line(client, str_c(str));
}
int ret;
str_append(response, "* URLFETCH ");
- imap_append_astring(response, reply->url);
+ imap_append_astring(response, reply->url, 0);
if ((reply->flags & IMAP_URLAUTH_FETCH_FLAG_EXTENDED) == 0) {
/* simple */
string_t *response = t_str_new(128);
str_append(response, "* URLFETCH ");
- imap_append_astring(response, reply->url);
+ imap_append_astring(response, reply->url, 0);
str_append(response, " NIL");
client_send_line(client, str_c(response));
if (reply->error != NULL) {
if (args[i].type == IMAP_ARG_ATOM)
str_append(str, value);
else
- imap_append_quoted(str, value);
+ imap_append_quoted(str, value, 0);
}
str_append_c(str, ')');
body->section = str_c(str);
else
str_append(ctx->state.cur_str, " ");
if (ret == 0)
- imap_append_string(ctx->state.cur_str, snippet);
+ imap_append_string(ctx->state.cur_str, snippet, 0);
else
str_append(ctx->state.cur_str, "NIL");
if (preview->old_standard)
return -1;
str_append(ctx->state.cur_str, "X-GUID ");
- imap_append_astring(ctx->state.cur_str, value);
+ imap_append_astring(ctx->state.cur_str, value, 0);
str_append_c(ctx->state.cur_str, ' ');
return 1;
}
i_panic("FETCH: Mailbox name not UTF-8: %s", name);
str_append(ctx->state.cur_str, "X-MAILBOX ");
- imap_append_astring(ctx->state.cur_str, str_c(mutf7_name));
+ imap_append_astring(ctx->state.cur_str, str_c(mutf7_name), 0);
str_append_c(ctx->state.cur_str, ' ');
return 1;
}
if (imap_utf8_to_utf7(vname, mutf7_vname) < 0)
i_panic("Mailbox name not UTF-8: %s", vname);
vname = str_c(mutf7_vname);
- imap_append_astring(str, vname);
+ imap_append_astring(str, vname, 0);
if (rec->old_vname != NULL) {
old_vname = rec->old_vname;
str_truncate(mutf7_vname, 0);
}
old_vname = str_c(mutf7_vname);
str_append(str, " (\"OLDNAME\" (");
- imap_append_astring(str, old_vname);
+ imap_append_astring(str, old_vname, 0);
str_append(str, "))");
}
return client_send_line_next(client, str_c(str));
if (has_tag || processed > 0 || total > 0) {
str_append(str, " (");
if (has_tag)
- imap_append_quoted(str, tag);
+ imap_append_quoted(str, tag, 0);
else
str_append(str, "NIL");
/* too many updates */
string_t *str = t_str_new(256);
str_append(str, "* NO [NOUPDATE ");
- imap_append_quoted(str, ctx->cmd->tag);
+ imap_append_quoted(str, ctx->cmd->tag, 0);
str_append_c(str, ']');
client_send_line(client, str_c(str));
ctx->return_options &= ENUM_NEGATE(SEARCH_RETURN_UPDATE);
str = str_new(default_pool, 1024);
str_append(str, "* ESEARCH (TAG ");
- imap_append_string(str, ctx->cmd->tag);
+ imap_append_string(str, ctx->cmd->tag, 0);
str_append_c(str, ')');
if (ctx->cmd->uid)
str = t_str_new(128);
str_append(str, "* STATUS ");
- imap_append_astring(str, mailbox_mutf7);
+ imap_append_astring(str, mailbox_mutf7, 0);
str_append(str, " (");
prefix_len = str_len(str);
cmd = t_str_new(256);
str_append(cmd, "* ESEARCH (TAG ");
- imap_append_string(cmd, update->tag);
+ imap_append_string(cmd, update->tag, 0);
str_append_c(cmd, ')');
if (update->return_uids)
str_append(cmd, " UID");
const char *arg = va_arg(args, const char *);
if (!need_literal(arg))
- imap_append_quoted(cmd->data, arg);
+ imap_append_quoted(cmd->data, arg, 0);
else if ((cmd->conn->capabilities &
IMAPC_CAPABILITY_LITERALPLUS) != 0) {
str_printfa(cmd->data, "{%zu+}\r\n%s",
if (default_charset &&
strcasecmp(params[i].name, "charset") == 0)
seen_charset = TRUE;
- imap_append_string(str, params[i].name);
+ imap_append_string(str, params[i].name, 0);
str_append_c(str, ' ');
- imap_append_string(str, params[i].value);
+ imap_append_string(str, params[i].value, 0);
}
if (default_charset && !seen_charset) {
if (i > 0)
str_append(str, "NIL");
else {
str_append_c(str, '(');
- imap_append_string(str, data->content_disposition);
+ imap_append_string(str, data->content_disposition, 0);
str_append_c(str, ' ');
params_write(data->content_disposition_params,
i_assert(*lang != NULL);
str_append_c(str, '(');
- imap_append_string(str, *lang);
+ imap_append_string(str, *lang, 0);
lang++;
while (*lang != NULL) {
str_append_c(str, ' ');
- imap_append_string(str, *lang);
+ imap_append_string(str, *lang, 0);
lang++;
}
str_append_c(str, ')');
}
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->content_location);
+ imap_append_nstring_nolf(str, data->content_location, 0);
}
static int part_write_body_multipart(const struct message_part *part,
}
str_append_c(str, ' ');
- imap_append_string(str, data->content_subtype);
+ imap_append_string(str, data->content_subtype, 0);
if (!extended)
return 0;
str_append(str, "\"text\" \"plain\"");
} else {
text = (strcasecmp(data->content_type, "text") == 0);
- imap_append_string(str, data->content_type);
+ imap_append_string(str, data->content_type, 0);
str_append_c(str, ' ');
- imap_append_string(str, data->content_subtype);
+ imap_append_string(str, data->content_subtype, 0);
}
bool part_is_text = (part->flags & MESSAGE_PART_FLAG_TEXT) != 0;
if (text != part_is_text) {
data->content_type_params_count, str, text);
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->content_id);
+ imap_append_nstring_nolf(str, data->content_id, 0);
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->content_description);
+ imap_append_nstring_nolf(str, data->content_description, 0);
str_append_c(str, ' ');
if (data->content_transfer_encoding != NULL)
- imap_append_string(str, data->content_transfer_encoding);
+ imap_append_string(str, data->content_transfer_encoding, 0);
else
str_append(str, "\"7bit\"");
str_printfa(str, " %"PRIuUOFF_T, part->body_size.virtual_size);
/* "md5" ("content disposition" ("disposition" "params"))
("body" "language" "params") "location" */
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->content_md5);
+ imap_append_nstring_nolf(str, data->content_md5, 0);
part_write_bodystructure_common(data, str);
return 0;
}
str_append(str, "NIL");
else {
imap_append_string_for_humans(str,
- (const void *)addr->name, strlen(addr->name));
+ (const void *)addr->name, strlen(addr->name),
+ 0);
}
str_append_c(str, ' ');
- imap_append_nstring(str, addr->route);
+ imap_append_nstring(str, addr->route, 0);
str_append_c(str, ' ');
- imap_append_nstring(str, addr->mailbox);
+ imap_append_nstring(str, addr->mailbox, 0);
str_append_c(str, ' ');
- imap_append_nstring(str, addr->domain);
+ imap_append_nstring(str, addr->domain, 0);
str_append_c(str, ')');
addr = addr->next;
return;
}
- imap_append_nstring_nolf(str, data->date);
+ imap_append_nstring_nolf(str, data->date, 0);
str_append_c(str, ' ');
if (data->subject == NULL)
str_append(str, "NIL");
else {
imap_append_string_for_humans(str,
(const unsigned char *)data->subject,
- strlen(data->subject));
+ strlen(data->subject), 0);
}
str_append_c(str, ' ');
imap_write_address(str, data->bcc.head);
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->in_reply_to);
+ imap_append_nstring_nolf(str, data->in_reply_to, 0);
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->message_id);
+ imap_append_nstring_nolf(str, data->message_id, 0);
}
/*
for (unsigned int i = 0; i < count; i += 2) {
if (i > 0)
str_append_c(str, ' ');
- imap_append_quoted(str, kv[i]);
+ imap_append_quoted(str, kv[i], 0);
str_append_c(str, ' ');
const char *value = kv[i + 1];
#if defined(DOVECOT_EDITION)
strcmp(DOVECOT_EDITION, "Pro") == 0)
value = DOVECOT_NAME;
#endif
- imap_append_nstring(str, value);
+ imap_append_nstring(str, value, 0);
}
str_append_c(str, ')');
return str_c(str);
#include "lib.h"
#include "str.h"
+#include "unichar.h"
#include "imap-arg.h"
#include "imap-quote.h"
quoted-specials. */
#define QUOTED_MAX_ESCAPE_CHARS 4
-void imap_append_string(string_t *dest, const char *src)
+void imap_append_string(string_t *dest, const char *src,
+ enum imap_quote_flags flags)
{
i_assert(src != NULL);
- imap_append_nstring(dest, src);
+ imap_append_nstring(dest, src, flags);
}
-void imap_append_astring(string_t *dest, const char *src)
+void imap_append_astring(string_t *dest, const char *src,
+ enum imap_quote_flags flags)
{
unsigned int i;
for (i = 0; src[i] != '\0'; i++) {
if (!IS_ASTRING_CHAR(src[i])) {
- imap_append_string(dest, src);
+ imap_append_string(dest, src, flags);
return;
}
}
/* don't mix up NIL and "NIL"! */
if (i == 0 || strcasecmp(src, "NIL") == 0)
- imap_append_string(dest, src);
+ imap_append_string(dest, src, flags);
else
str_append(dest, src);
}
buffer_append(dest, src, full_len);
}
-void imap_append_nstring(string_t *dest, const char *src)
+void imap_append_nstring(string_t *dest, const char *src,
+ enum imap_quote_flags flags)
{
unsigned int escape_count = 0;
size_t i;
imap_append_literal(dest, src, i);
return;
default:
- if ((unsigned char)src[i] >= 0x80) {
- imap_append_literal(dest, src, i);
- return;
+ if (HAS_NO_BITS(flags, IMAP_QUOTE_FLAG_UTF8)) {
+ if ((unsigned char)src[i] >= 0x80) {
+ imap_append_literal(dest, src, i);
+ return;
+ }
+ } else {
+ unichar_t chr;
+ int ret;
+
+ ret = uni_utf8_get_char(&src[i], &chr);
+ if (ret <= 0) {
+ imap_append_literal(dest, src, i);
+ return;
+ }
+ i += ret - 1;
}
break;
}
}
- imap_append_quoted(dest, src);
+ imap_append_quoted(dest, src, flags);
}
-static void remove_newlines_and_append(string_t *dest, const char *src)
+static void
+remove_newlines_and_append(string_t *dest, const char *src,
+ enum imap_quote_flags flags)
{
size_t src_len;
string_t *src_nolf;
OR at the end of the string are discarded */
}
}
- imap_append_nstring(dest, str_c(src_nolf));
+ imap_append_nstring(dest, str_c(src_nolf), flags);
}
-void imap_append_nstring_nolf(string_t *dest, const char *src)
+void imap_append_nstring_nolf(string_t *dest, const char *src,
+ enum imap_quote_flags flags)
{
if (src == NULL || strpbrk(src, "\r\n") == NULL)
- imap_append_nstring(dest, src);
+ imap_append_nstring(dest, src, flags);
else if (buffer_get_pool(dest)->datastack_pool)
- remove_newlines_and_append(dest, src);
+ remove_newlines_and_append(dest, src, flags);
else T_BEGIN {
- remove_newlines_and_append(dest, src);
+ remove_newlines_and_append(dest, src, flags);
} T_END;
}
-void imap_append_quoted(string_t *dest, const char *src)
+void imap_append_quoted(string_t *dest, const char *src,
+ enum imap_quote_flags flags)
{
str_append_c(dest, '"');
for (; *src != '\0'; src++) {
str_append_c(dest, *src);
break;
default:
- if ((unsigned char)*src >= 0x80) {
- /* 8bit input not allowed in dquotes */
- break;
- }
+ if (HAS_NO_BITS(flags, IMAP_QUOTE_FLAG_UTF8)) {
+ if ((unsigned char)*src >= 0x80) {
+ /* 8bit input not allowed in dquotes */
+ break;
+ }
+ str_append_c(dest, *src);
+ } else {
+ unichar_t chr;
+ int ret;
- str_append_c(dest, *src);
+ ret = uni_utf8_get_char(src, &chr);
+ if (ret <= 0)
+ break;
+ str_append_data(dest, src, ret);
+ src += ret - 1;
+ }
break;
}
}
}
void imap_append_string_for_humans(string_t *dest,
- const unsigned char *src, size_t size)
+ const unsigned char *src, size_t size,
+ enum imap_quote_flags flags)
{
size_t i, pos, remove_count = 0;
bool whitespace_prefix = TRUE, last_lwsp = TRUE, modify = FALSE;
last_lwsp = FALSE;
break;
default:
- if ((src[i] & 0x80) != 0)
- modify = TRUE;
+ if (HAS_NO_BITS(flags, IMAP_QUOTE_FLAG_UTF8)) {
+ if ((src[i] & 0x80) != 0)
+ modify = TRUE;
+ } else {
+ unichar_t chr;
+ int ret;
+
+ ret = uni_utf8_get_char_n(&src[i], size - i, &chr);
+ if (ret <= 0)
+ modify = TRUE;
+ else
+ i += ret - 1;
+ }
last_lwsp = FALSE;
break;
}
#ifndef IMAP_QUOTE_H
#define IMAP_QUOTE_H
+enum imap_quote_flags {
+ /* This flag indicates that UTF-8 is allowed in quoted strings. When
+ generating IMAP string values with the functions below, the
+ production of quoted strings is preferred, unless characters need to
+ be represented that are not allowed therein. In that case, a literal
+ will be produced. This flag extends the allowed characters with valid
+ UTF-8 sequences. In case of invalid UTF-8, a literal will still be
+ emitted instead. */
+ IMAP_QUOTE_FLAG_UTF8 = BIT(0),
+};
+
/* Append "quoted" or literal. */
-void imap_append_string(string_t *dest, const char *src);
+void imap_append_string(string_t *dest, const char *src,
+ enum imap_quote_flags flags);
/* Append atom, "quoted" or literal. */
-void imap_append_astring(string_t *dest, const char *src);
+void imap_append_astring(string_t *dest, const char *src,
+ enum imap_quote_flags flags);
/* Append NIL, "quoted" or literal. */
-void imap_append_nstring(string_t *dest, const char *src);
+void imap_append_nstring(string_t *dest, const char *src,
+ enum imap_quote_flags flags);
/* Append NIL, "quoted" or literal, CRs and LFs skipped. */
-void imap_append_nstring_nolf(string_t *dest, const char *src);
+void imap_append_nstring_nolf(string_t *dest, const char *src,
+ enum imap_quote_flags flags);
/* Append "quoted". If src has 8bit chars, skip over them. */
-void imap_append_quoted(string_t *dest, const char *src);
+void imap_append_quoted(string_t *dest, const char *src,
+ enum imap_quote_flags flags);
/* Otherwise the same as imap_append_string(), but cleanup the input data
so that it's more readable by humans. This includes converting TABs to
spaces, multiple spaces into a single space and NULs to #0x80. */
void imap_append_string_for_humans(string_t *dest,
- const unsigned char *src, size_t size);
+ const unsigned char *src, size_t size,
+ enum imap_quote_flags flags);
#endif
for (i = 0; i < N_ELEMENTS(tests); i++) {
str_truncate(str, 0);
imap_append_string_for_humans(str, (const void *)tests[i].input,
- strlen(tests[i].input));
+ strlen(tests[i].input), 0);
test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
}
test_end();
{ "\x7f", "\"\x7f\"" },
{ "\x80", "{1}\r\n\x80" },
{ "\xff", "{1}\r\n\xff" },
+ { "außergewöhnlich", "{17}\r\naußergewöhnlich" },
};
string_t *str = t_str_new(128);
unsigned int i;
for (i = 0; i < N_ELEMENTS(tests); i++) {
str_truncate(str, 0);
- imap_append_astring(str, tests[i].input);
+ imap_append_astring(str, tests[i].input, 0);
test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
}
test_end();
for (i = 0; i < N_ELEMENTS(tests); i++) {
str_truncate(str, 0);
- imap_append_nstring(str, tests[i].input);
+ imap_append_nstring(str, tests[i].input, 0);
test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
}
test_end();
string_t *str2 = str_new(default_pool, 1);
str_truncate(str, 0);
- imap_append_nstring_nolf(str, tests[i].input);
+ imap_append_nstring_nolf(str, tests[i].input, 0);
test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
str_truncate(str2, 0);
- imap_append_nstring_nolf(str2, tests[i].input);
+ imap_append_nstring_nolf(str2, tests[i].input, 0);
test_assert_idx(strcmp(tests[i].output, str_c(str2)) == 0, i);
str_free(&str2);
test_end();
}
+static void test_imap_append_string_utf8(void)
+{
+ static const struct {
+ const char *input, *output;
+ } tests[] = {
+ { "", "\"\"" },
+ { "\"\"", "\"\\\"\\\"\"" },
+ { "\"\"\"", "\"\\\"\\\"\\\"\"" },
+ { "\"\"\"\"", "\"\\\"\\\"\\\"\\\"\"" },
+ { "\"\"\"\"\"", "{5}\r\n\"\"\"\"\"" },
+ { "\"\"\"\"\"\"", "{6}\r\n\"\"\"\"\"\"" },
+ { "\r", "{1}\r\n\r" },
+ { "\n", "{1}\r\n\n" },
+ { "\r\n", "{2}\r\n\r\n" },
+ { "\x7f", "\"\x7f\"" },
+ { "\x80", "{1}\r\n\x80" },
+ { "\xff", "{1}\r\n\xff" },
+ { "außergewöhnlich", "\"außergewöhnlich\"" }
+ };
+ string_t *str = t_str_new(128);
+ unsigned int i;
+
+ test_begin("test_imap_append_string_utf8()");
+
+ for (i = 0; i < N_ELEMENTS(tests); i++) {
+ str_truncate(str, 0);
+ imap_append_string(str, tests[i].input, IMAP_QUOTE_FLAG_UTF8);
+ test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i);
+ }
+ test_end();
+}
+
int main(void)
{
static void (*const test_functions[])(void) = {
test_imap_append_astring,
test_imap_append_nstring,
test_imap_append_nstring_nolf,
+ test_imap_append_string_utf8,
NULL
};
return test_run(test_functions);
}
str_append_c(text, ' ');
- imap_append_astring(text, mbname);
+ imap_append_astring(text, mbname, 0);
str_append_c(text, ' ');
if (command == GETMETADATA) {
- imap_append_astring(text, fkey);
+ imap_append_astring(text, fkey, 0);
} else {
str_append_c(text, '(');
- imap_append_astring(text, fkey);
+ imap_append_astring(text, fkey, 0);
str_append_c(text, ' ');
- imap_append_nstring(text, value);
+ imap_append_nstring(text, value, 0);
str_append_c(text, ')');
}
return str_c(text);
for (i = 0; mail->fetching_headers[i] != NULL; i++) {
if (i > 0)
str_append_c(str, ' ');
- imap_append_astring(str, mail->fetching_headers[i]);
+ imap_append_astring(str, mail->fetching_headers[i], 0);
}
str_append(str, ")] ");
mail->header_list_fetched = FALSE;
seqset_builder_deinit(&mbox->pending_copy_request->uidset_builder);
str_append(mbox->pending_copy_cmd, " ");
- imap_append_astring(mbox->pending_copy_cmd, mbox->copy_dest_box);
+ imap_append_astring(mbox->pending_copy_cmd, mbox->copy_dest_box, 0);
imapc_command_send(cmd, str_c(mbox->pending_copy_cmd));
}
case SEARCH_INTHREAD:
str_append(dest, "INTHREAD ");
- imap_append_astring(dest, mail_thread_type_to_str(arg->value.thread_type));
+ imap_append_astring(
+ dest, mail_thread_type_to_str(arg->value.thread_type),
+ 0);
str_append_c(dest, ' ');
mail_search_subargs_to_cmdline(dest, arg->value.subargs, " ");
break;
case SEARCH_MAILBOX:
case SEARCH_MAILBOX_GLOB:
str_append(dest, "MAILBOX ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
return;
case SEARCH_MAILBOX_GUID:
str_append(dest, "MAILBOX-GUID ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
return;
case SEARCH_ALL:
case SEARCH_SEQSET:
str_append(dest, t_str_ucase(arg->hdr_field_name));
else {
str_append(dest, "HEADER ");
- imap_append_astring(dest, arg->hdr_field_name);
+ imap_append_astring(dest, arg->hdr_field_name, 0);
}
str_append_c(dest, ' ');
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_BODY:
str_append(dest, "BODY ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_TEXT:
str_append(dest, "TEXT ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
/* extensions */
break;
case SEARCH_INTHREAD:
str_append(dest, "INTHREAD ");
- imap_append_astring(dest, mail_thread_type_to_str(arg->value.thread_type));
+ imap_append_astring(
+ dest, mail_thread_type_to_str(arg->value.thread_type),
+ 0);
str_append_c(dest, ' ');
if (!mail_search_subargs_to_imap(dest, arg->value.subargs,
"", error_r))
break;
case SEARCH_GUID:
str_append(dest, "X-GUID ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MAILBOX:
*error_r = "SEARCH_MAILBOX can't be written as IMAP";
return FALSE;
case SEARCH_MAILBOX_GLOB:
str_append(dest, "X-MAILBOX ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_REAL_UID:
str_append(dest, "X-REAL-UID ");
break;
case SEARCH_MIME_DESCRIPTION:
str_append(dest, "DESCRIPTION ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_DISPOSITION_TYPE:
str_append(dest, "DISPOSITION TYPE ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_DISPOSITION_PARAM:
str_append(dest, "DISPOSITION PARAM ");
- imap_append_astring(dest, arg->field_name);
+ imap_append_astring(dest, arg->field_name, 0);
str_append_c(dest, ' ');
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_ENCODING:
str_append(dest, "ENCODING ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_ID:
str_append(dest, "ID ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_LANGUAGE:
str_append(dest, "LANGUAGE ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_LOCATION:
str_append(dest, "LOCATION ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_MD5:
str_append(dest, "MD5 ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_TYPE:
str_append(dest, "TYPE ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_SUBTYPE:
str_append(dest, "SUBTYPE ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_PARAM:
str_append(dest, "PARAM ");
- imap_append_astring(dest, arg->field_name);
+ imap_append_astring(dest, arg->field_name, 0);
str_append_c(dest, ' ');
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_HEADER:
str_append(dest, "HEADER ");
- imap_append_astring(dest, arg->field_name);
+ imap_append_astring(dest, arg->field_name, 0);
str_append_c(dest, ' ');
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_BODY:
str_append(dest, "BODY ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_TEXT:
str_append(dest, "TEXT ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_CC:
str_append(dest, "CC ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_BCC:
str_append(dest, "BCC ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_FROM:
str_append(dest, "FROM ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_IN_REPLY_TO:
str_append(dest, "IN-REPLY-TO ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_MESSAGE_ID:
str_append(dest, "MESSAGE-ID ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_REPLY_TO:
str_append(dest, "REPLY-TO ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_SENDER:
str_append(dest, "SENDER ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_SENTBEFORE:
str_append(dest, "SENTBEFORE");
break;
case SEARCH_MIME_SUBJECT:
str_append(dest, "SUBJECT ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_TO:
str_append(dest, "TO ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_DEPTH_EQUAL:
str_printfa(dest, "DEPTH %u", arg->value.number);
break;
case SEARCH_MIME_FILENAME_IS:
str_append(dest, "FILENAME IS ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_FILENAME_CONTAINS:
str_append(dest, "FILENAME CONTAINS ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_FILENAME_BEGINS:
str_append(dest, "FILENAME BEGINS ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
case SEARCH_MIME_FILENAME_ENDS:
str_append(dest, "FILENAME ENDS ");
- imap_append_astring(dest, arg->value.str);
+ imap_append_astring(dest, arg->value.str, 0);
break;
}
return TRUE;
i_unreached();
}
- imap_append_astring(dest, str_c(tmp));
+ imap_append_astring(dest, str_c(tmp), 0);
str_append_c(dest, ' ');
imap_acl_write_rights_list(dest, rights);
}
case IMAP_ACL_CMD_MYRIGHTS:
/* Prepare client untagged reply. */
str_append(reply_r, "* MYRIGHTS ");
- imap_append_astring(reply_r, mailbox);
+ imap_append_astring(reply_r, mailbox, 0);
str_append_c(reply_r, ' ');
str_append(proxy_cmd_str, "MYRIGHTS ");
/* Strip namespace prefix. */
imap_append_astring(proxy_cmd_str,
- imap_acl_get_mailbox_name(ns, mailbox));
+ imap_acl_get_mailbox_name(ns, mailbox),
+ 0);
break;
case IMAP_ACL_CMD_GETACL:
/* Prepare client untagged reply. */
str_append(reply_r, "* ACL ");
- imap_append_astring(reply_r, mailbox);
+ imap_append_astring(reply_r, mailbox, 0);
str_append_c(reply_r, ' ');
str_append(proxy_cmd_str, "GETACL ");
imap_append_astring(proxy_cmd_str,
- imap_acl_get_mailbox_name(ns, mailbox));
+ imap_acl_get_mailbox_name(ns, mailbox),
+ 0);
break;
case IMAP_ACL_CMD_SETACL:
/* No contents in untagged replies for SETACL */
str_append(proxy_cmd_str, "SETACL ");
imap_append_astring(proxy_cmd_str,
- imap_acl_get_mailbox_name(ns, mailbox));
+ imap_acl_get_mailbox_name(ns, mailbox),
+ 0);
str_append_c(proxy_cmd_str, ' ');
str_append(proxy_cmd_str, cmd_args);
/* No contents in untagged replies for DELETEACL */
str_append(proxy_cmd_str, "DELETEACL ");
imap_append_astring(proxy_cmd_str,
- imap_acl_get_mailbox_name(ns, mailbox));
+ imap_acl_get_mailbox_name(ns, mailbox),
+ 0);
str_append_c(proxy_cmd_str, ' ');
str_append(proxy_cmd_str, cmd_args);
str = t_str_new(128);
str_append(str, "* MYRIGHTS ");
- imap_append_astring(str, mutf7_mailbox);
+ imap_append_astring(str, mutf7_mailbox, 0);
str_append_c(str, ' ');
imap_acl_write_rights_list(str, rights);
str = t_str_new(128);
str_append(str, "* ACL ");
- imap_append_astring(str, mailbox);
+ imap_append_astring(str, mailbox, 0);
ret = imap_acl_write_aclobj(str, backend,
acl_mailbox_get_aclobj(box), TRUE,
str = t_str_new(128);
str_append(str, "* LISTRIGHTS ");
- imap_append_astring(str, orig_mailbox);
+ imap_append_astring(str, orig_mailbox, 0);
str_append_c(str, ' ');
- imap_append_astring(str, identifier);
+ imap_append_astring(str, identifier, 0);
str_append_c(str, ' ');
str_append(str, "\"\" l r w s t p i e k x a c d");
}
/* Keep original identifer for proxy_cmd_args */
- imap_append_astring(proxy_cmd_args, identifier);
+ imap_append_astring(proxy_cmd_args, identifier, 0);
str_append_c(proxy_cmd_args, ' ');
/* Append original rights for proxy_cmd_args */
- imap_append_astring(proxy_cmd_args, rights);
+ imap_append_astring(proxy_cmd_args, rights, 0);
ns = imap_acl_find_namespace(cmd, &mailbox);
if (ns == NULL)
return TRUE;
/* Escaped identifer for proxy_cmd_args */
- imap_append_astring(proxy_cmd_args, identifier);
+ imap_append_astring(proxy_cmd_args, identifier, 0);
box = mailbox_alloc(ns->list, mailbox,
MAILBOX_FLAG_READONLY | MAILBOX_FLAG_IGNORE_ACLS);
str_append(str, "* QUOTA ");
name = imap_quota_root_get_name(user, owner, root);
- imap_append_astring(str, name);
+ imap_append_astring(str, name, 0);
str_append(str, " (");
prefix_len = str_len(str);
quotaroot_reply = t_str_new(128);
quota_reply = t_str_new(256);
str_append(quotaroot_reply, "* QUOTAROOT ");
- imap_append_astring(quotaroot_reply, orig_mailbox);
+ imap_append_astring(quotaroot_reply, orig_mailbox, 0);
ret = 0;
iter = quota_root_iter_init(box);
continue;
str_append_c(quotaroot_reply, ' ');
name = imap_quota_root_get_name(client->user, ns->owner, root);
- imap_append_astring(quotaroot_reply, name);
+ imap_append_astring(quotaroot_reply, name, 0);
if (quota_reply_write(quota_reply, client->user, ns->owner, root) < 0)
ret = -1;