From b87ba2c94217c0b5da8758b22972ee2d5381f169 Mon Sep 17 00:00:00 2001 From: Steve Holme Date: Sun, 27 Oct 2013 16:27:38 +0000 Subject: email: Added support for cancelling DIGEST-MD5 authentication --- lib/smtp.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'lib/smtp.c') diff --git a/lib/smtp.c b/lib/smtp.c index 30c89dba1..54688bcd9 100644 --- a/lib/smtp.c +++ b/lib/smtp.c @@ -998,6 +998,10 @@ static CURLcode smtp_state_auth_digest_resp(struct connectdata *conn, char *rplyb64 = NULL; size_t len = 0; + char nonce[64]; + char realm[128]; + char algorithm[64]; + (void)instate; /* no use for this yet */ if(smtpcode != 334) { @@ -1008,23 +1012,33 @@ static CURLcode smtp_state_auth_digest_resp(struct connectdata *conn, /* Get the challenge message */ smtp_get_message(data->state.buffer, &chlg64); - /* Create the response message */ - result = Curl_sasl_create_digest_md5_message(data, chlg64, conn->user, - conn->passwd, "smtp", - &rplyb64, &len); + /* Decode the challange message */ + result = Curl_sasl_decode_digest_md5_message(chlg64, nonce, sizeof(nonce), + realm, sizeof(realm), + algorithm, sizeof(algorithm)); + if(result || strcmp(algorithm, "md5-sess") != 0) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "*"); - /* Send the response */ - if(!result) { - if(rplyb64) { + if(!result) + state(conn, SMTP_AUTH_CANCEL); + } + else { + /* Create the response message */ + result = Curl_sasl_create_digest_md5_message(data, nonce, realm, + conn->user, conn->passwd, + "smtp", &rplyb64, &len); + if(!result && rplyb64) { + /* Send the response */ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64); if(!result) state(conn, SMTP_AUTH_DIGESTMD5_RESP); } - - Curl_safefree(rplyb64); } + Curl_safefree(rplyb64); + return result; } -- cgit v1.2.3