]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap: imap-envelope - Add UTF8 support for ENVELOPE encoding
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 26 Aug 2025 01:22:02 +0000 (03:22 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 26 Jan 2026 01:35:25 +0000 (02:35 +0100)
src/lib-imap/imap-bodystructure.c
src/lib-imap/imap-envelope.c
src/lib-imap/imap-envelope.h
src/lib-imap/test-imap-envelope.c
src/lib-storage/index/index-mail-headers.c

index 74a8f651a77b54dda9ad3c753fda4dd4f26fdc68..f7a82db45dbbaba053a592ffdf0f7054b9c00fbb 100644 (file)
@@ -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,
index 9211cd9ce9e256a4430898633ac3d074d707bc87..395e189c70c89734b41c002ddad6801ced22295c 100644 (file)
@@ -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);
 }
 
 /*
index f9e4c0bdd2d29c7cb6e60976fc3052d2d3005eca..a33d30ffc57282e50fdc641f6a4477e8c8500186 100644 (file)
@@ -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,
index c9b92b4be2b42ad916225e13344a0d2288fa8e45..7fe917a91e5ac42c8b24d5433d7b8c670104dbdb 100644 (file)
@@ -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);
index b5a20edc8a88205422e3af89b8cbb968f3c81f14..cf16e39b694faf7d68be4954723679e40dc717c6 100644 (file)
@@ -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;