|
ferencd@0
|
1 //
|
|
ferencd@0
|
2 // VMime library (http://www.vmime.org)
|
|
ferencd@0
|
3 // Copyright (C) 2002-2013 Vincent Richard <vincent@vmime.org>
|
|
ferencd@0
|
4 //
|
|
ferencd@0
|
5 // This program is free software; you can redistribute it and/or
|
|
ferencd@0
|
6 // modify it under the terms of the GNU General Public License as
|
|
ferencd@0
|
7 // published by the Free Software Foundation; either version 3 of
|
|
ferencd@0
|
8 // the License, or (at your option) any later version.
|
|
ferencd@0
|
9 //
|
|
ferencd@0
|
10 // This program is distributed in the hope that it will be useful,
|
|
ferencd@0
|
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
ferencd@0
|
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
ferencd@0
|
13 // General Public License for more details.
|
|
ferencd@0
|
14 //
|
|
ferencd@0
|
15 // You should have received a copy of the GNU General Public License along
|
|
ferencd@0
|
16 // with this program; if not, write to the Free Software Foundation, Inc.,
|
|
ferencd@0
|
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
ferencd@0
|
18 //
|
|
ferencd@0
|
19 // Linking this library statically or dynamically with other modules is making
|
|
ferencd@0
|
20 // a combined work based on this library. Thus, the terms and conditions of
|
|
ferencd@0
|
21 // the GNU General Public License cover the whole combination.
|
|
ferencd@0
|
22 //
|
|
ferencd@0
|
23
|
|
ferencd@0
|
24 #include "tests/testUtils.hpp"
|
|
ferencd@0
|
25
|
|
ferencd@0
|
26 #include "vmime/net/imap/IMAPTag.hpp"
|
|
ferencd@0
|
27 #include "vmime/net/imap/IMAPParser.hpp"
|
|
ferencd@0
|
28
|
|
ferencd@0
|
29
|
|
ferencd@0
|
30 VMIME_TEST_SUITE_BEGIN(IMAPParserTest)
|
|
ferencd@0
|
31
|
|
ferencd@0
|
32 VMIME_TEST_LIST_BEGIN
|
|
ferencd@0
|
33 VMIME_TEST(testExtraSpaceInCapaResponse)
|
|
ferencd@0
|
34 VMIME_TEST(testContinueReqWithoutSpace)
|
|
ferencd@0
|
35 VMIME_TEST(testNILValueInBodyFldEnc)
|
|
ferencd@0
|
36 VMIME_TEST_LIST_END
|
|
ferencd@0
|
37
|
|
ferencd@0
|
38
|
|
ferencd@0
|
39 // For Apple iCloud IMAP server
|
|
ferencd@0
|
40 void testExtraSpaceInCapaResponse()
|
|
ferencd@0
|
41 {
|
|
ferencd@0
|
42 vmime::shared_ptr <testSocket> socket = vmime::make_shared <testSocket>();
|
|
ferencd@0
|
43 vmime::shared_ptr <vmime::net::timeoutHandler> toh = vmime::make_shared <testTimeoutHandler>();
|
|
ferencd@0
|
44
|
|
ferencd@0
|
45 vmime::shared_ptr <vmime::net::imap::IMAPTag> tag =
|
|
ferencd@0
|
46 vmime::make_shared <vmime::net::imap::IMAPTag>();
|
|
ferencd@0
|
47
|
|
ferencd@0
|
48 socket->localSend(
|
|
ferencd@0
|
49 "* CAPABILITY IMAP4rev1 AUTH=ATOKEN AUTH=PLAIN \r\n" // extra space at end
|
|
ferencd@0
|
50 "a001 OK Capability completed.\r\n");
|
|
ferencd@0
|
51
|
|
ferencd@0
|
52 vmime::shared_ptr <vmime::net::imap::IMAPParser> parser =
|
|
ferencd@0
|
53 vmime::make_shared <vmime::net::imap::IMAPParser>();
|
|
ferencd@0
|
54
|
|
ferencd@0
|
55 parser->setTag(tag);
|
|
ferencd@0
|
56 parser->setSocket(socket);
|
|
ferencd@0
|
57 parser->setTimeoutHandler(toh);
|
|
ferencd@0
|
58
|
|
ferencd@0
|
59 parser->setStrict(false);
|
|
ferencd@0
|
60 VASSERT_NO_THROW("non-strict mode", parser->readResponse(/* literalHandler */ NULL));
|
|
ferencd@0
|
61
|
|
ferencd@0
|
62 ++(*tag);
|
|
ferencd@0
|
63
|
|
ferencd@0
|
64 socket->localSend(
|
|
ferencd@0
|
65 "* CAPABILITY IMAP4rev1 AUTH=ATOKEN AUTH=PLAIN \r\n" // extra space at end
|
|
ferencd@0
|
66 "a002 OK Capability completed.\r\n");
|
|
ferencd@0
|
67
|
|
ferencd@0
|
68 parser->setStrict(true);
|
|
ferencd@0
|
69 VASSERT_THROW("strict mode", parser->readResponse(/* literalHandler */ NULL), vmime::exceptions::invalid_response);
|
|
ferencd@0
|
70 }
|
|
ferencd@0
|
71
|
|
ferencd@0
|
72 // For Apple iCloud/Exchange IMAP server
|
|
ferencd@0
|
73 void testContinueReqWithoutSpace()
|
|
ferencd@0
|
74 {
|
|
ferencd@0
|
75 // continue_req ::= "+" SPACE (resp_text / base64)
|
|
ferencd@0
|
76 //
|
|
ferencd@0
|
77 // Some servers do not send SPACE when response text is empty.
|
|
ferencd@0
|
78 // IMAP parser should allow this in non-strict mode.
|
|
ferencd@0
|
79 //
|
|
ferencd@0
|
80 // Eg:
|
|
ferencd@0
|
81 //
|
|
ferencd@0
|
82 // C: a002 AUTHENTICATE xxx[CR][LF]
|
|
ferencd@0
|
83 // S: +[CR][LF]
|
|
ferencd@0
|
84
|
|
ferencd@0
|
85 vmime::shared_ptr <testSocket> socket = vmime::make_shared <testSocket>();
|
|
ferencd@0
|
86 vmime::shared_ptr <vmime::net::timeoutHandler> toh = vmime::make_shared <testTimeoutHandler>();
|
|
ferencd@0
|
87
|
|
ferencd@0
|
88 vmime::shared_ptr <vmime::net::imap::IMAPTag> tag =
|
|
ferencd@0
|
89 vmime::make_shared <vmime::net::imap::IMAPTag>();
|
|
ferencd@0
|
90
|
|
ferencd@0
|
91 socket->localSend("+\r\n");
|
|
ferencd@0
|
92
|
|
ferencd@0
|
93 vmime::shared_ptr <vmime::net::imap::IMAPParser> parser =
|
|
ferencd@0
|
94 vmime::make_shared <vmime::net::imap::IMAPParser>();
|
|
ferencd@0
|
95
|
|
ferencd@0
|
96 parser->setTag(tag);
|
|
ferencd@0
|
97 parser->setSocket(socket);
|
|
ferencd@0
|
98 parser->setTimeoutHandler(toh);
|
|
ferencd@0
|
99
|
|
ferencd@0
|
100 parser->setStrict(false);
|
|
ferencd@0
|
101 VASSERT_NO_THROW("non-strict mode", parser->readResponse());
|
|
ferencd@0
|
102
|
|
ferencd@0
|
103 ++(*tag);
|
|
ferencd@0
|
104
|
|
ferencd@0
|
105 socket->localSend("+\r\n");
|
|
ferencd@0
|
106
|
|
ferencd@0
|
107 parser->setStrict(true);
|
|
ferencd@0
|
108 VASSERT_THROW("strict mode", parser->readResponse(), vmime::exceptions::invalid_response);
|
|
ferencd@0
|
109 }
|
|
ferencd@0
|
110
|
|
ferencd@0
|
111 // When an IMAP4 client sends a FETCH (bodystructure) request to a server
|
|
ferencd@0
|
112 // that is running the Exchange Server 2007 IMAP4 service, a corrupted
|
|
ferencd@0
|
113 // response is sent as a reply
|
|
ferencd@0
|
114 // --> http://support.microsoft.com/kb/975918/en-us
|
|
ferencd@0
|
115 void testNILValueInBodyFldEnc()
|
|
ferencd@0
|
116 {
|
|
ferencd@0
|
117 vmime::shared_ptr <testSocket> socket = vmime::make_shared <testSocket>();
|
|
ferencd@0
|
118 vmime::shared_ptr <vmime::net::timeoutHandler> toh = vmime::make_shared <testTimeoutHandler>();
|
|
ferencd@0
|
119
|
|
ferencd@0
|
120 vmime::shared_ptr <vmime::net::imap::IMAPTag> tag =
|
|
ferencd@0
|
121 vmime::make_shared <vmime::net::imap::IMAPTag>();
|
|
ferencd@0
|
122
|
|
ferencd@0
|
123 const char* resp = "* 7970 FETCH (UID 8036 FLAGS () BODYSTRUCTURE (\"text\" \"html\" (\"charset\" \"utf-8\") NIL NIL NIL 175501 1651 NIL NIL NIL NIL) RFC822.HEADER {3}\r\nx\r\n)\r\na001 OK FETCH complete\r\n";
|
|
ferencd@0
|
124
|
|
ferencd@0
|
125 socket->localSend(resp);
|
|
ferencd@0
|
126
|
|
ferencd@0
|
127 vmime::shared_ptr <vmime::net::imap::IMAPParser> parser =
|
|
ferencd@0
|
128 vmime::make_shared <vmime::net::imap::IMAPParser>();
|
|
ferencd@0
|
129
|
|
ferencd@0
|
130 parser->setTag(tag);
|
|
ferencd@0
|
131 parser->setSocket(socket);
|
|
ferencd@0
|
132 parser->setTimeoutHandler(toh);
|
|
ferencd@0
|
133
|
|
ferencd@0
|
134 parser->setStrict(false);
|
|
ferencd@0
|
135 VASSERT_NO_THROW("non-strict mode", parser->readResponse());
|
|
ferencd@0
|
136
|
|
ferencd@0
|
137 ++(*tag);
|
|
ferencd@0
|
138
|
|
ferencd@0
|
139 socket->localSend(resp);
|
|
ferencd@0
|
140
|
|
ferencd@0
|
141 parser->setStrict(true);
|
|
ferencd@0
|
142 VASSERT_THROW("strict mode", parser->readResponse(), vmime::exceptions::invalid_response);
|
|
ferencd@0
|
143 }
|
|
ferencd@0
|
144
|
|
ferencd@0
|
145 VMIME_TEST_SUITE_END
|