/* For responses to user entry of AUTH LOGIN */ static CURLcode smtp_state_auth_passwd_resp(struct connectdata *conn, int smtpcode, smtpstate instate) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; size_t len = 0; char *authpasswd = NULL; (void)instate; /* no use for this yet */ if(smtpcode != 334) { failf(data, "Access denied: %d", smtpcode); result = CURLE_LOGIN_DENIED; } else { /* Create the password message */ result = Curl_sasl_create_login_message(conn->data, conn->passwd, &authpasswd, &len); /* Send the password */ if(!result) { if(authpasswd) { result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authpasswd); if(!result) state(conn, SMTP_AUTH); } Curl_safefree(authpasswd); } } return result; }
/* For AUTH LOGIN responses */ static CURLcode pop3_state_auth_login_resp(struct connectdata *conn, int pop3code, pop3state instate) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; size_t len = 0; char *authuser = NULL; (void)instate; /* no use for this yet */ if(pop3code != '+') { failf(data, "Access denied: %d", pop3code); result = CURLE_LOGIN_DENIED; } else { /* Create the user message */ result = Curl_sasl_create_login_message(data, conn->user, &authuser, &len); /* Send the user */ if(!result) { if(authuser) { result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", authuser); if(!result) state(conn, POP3_AUTH_LOGIN_PASSWD); } Curl_safefree(authuser); } } return result; }
static CURLcode smtp_authenticate(struct connectdata *conn) { CURLcode result = CURLE_OK; struct smtp_conn *smtpc = &conn->proto.smtpc; 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); return result; } /* Check supported authentication mechanisms by decreasing order of security */ #ifndef CURL_DISABLE_CRYPTO_AUTH if(smtpc->authmechs & SASL_MECH_DIGEST_MD5) { mech = "DIGEST-MD5"; state1 = SMTP_AUTH_DIGESTMD5; smtpc->authused = SASL_MECH_DIGEST_MD5; } else if(smtpc->authmechs & SASL_MECH_CRAM_MD5) { mech = "CRAM-MD5"; state1 = SMTP_AUTH_CRAMMD5; smtpc->authused = SASL_MECH_CRAM_MD5; } else #endif #ifdef USE_NTLM if(smtpc->authmechs & SASL_MECH_NTLM) { mech = "NTLM"; state1 = SMTP_AUTH_NTLM; state2 = SMTP_AUTH_NTLM_TYPE2MSG; smtpc->authused = SASL_MECH_NTLM; result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, &conn->ntlm, &initresp, &len); } else #endif if(smtpc->authmechs & SASL_MECH_LOGIN) { mech = "LOGIN"; state1 = SMTP_AUTH_LOGIN; state2 = SMTP_AUTH_PASSWD; smtpc->authused = SASL_MECH_LOGIN; result = Curl_sasl_create_login_message(conn->data, conn->user, &initresp, &len); } else if(smtpc->authmechs & SASL_MECH_PLAIN) { mech = "PLAIN"; state1 = SMTP_AUTH_PLAIN; state2 = SMTP_AUTH; smtpc->authused = SASL_MECH_PLAIN; result = Curl_sasl_create_plain_message(conn->data, conn->user, conn->passwd, &initresp, &len); } else { infof(conn->data, "No known authentication mechanisms supported!\n"); result = CURLE_LOGIN_DENIED; /* Other mechanisms not supported */ } 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, state1); } Curl_safefree(initresp); } return result; }