diff options
| -rw-r--r-- | CHANGES | 6 | ||||
| -rw-r--r-- | RELEASE-NOTES | 3 | ||||
| -rw-r--r-- | docs/KNOWN_BUGS | 5 | ||||
| -rw-r--r-- | docs/libcurl/curl_easy_setopt.3 | 20 | ||||
| -rw-r--r-- | include/curl/curl.h | 4 | ||||
| -rw-r--r-- | include/curl/typecheck-gcc.h | 4 | ||||
| -rw-r--r-- | lib/url.c | 101 | ||||
| -rw-r--r-- | lib/urldata.h | 3 | 
8 files changed, 99 insertions, 47 deletions
| @@ -6,6 +6,12 @@                                    Changelog +Daniel Stenberg (16 Oct 2008) +- Igor Novoseltsev added CURLOPT_PROXYUSER and CURLOPT_PROXYPASSWORD that then +  make CURLOPT_PROXYUSERPWD sort of deprecated. The primary motive for adding +  these new options is that they have no problems with the colon separator +  that the CURLOPT_PROXYUSERPWD option does. +  Daniel Stenberg (15 Oct 2008)  - Pascal Terjan filed bug #2154627    (http://curl.haxx.se/bug/view.cgi?id=2154627) which pointed out that libcurl diff --git a/RELEASE-NOTES b/RELEASE-NOTES index cba3eed21..bf78c157c 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -2,7 +2,7 @@ Curl and libcurl 7.19.1   Public curl releases:         107   Command line options:         128 - curl_easy_setopt() options:   156 + curl_easy_setopt() options:   158   Public functions in libcurl:  58   Known libcurl bindings:       37   Contributors:                 672 @@ -16,6 +16,7 @@ This release includes the following changes:   o configure --disable-proxy disables proxy   o Added CURLOPT_USERNAME and CURLOPT_PASSWORD   o --interface now works with IPv6 connections on glibc systems + o Added CURLOPT_PROXYUSER and CURLOPT_PROXYPASSWORD  This release includes the following bugfixes: diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS index dcc693cb9..e9ecd5103 100644 --- a/docs/KNOWN_BUGS +++ b/docs/KNOWN_BUGS @@ -160,11 +160,6 @@ may have been fixed since this was written!    doesn't do a HEAD first to get the initial size. This needs to be done    manually for HTTP PUT resume to work, and then '-C [index]'. -7. CURLOPT_PROXYUSERPWD has no way of providing user names that contain a -  colon. This can't be fixed easily in a backwards compatible way without -  adding new options. CURLOPT_USERPWD was split into CURLOPT_USERNAME and -  CURLOPT_PASSWORD for this reason. -  6. libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that    such parts should be sent to the server as 'CWD ' (without an argument).    The only exception to this rule, is that we knowingly break this if the diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3 index cface443c..9759e8fcc 100644 --- a/docs/libcurl/curl_easy_setopt.3 +++ b/docs/libcurl/curl_easy_setopt.3 @@ -620,6 +620,26 @@ password to use for the transfer.  The CURLOPT_PASSWORD option should be used in conjunction with  as the \fICURLOPT_USERNAME\fP option. (Added in 7.19.1) +.IP CURLOPT_PROXYUSERNAME
 +Pass a char * as parameter, which should be pointing to the zero terminated
 +user name to use for the transfer while connecting to Proxy.
 +
 +The CURLOPT_PROXYUSERNAME option should be used in same way as the
 +\fICURLOPT_PROXYUSERPWD\fP is used.  In comparison to \fICURLOPT_PROXYUSERPWD\fP
 +the CURLOPT_PROXYUSERNAME allows the username to contain colon,
 +like in following example: "sip:user@example.com".
 +Note the CURLOPT_PROXYUSERNAME option is an alternative way to set the user name
 +while connecting to Proxy.  There is no meaning to use it together
 +with the \fICURLOPT_PROXYUSERPWD\fP option.
 +
 +In order to specify the password to be used in conjunction with the user name
 +use the \fICURLOPT_PROXYPASSWORD\fP option.  (Added in 7.19.1)
 +.IP CURLOPT_PROXYPASSWORD
 +Pass a char * as parameter, which should be pointing to the zero terminated
 +password to use for the transfer while connecting to Proxy.
 +
 +The CURLOPT_PROXYPASSWORD option should be used in conjunction with
 +as the \fICURLOPT_PROXYUSERNAME\fP option. (Added in 7.19.1)
  .IP CURLOPT_HTTPAUTH  Pass a long as parameter, which is set to a bitmask, to tell libcurl what  authentication method(s) you want it to use. The available bits are listed diff --git a/include/curl/curl.h b/include/curl/curl.h index 7a0960f03..0d4fdbbb2 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -1144,6 +1144,10 @@ typedef enum {    /* "name" and "pwd" to use when fetching. */    CINIT(USERNAME, OBJECTPOINT, 173),    CINIT(PASSWORD, OBJECTPOINT, 174), +
 +    /* "name" and "pwd" to use with Proxy when fetching. */
 +  CINIT(PROXYUSERNAME, OBJECTPOINT, 175),
 +  CINIT(PROXYPASSWORD, OBJECTPOINT, 176),
    CURLOPT_LASTENTRY /* the last unused */  } CURLoption; diff --git a/include/curl/typecheck-gcc.h b/include/curl/typecheck-gcc.h index 33e264771..6f5313f1f 100644 --- a/include/curl/typecheck-gcc.h +++ b/include/curl/typecheck-gcc.h @@ -198,7 +198,9 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist,     (option) == CURLOPT_USERPWD ||                                             \     (option) == CURLOPT_USERNAME ||                                            \     (option) == CURLOPT_PASSWORD ||                                            \ -   (option) == CURLOPT_PROXYUSERPWD ||                                        \ +   (option) == CURLOPT_PROXYUSERPWD ||                                        \
 +   (option) == CURLOPT_PROXYUSERNAME ||                                       \
 +   (option) == CURLOPT_PROXYPASSWORD ||                                       \
     (option) == CURLOPT_ENCODING ||                                            \     (option) == CURLOPT_REFERER ||                                             \     (option) == CURLOPT_USERAGENT ||                                           \ @@ -280,6 +280,39 @@ static CURLcode setstropt(char **charp, char * s)    return CURLE_OK;  } +static CURLcode setstropt_userpwd(char *option, char **user_storage, +                                  char **pwd_storage) +{ +  char* separator; +  CURLcode result = CURLE_OK; + +  separator = strchr(option, ':'); +  if (separator != NULL) { + +    /* store username part of option */ +    char * p; +    size_t username_len = (size_t)(separator-option); +    p = malloc(username_len+1); +    if(!p) +      result = CURLE_OUT_OF_MEMORY; +    else { +      memcpy(p, option, username_len); +      p[username_len] = '\0'; +      Curl_safefree(*user_storage); +      *user_storage = p; +    } + +    /* store password part of option */ +    if (result == CURLE_OK) { +      result = setstropt(pwd_storage, separator+1); +    } +  } +  else { +    result = setstropt(user_storage, option); +  } +  return result; +} +  CURLcode Curl_dupset(struct SessionHandle * dst, struct SessionHandle * src)  {    CURLcode r = CURLE_OK; @@ -1500,39 +1533,9 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,      /*       * user:password to use in the operation       */ -    { -      char* userpwd; -      char* separator; - -      userpwd = va_arg(param, char *); -      if(userpwd == NULL) -        break; - -      separator = strchr(userpwd, ':'); -      if (separator != NULL) { - -        /* store username part of option */ -        char * p; -        size_t username_len = (size_t)(separator-userpwd); -        p = malloc(username_len+1); -        if(!p) -          result = CURLE_OUT_OF_MEMORY; -        else { -            memcpy(p, userpwd, username_len); -            p[username_len] = '\0'; -            Curl_safefree(data->set.str[STRING_USERNAME]); -            data->set.str[STRING_USERNAME] = p; -        } - -        /* store password part of option */ -        if (result == CURLE_OK) { -          result = setstropt(&data->set.str[STRING_PASSWORD], separator+1); -        } -      } -      else { -        result = setstropt(&data->set.str[STRING_USERNAME], userpwd); -      } -    } +    result = setstropt_userpwd(va_arg(param, char *), +                               &data->set.str[STRING_USERNAME], +                               &data->set.str[STRING_PASSWORD]);      break;    case CURLOPT_USERNAME:      /* @@ -1587,7 +1590,22 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,      /*       * user:password needed to use the proxy       */ -    result = setstropt(&data->set.str[STRING_PROXYUSERPWD], +    result = setstropt_userpwd(va_arg(param, char *), +                               &data->set.str[STRING_PROXYUSERNAME], +                               &data->set.str[STRING_PROXYPASSWORD]); +    break; +  case CURLOPT_PROXYUSERNAME: +    /* +     * authentication user name to use in the operation +     */ +    result = setstropt(&data->set.str[STRING_PROXYUSERNAME], +                       va_arg(param, char *)); +    break; +  case CURLOPT_PROXYPASSWORD: +    /* +     * authentication password to use in the operation +     */ +    result = setstropt(&data->set.str[STRING_PROXYPASSWORD],                         va_arg(param, char *));      break;    case CURLOPT_RANGE: @@ -3545,10 +3563,15 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data,    char proxyuser[MAX_CURL_USER_LENGTH]="";    char proxypasswd[MAX_CURL_PASSWORD_LENGTH]=""; -  sscanf(data->set.str[STRING_PROXYUSERPWD], -         "%" MAX_CURL_USER_LENGTH_TXT "[^:]:" -         "%" MAX_CURL_PASSWORD_LENGTH_TXT "[^\n]", -         proxyuser, proxypasswd); +  if(data->set.str[STRING_PROXYUSERNAME] != NULL) { +    strncpy(proxyuser, data->set.str[STRING_PROXYUSERNAME], MAX_CURL_USER_LENGTH); +    proxyuser[MAX_CURL_USER_LENGTH-1] = '\0';   /*To be on safe side*/ +  } +  if(data->set.str[STRING_PROXYPASSWORD] != NULL) { +    strncpy(proxypasswd, data->set.str[STRING_PROXYPASSWORD], +            MAX_CURL_PASSWORD_LENGTH); +    proxypasswd[MAX_CURL_PASSWORD_LENGTH-1] = '\0'; /*To be on safe side*/ +  }    conn->proxyuser = curl_easy_unescape(data, proxyuser, 0, NULL);    if(!conn->proxyuser) @@ -4032,7 +4055,7 @@ static CURLcode create_conn(struct SessionHandle *data,    conn->bits.user_passwd = (bool)(NULL != data->set.str[STRING_USERNAME]); -  conn->bits.proxy_user_passwd = (bool)(NULL != data->set.str[STRING_PROXYUSERPWD]); +  conn->bits.proxy_user_passwd = (bool)(NULL != data->set.str[STRING_PROXYUSERNAME]);    conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;    conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;    conn->bits.ftp_use_eprt = data->set.ftp_use_eprt; diff --git a/lib/urldata.h b/lib/urldata.h index a1a95ef44..079c7716b 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1322,7 +1322,6 @@ enum dupstring {                               $HOME/.netrc */    STRING_COPYPOSTFIELDS,  /* if POST, set the fields' values here */    STRING_PROXY,           /* proxy to use */ -  STRING_PROXYUSERPWD,    /* Proxy <user:password>, if used */    STRING_SET_RANGE,       /* range, if used */    STRING_SET_REFERER,     /* custom string for the HTTP referer field */    STRING_SET_URL,         /* what original URL to work on */ @@ -1339,6 +1338,8 @@ enum dupstring {    STRING_SSL_ISSUERCERT,  /* issuer cert file to check certificate */    STRING_USERNAME,        /* <username>, if used */    STRING_PASSWORD,        /* <password>, if used */ +  STRING_PROXYUSERNAME,   /* Proxy <username>, if used */
 +  STRING_PROXYPASSWORD,   /* Proxy <password>, if used */
    /* -- end of strings -- */    STRING_LAST /* not used, just an end-of-list marker */ | 
