From 811f84f8e331d4946e050a6e2198c9b186e7eccb Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@dovecot.fi> Date: Sun, 3 Dec 2017 12:52:03 +0100 Subject: [PATCH] lib-sieve: util: rfc2822: Added rfc2822_header_write_address() which allows adding a header with one or more addresses. It applies UTF8 encoding only when the address string somehow contains 8-bit characters. Sieve addresses are supposed to have any UTF8 characters in the phase MIME-encoded, not literal 8-bit characters. However, this has been allowed from the beginning, so disabling the old behavior may break existing installations. This function allows supporting both options. --- src/lib-sieve/util/rfc2822.c | 20 ++++++++++++++++++++ src/lib-sieve/util/rfc2822.h | 4 ++++ 2 files changed, 24 insertions(+) diff --git a/src/lib-sieve/util/rfc2822.c b/src/lib-sieve/util/rfc2822.c index 2bfe388b0..98a6aa631 100644 --- a/src/lib-sieve/util/rfc2822.c +++ b/src/lib-sieve/util/rfc2822.c @@ -242,3 +242,23 @@ void rfc2822_header_utf8_printf rfc2822_header_write(header, name, str_c(body)); } + +void rfc2822_header_write_address(string_t *header, + const char *name, const char *address) +{ + bool has_8bit = FALSE; + const char *p; + + for (p = address; *p != '\0'; p++) { + if ((*p & 0x80) != 0) + has_8bit = TRUE; + } + + if (!has_8bit) { + rfc2822_header_write(header, name, address); + } else { + string_t *body = t_str_new(256); + message_header_encode(address, body); + rfc2822_header_write(header, name, str_c(body)); + } +} diff --git a/src/lib-sieve/util/rfc2822.h b/src/lib-sieve/util/rfc2822.h index 5b2d71d24..f6cba7b53 100644 --- a/src/lib-sieve/util/rfc2822.h +++ b/src/lib-sieve/util/rfc2822.h @@ -42,4 +42,8 @@ void rfc2822_header_printf void rfc2822_header_utf8_printf (string_t *header, const char *name, const char *fmt, ...) ATTR_FORMAT(3, 4); +void rfc2822_header_write_address(string_t *header, + const char *name, const char *address); + + #endif /* __RFC2822_H */ -- GitLab