From e5186e6710ebad3cb70f59fe81d82e9d1b1fba06 Mon Sep 17 00:00:00 2001 From: vincent-richard Date: Wed, 24 Mar 2021 21:04:01 +0100 Subject: Fixed parsing of IMAP astring. --- tests/net/imap/IMAPParserTest.cpp | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'tests') diff --git a/tests/net/imap/IMAPParserTest.cpp b/tests/net/imap/IMAPParserTest.cpp index 387e4c66..47880a06 100644 --- a/tests/net/imap/IMAPParserTest.cpp +++ b/tests/net/imap/IMAPParserTest.cpp @@ -39,6 +39,7 @@ VMIME_TEST_SUITE_BEGIN(IMAPParserTest) VMIME_TEST(testPipelining) VMIME_TEST(testStarFlagWithoutBackslash) VMIME_TEST(testUnquotedMailboxName) + VMIME_TEST(testInvalidCharsInAstring) VMIME_TEST_LIST_END @@ -427,4 +428,59 @@ VMIME_TEST_SUITE_BEGIN(IMAPParserTest) } } + // Some broken IMAP servers return non-ASCII chars in astring. + // Server returns UTF-8 instead of modified UTF-7. + void testInvalidCharsInAstring() { + + const char* respText = + R"END(* STATUS Segregator/Społeczności (MESSAGES 3 UIDNEXT 4 UIDVALIDITY 1519867193 UNSEEN 0))END" + "\r\n" + R"END(a001 OK Completed.)END" + "\r\n"; + + // Strict mode + { + auto socket = vmime::make_shared (); + auto toh = vmime::make_shared (); + + auto tag = vmime::make_shared (); + + socket->localSend(respText); + + auto parser = vmime::make_shared (); + + parser->setSocket(socket); + parser->setTimeoutHandler(toh); + parser->setStrict(true); + + VASSERT_THROW("strict mode", parser->readResponse(*tag), vmime::exceptions::invalid_response); + } + + // Non-strict mode + { + auto socket = vmime::make_shared (); + auto toh = vmime::make_shared (); + + auto tag = vmime::make_shared (); + + socket->localSend(respText); + + auto parser = vmime::make_shared (); + + parser->setSocket(socket); + parser->setTimeoutHandler(toh); + parser->setStrict(false); + + std::unique_ptr resp; + + VASSERT_NO_THROW("non-strict mode", resp.reset(parser->readResponse(*tag))); + + VASSERT_EQ("resp size", 1, resp->continue_req_or_response_data.size()); + VASSERT("resp data", resp->continue_req_or_response_data[0]->response_data); + VASSERT("mbox data", resp->continue_req_or_response_data[0]->response_data->mailbox_data); + VASSERT("mbox", resp->continue_req_or_response_data[0]->response_data->mailbox_data->mailbox); + VASSERT_EQ("mbox name", "Segregator/Społeczności", resp->continue_req_or_response_data[0]->response_data->mailbox_data->mailbox->name); + } + } + VMIME_TEST_SUITE_END -- cgit v1.2.3