From 796292fb21af04117f0f84e161a9588fc528d939 Mon Sep 17 00:00:00 2001 From: 5 Date: Fri, 5 Oct 2001 18:52:21 +0000 Subject: Try harder to get broken names out of addresses. Unencoded ,'s in names 2001-10-05 * camel-mime-utils.c (header_decode_mailbox): Try harder to get broken names out of addresses. Unencoded ,'s in names will still break it, but well what can you do eh? (header_decode_mailbox): Always add .'s into address we've scanned past a '.', even if we can't decode the next part. Fix for some annoying bug #. svn path=/trunk/; revision=13453 --- camel/camel-mime-utils.c | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) (limited to 'camel/camel-mime-utils.c') diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c index 38b932a280..d5ca9b436b 100644 --- a/camel/camel-mime-utils.c +++ b/camel/camel-mime-utils.c @@ -2330,10 +2330,9 @@ header_decode_mailbox(const char **in) inptr++; g_free(pre); pre = header_decode_word(&inptr); - if (pre) { - addr = g_string_append_c(addr, '.'); + addr = g_string_append_c(addr, '.'); + if (pre) addr = g_string_append(addr, pre); - } comment = inptr; header_decode_lwsp(&inptr); } @@ -2352,10 +2351,41 @@ header_decode_mailbox(const char **in) } else { /* If we get a <, the address was probably a name part, lets try again shall we? */ /* Another fix for seriously-broken-mailers */ - if (name == NULL && *inptr == '<') { - name = addr; - addr = g_string_new(""); - closeme = TRUE; + if (*inptr && *inptr != ',') { + char *text; + + g_warning("We didn't get an '@' where we expected in '%s', trying again", *in); + g_warning("Name is '%s', Addr is '%s' we're at '%s'\n", name?name->str:"", addr->str, inptr); + + /* need to keep *inptr, as try_address_again will drop the current character */ + if (*inptr == '<') + closeme = TRUE; + else + g_string_append_c(addr, *inptr); + + /* check for address is encoded word ... */ + text = header_decode_string(addr->str, NULL); + if (name == NULL) { + name = addr; + addr = g_string_new(""); + if (text) { + g_string_truncate(name, 0); + g_string_append(name, text); + } + } else { + g_string_append(name, text?text:addr->str); + g_string_truncate(addr, 0); + } + g_free(text); + + /* or maybe that we've added up a bunch of broken bits to make an encoded word */ + text = header_decode_string(name->str, NULL); + if (text) { + g_string_truncate(name, 0); + g_string_append(name, text); + g_free(text); + } + goto try_address_again; } w(g_warning("invalid address, no '@' domain part at %c: %s", *inptr, *in)); -- cgit v1.2.3