diff options
-rw-r--r-- | lib/smtp.c | 143 |
1 files changed, 72 insertions, 71 deletions
diff --git a/lib/smtp.c b/lib/smtp.c index 75b008ef2..6d99d36dd 100644 --- a/lib/smtp.c +++ b/lib/smtp.c @@ -111,7 +111,6 @@ static CURLcode smtp_doing(struct connectdata *conn, static CURLcode smtp_setup_connection(struct connectdata * conn); static CURLcode smtp_state_upgrade_tls(struct connectdata *conn); - /* * SMTP protocol handler. */ @@ -135,7 +134,6 @@ const struct Curl_handler Curl_handler_smtp = { PROTOPT_CLOSEACTION /* flags */ }; - #ifdef USE_SSL /* * SMTPS protocol handler. @@ -185,7 +183,6 @@ static const struct Curl_handler Curl_handler_smtp_proxy = { PROTOPT_NONE /* flags */ }; - #ifdef USE_SSL /* * HTTP-proxyed SMTPS protocol handler. @@ -212,7 +209,6 @@ static const struct Curl_handler Curl_handler_smtps_proxy = { #endif #endif - /* Function that checks for an ending smtp status code at the start of the given string. As a side effect, it also flags allowed authentication mechanisms according @@ -388,64 +384,61 @@ static CURLcode smtp_authenticate(struct connectdata *conn) { CURLcode result = CURLE_OK; struct smtp_conn *smtpc = &conn->proto.smtpc; - char * initresp; - const char * mech; - size_t l; - smtpstate state1; - smtpstate state2; - - if(!conn->bits.user_passwd) - state(conn, SMTP_STOP); /* End of connect phase. */ - else { - initresp = (char *) NULL; - l = 1; + char *initresp = NULL; + const char *mech = NULL; + size_t len = 0; + smtpstate state1 = SMTP_STOP; + smtpstate state2 = SMTP_STOP; + + /* Check we have a username and password to authenticate with and end the + connect phase if we don't. */ + if(!conn->bits.user_passwd) { + state(conn, SMTP_STOP); - /* Check supported authentication mechanisms by decreasing order of - security. */ - mech = (const char *) NULL; /* Avoid compiler warnings. */ - state1 = SMTP_STOP; - state2 = SMTP_STOP; + return result; + } + /* Check supported authentication mechanisms by decreasing order of + security. */ #ifndef CURL_DISABLE_CRYPTO_AUTH - if(smtpc->authmechs & SMTP_AUTH_CRAM_MD5) { - mech = "CRAM-MD5"; - state1 = SMTP_AUTHCRAM; - } - else + if(smtpc->authmechs & SMTP_AUTH_CRAM_MD5) { + mech = "CRAM-MD5"; + state1 = SMTP_AUTHCRAM; + } + else #endif - if(smtpc->authmechs & SMTP_AUTH_LOGIN) { - mech = "LOGIN"; - state1 = SMTP_AUTHLOGIN; - state2 = SMTP_AUTHPASSWD; - result = smtp_auth_login_user(conn, &initresp, &l); - } - else if(smtpc->authmechs & SMTP_AUTH_PLAIN) { - mech = "PLAIN"; - state1 = SMTP_AUTHPLAIN; - state2 = SMTP_AUTH; - result = smtp_auth_plain_data(conn, &initresp, &l); - } - else { - infof(conn->data, "No known auth mechanisms supported!\n"); - result = CURLE_LOGIN_DENIED; /* Other mechanisms not supported. */ - } + if(smtpc->authmechs & SMTP_AUTH_LOGIN) { + mech = "LOGIN"; + state1 = SMTP_AUTHLOGIN; + state2 = SMTP_AUTHPASSWD; + result = smtp_auth_login_user(conn, &initresp, &len); + } + else if(smtpc->authmechs & SMTP_AUTH_PLAIN) { + mech = "PLAIN"; + state1 = SMTP_AUTHPLAIN; + state2 = SMTP_AUTH; + result = smtp_auth_plain_data(conn, &initresp, &len); + } + else { + infof(conn->data, "No known auth mechanisms supported!\n"); + result = CURLE_LOGIN_DENIED; /* Other mechanisms not supported. */ + } - if(!result) { - if(initresp && - l + strlen(mech) <= 512 - 8) { /* AUTH <mech> ...<crlf> */ - result = Curl_pp_sendf(&smtpc->pp, "AUTH %s %s", mech, initresp); + if(!result) { + if(initresp && + strlen(mech) + len <= 512 - 8) { /* AUTH <mech> ...<crlf> */ + result = Curl_pp_sendf(&smtpc->pp, "AUTH %s %s", mech, initresp); - if(!result) - state(conn, state2); - } - else { - result = Curl_pp_sendf(&smtpc->pp, "AUTH %s", mech); + if(!result) + state(conn, state2); + } + else { + result = Curl_pp_sendf(&smtpc->pp, "AUTH %s", mech); - if(!result) - state(conn, state1); - } - Curl_safefree(initresp); + if(!result) + state(conn, state1); } + Curl_safefree(initresp); } return result; @@ -498,6 +491,7 @@ static CURLcode smtp_state_starttls_resp(struct connectdata *conn, } } } + return result; } @@ -565,6 +559,7 @@ static CURLcode smtp_state_helo_resp(struct connectdata *conn, /* end the connect phase */ state(conn, SMTP_STOP); } + return result; } @@ -575,8 +570,8 @@ static CURLcode smtp_state_authplain_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - size_t l = 0; - char * plainauth = NULL; + size_t len = 0; + char *plainauth = NULL; (void)instate; /* no use for this yet */ @@ -585,7 +580,7 @@ static CURLcode smtp_state_authplain_resp(struct connectdata *conn, result = CURLE_LOGIN_DENIED; } else { - result = smtp_auth_plain_data(conn, &plainauth, &l); + result = smtp_auth_plain_data(conn, &plainauth, &len); if(!result) { if(plainauth) { @@ -608,8 +603,8 @@ static CURLcode smtp_state_authlogin_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - size_t l = 0; - char * authuser = NULL; + size_t len = 0; + char *authuser = NULL; (void)instate; /* no use for this yet */ @@ -618,7 +613,7 @@ static CURLcode smtp_state_authlogin_resp(struct connectdata *conn, result = CURLE_LOGIN_DENIED; } else { - result = smtp_auth_login_user(conn, &authuser, &l); + result = smtp_auth_login_user(conn, &authuser, &len); if(!result) { if(authuser) { @@ -642,7 +637,7 @@ static CURLcode smtp_state_authpasswd_resp(struct connectdata *conn, CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; size_t plen; - size_t l = 0; + size_t len = 0; char *authpasswd = NULL; (void)instate; /* no use for this yet */ @@ -657,7 +652,7 @@ static CURLcode smtp_state_authpasswd_resp(struct connectdata *conn, if(!plen) result = Curl_pp_sendf(&conn->proto.smtpc.pp, "="); else { - result = Curl_base64_encode(data, conn->passwd, plen, &authpasswd, &l); + result = Curl_base64_encode(data, conn->passwd, plen, &authpasswd, &len); if(!result) { if(authpasswd) { @@ -686,9 +681,9 @@ static CURLcode smtp_state_authcram_resp(struct connectdata *conn, char * chlg64 = data->state.buffer; unsigned char * chlg; size_t chlglen; - size_t l = 0; - char * rplyb64 = NULL; - HMAC_context * ctxt; + size_t len = 0; + char *rplyb64 = NULL; + HMAC_context *ctxt; unsigned char digest[16]; char reply[MAX_CURL_USER_LENGTH + 32 /* 2 * size of MD5 digest */ + 1]; @@ -707,13 +702,13 @@ static CURLcode smtp_state_authcram_resp(struct connectdata *conn, chlglen = 0; if(*chlg64 != '=') { - for(l = strlen(chlg64); l--;) - if(chlg64[l] != '\r' && chlg64[l] != '\n' && chlg64[l] != ' ' && - chlg64[l] != '\t') + for(len = strlen(chlg64); len--;) + if(chlg64[len] != '\r' && chlg64[len] != '\n' && chlg64[len] != ' ' && + chlg64[len] != '\t') break; - if(++l) { - chlg64[l] = '\0'; + if(++len) { + chlg64[len] = '\0'; result = Curl_base64_decode(chlg64, &chlg, &chlglen); if(result) @@ -747,7 +742,7 @@ static CURLcode smtp_state_authcram_resp(struct connectdata *conn, digest[12], digest[13], digest[14], digest[15]); /* Encode it to base64 and send it. */ - result = Curl_base64_encode(data, reply, 0, &rplyb64, &l); + result = Curl_base64_encode(data, reply, 0, &rplyb64, &len); if(!result) { if(rplyb64) { @@ -849,6 +844,7 @@ static CURLcode smtp_rcpt_to(struct connectdata *conn) if(!result) state(conn, SMTP_RCPT); } + return result; } @@ -909,6 +905,7 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn, state(conn, SMTP_DATA); } + return result; } @@ -949,6 +946,7 @@ static CURLcode smtp_state_postdata_resp(struct connectdata *conn, result = CURLE_RECV_ERROR; state(conn, SMTP_STOP); + return result; } @@ -1046,6 +1044,7 @@ static CURLcode smtp_statemach_act(struct connectdata *conn) break; } } + return result; } @@ -1440,6 +1439,7 @@ static CURLcode smtp_doing(struct connectdata *conn, DEBUGF(infof(conn->data, "DO phase is complete\n")); } + return result; } @@ -1579,6 +1579,7 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread) /* set the new amount too */ data->req.upload_present = nread; } + return CURLE_OK; } |