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

Set auth type differently, we use one CURLOPT_HTTPAUTH instead as we plan

to add more method in the future.
parent d7980c1a
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -7,10 +7,15 @@
                                  Changelog

Daniel (10 June)
- Modified how to set auth type to libcurl. Now use CURLOPT_HTTPAUTH instead,
  and pick method. Supported ones currently are:
  CURLHTTP_BASIC     - default selection
  CURLHTTP_DIGEST    - formerly CURLOPT_HTTPDIGEST
  CURLHTTP_NEGOTIATE

- Daniel Kouril added HTTP Negotiate authentication support, as defined in the
  IETF draft draft-brezak-spnego-http-04.txt. In use already by various
  Microsoft web applications. CURLOPT_HTTPNEGOTIATE and --negotiate are the
  new family members.
  Microsoft web applications. --negotiate is the new family member.

- A missing ending bracket (']') while doing URL globbing could lead to a
  segfault. While fixing this, I also introduced better error reporting in the
+11 −7
Original line number Diff line number Diff line
@@ -213,6 +213,14 @@ typedef enum {
  CURLPROXY_SOCKS5 = 5
} curl_proxytype;

typedef enum {
  CURLHTTP_BASIC  =    0, /* default */
  CURLHTTP_DIGEST =    1, /* Digest */
  CURLHTTP_NEGOTIATE = 2, /* Negotiate */
  CURLHTTP_NTLM =      3, /* NTLM */
  CURLHTTP_LAST           /* never to be used */
} curl_httpauth;

/* this was the error code 50 in 7.7.3 and a few earlier versions, this
   is no longer used by libcurl but is instead #defined here only to not
   make programs break */
@@ -625,13 +633,9 @@ typedef enum {
     attempted before the good old traditional PORT command. */     
  CINIT(FTP_USE_EPRT, LONG, 106),

  /* Set this to a non-zero value to enable HTTP Digest Authentication.
     You should use this in combination with CURLOPT_USERPWD. */
  CINIT(HTTPDIGEST, LONG, 107),

  /* Set this to a non-zero value to enable HTTP Negotiate Authentication.
     You should use this in combination with CURLOPT_USERPWD. */
  CINIT(HTTPNEGOTIATE, LONG, 108),
  /* Set this to a curl_httpauth value to enable that particular authentication
     method. Use this in combination with CURLOPT_USERPWD. */
  CINIT(HTTPAUTH, LONG, 107),

  CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
+28 −8
Original line number Diff line number Diff line
@@ -844,18 +844,38 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
      data->set.encoding = (char*)ALL_CONTENT_ENCODINGS;
    break;

  case CURLOPT_HTTPDIGEST:
  case CURLOPT_HTTPAUTH:
    /*
     * Enable HTTP Digest Authentication
     * Set HTTP Authentication type.
     */
    data->set.httpdigest = va_arg(param, long);
    break;
  {
    curl_httpauth auth = va_arg(param, long);
    switch(auth) {
    case CURLHTTP_BASIC:
      /* default */
      data->set.httpdigest = FALSE;
      data->set.httpnegotiate = FALSE;
      break;
    case CURLHTTP_DIGEST:
      /* Enable HTTP Digest authentication */
      data->set.httpdigest = TRUE;
      data->set.httpnegotiate = FALSE;
      break;
    case CURLHTTP_NEGOTIATE:
#ifdef GSSAPI
  case CURLOPT_HTTPNEGOTIATE:
      /* Enable HTTP Negotaiate authentication */
    data->set.httpnegotiate = va_arg(param, long);
      data->set.httpdigest = FALSE;
      data->set.httpnegotiate = TRUE;
      break;
#else
      /* fall-through */
#endif
    default:
      return CURLE_FAILED_INIT; /* unsupported type */
    }
  }
  break;
  
  case CURLOPT_USERPWD:
    /*
     * user:password to use in the operation
+0 −2
Original line number Diff line number Diff line
@@ -689,9 +689,7 @@ struct UserDefined {
  long use_port;     /* which port to use (when not using default) */
  char *userpwd;     /* <user:password>, if used */
  bool httpdigest;   /* if HTTP Digest is enabled */
#ifdef GSSAPI
  bool httpnegotiate; /* if HTTP Negotiate authentication is enabled */
#endif
  char *set_range;   /* range, if used. See README for detailed specification
                        on this syntax. */
  long followlocation; /* as in HTTP Location: */
+6 −15
Original line number Diff line number Diff line
@@ -359,9 +359,7 @@ static void help(void)
       " -d/--data <data>   HTTP POST data (H)\n"
       "    --data-ascii <data>   HTTP POST ASCII data (H)\n"
       "    --data-binary <data>  HTTP POST binary data (H)\n"
#ifdef GSSAPI
       "    --negotiate     Enable HTTP Negotiate Authentication\n"
#endif
       "    --negotiate     Enable HTTP Negotiate Authentication (req GSS-lib)\n"
       "    --digest        Enable HTTP Digest Authentication");
  puts("    --disable-eprt  Prevents curl from using EPRT or LPRT (F)\n"
       "    --disable-epsv  Prevents curl from using EPSV (F)\n"
@@ -464,9 +462,7 @@ struct Configurable {
  bool cookiesession; /* new session? */
  bool encoding;    /* Accept-Encoding please */
  bool digest;      /* Digest Authentication */
#ifdef GSSAPI
  bool negotiate;   /* Negotiate Authentication */
#endif
  bool use_resume;
  bool resume_from_current;
  bool disable_epsv;
@@ -1059,9 +1055,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
    {"5i", "limit-rate", TRUE},
    {"5j", "compressed",  FALSE}, /* might take an arg someday */
    {"5k", "digest",     FALSE},
#ifdef GSSAPI
    {"5l",  "negotiate", FALSE},
#endif
    {"0", "http1.0",     FALSE},
    {"1", "tlsv1",       FALSE},
    {"2", "sslv2",       FALSE},
@@ -1290,11 +1284,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
 	config->digest ^= TRUE;
 	break;

#ifdef GSSAPI
      case 'l': /* --negotiate */
	config->negotiate ^= TRUE;
	break;
#endif

      default: /* the URL! */
        {
@@ -2989,12 +2981,11 @@ operate(struct Configurable *config, int argc, char *argv[])
        /* disable it */
        curl_easy_setopt(curl, CURLOPT_FTP_USE_EPRT, FALSE);

      /* new in libcurl 7.10.6 */
      curl_easy_setopt(curl, CURLOPT_HTTPDIGEST, config->digest);

#ifdef GSSAPI
      curl_easy_setopt(curl, CURLOPT_HTTPNEGOTIATE, config->negotiate);
#endif
      /* new in libcurl 7.10.6 (default is Basic) */
      if(config->digest)
        curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLHTTP_DIGEST);
      else if(config->negotiate)
        curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLHTTP_NEGOTIATE);
      
      /* new in curl 7.9.7 */
      if(config->trace_dump) {