From 9d88f56dde0eb709161814d7483af7a500ab8fac Mon Sep 17 00:00:00 2001 From: "Hoa V. Dinh" Date: Mon, 27 Apr 2015 15:34:01 -0700 Subject: [PATCH] Fixes of the workaround for qq.com IMAP server --- src/low-level/imap/mailimap_parser.c | 50 +++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/low-level/imap/mailimap_parser.c b/src/low-level/imap/mailimap_parser.c index c02843d..88e19b5 100644 --- a/src/low-level/imap/mailimap_parser.c +++ b/src/low-level/imap/mailimap_parser.c @@ -1532,6 +1532,14 @@ static int mailimap_addr_host_parse(mailstream * fd, MMAPString * buffer, size_t progr_rate, progress_function * progr_fun) { + int r; + + /* workaround for qq.com IMAP Server. */ + r = mailimap_token_case_insensitive_parse(fd, buffer, indx, "\"qq.com\\\""); + if (r == MAILIMAP_NO_ERROR) { + return r; + } + return mailimap_nstring_parse(fd, buffer, indx, result, NULL, progr_rate, progr_fun); } @@ -4641,6 +4649,7 @@ static int mailimap_envelope_parse(mailstream * fd, MMAPString * buffer, return r; } + /* workaround for qq.com IMAP Server. */ r = mailimap_envelope_parse_workaround_qq_mail(fd, buffer, indx, result, progr_rate, progr_fun); return r; } @@ -4920,11 +4929,44 @@ static int mailimap_envelope_parse_workaround_qq_mail(mailstream * fd, MMAPStrin goto subject; } + if (from == NULL) { + clist * list; + struct mailimap_address * addr; + + addr = mailimap_address_new("", NULL, "", ""); + if (addr == NULL) { + goto subject; + } + + list = clist_new(); + if (list == NULL) { + mailimap_address_free(addr); + goto subject; + } + + r = clist_append(list, addr); + if (r < 0) { + clist_free(list); + mailimap_address_free(addr); + goto subject; + } + + from = mailimap_env_from_new(list); + if (from == NULL) { + clist_free(list); + mailimap_address_free(addr); + goto subject; + } + } + while (1) { clist * list; r = mailimap_space_parse(fd, buffer, &cur_token); - if (r != MAILIMAP_NO_ERROR) { + if (r == MAILIMAP_ERROR_PARSE) { + break; + } + else if (r != MAILIMAP_NO_ERROR) { res = r; goto from; } @@ -4945,7 +4987,7 @@ static int mailimap_envelope_parse_workaround_qq_mail(mailstream * fd, MMAPStrin } has_first_string = 0; - r = mailimap_nstring_parse(fd, buffer, indx, &first_string, NULL, + r = mailimap_nstring_parse(fd, buffer, &cur_token, &first_string, NULL, progr_rate, progr_fun); if (r == MAILIMAP_NO_ERROR) { has_first_string = 1; @@ -4962,7 +5004,7 @@ static int mailimap_envelope_parse_workaround_qq_mail(mailstream * fd, MMAPStrin // ignore errors. has_second_string = 0; - r = mailimap_nstring_parse(fd, buffer, indx, &second_string, NULL, + r = mailimap_nstring_parse(fd, buffer, &cur_token, &second_string, NULL, progr_rate, progr_fun); if (r == MAILIMAP_NO_ERROR) { has_second_string = 1; @@ -4980,7 +5022,7 @@ static int mailimap_envelope_parse_workaround_qq_mail(mailstream * fd, MMAPStrin message_id = second_string; } else if (has_first_string) { - message_id = second_string; + message_id = first_string; } r = mailimap_cparenth_parse(fd, buffer, &cur_token);