From: Stephan Bosch Date: Tue, 26 Aug 2025 01:22:02 +0000 (+0200) Subject: lib-imap: imap-envelope - Add UTF8 support for ENVELOPE encoding X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cc586010324897e22a748fd6a360e1d0df1c8e1d;p=thirdparty%2Fdovecot%2Fcore.git lib-imap: imap-envelope - Add UTF8 support for ENVELOPE encoding --- diff --git a/src/lib-imap/imap-bodystructure.c b/src/lib-imap/imap-bodystructure.c index 74a8f651a7..f7a82db45d 100644 --- a/src/lib-imap/imap-bodystructure.c +++ b/src/lib-imap/imap-bodystructure.c @@ -256,7 +256,7 @@ static int part_write_body(const struct message_part *part, child_data = part->children->data; str_append(str, " ("); - imap_envelope_write(child_data->envelope, str); + imap_envelope_write(child_data->envelope, str, 0); str_append(str, ") "); if (part_write_bodystructure_siblings(part->children, str, diff --git a/src/lib-imap/imap-envelope.c b/src/lib-imap/imap-envelope.c index 9211cd9ce9..395e189c70 100644 --- a/src/lib-imap/imap-envelope.c +++ b/src/lib-imap/imap-envelope.c @@ -15,7 +15,9 @@ * Envelope write */ -static void imap_write_address(string_t *str, struct message_address *addr) +static void +imap_write_address(string_t *str, struct message_address *addr, + enum imap_quote_flags qflags) { if (addr == NULL) { str_append(str, "NIL"); @@ -30,14 +32,14 @@ static void imap_write_address(string_t *str, struct message_address *addr) else { imap_append_string_for_humans(str, (const void *)addr->name, strlen(addr->name), - 0); + qflags); } str_append_c(str, ' '); - imap_append_nstring(str, addr->route, 0); + imap_append_nstring(str, addr->route, qflags); str_append_c(str, ' '); - imap_append_nstring(str, addr->mailbox, 0); + imap_append_nstring(str, addr->mailbox, qflags); str_append_c(str, ' '); - imap_append_nstring(str, addr->domain, 0); + imap_append_nstring(str, addr->domain, qflags); str_append_c(str, ')'); addr = addr->next; @@ -45,8 +47,8 @@ static void imap_write_address(string_t *str, struct message_address *addr) str_append_c(str, ')'); } -void imap_envelope_write(struct message_part_envelope *data, - string_t *str) +void imap_envelope_write(struct message_part_envelope *data, string_t *str, + enum imap_quote_flags qflags) { #define NVL(str, nullstr) ((str) != NULL ? (str) : (nullstr)) static const char *empty_envelope = @@ -57,33 +59,33 @@ void imap_envelope_write(struct message_part_envelope *data, return; } - imap_append_nstring_nolf(str, data->date, 0); + imap_append_nstring_nolf(str, data->date, qflags); 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), 0); + strlen(data->subject), qflags); } str_append_c(str, ' '); - imap_write_address(str, data->from.head); + imap_write_address(str, data->from.head, qflags); str_append_c(str, ' '); - imap_write_address(str, NVL(data->sender.head, data->from.head)); + imap_write_address(str, NVL(data->sender.head, data->from.head), qflags); str_append_c(str, ' '); - imap_write_address(str, NVL(data->reply_to.head, data->from.head)); + imap_write_address(str, NVL(data->reply_to.head, data->from.head), qflags); str_append_c(str, ' '); - imap_write_address(str, data->to.head); + imap_write_address(str, data->to.head, qflags); str_append_c(str, ' '); - imap_write_address(str, data->cc.head); + imap_write_address(str, data->cc.head, qflags); str_append_c(str, ' '); - imap_write_address(str, data->bcc.head); + imap_write_address(str, data->bcc.head, qflags); str_append_c(str, ' '); - imap_append_nstring_nolf(str, data->in_reply_to, 0); + imap_append_nstring_nolf(str, data->in_reply_to, qflags); str_append_c(str, ' '); - imap_append_nstring_nolf(str, data->message_id, 0); + imap_append_nstring_nolf(str, data->message_id, qflags); } /* diff --git a/src/lib-imap/imap-envelope.h b/src/lib-imap/imap-envelope.h index f9e4c0bdd2..a33d30ffc5 100644 --- a/src/lib-imap/imap-envelope.h +++ b/src/lib-imap/imap-envelope.h @@ -1,12 +1,14 @@ #ifndef IMAP_ENVELOPE_H #define IMAP_ENVELOPE_H +#include "imap-quote.h" + struct imap_arg; struct message_part_envelope; /* Write envelope to given string */ -void imap_envelope_write(struct message_part_envelope *data, - string_t *str); +void imap_envelope_write(struct message_part_envelope *data, string_t *str, + enum imap_quote_flags qflags); /* Parse envelope from arguments */ bool imap_envelope_parse_args(const struct imap_arg *args, diff --git a/src/lib-imap/test-imap-envelope.c b/src/lib-imap/test-imap-envelope.c index c9b92b4be2..7fe917a91e 100644 --- a/src/lib-imap/test-imap-envelope.c +++ b/src/lib-imap/test-imap-envelope.c @@ -156,7 +156,7 @@ static void test_imap_envelope_write(void) test_begin(t_strdup_printf("imap envelope write [%u]", i)); envlp = msg_parse(pool, test->message); - imap_envelope_write(envlp, str); + imap_envelope_write(envlp, str, 0); test_assert_idx(strcmp(str_c(str), test->envelope) == 0, i); pool_unref(&pool); @@ -183,7 +183,7 @@ static void test_imap_envelope_parse(void) if (ret) { str_truncate(str, 0); - imap_envelope_write(envlp, str); + imap_envelope_write(envlp, str, 0); test_assert_idx(strcmp(str_c(str), test->envelope) == 0, i); } else { i_error("Invalid envelope: %s", error); diff --git a/src/lib-storage/index/index-mail-headers.c b/src/lib-storage/index/index-mail-headers.c index b5a20edc8a..cf16e39b69 100644 --- a/src/lib-storage/index/index-mail-headers.c +++ b/src/lib-storage/index/index-mail-headers.c @@ -291,7 +291,7 @@ static void index_mail_parse_finish_imap_envelope(struct index_mail *mail) string_t *str; str = str_new(mail->mail.data_pool, 256); - imap_envelope_write(mail->data.envelope_data, str); + imap_envelope_write(mail->data.envelope_data, str, 0); mail->data.envelope = str_c(str); mail->data.save_envelope = FALSE;