mirror of
https://github.com/moparisthebest/curl
synced 2025-01-03 09:58:02 -05:00
smtp: Post authentication code tidy up
Corrected lines longer than 78 characters. Removed unnecessary braces in smtp_state_helo_resp(). Introduced some comments in data sending functions. Tidied up comments to match changes made in pop3.c.
This commit is contained in:
parent
c5b66836a5
commit
7157363ab4
139
lib/smtp.c
139
lib/smtp.c
@ -316,7 +316,7 @@ static CURLcode smtp_state_ehlo(struct connectdata *conn)
|
|||||||
CURLcode result;
|
CURLcode result;
|
||||||
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
||||||
|
|
||||||
smtpc->authmechs = 0; /* No known authentication mechanisms yet. */
|
smtpc->authmechs = 0; /* No known authentication mechanisms yet */
|
||||||
smtpc->authused = 0; /* Clear the authentication mechanism used
|
smtpc->authused = 0; /* Clear the authentication mechanism used
|
||||||
for esmtp connections */
|
for esmtp connections */
|
||||||
|
|
||||||
@ -390,7 +390,8 @@ static CURLcode smtp_authenticate(struct connectdata *conn)
|
|||||||
state2 = SMTP_AUTHNTLM_TYPE2MSG;
|
state2 = SMTP_AUTHNTLM_TYPE2MSG;
|
||||||
smtpc->authused = SASL_AUTH_NTLM;
|
smtpc->authused = SASL_AUTH_NTLM;
|
||||||
result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd,
|
result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd,
|
||||||
&conn->ntlm, &initresp, &len);
|
&conn->ntlm,
|
||||||
|
&initresp, &len);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -452,7 +453,7 @@ static void smtp_to_smtps(struct connectdata *conn)
|
|||||||
#define smtp_to_smtps(x) Curl_nop_stmt
|
#define smtp_to_smtps(x) Curl_nop_stmt
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* for the initial server greeting */
|
/* For the initial server greeting */
|
||||||
static CURLcode smtp_state_servergreet_resp(struct connectdata *conn,
|
static CURLcode smtp_state_servergreet_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -472,7 +473,7 @@ static CURLcode smtp_state_servergreet_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for STARTTLS responses */
|
/* For STARTTLS responses */
|
||||||
static CURLcode smtp_state_starttls_resp(struct connectdata *conn,
|
static CURLcode smtp_state_starttls_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -522,7 +523,7 @@ static CURLcode smtp_state_upgrade_tls(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for EHLO responses */
|
/* For EHLO responses */
|
||||||
static CURLcode smtp_state_ehlo_resp(struct connectdata *conn,
|
static CURLcode smtp_state_ehlo_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -553,7 +554,7 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for HELO responses */
|
/* For HELO responses */
|
||||||
static CURLcode smtp_state_helo_resp(struct connectdata *conn,
|
static CURLcode smtp_state_helo_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -567,15 +568,14 @@ static CURLcode smtp_state_helo_resp(struct connectdata *conn,
|
|||||||
failf(data, "Remote access denied: %d", smtpcode);
|
failf(data, "Remote access denied: %d", smtpcode);
|
||||||
result = CURLE_REMOTE_ACCESS_DENIED;
|
result = CURLE_REMOTE_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
/* end the connect phase */
|
/* End of connect phase */
|
||||||
state(conn, SMTP_STOP);
|
state(conn, SMTP_STOP);
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for AUTH PLAIN (without initial response) responses */
|
/* For AUTH PLAIN (without initial response) responses */
|
||||||
static CURLcode smtp_state_authplain_resp(struct connectdata *conn,
|
static CURLcode smtp_state_authplain_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -592,9 +592,11 @@ static CURLcode smtp_state_authplain_resp(struct connectdata *conn,
|
|||||||
result = CURLE_LOGIN_DENIED;
|
result = CURLE_LOGIN_DENIED;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* Create the authorisation message */
|
||||||
result = Curl_sasl_create_plain_message(conn->data, conn->user,
|
result = Curl_sasl_create_plain_message(conn->data, conn->user,
|
||||||
conn->passwd, &plainauth, &len);
|
conn->passwd, &plainauth, &len);
|
||||||
|
|
||||||
|
/* Send the message */
|
||||||
if(!result) {
|
if(!result) {
|
||||||
if(plainauth) {
|
if(plainauth) {
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", plainauth);
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", plainauth);
|
||||||
@ -609,7 +611,7 @@ static CURLcode smtp_state_authplain_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for AUTH LOGIN (without initial response) responses */
|
/* For AUTH LOGIN (without initial response) responses */
|
||||||
static CURLcode smtp_state_authlogin_resp(struct connectdata *conn,
|
static CURLcode smtp_state_authlogin_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -626,9 +628,11 @@ static CURLcode smtp_state_authlogin_resp(struct connectdata *conn,
|
|||||||
result = CURLE_LOGIN_DENIED;
|
result = CURLE_LOGIN_DENIED;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* Create the user message */
|
||||||
result = Curl_sasl_create_login_message(conn->data, conn->user,
|
result = Curl_sasl_create_login_message(conn->data, conn->user,
|
||||||
&authuser, &len);
|
&authuser, &len);
|
||||||
|
|
||||||
|
/* Send the user */
|
||||||
if(!result) {
|
if(!result) {
|
||||||
if(authuser) {
|
if(authuser) {
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authuser);
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authuser);
|
||||||
@ -643,7 +647,7 @@ static CURLcode smtp_state_authlogin_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for responses to user entry of AUTH LOGIN */
|
/* For responses to user entry of AUTH LOGIN */
|
||||||
static CURLcode smtp_state_authpasswd_resp(struct connectdata *conn,
|
static CURLcode smtp_state_authpasswd_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -660,9 +664,11 @@ static CURLcode smtp_state_authpasswd_resp(struct connectdata *conn,
|
|||||||
result = CURLE_LOGIN_DENIED;
|
result = CURLE_LOGIN_DENIED;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* Create the password message */
|
||||||
result = Curl_sasl_create_login_message(conn->data, conn->passwd,
|
result = Curl_sasl_create_login_message(conn->data, conn->passwd,
|
||||||
&authpasswd, &len);
|
&authpasswd, &len);
|
||||||
|
|
||||||
|
/* Send the password */
|
||||||
if(!result) {
|
if(!result) {
|
||||||
if(authpasswd) {
|
if(authpasswd) {
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authpasswd);
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authpasswd);
|
||||||
@ -678,7 +684,7 @@ static CURLcode smtp_state_authpasswd_resp(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_CRYPTO_AUTH
|
#ifndef CURL_DISABLE_CRYPTO_AUTH
|
||||||
/* for AUTH CRAM-MD5 responses */
|
/* For AUTH CRAM-MD5 responses */
|
||||||
static CURLcode smtp_state_authcram_resp(struct connectdata *conn,
|
static CURLcode smtp_state_authcram_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -712,9 +718,11 @@ static CURLcode smtp_state_authcram_resp(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create the response message */
|
||||||
result = Curl_sasl_create_cram_md5_message(data, chlg64, conn->user,
|
result = Curl_sasl_create_cram_md5_message(data, chlg64, conn->user,
|
||||||
conn->passwd, &rplyb64, &len);
|
conn->passwd, &rplyb64, &len);
|
||||||
|
|
||||||
|
/* Send the response */
|
||||||
if(!result) {
|
if(!result) {
|
||||||
if(rplyb64) {
|
if(rplyb64) {
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64);
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64);
|
||||||
@ -728,7 +736,7 @@ static CURLcode smtp_state_authcram_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for AUTH DIGEST-MD5 challenge responses */
|
/* For AUTH DIGEST-MD5 challenge responses */
|
||||||
static CURLcode smtp_state_authdigest_resp(struct connectdata *conn,
|
static CURLcode smtp_state_authdigest_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -750,10 +758,12 @@ static CURLcode smtp_state_authdigest_resp(struct connectdata *conn,
|
|||||||
for(chlg64 += 4; *chlg64 == ' ' || *chlg64 == '\t'; chlg64++)
|
for(chlg64 += 4; *chlg64 == ' ' || *chlg64 == '\t'; chlg64++)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
/* Create the response message */
|
||||||
result = Curl_sasl_create_digest_md5_message(data, chlg64, conn->user,
|
result = Curl_sasl_create_digest_md5_message(data, chlg64, conn->user,
|
||||||
conn->passwd, "smtp",
|
conn->passwd, "smtp",
|
||||||
&rplyb64, &len);
|
&rplyb64, &len);
|
||||||
|
|
||||||
|
/* Send the response */
|
||||||
if(!result) {
|
if(!result) {
|
||||||
if(rplyb64) {
|
if(rplyb64) {
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64);
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64);
|
||||||
@ -783,6 +793,7 @@ static CURLcode smtp_state_authdigest_resp_resp(struct connectdata *conn,
|
|||||||
result = CURLE_LOGIN_DENIED;
|
result = CURLE_LOGIN_DENIED;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* Send an empty response */
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "");
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "");
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
@ -795,7 +806,7 @@ static CURLcode smtp_state_authdigest_resp_resp(struct connectdata *conn,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_NTLM
|
#ifdef USE_NTLM
|
||||||
/* for the AUTH NTLM (without initial response) response */
|
/* For AUTH NTLM (without initial response) responses */
|
||||||
static CURLcode smtp_state_auth_ntlm_resp(struct connectdata *conn,
|
static CURLcode smtp_state_auth_ntlm_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -812,9 +823,12 @@ static CURLcode smtp_state_auth_ntlm_resp(struct connectdata *conn,
|
|||||||
result = CURLE_LOGIN_DENIED;
|
result = CURLE_LOGIN_DENIED;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* Create the type-1 message */
|
||||||
result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd,
|
result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd,
|
||||||
&conn->ntlm, &type1msg, &len);
|
&conn->ntlm,
|
||||||
|
&type1msg, &len);
|
||||||
|
|
||||||
|
/* Send the message */
|
||||||
if(!result) {
|
if(!result) {
|
||||||
if(type1msg) {
|
if(type1msg) {
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", type1msg);
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", type1msg);
|
||||||
@ -830,7 +844,7 @@ static CURLcode smtp_state_auth_ntlm_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for the NTLM type-2 response (sent in reponse to our type-1 message) */
|
/* For NTLM type-2 responses (sent in reponse to our type-1 message) */
|
||||||
static CURLcode smtp_state_auth_ntlm_type2msg_resp(struct connectdata *conn,
|
static CURLcode smtp_state_auth_ntlm_type2msg_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -847,11 +861,14 @@ static CURLcode smtp_state_auth_ntlm_type2msg_resp(struct connectdata *conn,
|
|||||||
result = CURLE_LOGIN_DENIED;
|
result = CURLE_LOGIN_DENIED;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* Create the type-3 message */
|
||||||
result = Curl_sasl_create_ntlm_type3_message(data,
|
result = Curl_sasl_create_ntlm_type3_message(data,
|
||||||
data->state.buffer + 4,
|
data->state.buffer + 4,
|
||||||
conn->user, conn->passwd,
|
conn->user, conn->passwd,
|
||||||
&conn->ntlm,
|
&conn->ntlm,
|
||||||
&type3msg, &len);
|
&type3msg, &len);
|
||||||
|
|
||||||
|
/* Send the message */
|
||||||
if(!result) {
|
if(!result) {
|
||||||
if(type3msg) {
|
if(type3msg) {
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", type3msg);
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", type3msg);
|
||||||
@ -868,7 +885,7 @@ static CURLcode smtp_state_auth_ntlm_type2msg_resp(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* for the final responses to the AUTH sequence */
|
/* For the final responses to the AUTH sequence */
|
||||||
static CURLcode smtp_state_auth_resp(struct connectdata *conn,
|
static CURLcode smtp_state_auth_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -883,12 +900,13 @@ static CURLcode smtp_state_auth_resp(struct connectdata *conn,
|
|||||||
result = CURLE_LOGIN_DENIED;
|
result = CURLE_LOGIN_DENIED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
state(conn, SMTP_STOP); /* End of connect phase */
|
/* End of connect phase */
|
||||||
|
state(conn, SMTP_STOP);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* start the DO phase */
|
/* Start the DO phase */
|
||||||
static CURLcode smtp_mail(struct connectdata *conn)
|
static CURLcode smtp_mail(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
char *from = NULL;
|
char *from = NULL;
|
||||||
@ -897,9 +915,9 @@ static CURLcode smtp_mail(struct connectdata *conn)
|
|||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
|
|
||||||
/* calculate the FROM parameter */
|
/* Calculate the FROM parameter */
|
||||||
if(!data->set.str[STRING_MAIL_FROM])
|
if(!data->set.str[STRING_MAIL_FROM])
|
||||||
/* null reverse-path, RFC-2821, sect. 3.7 */
|
/* Null reverse-path, RFC-2821, sect. 3.7 */
|
||||||
from = strdup("<>");
|
from = strdup("<>");
|
||||||
else if(data->set.str[STRING_MAIL_FROM][0] == '<')
|
else if(data->set.str[STRING_MAIL_FROM][0] == '<')
|
||||||
from = aprintf("%s", data->set.str[STRING_MAIL_FROM]);
|
from = aprintf("%s", data->set.str[STRING_MAIL_FROM]);
|
||||||
@ -909,12 +927,12 @@ static CURLcode smtp_mail(struct connectdata *conn)
|
|||||||
if(!from)
|
if(!from)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
/* calculate the optional AUTH parameter */
|
/* Calculate the optional AUTH parameter */
|
||||||
if(data->set.str[STRING_MAIL_AUTH] && conn->proto.smtpc.authused) {
|
if(data->set.str[STRING_MAIL_AUTH] && conn->proto.smtpc.authused) {
|
||||||
if(data->set.str[STRING_MAIL_AUTH][0] != '\0')
|
if(data->set.str[STRING_MAIL_AUTH][0] != '\0')
|
||||||
auth = aprintf("%s", data->set.str[STRING_MAIL_AUTH]);
|
auth = aprintf("%s", data->set.str[STRING_MAIL_AUTH]);
|
||||||
else
|
else
|
||||||
/* empty AUTH, RFC-2554, sect. 5 */
|
/* Empty AUTH, RFC-2554, sect. 5 */
|
||||||
auth = strdup("<>");
|
auth = strdup("<>");
|
||||||
|
|
||||||
if(!auth) {
|
if(!auth) {
|
||||||
@ -936,7 +954,7 @@ static CURLcode smtp_mail(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* send MAIL FROM */
|
/* Send the MAIL command */
|
||||||
if(!auth && !size)
|
if(!auth && !size)
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp,
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp,
|
||||||
"MAIL FROM:%s", from);
|
"MAIL FROM:%s", from);
|
||||||
@ -967,7 +985,7 @@ static CURLcode smtp_rcpt_to(struct connectdata *conn)
|
|||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
||||||
|
|
||||||
/* send RCPT TO */
|
/* Send the RCPT TO command */
|
||||||
if(smtpc->rcpt) {
|
if(smtpc->rcpt) {
|
||||||
if(smtpc->rcpt->data[0] == '<')
|
if(smtpc->rcpt->data[0] == '<')
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s",
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s",
|
||||||
@ -982,7 +1000,7 @@ static CURLcode smtp_rcpt_to(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for MAIL responses */
|
/* For MAIL responses */
|
||||||
static CURLcode smtp_state_mail_resp(struct connectdata *conn,
|
static CURLcode smtp_state_mail_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -1007,7 +1025,7 @@ static CURLcode smtp_state_mail_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for RCPT responses */
|
/* For RCPT responses */
|
||||||
static CURLcode smtp_state_rcpt_resp(struct connectdata *conn,
|
static CURLcode smtp_state_rcpt_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -1029,12 +1047,12 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn,
|
|||||||
smtpc->rcpt = smtpc->rcpt->next;
|
smtpc->rcpt = smtpc->rcpt->next;
|
||||||
result = smtp_rcpt_to(conn);
|
result = smtp_rcpt_to(conn);
|
||||||
|
|
||||||
/* if we failed or still is in RCPT sending, return */
|
/* If we failed or still are sending RCPT data then return */
|
||||||
if(result || smtpc->rcpt)
|
if(result || smtpc->rcpt)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* send DATA */
|
/* Send the DATA command */
|
||||||
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "DATA");
|
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "DATA");
|
||||||
|
|
||||||
if(result)
|
if(result)
|
||||||
@ -1046,7 +1064,7 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for the DATA response */
|
/* For DATA response */
|
||||||
static CURLcode smtp_state_data_resp(struct connectdata *conn,
|
static CURLcode smtp_state_data_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -1070,8 +1088,8 @@ static CURLcode smtp_state_data_resp(struct connectdata *conn,
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for the POSTDATA response, which is received after the entire DATA
|
/* For POSTDATA responses, which are received after the entire DATA
|
||||||
part has been sent off to the server */
|
part has been sent to the server */
|
||||||
static CURLcode smtp_state_postdata_resp(struct connectdata *conn,
|
static CURLcode smtp_state_postdata_resp(struct connectdata *conn,
|
||||||
int smtpcode,
|
int smtpcode,
|
||||||
smtpstate instate)
|
smtpstate instate)
|
||||||
@ -1101,17 +1119,17 @@ static CURLcode smtp_statemach_act(struct connectdata *conn)
|
|||||||
if(smtpc->state == SMTP_UPGRADETLS)
|
if(smtpc->state == SMTP_UPGRADETLS)
|
||||||
return smtp_state_upgrade_tls(conn);
|
return smtp_state_upgrade_tls(conn);
|
||||||
|
|
||||||
|
/* Flush any data that needs to be sent */
|
||||||
if(pp->sendleft)
|
if(pp->sendleft)
|
||||||
/* we have a piece of a command still left to send */
|
|
||||||
return Curl_pp_flushsend(pp);
|
return Curl_pp_flushsend(pp);
|
||||||
|
|
||||||
/* we read a piece of response */
|
/* Read the response from the server */
|
||||||
result = Curl_pp_readresp(sock, pp, &smtpcode, &nread);
|
result = Curl_pp_readresp(sock, pp, &smtpcode, &nread);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
/* Store the latest response for later retrieval */
|
||||||
if(smtpc->state != SMTP_QUIT)
|
if(smtpc->state != SMTP_QUIT)
|
||||||
/* store the latest code for later retrieval */
|
|
||||||
data->info.httpcode = smtpcode;
|
data->info.httpcode = smtpcode;
|
||||||
|
|
||||||
if(smtpcode) {
|
if(smtpcode) {
|
||||||
@ -1202,7 +1220,7 @@ static CURLcode smtp_statemach_act(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called repeatedly until done from multi.c */
|
/* Called repeatedly until done from multi.c */
|
||||||
static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done)
|
static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done)
|
||||||
{
|
{
|
||||||
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
struct smtp_conn *smtpc = &conn->proto.smtpc;
|
||||||
@ -1233,21 +1251,20 @@ static CURLcode smtp_easy_statemach(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Allocate and initialize the SMTP struct for the current SessionHandle if
|
||||||
* Allocate and initialize the struct SMTP for the current SessionHandle. If
|
* required */
|
||||||
* need be.
|
|
||||||
*/
|
|
||||||
static CURLcode smtp_init(struct connectdata *conn)
|
static CURLcode smtp_init(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct FTP *smtp = data->state.proto.smtp;
|
struct FTP *smtp = data->state.proto.smtp;
|
||||||
|
|
||||||
if(!smtp) {
|
if(!smtp) {
|
||||||
smtp = data->state.proto.smtp = calloc(sizeof(struct FTP), 1);
|
smtp = data->state.proto.smtp = calloc(sizeof(struct FTP), 1);
|
||||||
if(!smtp)
|
if(!smtp)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get some initial data into the smtp struct */
|
/* Get some initial data into the smtp struct */
|
||||||
smtp->bytecountp = &data->req.bytecount;
|
smtp->bytecountp = &data->req.bytecount;
|
||||||
|
|
||||||
/* No need to duplicate user+password, the connectdata struct won't change
|
/* No need to duplicate user+password, the connectdata struct won't change
|
||||||
@ -1260,8 +1277,11 @@ static CURLcode smtp_init(struct connectdata *conn)
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/***********************************************************************
|
||||||
* smtp_connect() should do everything that is to be considered a part of
|
*
|
||||||
|
* smtp_connect()
|
||||||
|
*
|
||||||
|
* This function should do everything that is to be considered a part of
|
||||||
* the connection phase.
|
* the connection phase.
|
||||||
*
|
*
|
||||||
* The variable pointed to by 'done' will be TRUE if the protocol-layer
|
* The variable pointed to by 'done' will be TRUE if the protocol-layer
|
||||||
@ -1319,7 +1339,7 @@ static CURLcode smtp_connect(struct connectdata *conn, bool *done)
|
|||||||
path = "localhost";
|
path = "localhost";
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Url decode the path and use it as the domain in our EHLO */
|
/* URL decode the path and use it as the domain in our EHLO */
|
||||||
result = Curl_urldecode(conn->data, path, 0, &smtpc->domain, NULL, TRUE);
|
result = Curl_urldecode(conn->data, path, 0, &smtpc->domain, NULL, TRUE);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
@ -1418,25 +1438,23 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
|
|||||||
* This is the actual DO function for SMTP. Get a file/directory according to
|
* This is the actual DO function for SMTP. Get a file/directory according to
|
||||||
* the options previously setup.
|
* the options previously setup.
|
||||||
*/
|
*/
|
||||||
static
|
static CURLcode smtp_perform(struct connectdata *conn, bool *connected,
|
||||||
CURLcode smtp_perform(struct connectdata *conn,
|
|
||||||
bool *connected, /* connect status after PASV / PORT */
|
|
||||||
bool *dophase_done)
|
bool *dophase_done)
|
||||||
{
|
{
|
||||||
/* this is SMTP and no proxy */
|
/* This is SMTP and no proxy */
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
|
|
||||||
DEBUGF(infof(conn->data, "DO phase starts\n"));
|
DEBUGF(infof(conn->data, "DO phase starts\n"));
|
||||||
|
|
||||||
if(conn->data->set.opt_no_body) {
|
if(conn->data->set.opt_no_body) {
|
||||||
/* requested no body means no transfer... */
|
/* Requested no body means no transfer */
|
||||||
struct FTP *smtp = conn->data->state.proto.smtp;
|
struct FTP *smtp = conn->data->state.proto.smtp;
|
||||||
smtp->transfer = FTPTRANSFER_INFO;
|
smtp->transfer = FTPTRANSFER_INFO;
|
||||||
}
|
}
|
||||||
|
|
||||||
*dophase_done = FALSE; /* not done yet */
|
*dophase_done = FALSE; /* not done yet */
|
||||||
|
|
||||||
/* start the first command in the DO phase */
|
/* Start the first command in the DO phase */
|
||||||
result = smtp_mail(conn);
|
result = smtp_mail(conn);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
@ -1494,7 +1512,6 @@ static CURLcode smtp_do(struct connectdata *conn, bool *done)
|
|||||||
* This should be called before calling sclose(). We should then wait for the
|
* This should be called before calling sclose(). We should then wait for the
|
||||||
* response from the server before returning. The calling code should then try
|
* response from the server before returning. The calling code should then try
|
||||||
* to close the connection.
|
* to close the connection.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
static CURLcode smtp_quit(struct connectdata *conn)
|
static CURLcode smtp_quit(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
@ -1525,8 +1542,7 @@ static CURLcode smtp_disconnect(struct connectdata *conn,
|
|||||||
|
|
||||||
/* We cannot send quit unconditionally. If this connection is stale or
|
/* We cannot send quit unconditionally. If this connection is stale or
|
||||||
bad in any way, sending quit and waiting around here will make the
|
bad in any way, sending quit and waiting around here will make the
|
||||||
disconnect wait in vain and cause more problems than we need to.
|
disconnect wait in vain and cause more problems than we need to */
|
||||||
*/
|
|
||||||
|
|
||||||
/* The SMTP session may or may not have been allocated/setup at this
|
/* The SMTP session may or may not have been allocated/setup at this
|
||||||
point! */
|
point! */
|
||||||
@ -1543,7 +1559,7 @@ static CURLcode smtp_disconnect(struct connectdata *conn,
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call this when the DO phase has completed */
|
/* Call this when the DO phase has completed */
|
||||||
static CURLcode smtp_dophase_done(struct connectdata *conn, bool connected)
|
static CURLcode smtp_dophase_done(struct connectdata *conn, bool connected)
|
||||||
{
|
{
|
||||||
struct FTP *smtp = conn->data->state.proto.smtp;
|
struct FTP *smtp = conn->data->state.proto.smtp;
|
||||||
@ -1559,7 +1575,7 @@ static CURLcode smtp_dophase_done(struct connectdata *conn, bool connected)
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called from multi.c while DOing */
|
/* Called from multi.c while DOing */
|
||||||
static CURLcode smtp_doing(struct connectdata *conn, bool *dophase_done)
|
static CURLcode smtp_doing(struct connectdata *conn, bool *dophase_done)
|
||||||
{
|
{
|
||||||
CURLcode result = smtp_multi_statemach(conn, dophase_done);
|
CURLcode result = smtp_multi_statemach(conn, dophase_done);
|
||||||
@ -1597,14 +1613,12 @@ static CURLcode smtp_regular_transfer(struct connectdata *conn,
|
|||||||
Curl_pgrsSetUploadSize(data, 0);
|
Curl_pgrsSetUploadSize(data, 0);
|
||||||
Curl_pgrsSetDownloadSize(data, 0);
|
Curl_pgrsSetDownloadSize(data, 0);
|
||||||
|
|
||||||
result = smtp_perform(conn,
|
result = smtp_perform(conn, &connected, dophase_done);
|
||||||
&connected, /* have we connected after PASV/PORT */
|
|
||||||
dophase_done); /* all commands in the DO-phase done? */
|
|
||||||
|
|
||||||
if(CURLE_OK == result) {
|
if(CURLE_OK == result) {
|
||||||
|
|
||||||
if(!*dophase_done)
|
if(!*dophase_done)
|
||||||
/* the DO phase has not completed yet */
|
/* The DO phase has not completed yet */
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
|
||||||
result = smtp_dophase_done(conn, connected);
|
result = smtp_dophase_done(conn, connected);
|
||||||
@ -1635,9 +1649,8 @@ static CURLcode smtp_setup_connection(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We explicitly mark this connection as persistent here as we're doing
|
/* We explicitly mark this connection as persistent here as we're doing
|
||||||
* SMTP over HTTP and thus we accidentally avoid setting this value
|
SMTP over HTTP and thus we accidentally avoid setting this value
|
||||||
* otherwise.
|
otherwise */
|
||||||
*/
|
|
||||||
conn->bits.close = FALSE;
|
conn->bits.close = FALSE;
|
||||||
#else
|
#else
|
||||||
failf(data, "SMTP over http proxy requires HTTP support built-in!");
|
failf(data, "SMTP over http proxy requires HTTP support built-in!");
|
||||||
|
15
lib/smtp.h
15
lib/smtp.h
@ -57,14 +57,15 @@ typedef enum {
|
|||||||
struct */
|
struct */
|
||||||
struct smtp_conn {
|
struct smtp_conn {
|
||||||
struct pingpong pp;
|
struct pingpong pp;
|
||||||
char *domain; /* what to send in the EHLO */
|
char *domain; /* Client address/name to send in the EHLO */
|
||||||
size_t eob; /* number of bytes of the EOB (End Of Body) that has been
|
size_t eob; /* Number of bytes of the EOB (End Of Body) that
|
||||||
received thus far */
|
have been received so far */
|
||||||
unsigned int authmechs; /* Accepted authentication methods. */
|
unsigned int authmechs; /* Accepted authentication methods */
|
||||||
unsigned int authused; /* Authentication method used for the connection */
|
unsigned int authused; /* Authentication method used for the connection */
|
||||||
smtpstate state; /* always use smtp.c:state() to change state! */
|
smtpstate state; /* Always use smtp.c:state() to change state! */
|
||||||
struct curl_slist *rcpt;
|
struct curl_slist *rcpt; /* Recipient list */
|
||||||
bool ssldone; /* is connect() over SSL done? only relevant in multi mode */
|
bool ssldone; /* Is connect() over SSL done? only relevant in
|
||||||
|
multi mode */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct Curl_handler Curl_handler_smtp;
|
extern const struct Curl_handler Curl_handler_smtp;
|
||||||
|
Loading…
Reference in New Issue
Block a user