aboutsummaryrefslogtreecommitdiffstats
path: root/tests/net/imap/IMAPParserTest.cpp
diff options
context:
space:
mode:
authorvincent-richard <[email protected]>2021-03-24 20:04:01 +0000
committervincent-richard <[email protected]>2021-03-24 20:04:01 +0000
commite5186e6710ebad3cb70f59fe81d82e9d1b1fba06 (patch)
tree245c58afa110d3f6156262fc51a920ba1c700b38 /tests/net/imap/IMAPParserTest.cpp
parentMerge pull request #257 from jacadcaps/defaultCertificateVerifier (diff)
downloadvmime-e5186e6710ebad3cb70f59fe81d82e9d1b1fba06.tar.gz
vmime-e5186e6710ebad3cb70f59fe81d82e9d1b1fba06.zip
Fixed parsing of IMAP astring.
Diffstat (limited to '')
-rw-r--r--tests/net/imap/IMAPParserTest.cpp56
1 files changed, 56 insertions, 0 deletions
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 <testSocket>();
+ auto toh = vmime::make_shared <testTimeoutHandler>();
+
+ auto tag = vmime::make_shared <vmime::net::imap::IMAPTag>();
+
+ socket->localSend(respText);
+
+ auto parser = vmime::make_shared <vmime::net::imap::IMAPParser>();
+
+ 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 <testSocket>();
+ auto toh = vmime::make_shared <testTimeoutHandler>();
+
+ auto tag = vmime::make_shared <vmime::net::imap::IMAPTag>();
+
+ socket->localSend(respText);
+
+ auto parser = vmime::make_shared <vmime::net::imap::IMAPParser>();
+
+ parser->setSocket(socket);
+ parser->setTimeoutHandler(toh);
+ parser->setStrict(false);
+
+ std::unique_ptr <vmime::net::imap::IMAPParser::response> 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