diff --git a/lib/http.c b/lib/http.c index 989e09e20..2487bac08 100644 --- a/lib/http.c +++ b/lib/http.c @@ -845,7 +845,7 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy, infof(data, "Ignoring duplicate digest auth header.\n"); } else { - CURLdigest dig; + CURLcode result; *availp |= 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 * incoming data from this header in case we are gonna use * Digest. */ - dig = Curl_input_digest(conn, proxy, auth); - - if(CURLDIGEST_FINE != dig) { + result = Curl_input_digest(conn, proxy, auth); + if(result) { infof(data, "Authentication problem. Ignoring this.\n"); data->state.authproblem = TRUE; } diff --git a/lib/http_digest.c b/lib/http_digest.c index 03963dbc9..19de4d41e 100644 --- a/lib/http_digest.c +++ b/lib/http_digest.c @@ -121,10 +121,10 @@ Proxy-Authenticate: Digest realm="testrealm", nonce="1053604598" */ -CURLdigest Curl_input_digest(struct connectdata *conn, - bool proxy, - const char *header) /* rest of the *-authenticate: - header */ +CURLcode Curl_input_digest(struct connectdata *conn, + bool proxy, + const char *header) /* rest of the *-authenticate: + header */ { char *token = NULL; char *tmp = NULL; @@ -163,7 +163,7 @@ CURLdigest Curl_input_digest(struct connectdata *conn, if(Curl_raw_equal(value, "nonce")) { d->nonce = strdup(content); if(!d->nonce) - return CURLDIGEST_NOMEM; + return CURLE_OUT_OF_MEMORY; } else if(Curl_raw_equal(value, "stale")) { if(Curl_raw_equal(content, "true")) { @@ -174,12 +174,12 @@ CURLdigest Curl_input_digest(struct connectdata *conn, else if(Curl_raw_equal(value, "realm")) { d->realm = strdup(content); if(!d->realm) - return CURLDIGEST_NOMEM; + return CURLE_OUT_OF_MEMORY; } else if(Curl_raw_equal(value, "opaque")) { d->opaque = strdup(content); if(!d->opaque) - return CURLDIGEST_NOMEM; + return CURLE_OUT_OF_MEMORY; } else if(Curl_raw_equal(value, "qop")) { char *tok_buf; @@ -187,7 +187,8 @@ CURLdigest Curl_input_digest(struct connectdata *conn, clone of the buffer since strtok_r() ruins it */ tmp = strdup(content); if(!tmp) - return CURLDIGEST_NOMEM; + return CURLE_OUT_OF_MEMORY; + token = strtok_r(tmp, ",", &tok_buf); while(token != NULL) { if(Curl_raw_equal(token, "auth")) { @@ -203,24 +204,25 @@ CURLdigest Curl_input_digest(struct connectdata *conn, if(foundAuth) { d->qop = strdup("auth"); if(!d->qop) - return CURLDIGEST_NOMEM; + return CURLE_OUT_OF_MEMORY; } else if(foundAuthInt) { d->qop = strdup("auth-int"); if(!d->qop) - return CURLDIGEST_NOMEM; + return CURLE_OUT_OF_MEMORY; } } else if(Curl_raw_equal(value, "algorithm")) { d->algorithm = strdup(content); if(!d->algorithm) - return CURLDIGEST_NOMEM; + return CURLE_OUT_OF_MEMORY; + if(Curl_raw_equal(content, "MD5-sess")) d->algo = CURLDIGESTALGO_MD5SESS; else if(Curl_raw_equal(content, "MD5")) d->algo = CURLDIGESTALGO_MD5; else - return CURLDIGEST_BADALGO; + return CURLE_BAD_CONTENT_ENCODING; } else { /* 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 request */ 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! */ if(!d->nonce) - return CURLDIGEST_BAD; + return CURLE_BAD_CONTENT_ENCODING; } else /* 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*/ diff --git a/lib/http_digest.h b/lib/http_digest.h index c6a4e9161..42ed83c7b 100644 --- a/lib/http_digest.h +++ b/lib/http_digest.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -23,24 +23,14 @@ ***************************************************************************/ #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 { CURLDIGESTALGO_MD5, CURLDIGESTALGO_MD5SESS }; /* this is for digest header input */ -CURLdigest Curl_input_digest(struct connectdata *conn, - bool proxy, const char *header); +CURLcode Curl_input_digest(struct connectdata *conn, + bool proxy, const char *header); /* this is for creating digest header output */ CURLcode Curl_output_digest(struct connectdata *conn,