Geary.RFC822.MailboxAddress: Handle long headers being folded

Remove "\n " sequences from RFC822 text before decoding so that any
long mailboxes/mailbox lists folded before the 80 char limit are
unfolded.

Fixes #1009
This commit is contained in:
Michael Gratton 2021-01-20 19:22:46 +11:00
parent b51b933b6d
commit 3c4d5c5e9d
2 changed files with 18 additions and 9 deletions

View file

@ -136,11 +136,11 @@ public class Geary.RFC822.MailboxAddress :
: GMime.utils_decode_8bit(get_parser_options(), part.data) : GMime.utils_decode_8bit(get_parser_options(), part.data)
); );
// unquote the string then decode the text text = GMime.utils_header_unfold(text);
GMime.utils_unquote_string(text); GMime.utils_unquote_string(text);
// Sometimes quoted printables contain unencoded spaces which trips up GMime, so we want to // Sometimes quoted printables contain unencoded spaces which
// encode them all here. // trips up GMime, so we want to encode them all here.
int offset = 0; int offset = 0;
int start; int start;
while ((start = text.index_of("=?", offset)) != -1) { while ((start = text.index_of("=?", offset)) != -1) {

View file

@ -234,12 +234,21 @@ class Geary.RFC822.MailboxAddressTest : TestCase {
assert(new MailboxAddress("test", "example@example@example.com").is_spoofed() == true); assert(new MailboxAddress("test", "example@example@example.com").is_spoofed() == true);
assert(new MailboxAddress("'prefix-example@example.com'", "example@example.com").is_spoofed() == true); assert(new MailboxAddress("'prefix-example@example.com'", "example@example.com").is_spoofed() == true);
try { assert_false(
assert(new MailboxAddress.from_rfc822_string("\"=?utf-8?b?dGVzdCIgPHBvdHVzQHdoaXRlaG91c2UuZ292Pg==?==?utf-8?Q?=00=0A?=\" <demo@mailsploit.com>") new MailboxAddress.from_rfc822_string(
.is_spoofed() == true); "hello\n there <example@example.com>"
} catch (Error err) { ).is_spoofed()
assert_no_error(err); );
} assert_false(
new MailboxAddress.from_rfc822_string(
"\"hello\n there\" <example@example.com>"
).is_spoofed()
);
assert_true(
new MailboxAddress.from_rfc822_string(
"\"=?utf-8?b?dGVzdCIgPHBvdHVzQHdoaXRlaG91c2UuZ292Pg==?==?utf-8?Q?=00=0A?=\" <demo@mailsploit.com>"
).is_spoofed()
);
} }
public void to_full_display() throws GLib.Error { public void to_full_display() throws GLib.Error {