Commit efe4bab2 authored by Steve Holme's avatar Steve Holme
Browse files

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.
parent 54c8728c
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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;
            }
+18 −16
Original line number Diff line number Diff line
@@ -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,
                           const char *header) /* rest of the *-authenticate:
                                                  header */
@@ -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*/
+3 −13
Original line number Diff line number Diff line
@@ -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
 * you should have received as part of this distribution. The terms
@@ -23,23 +23,13 @@
 ***************************************************************************/
#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,
CURLcode Curl_input_digest(struct connectdata *conn,
                           bool proxy, const char *header);

/* this is for creating digest header output */