LIBETPAN_EXPORT int mailimap_idle(mailimap * session) { int r; size_t indx; struct mailimap_continue_req * cont_req; struct mailimap_response * response; clist * resp_data_list; struct mailimap_parser_context * parser_ctx; session->imap_selection_info->sel_has_exists = 0; session->imap_selection_info->sel_has_recent = 0; session->imap_idle_timestamp = time(NULL); r = mailimap_send_current_tag(session); if (r != MAILIMAP_NO_ERROR) return r; r = mailimap_idle_send(session); if (r != MAILIMAP_NO_ERROR) return r; r = mailimap_crlf_send(session->imap_stream); if (r != MAILIMAP_NO_ERROR) return r; if (mailstream_flush(session->imap_stream) == -1) return MAILIMAP_ERROR_STREAM; if (mailimap_read_line(session) == NULL) return MAILIMAP_ERROR_STREAM; indx = 0; parser_ctx = mailimap_parser_context_new(session); if (parser_ctx == NULL) return MAILIMAP_ERROR_MEMORY; r = mailimap_struct_multiple_parse(session->imap_stream, session->imap_stream_buffer, parser_ctx, &indx, &resp_data_list, (mailimap_struct_parser *) mailimap_response_data_parse, (mailimap_struct_destructor *) mailimap_response_data_free, session->imap_progr_rate, session->imap_progr_fun); mailimap_parser_context_free(parser_ctx); if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) return r; if (r == MAILIMAP_NO_ERROR) { clist_foreach(resp_data_list, (clist_func) mailimap_response_data_free, NULL); clist_free(resp_data_list); } r = mailimap_continue_req_parse(session->imap_stream, session->imap_stream_buffer, NULL, &indx, &cont_req, session->imap_progr_rate, session->imap_progr_fun); if (r == MAILIMAP_NO_ERROR) mailimap_continue_req_free(cont_req); if (r == MAILIMAP_ERROR_PARSE) { r = mailimap_parse_response(session, &response); if (r != MAILIMAP_NO_ERROR) return r; mailimap_response_free(response); return MAILIMAP_ERROR_PARSE; } return MAILIMAP_NO_ERROR; }
LIBETPAN_EXPORT int mailimap_oauth2_authenticate(mailimap * session, const char *auth_user, const char * access_token) { struct mailimap_response * response; int r; int error_code; size_t indx; struct mailimap_continue_req * cont_req; if (session->imap_state != MAILIMAP_STATE_NON_AUTHENTICATED) return MAILIMAP_ERROR_BAD_STATE; mailstream_set_privacy(session->imap_stream, 0); r = mailimap_send_current_tag(session); if (r != MAILIMAP_NO_ERROR) { mailstream_set_privacy(session->imap_stream, 1); return r; } r = mailimap_oauth2_authenticate_send(session, auth_user, access_token); if (r != MAILIMAP_NO_ERROR) { mailstream_set_privacy(session->imap_stream, 1); return r; } r = mailimap_crlf_send(session->imap_stream); if (r != MAILIMAP_NO_ERROR) { mailstream_set_privacy(session->imap_stream, 1); return r; } if (mailstream_flush(session->imap_stream) == -1) { mailstream_set_privacy(session->imap_stream, 1); return MAILIMAP_ERROR_STREAM; } mailstream_set_privacy(session->imap_stream, 1); if (mailimap_read_line(session) == NULL) return MAILIMAP_ERROR_STREAM; indx = 0; r = mailimap_continue_req_parse(session->imap_stream, session->imap_stream_buffer, &indx, &cont_req, session->imap_progr_rate, session->imap_progr_fun); if (r == MAILIMAP_NO_ERROR) { mailimap_continue_req_free(cont_req); /* There's probably an error, send an empty line as acknowledgement. */ r = mailimap_crlf_send(session->imap_stream); if (r != MAILIMAP_NO_ERROR) { return r; } if (mailstream_flush(session->imap_stream) == -1) { return MAILIMAP_ERROR_STREAM; } } else if (r == MAILIMAP_ERROR_PARSE) { r = MAILIMAP_NO_ERROR; } if (r != MAILIMAP_NO_ERROR) { return r; } r = mailimap_parse_response(session, &response); if (r != MAILIMAP_NO_ERROR) return r; error_code = response->rsp_resp_done->rsp_data.rsp_tagged->rsp_cond_state->rsp_type; mailimap_response_free(response); switch (error_code) { case MAILIMAP_RESP_COND_STATE_OK: session->imap_state = MAILIMAP_STATE_AUTHENTICATED; return MAILIMAP_NO_ERROR; default: return MAILIMAP_ERROR_LOGIN; } }