• Home
  • Raw
  • Download

Lines Matching +full:- +full:- +full:no +full:- +full:transfer +full:- +full:progress

21  * SPDX-License-Identifier: curl
25 * RFC2195 CRAM-MD5 authentication
29 * RFC2831 DIGEST-MD5 authentication
36 * Draft LOGIN SASL Mechanism <draft-murchison-sasl-login-00.txt>
65 #include "progress.h"
66 #include "transfer.h"
177 255 - 8, /* Max line len - strlen("AUTH ") - 1 space - crlf */
188 conn->handler = &Curl_handler_pop3s; in pop3_to_pop3s()
191 conn->bits.tls_upgraded = TRUE; in pop3_to_pop3s()
209 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_endofresp()
213 if(len >= 4 && !memcmp("-ERR", line, 4)) { in pop3_endofresp()
214 *resp = '-'; in pop3_endofresp()
220 if(pop3c->state == POP3_CAPA) { in pop3_endofresp()
257 char *message = data->state.buffer; in pop3_get_message()
262 len -= 2; in pop3_get_message()
263 for(message += 2; *message == ' ' || *message == '\t'; message++, len--) in pop3_get_message()
267 while(len--) in pop3_get_message()
291 struct pop3_conn *pop3c = &data->conn->proto.pop3c; in state()
309 if(pop3c->state != newstate) in state()
311 (void *)pop3c, names[pop3c->state], names[newstate]); in state()
314 pop3c->state = newstate; in state()
328 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_perform_capa()
330 pop3c->sasl.authmechs = SASL_AUTH_NONE; /* No known auth. mechanisms yet */ in pop3_perform_capa()
331 pop3c->sasl.authused = SASL_AUTH_NONE; /* Clear the auth. mechanism used */ in pop3_perform_capa()
332 pop3c->tls_supported = FALSE; /* Clear the TLS capability */ in pop3_perform_capa()
335 result = Curl_pp_sendf(data, &pop3c->pp, "%s", "CAPA"); in pop3_perform_capa()
353 CURLcode result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "%s", "STLS"); in pop3_perform_starttls()
371 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_perform_upgrade_tls()
384 pop3c->ssldone = ssldone; in pop3_perform_upgrade_tls()
385 if(pop3c->state != POP3_UPGRADETLS) in pop3_perform_upgrade_tls()
388 if(pop3c->ssldone) { in pop3_perform_upgrade_tls()
410 if(!data->state.aptr.user) { in pop3_perform_user()
417 result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "USER %s", in pop3_perform_user()
418 conn->user ? conn->user : ""); in pop3_perform_user()
436 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_perform_apop()
444 if(!data->state.aptr.user) { in pop3_perform_apop()
455 Curl_MD5_update(ctxt, (const unsigned char *) pop3c->apoptimestamp, in pop3_perform_apop()
456 curlx_uztoui(strlen(pop3c->apoptimestamp))); in pop3_perform_apop()
458 Curl_MD5_update(ctxt, (const unsigned char *) conn->passwd, in pop3_perform_apop()
459 curlx_uztoui(strlen(conn->passwd))); in pop3_perform_apop()
468 result = Curl_pp_sendf(data, &pop3c->pp, "APOP %s %s", conn->user, secret); in pop3_perform_apop()
489 struct pop3_conn *pop3c = &data->conn->proto.pop3c; in pop3_perform_auth()
494 result = Curl_pp_sendf(data, &pop3c->pp, "AUTH %s %s", mech, ir); in pop3_perform_auth()
498 result = Curl_pp_sendf(data, &pop3c->pp, "AUTH %s", mech); in pop3_perform_auth()
514 struct pop3_conn *pop3c = &data->conn->proto.pop3c; in pop3_continue_auth()
518 return Curl_pp_sendf(data, &pop3c->pp, in pop3_continue_auth()
530 struct pop3_conn *pop3c = &data->conn->proto.pop3c; in pop3_cancel_auth()
534 return Curl_pp_sendf(data, &pop3c->pp, "*"); in pop3_cancel_auth()
549 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_perform_authentication()
550 saslprogress progress = SASL_IDLE; in pop3_perform_authentication() local
554 if(!Curl_sasl_can_authenticate(&pop3c->sasl, data)) { in pop3_perform_authentication()
559 if(pop3c->authtypes & pop3c->preftype & POP3_TYPE_SASL) { in pop3_perform_authentication()
561 result = Curl_sasl_start(&pop3c->sasl, data, FALSE, &progress); in pop3_perform_authentication()
564 if(progress == SASL_INPROGRESS) in pop3_perform_authentication()
568 if(!result && progress == SASL_IDLE) { in pop3_perform_authentication()
570 if(pop3c->authtypes & pop3c->preftype & POP3_TYPE_APOP) in pop3_perform_authentication()
575 if(pop3c->authtypes & pop3c->preftype & POP3_TYPE_CLEARTEXT) in pop3_perform_authentication()
580 infof(data, "No known authentication mechanisms supported"); in pop3_perform_authentication()
597 struct connectdata *conn = data->conn; in pop3_perform_command()
598 struct POP3 *pop3 = data->req.p.pop3; in pop3_perform_command()
602 if(pop3->id[0] == '\0' || data->set.list_only) { in pop3_perform_command()
605 if(pop3->id[0] != '\0') in pop3_perform_command()
606 /* Message specific LIST so skip the BODY transfer */ in pop3_perform_command()
607 pop3->transfer = PPTRANSFER_INFO; in pop3_perform_command()
613 if(pop3->id[0] != '\0') in pop3_perform_command()
614 result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "%s %s", in pop3_perform_command()
615 (pop3->custom && pop3->custom[0] != '\0' ? in pop3_perform_command()
616 pop3->custom : command), pop3->id); in pop3_perform_command()
618 result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "%s", in pop3_perform_command()
619 (pop3->custom && pop3->custom[0] != '\0' ? in pop3_perform_command()
620 pop3->custom : command)); in pop3_perform_command()
638 CURLcode result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "%s", "QUIT"); in pop3_perform_quit()
652 struct connectdata *conn = data->conn; in pop3_state_servergreet_resp()
653 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_state_servergreet_resp()
654 const char *line = data->state.buffer; in pop3_state_servergreet_resp()
657 (void)instate; /* no use for this yet */ in pop3_state_servergreet_resp()
660 failf(data, "Got unexpected pop3-server response"); in pop3_state_servergreet_resp()
665 if(len >= 4 && line[len - 2] == '>') { in pop3_state_servergreet_resp()
668 for(i = 3; i < len - 2; ++i) { in pop3_state_servergreet_resp()
671 size_t timestamplen = len - 1 - i; in pop3_state_servergreet_resp()
677 pop3c->apoptimestamp = (char *)calloc(1, timestamplen + 1); in pop3_state_servergreet_resp()
679 if(!pop3c->apoptimestamp) in pop3_state_servergreet_resp()
683 memcpy(pop3c->apoptimestamp, line + i, timestamplen); in pop3_state_servergreet_resp()
684 pop3c->apoptimestamp[timestamplen] = '\0'; in pop3_state_servergreet_resp()
687 RFC-1939) conformant to the RFC-822 message id syntax, and we in pop3_state_servergreet_resp()
689 at = strchr(pop3c->apoptimestamp, '@'); in pop3_state_servergreet_resp()
691 Curl_safefree(pop3c->apoptimestamp); in pop3_state_servergreet_resp()
694 pop3c->authtypes |= POP3_TYPE_APOP; in pop3_state_servergreet_resp()
711 struct connectdata *conn = data->conn; in pop3_state_capa_resp()
712 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_state_capa_resp()
713 const char *line = data->state.buffer; in pop3_state_capa_resp()
716 (void)instate; /* no use for this yet */ in pop3_state_capa_resp()
722 pop3c->tls_supported = TRUE; in pop3_state_capa_resp()
726 pop3c->authtypes |= POP3_TYPE_CLEARTEXT; in pop3_state_capa_resp()
730 pop3c->authtypes |= POP3_TYPE_SASL; in pop3_state_capa_resp()
734 len -= 5; in pop3_state_capa_resp()
747 len--; in pop3_state_capa_resp()
762 pop3c->sasl.authmechs |= mechbit; in pop3_state_capa_resp()
765 len -= wordlen; in pop3_state_capa_resp()
772 pop3c->authtypes |= POP3_TYPE_CLEARTEXT; in pop3_state_capa_resp()
774 if(!data->set.use_ssl || Curl_conn_is_ssl(conn, FIRSTSOCKET)) in pop3_state_capa_resp()
776 else if(pop3code == '+' && pop3c->tls_supported) in pop3_state_capa_resp()
779 else if(data->set.use_ssl <= CURLUSESSL_TRY) in pop3_state_capa_resp()
798 (void)instate; /* no use for this yet */ in pop3_state_starttls_resp()
801 if(data->conn->proto.pop3c.pp.cache_size) in pop3_state_starttls_resp()
805 if(data->set.use_ssl != CURLUSESSL_TRY) { in pop3_state_starttls_resp()
824 struct connectdata *conn = data->conn; in pop3_state_auth_resp()
825 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_state_auth_resp()
826 saslprogress progress; in pop3_state_auth_resp() local
828 (void)instate; /* no use for this yet */ in pop3_state_auth_resp()
830 result = Curl_sasl_continue(&pop3c->sasl, data, pop3code, &progress); in pop3_state_auth_resp()
832 switch(progress) { in pop3_state_auth_resp()
836 case SASL_IDLE: /* No mechanism left after cancellation */ in pop3_state_auth_resp()
838 if(pop3c->authtypes & pop3c->preftype & POP3_TYPE_APOP) in pop3_state_auth_resp()
843 if(pop3c->authtypes & pop3c->preftype & POP3_TYPE_CLEARTEXT) in pop3_state_auth_resp()
864 (void)instate; /* no use for this yet */ in pop3_state_apop_resp()
883 struct connectdata *conn = data->conn; in pop3_state_user_resp()
884 (void)instate; /* no use for this yet */ in pop3_state_user_resp()
892 result = Curl_pp_sendf(data, &conn->proto.pop3c.pp, "PASS %s", in pop3_state_user_resp()
893 conn->passwd ? conn->passwd : ""); in pop3_state_user_resp()
905 (void)instate; /* no use for this yet */ in pop3_state_pass_resp()
924 struct connectdata *conn = data->conn; in pop3_state_command_resp()
925 struct POP3 *pop3 = data->req.p.pop3; in pop3_state_command_resp()
926 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_state_command_resp()
927 struct pingpong *pp = &pop3c->pp; in pop3_state_command_resp()
929 (void)instate; /* no use for this yet */ in pop3_state_command_resp()
939 when there is no body to return. */ in pop3_state_command_resp()
940 pop3c->eob = 2; in pop3_state_command_resp()
944 pop3c->strip = 2; in pop3_state_command_resp()
946 if(pop3->transfer == PPTRANSFER_BODY) { in pop3_state_command_resp()
948 Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1); in pop3_state_command_resp()
950 if(pp->cache) { in pop3_state_command_resp()
955 if(!data->req.no_body) { in pop3_state_command_resp()
956 result = Curl_pop3_write(data, pp->cache, pp->cache_size); in pop3_state_command_resp()
962 Curl_safefree(pp->cache); in pop3_state_command_resp()
965 pp->cache_size = 0; in pop3_state_command_resp()
979 curl_socket_t sock = conn->sock[FIRSTSOCKET]; in pop3_statemachine()
981 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_statemachine()
982 struct pingpong *pp = &pop3c->pp; in pop3_statemachine()
987 if(pop3c->state == POP3_UPGRADETLS) in pop3_statemachine()
991 if(pp->sendleft) in pop3_statemachine()
1004 switch(pop3c->state) { in pop3_statemachine()
1006 result = pop3_state_servergreet_resp(data, pop3code, pop3c->state); in pop3_statemachine()
1010 result = pop3_state_capa_resp(data, pop3code, pop3c->state); in pop3_statemachine()
1014 result = pop3_state_starttls_resp(data, conn, pop3code, pop3c->state); in pop3_statemachine()
1018 result = pop3_state_auth_resp(data, pop3code, pop3c->state); in pop3_statemachine()
1023 result = pop3_state_apop_resp(data, pop3code, pop3c->state); in pop3_statemachine()
1028 result = pop3_state_user_resp(data, pop3code, pop3c->state); in pop3_statemachine()
1032 result = pop3_state_pass_resp(data, pop3code, pop3c->state); in pop3_statemachine()
1036 result = pop3_state_command_resp(data, pop3code, pop3c->state); in pop3_statemachine()
1048 } while(!result && pop3c->state != POP3_STOP && Curl_pp_moredata(pp)); in pop3_statemachine()
1057 struct connectdata *conn = data->conn; in pop3_multi_statemach()
1058 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_multi_statemach()
1060 if((conn->handler->flags & PROTOPT_SSL) && !pop3c->ssldone) { in pop3_multi_statemach()
1063 pop3c->ssldone = ssldone; in pop3_multi_statemach()
1064 if(result || !pop3c->ssldone) in pop3_multi_statemach()
1068 result = Curl_pp_statemach(data, &pop3c->pp, FALSE, FALSE); in pop3_multi_statemach()
1069 *done = (pop3c->state == POP3_STOP) ? TRUE : FALSE; in pop3_multi_statemach()
1079 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_block_statemach()
1081 while(pop3c->state != POP3_STOP && !result) in pop3_block_statemach()
1082 result = Curl_pp_statemach(data, &pop3c->pp, TRUE, disconnecting); in pop3_block_statemach()
1094 pop3 = data->req.p.pop3 = calloc(sizeof(struct POP3), 1); in pop3_init()
1105 return Curl_pp_getsock(data, &conn->proto.pop3c.pp, socks); in pop3_getsock()
1115 * The variable 'done' points to will be TRUE if the protocol-layer connect
1121 struct connectdata *conn = data->conn; in pop3_connect()
1122 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_connect()
1123 struct pingpong *pp = &pop3c->pp; in pop3_connect()
1133 pop3c->preftype = POP3_TYPE_ANY; in pop3_connect()
1134 Curl_sasl_init(&pop3c->sasl, data, &saslpop3); in pop3_connect()
1166 struct POP3 *pop3 = data->req.p.pop3; in pop3_done()
1174 connclose(data->conn, "POP3 done with bad status"); in pop3_done()
1178 /* Cleanup our per-request based variables */ in pop3_done()
1179 Curl_safefree(pop3->id); in pop3_done()
1180 Curl_safefree(pop3->custom); in pop3_done()
1182 /* Clear the transfer mode for the next request */ in pop3_done()
1183 pop3->transfer = PPTRANSFER_BODY; in pop3_done()
1198 /* This is POP3 and no proxy */ in pop3_perform()
1200 struct POP3 *pop3 = data->req.p.pop3; in pop3_perform()
1204 if(data->req.no_body) { in pop3_perform()
1205 /* Requested no body means no transfer */ in pop3_perform()
1206 pop3->transfer = PPTRANSFER_INFO; in pop3_perform()
1216 /* Run the state-machine */ in pop3_perform()
1218 *connected = Curl_conn_is_connected(data->conn, FIRSTSOCKET); in pop3_perform()
1259 * Disconnect from an POP3 server. Cleanup protocol-specific per-connection
1265 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_disconnect()
1272 if(!dead_connection && conn->bits.protoconnstart) { in pop3_disconnect()
1278 Curl_pp_disconnect(&pop3c->pp); in pop3_disconnect()
1281 Curl_sasl_cleanup(conn, pop3c->sasl.authused); in pop3_disconnect()
1284 Curl_safefree(pop3c->apoptimestamp); in pop3_disconnect()
1320 * Performs all commands done before a regular transfer between a local and a
1330 data->req.size = -1; in pop3_regular_transfer()
1332 /* Set the progress data */ in pop3_regular_transfer()
1335 Curl_pgrsSetUploadSize(data, -1); in pop3_regular_transfer()
1336 Curl_pgrsSetDownloadSize(data, -1); in pop3_regular_transfer()
1357 conn->bits.tls_upgraded = FALSE; in pop3_setup_connection()
1371 struct pop3_conn *pop3c = &conn->proto.pop3c; in pop3_parse_url_options()
1372 const char *ptr = conn->options; in pop3_parse_url_options()
1387 result = Curl_sasl_parse_url_auth_option(&pop3c->sasl, in pop3_parse_url_options()
1388 value, ptr - value); in pop3_parse_url_options()
1390 if(result && strncasecompare(value, "+APOP", ptr - value)) { in pop3_parse_url_options()
1391 pop3c->preftype = POP3_TYPE_APOP; in pop3_parse_url_options()
1392 pop3c->sasl.prefmech = SASL_AUTH_NONE; in pop3_parse_url_options()
1403 if(pop3c->preftype != POP3_TYPE_APOP) in pop3_parse_url_options()
1404 switch(pop3c->sasl.prefmech) { in pop3_parse_url_options()
1406 pop3c->preftype = POP3_TYPE_NONE; in pop3_parse_url_options()
1409 pop3c->preftype = POP3_TYPE_ANY; in pop3_parse_url_options()
1412 pop3c->preftype = POP3_TYPE_SASL; in pop3_parse_url_options()
1428 struct POP3 *pop3 = data->req.p.pop3; in pop3_parse_url_path()
1429 const char *path = &data->state.up.path[1]; /* skip leading path */ in pop3_parse_url_path()
1432 return Curl_urldecode(path, 0, &pop3->id, NULL, REJECT_CTRL); in pop3_parse_url_path()
1444 struct POP3 *pop3 = data->req.p.pop3; in pop3_parse_custom_request()
1445 const char *custom = data->set.str[STRING_CUSTOMREQUEST]; in pop3_parse_custom_request()
1449 result = Curl_urldecode(custom, 0, &pop3->custom, NULL, REJECT_CTRL); in pop3_parse_custom_request()
1458 * This function scans the body after the end-of-body and writes everything
1465 struct SingleRequest *k = &data->req; in Curl_pop3_write()
1466 struct connectdata *conn = data->conn; in Curl_pop3_write()
1467 struct pop3_conn *pop3c = &conn->proto.pop3c; in Curl_pop3_write()
1472 /* Search through the buffer looking for the end-of-body marker which is in Curl_pop3_write()
1478 size_t prev = pop3c->eob; in Curl_pop3_write()
1482 if(pop3c->eob == 0) { in Curl_pop3_write()
1483 pop3c->eob++; in Curl_pop3_write()
1488 i - last); in Curl_pop3_write()
1496 else if(pop3c->eob == 3) in Curl_pop3_write()
1497 pop3c->eob++; in Curl_pop3_write()
1501 pop3c->eob = 1; in Curl_pop3_write()
1505 if(pop3c->eob == 1 || pop3c->eob == 4) in Curl_pop3_write()
1506 pop3c->eob++; in Curl_pop3_write()
1510 pop3c->eob = 0; in Curl_pop3_write()
1514 if(pop3c->eob == 2) in Curl_pop3_write()
1515 pop3c->eob++; in Curl_pop3_write()
1516 else if(pop3c->eob == 3) { in Curl_pop3_write()
1519 pop3c->eob = 0; in Curl_pop3_write()
1524 pop3c->eob = 0; in Curl_pop3_write()
1528 pop3c->eob = 0; in Curl_pop3_write()
1533 if(prev && prev >= pop3c->eob) { in Curl_pop3_write()
1534 /* Strip can only be non-zero for the very first mismatch after CRLF in Curl_pop3_write()
1537 while(prev && pop3c->strip) { in Curl_pop3_write()
1538 prev--; in Curl_pop3_write()
1539 pop3c->strip--; in Curl_pop3_write()
1545 if(strip_dot && prev - 1 > 0) { in Curl_pop3_write()
1547 prev - 1); in Curl_pop3_write()
1566 if(pop3c->eob == POP3_EOB_LEN) { in Curl_pop3_write()
1567 /* We have a full match so the transfer is done, however we must transfer in Curl_pop3_write()
1569 message as per RFC-1939, sect. 3 */ in Curl_pop3_write()
1572 k->keepon &= ~KEEP_RECV; in Curl_pop3_write()
1573 pop3c->eob = 0; in Curl_pop3_write()
1578 if(pop3c->eob) in Curl_pop3_write()
1582 if(nread - last) { in Curl_pop3_write()
1584 nread - last); in Curl_pop3_write()