Lines Matching refs:data
87 static CURLcode pop3_regular_transfer(struct Curl_easy *data, bool *done);
88 static CURLcode pop3_do(struct Curl_easy *data, bool *done);
89 static CURLcode pop3_done(struct Curl_easy *data, CURLcode status,
91 static CURLcode pop3_connect(struct Curl_easy *data, bool *done);
92 static CURLcode pop3_disconnect(struct Curl_easy *data,
94 static CURLcode pop3_multi_statemach(struct Curl_easy *data, bool *done);
95 static int pop3_getsock(struct Curl_easy *data,
97 static CURLcode pop3_doing(struct Curl_easy *data, bool *dophase_done);
98 static CURLcode pop3_setup_connection(struct Curl_easy *data,
101 static CURLcode pop3_parse_url_path(struct Curl_easy *data);
102 static CURLcode pop3_parse_custom_request(struct Curl_easy *data);
103 static CURLcode pop3_perform_auth(struct Curl_easy *data, const char *mech,
105 static CURLcode pop3_continue_auth(struct Curl_easy *data, const char *mech,
107 static CURLcode pop3_cancel_auth(struct Curl_easy *data, const char *mech);
108 static CURLcode pop3_get_message(struct Curl_easy *data, struct bufref *out);
204 static bool pop3_endofresp(struct Curl_easy *data, struct connectdata *conn,
208 (void)data;
253 static CURLcode pop3_get_message(struct Curl_easy *data, struct bufref *out)
255 char *message = Curl_dyn_ptr(&data->conn->proto.pop3c.pp.recvbuf);
256 size_t len = data->conn->proto.pop3c.pp.nfinal;
287 static void pop3_state(struct Curl_easy *data, pop3state newstate)
289 struct pop3_conn *pop3c = &data->conn->proto.pop3c;
308 infof(data, "POP3 %p state change from %s to %s",
322 static CURLcode pop3_perform_capa(struct Curl_easy *data,
333 result = Curl_pp_sendf(data, &pop3c->pp, "%s", "CAPA");
336 pop3_state(data, POP3_CAPA);
347 static CURLcode pop3_perform_starttls(struct Curl_easy *data,
351 CURLcode result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "%s", "STLS");
354 pop3_state(data, POP3_STARTTLS);
365 static CURLcode pop3_perform_upgrade_tls(struct Curl_easy *data,
374 result = Curl_ssl_cfilter_add(data, conn, FIRSTSOCKET);
379 result = Curl_conn_connect(data, FIRSTSOCKET, FALSE, &ssldone);
384 pop3_state(data, POP3_UPGRADETLS);
388 result = pop3_perform_capa(data, conn);
401 static CURLcode pop3_perform_user(struct Curl_easy *data,
408 if(!data->state.aptr.user) {
409 pop3_state(data, POP3_STOP);
415 result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "USER %s",
418 pop3_state(data, POP3_USER);
430 static CURLcode pop3_perform_apop(struct Curl_easy *data,
442 if(!data->state.aptr.user) {
443 pop3_state(data, POP3_STOP);
466 result = Curl_pp_sendf(data, &pop3c->pp, "APOP %s %s", conn->user, secret);
469 pop3_state(data, POP3_APOP);
482 static CURLcode pop3_perform_auth(struct Curl_easy *data,
487 struct pop3_conn *pop3c = &data->conn->proto.pop3c;
492 result = Curl_pp_sendf(data, &pop3c->pp, "AUTH %s %s", mech, ir);
496 result = Curl_pp_sendf(data, &pop3c->pp, "AUTH %s", mech);
506 * Sends SASL continuation data.
508 static CURLcode pop3_continue_auth(struct Curl_easy *data,
512 struct pop3_conn *pop3c = &data->conn->proto.pop3c;
516 return Curl_pp_sendf(data, &pop3c->pp,
526 static CURLcode pop3_cancel_auth(struct Curl_easy *data, const char *mech)
528 struct pop3_conn *pop3c = &data->conn->proto.pop3c;
532 return Curl_pp_sendf(data, &pop3c->pp, "*");
543 static CURLcode pop3_perform_authentication(struct Curl_easy *data,
550 /* Check we have enough data to authenticate with and end the
552 if(!Curl_sasl_can_authenticate(&pop3c->sasl, data)) {
553 pop3_state(data, POP3_STOP);
559 result = Curl_sasl_start(&pop3c->sasl, data, FALSE, &progress);
563 pop3_state(data, POP3_AUTH);
570 result = pop3_perform_apop(data, conn);
575 result = pop3_perform_user(data, conn);
578 infof(data, "No known authentication mechanisms supported");
592 static CURLcode pop3_perform_command(struct Curl_easy *data)
595 struct connectdata *conn = data->conn;
596 struct POP3 *pop3 = data->req.p.pop3;
600 if(pop3->id[0] == '\0' || data->set.list_only) {
612 result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "%s %s",
616 result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "%s",
621 pop3_state(data, POP3_COMMAND);
632 static CURLcode pop3_perform_quit(struct Curl_easy *data,
636 CURLcode result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "%s", "QUIT");
639 pop3_state(data, POP3_QUIT);
645 static CURLcode pop3_state_servergreet_resp(struct Curl_easy *data,
650 struct connectdata *conn = data->conn;
652 const char *line = Curl_dyn_ptr(&data->conn->proto.pop3c.pp.recvbuf);
653 size_t len = data->conn->proto.pop3c.pp.nfinal;
658 failf(data, "Got unexpected pop3-server response");
689 result = pop3_perform_capa(data, conn);
696 static CURLcode pop3_state_capa_resp(struct Curl_easy *data, int pop3code,
700 struct connectdata *conn = data->conn;
702 const char *line = Curl_dyn_ptr(&data->conn->proto.pop3c.pp.recvbuf);
703 size_t len = data->conn->proto.pop3c.pp.nfinal;
725 /* Loop through the data line */
763 if(!data->set.use_ssl || Curl_conn_is_ssl(conn, FIRSTSOCKET))
764 result = pop3_perform_authentication(data, conn);
767 result = pop3_perform_starttls(data, conn);
768 else if(data->set.use_ssl <= CURLUSESSL_TRY)
770 result = pop3_perform_authentication(data, conn);
772 failf(data, "STLS not supported.");
781 static CURLcode pop3_state_starttls_resp(struct Curl_easy *data,
790 if(data->conn->proto.pop3c.pp.overflow)
794 if(data->set.use_ssl != CURLUSESSL_TRY) {
795 failf(data, "STARTTLS denied");
799 result = pop3_perform_authentication(data, conn);
802 result = pop3_perform_upgrade_tls(data, conn);
808 static CURLcode pop3_state_auth_resp(struct Curl_easy *data,
813 struct connectdata *conn = data->conn;
819 result = Curl_sasl_continue(&pop3c->sasl, data, pop3code, &progress);
823 pop3_state(data, POP3_STOP); /* Authenticated */
829 result = pop3_perform_apop(data, conn);
834 result = pop3_perform_user(data, conn);
836 failf(data, "Authentication cancelled");
849 static CURLcode pop3_state_apop_resp(struct Curl_easy *data, int pop3code,
856 failf(data, "Authentication failed: %d", pop3code);
861 pop3_state(data, POP3_STOP);
868 static CURLcode pop3_state_user_resp(struct Curl_easy *data, int pop3code,
872 struct connectdata *conn = data->conn;
876 failf(data, "Access denied. %c", pop3code);
881 result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "PASS %s",
884 pop3_state(data, POP3_PASS);
890 static CURLcode pop3_state_pass_resp(struct Curl_easy *data, int pop3code,
897 failf(data, "Access denied. %c", pop3code);
902 pop3_state(data, POP3_STOP);
908 static CURLcode pop3_state_command_resp(struct Curl_easy *data,
913 struct connectdata *conn = data->conn;
914 struct POP3 *pop3 = data->req.p.pop3;
921 pop3_state(data, POP3_STOP);
927 the code detect the EOB if the only data than comes now is %2e CR LF like
937 Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
940 /* The recv buffer contains data that is actually body content so send
948 if(!data->req.no_body) {
949 result = Curl_pop3_write(data, Curl_dyn_ptr(&pp->recvbuf),
964 pop3_state(data, POP3_STOP);
969 static CURLcode pop3_statemachine(struct Curl_easy *data,
978 (void)data;
982 return pop3_perform_upgrade_tls(data, conn);
984 /* Flush any data that needs to be sent */
986 return Curl_pp_flushsend(data, pp);
990 result = Curl_pp_readresp(data, sock, pp, &pop3code, &nread);
1000 result = pop3_state_servergreet_resp(data, pop3code, pop3c->state);
1004 result = pop3_state_capa_resp(data, pop3code, pop3c->state);
1008 result = pop3_state_starttls_resp(data, conn, pop3code, pop3c->state);
1012 result = pop3_state_auth_resp(data, pop3code, pop3c->state);
1017 result = pop3_state_apop_resp(data, pop3code, pop3c->state);
1022 result = pop3_state_user_resp(data, pop3code, pop3c->state);
1026 result = pop3_state_pass_resp(data, pop3code, pop3c->state);
1030 result = pop3_state_command_resp(data, pop3code, pop3c->state);
1034 pop3_state(data, POP3_STOP);
1039 pop3_state(data, POP3_STOP);
1048 static CURLcode pop3_multi_statemach(struct Curl_easy *data, bool *done)
1051 struct connectdata *conn = data->conn;
1056 result = Curl_conn_connect(data, FIRSTSOCKET, FALSE, &ssldone);
1062 result = Curl_pp_statemach(data, &pop3c->pp, FALSE, FALSE);
1068 static CURLcode pop3_block_statemach(struct Curl_easy *data,
1076 result = Curl_pp_statemach(data, &pop3c->pp, TRUE, disconnecting);
1083 static CURLcode pop3_init(struct Curl_easy *data)
1088 pop3 = data->req.p.pop3 = calloc(1, sizeof(struct POP3));
1096 static int pop3_getsock(struct Curl_easy *data,
1099 return Curl_pp_getsock(data, &conn->proto.pop3c.pp, socks);
1112 static CURLcode pop3_connect(struct Curl_easy *data, bool *done)
1115 struct connectdata *conn = data->conn;
1128 Curl_sasl_init(&pop3c->sasl, data, &saslpop3);
1139 pop3_state(data, POP3_SERVERGREET);
1141 result = pop3_multi_statemach(data, done);
1155 static CURLcode pop3_done(struct Curl_easy *data, CURLcode status,
1159 struct POP3 *pop3 = data->req.p.pop3;
1167 connclose(data->conn, "POP3 done with bad status");
1188 static CURLcode pop3_perform(struct Curl_easy *data, bool *connected,
1193 struct POP3 *pop3 = data->req.p.pop3;
1195 DEBUGF(infof(data, "DO phase starts"));
1197 if(data->req.no_body) {
1205 result = pop3_perform_command(data);
1210 result = pop3_multi_statemach(data, dophase_done);
1211 *connected = Curl_conn_is_connected(data->conn, FIRSTSOCKET);
1214 DEBUGF(infof(data, "DO phase is complete"));
1228 static CURLcode pop3_do(struct Curl_easy *data, bool *done)
1234 result = pop3_parse_url_path(data);
1239 result = pop3_parse_custom_request(data);
1243 result = pop3_regular_transfer(data, done);
1255 static CURLcode pop3_disconnect(struct Curl_easy *data,
1259 (void)data;
1266 if(!pop3_perform_quit(data, conn))
1267 (void)pop3_block_statemach(data, conn, TRUE); /* ignore errors on QUIT */
1283 static CURLcode pop3_dophase_done(struct Curl_easy *data, bool connected)
1285 (void)data;
1292 static CURLcode pop3_doing(struct Curl_easy *data, bool *dophase_done)
1294 CURLcode result = pop3_multi_statemach(data, dophase_done);
1297 DEBUGF(infof(data, "DO phase failed"));
1299 result = pop3_dophase_done(data, FALSE /* not connected */);
1301 DEBUGF(infof(data, "DO phase is complete"));
1316 static CURLcode pop3_regular_transfer(struct Curl_easy *data,
1323 data->req.size = -1;
1325 /* Set the progress data */
1326 Curl_pgrsSetUploadCounter(data, 0);
1327 Curl_pgrsSetDownloadCounter(data, 0);
1328 Curl_pgrsSetUploadSize(data, -1);
1329 Curl_pgrsSetDownloadSize(data, -1);
1332 result = pop3_perform(data, &connected, dophase_done);
1336 result = pop3_dophase_done(data, connected);
1341 static CURLcode pop3_setup_connection(struct Curl_easy *data,
1345 CURLcode result = pop3_init(data);
1418 static CURLcode pop3_parse_url_path(struct Curl_easy *data)
1421 struct POP3 *pop3 = data->req.p.pop3;
1422 const char *path = &data->state.up.path[1]; /* skip leading path */
1434 static CURLcode pop3_parse_custom_request(struct Curl_easy *data)
1437 struct POP3 *pop3 = data->req.p.pop3;
1438 const char *custom = data->set.str[STRING_CUSTOMREQUEST];
1454 CURLcode Curl_pop3_write(struct Curl_easy *data, char *str, size_t nread)
1458 struct SingleRequest *k = &data->req;
1459 struct connectdata *conn = data->conn;
1469 over 5 different data chunks. */
1480 result = Curl_client_write(data, CLIENTWRITE_BODY, &str[last],
1539 result = Curl_client_write(data, CLIENTWRITE_BODY, (char *)POP3_EOB,
1543 result = Curl_client_write(data, CLIENTWRITE_BODY, (char *)POP3_EOB,
1563 result = Curl_client_write(data, CLIENTWRITE_BODY, (char *)POP3_EOB, 2);
1576 result = Curl_client_write(data, CLIENTWRITE_BODY, &str[last],