1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

http_digest: Use CURLcode instead of CURLdigest

To provide consistent behaviour between the various HTTP authentication
functions use CURLcode based error codes for Curl_input_digest()
especially as the calling code doesn't use the specific error code just
that it failed.
This commit is contained in:
Steve Holme 2014-11-05 12:05:34 +00:00
parent 54c8728cd7
commit efe4bab29b
3 changed files with 24 additions and 33 deletions

View File

@ -845,7 +845,7 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
infof(data, "Ignoring duplicate digest auth header.\n"); infof(data, "Ignoring duplicate digest auth header.\n");
} }
else { else {
CURLdigest dig; CURLcode result;
*availp |= CURLAUTH_DIGEST; *availp |= CURLAUTH_DIGEST;
authp->avail |= CURLAUTH_DIGEST; authp->avail |= CURLAUTH_DIGEST;
@ -853,9 +853,8 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
* authentication isn't activated yet, as we need to store the * authentication isn't activated yet, as we need to store the
* incoming data from this header in case we are gonna use * incoming data from this header in case we are gonna use
* Digest. */ * Digest. */
dig = Curl_input_digest(conn, proxy, auth); result = Curl_input_digest(conn, proxy, auth);
if(result) {
if(CURLDIGEST_FINE != dig) {
infof(data, "Authentication problem. Ignoring this.\n"); infof(data, "Authentication problem. Ignoring this.\n");
data->state.authproblem = TRUE; data->state.authproblem = TRUE;
} }

View File

@ -121,7 +121,7 @@ Proxy-Authenticate: Digest realm="testrealm", nonce="1053604598"
*/ */
CURLdigest Curl_input_digest(struct connectdata *conn, CURLcode Curl_input_digest(struct connectdata *conn,
bool proxy, bool proxy,
const char *header) /* rest of the *-authenticate: const char *header) /* rest of the *-authenticate:
header */ header */
@ -163,7 +163,7 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
if(Curl_raw_equal(value, "nonce")) { if(Curl_raw_equal(value, "nonce")) {
d->nonce = strdup(content); d->nonce = strdup(content);
if(!d->nonce) if(!d->nonce)
return CURLDIGEST_NOMEM; return CURLE_OUT_OF_MEMORY;
} }
else if(Curl_raw_equal(value, "stale")) { else if(Curl_raw_equal(value, "stale")) {
if(Curl_raw_equal(content, "true")) { if(Curl_raw_equal(content, "true")) {
@ -174,12 +174,12 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
else if(Curl_raw_equal(value, "realm")) { else if(Curl_raw_equal(value, "realm")) {
d->realm = strdup(content); d->realm = strdup(content);
if(!d->realm) if(!d->realm)
return CURLDIGEST_NOMEM; return CURLE_OUT_OF_MEMORY;
} }
else if(Curl_raw_equal(value, "opaque")) { else if(Curl_raw_equal(value, "opaque")) {
d->opaque = strdup(content); d->opaque = strdup(content);
if(!d->opaque) if(!d->opaque)
return CURLDIGEST_NOMEM; return CURLE_OUT_OF_MEMORY;
} }
else if(Curl_raw_equal(value, "qop")) { else if(Curl_raw_equal(value, "qop")) {
char *tok_buf; char *tok_buf;
@ -187,7 +187,8 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
clone of the buffer since strtok_r() ruins it */ clone of the buffer since strtok_r() ruins it */
tmp = strdup(content); tmp = strdup(content);
if(!tmp) if(!tmp)
return CURLDIGEST_NOMEM; return CURLE_OUT_OF_MEMORY;
token = strtok_r(tmp, ",", &tok_buf); token = strtok_r(tmp, ",", &tok_buf);
while(token != NULL) { while(token != NULL) {
if(Curl_raw_equal(token, "auth")) { if(Curl_raw_equal(token, "auth")) {
@ -203,24 +204,25 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
if(foundAuth) { if(foundAuth) {
d->qop = strdup("auth"); d->qop = strdup("auth");
if(!d->qop) if(!d->qop)
return CURLDIGEST_NOMEM; return CURLE_OUT_OF_MEMORY;
} }
else if(foundAuthInt) { else if(foundAuthInt) {
d->qop = strdup("auth-int"); d->qop = strdup("auth-int");
if(!d->qop) if(!d->qop)
return CURLDIGEST_NOMEM; return CURLE_OUT_OF_MEMORY;
} }
} }
else if(Curl_raw_equal(value, "algorithm")) { else if(Curl_raw_equal(value, "algorithm")) {
d->algorithm = strdup(content); d->algorithm = strdup(content);
if(!d->algorithm) if(!d->algorithm)
return CURLDIGEST_NOMEM; return CURLE_OUT_OF_MEMORY;
if(Curl_raw_equal(content, "MD5-sess")) if(Curl_raw_equal(content, "MD5-sess"))
d->algo = CURLDIGESTALGO_MD5SESS; d->algo = CURLDIGESTALGO_MD5SESS;
else if(Curl_raw_equal(content, "MD5")) else if(Curl_raw_equal(content, "MD5"))
d->algo = CURLDIGESTALGO_MD5; d->algo = CURLDIGESTALGO_MD5;
else else
return CURLDIGEST_BADALGO; return CURLE_BAD_CONTENT_ENCODING;
} }
else { else {
/* unknown specifier, ignore it! */ /* unknown specifier, ignore it! */
@ -240,17 +242,17 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
'stale=true'. This means we provided bad credentials in the previous 'stale=true'. This means we provided bad credentials in the previous
request */ request */
if(before && !d->stale) if(before && !d->stale)
return CURLDIGEST_BAD; return CURLE_BAD_CONTENT_ENCODING;
/* We got this header without a nonce, that's a bad Digest line! */ /* We got this header without a nonce, that's a bad Digest line! */
if(!d->nonce) if(!d->nonce)
return CURLDIGEST_BAD; return CURLE_BAD_CONTENT_ENCODING;
} }
else else
/* else not a digest, get out */ /* else not a digest, get out */
return CURLDIGEST_NONE; return CURLE_BAD_CONTENT_ENCODING;
return CURLDIGEST_FINE; return CURLE_OK;
} }
/* convert md5 chunk to RFC2617 (section 3.1.3) -suitable ascii string*/ /* convert md5 chunk to RFC2617 (section 3.1.3) -suitable ascii string*/

View File

@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@ -23,23 +23,13 @@
***************************************************************************/ ***************************************************************************/
#include "curl_setup.h" #include "curl_setup.h"
typedef enum {
CURLDIGEST_NONE, /* not a digest */
CURLDIGEST_BAD, /* a digest, but one we don't like */
CURLDIGEST_BADALGO, /* unsupported algorithm requested */
CURLDIGEST_NOMEM,
CURLDIGEST_FINE, /* a digest we act on */
CURLDIGEST_LAST /* last entry in this enum, don't use */
} CURLdigest;
enum { enum {
CURLDIGESTALGO_MD5, CURLDIGESTALGO_MD5,
CURLDIGESTALGO_MD5SESS CURLDIGESTALGO_MD5SESS
}; };
/* this is for digest header input */ /* this is for digest header input */
CURLdigest Curl_input_digest(struct connectdata *conn, CURLcode Curl_input_digest(struct connectdata *conn,
bool proxy, const char *header); bool proxy, const char *header);
/* this is for creating digest header output */ /* this is for creating digest header output */