Skip to content

Commit

Permalink
Map '*' to '\*' in non-strict mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
vincent-richard committed Apr 6, 2020
1 parent f23cc90 commit 6d90a15
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/vmime/net/imap/IMAPParser.hpp
Expand Up @@ -1645,8 +1645,12 @@ class VMIME_EXPORT IMAPParser : public object {

} else {

type = KEYWORD_OR_EXTENSION;
VIMAP_PARSER_GET(atom, flag_keyword);
if (!parser.isStrict() && VIMAP_PARSER_TRY_CHECK(one_char <'*'> )) {
type = STAR; // map "*" to "\*"
} else {
type = KEYWORD_OR_EXTENSION;
VIMAP_PARSER_GET(atom, flag_keyword);
}
}

*currentPos = pos;
Expand Down
45 changes: 45 additions & 0 deletions tests/net/imap/IMAPParserTest.cpp
Expand Up @@ -37,6 +37,7 @@ VMIME_TEST_SUITE_BEGIN(IMAPParserTest)
VMIME_TEST(testFETCHBodyStructure_NIL_body_fld_param_value)
VMIME_TEST(testFETCHBodyStructure_empty_body_fld_param_instead_of_NIL)
VMIME_TEST(testPipelining)
VMIME_TEST(testStarFlagWithoutBackslash)
VMIME_TEST_LIST_END


Expand Down Expand Up @@ -304,4 +305,48 @@ VMIME_TEST_SUITE_BEGIN(IMAPParserTest)
VASSERT_EQ("a003 resp_cond_state.status", vmime::net::imap::IMAPParser::resp_cond_state::NO, resp3->continue_req_or_response_data[0]->response_data->resp_cond_state->status);
}

// Some IMAP servers return "*" instead of "\*" in PERMANENTFLAGS
void testStarFlagWithoutBackslash() {

const char* resp =
"* OK [PERMANENTFLAGS (Answered Flagged Deleted Seen Draft *)] Flags permitted.\r\n"
"a001 OK Completed.\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(resp);

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(resp);

auto parser = vmime::make_shared <vmime::net::imap::IMAPParser>();

parser->setSocket(socket);
parser->setTimeoutHandler(toh);
parser->setStrict(false);

VASSERT_NO_THROW("non-strict mode", parser->readResponse(*tag));
}
}

VMIME_TEST_SUITE_END

0 comments on commit 6d90a15

Please sign in to comment.