karastojko/mailio

parsing imap resp-text

Opened this issue · 0 comments

https://www.rfc-editor.org/rfc/rfc3501#section-9

response        = *(continue-req / response-data) response-done
response-done   = response-tagged / response-fatal
response-tagged = tag SP resp-cond-state CRLF
resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text
                    ; Status condition
resp-text       = ["[" resp-text-code "]" SP] text

text            = 1*TEXT-CHAR
TEXT-CHAR       = <any CHAR except CR and LF>

resp-text comes after tag and status in tagged response(response-done) and it can be all characters except CR and LF.

mailio/src/imap.cpp

Lines 247 to 249 in 75db981

string line = dlg_->receive();
tag_result_response_t parsed_line = parse_tag_result(line);
parse_response(parsed_line.response);

however mailio::imap::parse_response tries to parse it and can raise exception in following example.

e.g.
mailbox name is mailbox) and gmail imap server sends it in resp-text.

$ openssl s_client -connect imap.gmail.com:993 -quiet -crlf
... # login
2 SELECT "mailbox)" # send SELECT command
# receive response
... # receive untagged response
2 OK [READ-WRITE] mailbox) selected. (Success) # tagged response. resp-text is "mailbox) selected. (Success)"

mailio::imap::parse_response tries to parse [READ-WRITE] mailbox) selected. (Success) and raise exception since parenthesis_counter is 0.

mailio/src/imap.cpp

Lines 1171 to 1178 in 75db981

case LIST_END:
{
if (atom_state_ == atom_state_t::QUOTED)
cur_token->atom +=ch;
else
{
if (parenthesis_list_counter_ == 0)
throw imap_error("Parser failure.");

this problem can occurs in untagged status response like * BYE test))) data is invalid.

in additionally, it looks there is no part checking if status is PREAUTH and BYE in untagged status response.