Commit a39d7722 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Better Digest stuff

parent 9f69deec
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -670,7 +670,9 @@ CURLcode Curl_http(struct connectdata *conn)
    if(result)
      return result;
  }
  else if((conn->bits.user_passwd) && !checkheaders(data, "Authorization:")) {
  else if(!data->set.httpdigest && /* not if Digest is enabled */
          conn->bits.user_passwd &&
          !checkheaders(data, "Authorization:")) {
    char *authorization;

    /* To prevent the user+password to get sent to other than the original
+19 −1
Original line number Diff line number Diff line
@@ -65,7 +65,8 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
  if(checkprefix("Digest", header)) {
    header += strlen("Digest");

    data->state.digest.algo = CURLDIGESTALGO_MD5; /* default algorithm */
    /* clear off any former leftovers and init to defaults */
    Curl_digest_cleanup(data);

    while(more) {
      char value[32];
@@ -207,4 +208,21 @@ CURLcode Curl_output_digest(struct connectdata *conn,
  return CURLE_OK;
}

void Curl_digest_cleanup(struct SessionHandle *data)
{
  if(data->state.digest.nonce)
    free(data->state.digest.nonce);
  data->state.digest.nonce = NULL;

  if(data->state.digest.cnonce)
    free(data->state.digest.cnonce);
  data->state.digest.cnonce = NULL;

  if(data->state.digest.realm)
    free(data->state.digest.realm);
  data->state.digest.realm = NULL;

  data->state.digest.algo = CURLDIGESTALGO_MD5; /* default algorithm */
}

#endif
+2 −0
Original line number Diff line number Diff line
@@ -43,4 +43,6 @@ CURLdigest Curl_input_digest(struct connectdata *conn, char *header);
CURLcode Curl_output_digest(struct connectdata *conn,
                            unsigned char *request,
                            unsigned char *uripath);
void Curl_digest_cleanup(struct SessionHandle *data);

#endif
+13 −8
Original line number Diff line number Diff line
@@ -704,16 +704,21 @@ CURLcode Curl_readwrite(struct connectdata *conn,
            }
            else if(checkprefix("WWW-Authenticate:", k->p) &&
                    (401 == k->httpcode) &&
                    1 /* TODO: replace with a check for Digest authentication
                    data->set.httpdigest /* Digest authentication is 
                                            activated */) {
              CURLdigest dig = Curl_input_digest(conn, k->p+
                                                 strlen("WWW-Authenticate:"));
              if(CURLDIGEST_FINE == dig) {
              CURLdigest dig = CURLDIGEST_BAD;

              if(data->state.digest.nonce)
                infof(data, "Authentication problem. Ignoring this.");
              else
                dig = Curl_input_digest(conn,
                                        k->p+strlen("WWW-Authenticate:"));

              if(CURLDIGEST_FINE == dig)
                /* We act on it. Store our new url, which happens to be
                   the same one we already use! */
                conn->newurl = strdup(data->change.url); /* clone string */
            }
            }
            else if ((k->httpcode >= 300 && k->httpcode < 400) &&
                     checkprefix("Location:", k->p)) {
              if(data->set.http_follow_location) {
@@ -797,7 +802,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
              /* HTTP-only checks */
              if (conn->newurl) {
                /* abort after the headers if "follow Location" is set */
                infof (data, "Follow to new URL: %s\n", conn->newurl);
                infof (data, "Send request to this URL: %s\n", conn->newurl);
                k->keepon &= ~KEEP_READ;
                FD_ZERO(&k->rkeepfd);
                *done = TRUE;
@@ -1568,7 +1573,7 @@ CURLcode Curl_follow(struct SessionHandle *data,
  data->change.url = newurl;
  newurl = NULL; /* don't free! */

  infof(data, "Follows Location: to new URL: '%s'\n", data->change.url);
  infof(data, "Issue another request to this URL: '%s'\n", data->change.url);

  /*
   * We get here when the HTTP code is 300-399. We need to perform
+1 −0
Original line number Diff line number Diff line
@@ -671,6 +671,7 @@ struct UserDefined {
  char *set_proxy;   /* proxy to use */
  long use_port;     /* which port to use (when not using default) */
  char *userpwd;     /* <user:password>, if used */
  bool httpdigest;   /* if HTTP Digest is enabled */
  char *set_range;   /* range, if used. See README for detailed specification
                        on this syntax. */
  long followlocation; /* as in HTTP Location: */