1
0
mirror of https://github.com/moparisthebest/curl synced 2025-01-03 18:08:02 -05:00

- 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.
This commit is contained in:
Daniel Stenberg 2008-10-16 20:21:22 +00:00
parent f720e0ac0f
commit a9a4300a36
8 changed files with 99 additions and 47 deletions

View File

@ -6,6 +6,12 @@
Changelog 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) Daniel Stenberg (15 Oct 2008)
- Pascal Terjan filed bug #2154627 - Pascal Terjan filed bug #2154627
(http://curl.haxx.se/bug/view.cgi?id=2154627) which pointed out that libcurl (http://curl.haxx.se/bug/view.cgi?id=2154627) which pointed out that libcurl

View File

@ -2,7 +2,7 @@ Curl and libcurl 7.19.1
Public curl releases: 107 Public curl releases: 107
Command line options: 128 Command line options: 128
curl_easy_setopt() options: 156 curl_easy_setopt() options: 158
Public functions in libcurl: 58 Public functions in libcurl: 58
Known libcurl bindings: 37 Known libcurl bindings: 37
Contributors: 672 Contributors: 672
@ -16,6 +16,7 @@ This release includes the following changes:
o configure --disable-proxy disables proxy o configure --disable-proxy disables proxy
o Added CURLOPT_USERNAME and CURLOPT_PASSWORD o Added CURLOPT_USERNAME and CURLOPT_PASSWORD
o --interface now works with IPv6 connections on glibc systems o --interface now works with IPv6 connections on glibc systems
o Added CURLOPT_PROXYUSER and CURLOPT_PROXYPASSWORD
This release includes the following bugfixes: This release includes the following bugfixes:

View File

@ -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 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]'. 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 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). 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 The only exception to this rule, is that we knowingly break this if the

View File

@ -620,6 +620,26 @@ password to use for the transfer.
The CURLOPT_PASSWORD option should be used in conjunction with The CURLOPT_PASSWORD option should be used in conjunction with
as the \fICURLOPT_USERNAME\fP option. (Added in 7.19.1) 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 .IP CURLOPT_HTTPAUTH
Pass a long as parameter, which is set to a bitmask, to tell libcurl what 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 authentication method(s) you want it to use. The available bits are listed

View File

@ -1144,6 +1144,10 @@ typedef enum {
/* "name" and "pwd" to use when fetching. */ /* "name" and "pwd" to use when fetching. */
CINIT(USERNAME, OBJECTPOINT, 173), CINIT(USERNAME, OBJECTPOINT, 173),
CINIT(PASSWORD, OBJECTPOINT, 174), 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 */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;

View File

@ -198,7 +198,9 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
(option) == CURLOPT_USERPWD || \ (option) == CURLOPT_USERPWD || \
(option) == CURLOPT_USERNAME || \ (option) == CURLOPT_USERNAME || \
(option) == CURLOPT_PASSWORD || \ (option) == CURLOPT_PASSWORD || \
(option) == CURLOPT_PROXYUSERPWD || \ (option) == CURLOPT_PROXYUSERPWD || \
(option) == CURLOPT_PROXYUSERNAME || \
(option) == CURLOPT_PROXYPASSWORD || \
(option) == CURLOPT_ENCODING || \ (option) == CURLOPT_ENCODING || \
(option) == CURLOPT_REFERER || \ (option) == CURLOPT_REFERER || \
(option) == CURLOPT_USERAGENT || \ (option) == CURLOPT_USERAGENT || \

101
lib/url.c
View File

@ -280,6 +280,39 @@ static CURLcode setstropt(char **charp, char * s)
return CURLE_OK; 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 Curl_dupset(struct SessionHandle * dst, struct SessionHandle * src)
{ {
CURLcode r = CURLE_OK; CURLcode r = CURLE_OK;
@ -1500,39 +1533,9 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
/* /*
* user:password to use in the operation * user:password to use in the operation
*/ */
{ result = setstropt_userpwd(va_arg(param, char *),
char* userpwd; &data->set.str[STRING_USERNAME],
char* separator; &data->set.str[STRING_PASSWORD]);
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);
}
}
break; break;
case CURLOPT_USERNAME: case CURLOPT_USERNAME:
/* /*
@ -1587,7 +1590,22 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
/* /*
* user:password needed to use the proxy * 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 *)); va_arg(param, char *));
break; break;
case CURLOPT_RANGE: case CURLOPT_RANGE:
@ -3545,10 +3563,15 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data,
char proxyuser[MAX_CURL_USER_LENGTH]=""; char proxyuser[MAX_CURL_USER_LENGTH]="";
char proxypasswd[MAX_CURL_PASSWORD_LENGTH]=""; char proxypasswd[MAX_CURL_PASSWORD_LENGTH]="";
sscanf(data->set.str[STRING_PROXYUSERPWD], if(data->set.str[STRING_PROXYUSERNAME] != NULL) {
"%" MAX_CURL_USER_LENGTH_TXT "[^:]:" strncpy(proxyuser, data->set.str[STRING_PROXYUSERNAME], MAX_CURL_USER_LENGTH);
"%" MAX_CURL_PASSWORD_LENGTH_TXT "[^\n]", proxyuser[MAX_CURL_USER_LENGTH-1] = '\0'; /*To be on safe side*/
proxyuser, proxypasswd); }
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); conn->proxyuser = curl_easy_unescape(data, proxyuser, 0, NULL);
if(!conn->proxyuser) 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.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.tunnel_proxy = data->set.tunnel_thru_httpproxy;
conn->bits.ftp_use_epsv = data->set.ftp_use_epsv; conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
conn->bits.ftp_use_eprt = data->set.ftp_use_eprt; conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;

View File

@ -1322,7 +1322,6 @@ enum dupstring {
$HOME/.netrc */ $HOME/.netrc */
STRING_COPYPOSTFIELDS, /* if POST, set the fields' values here */ STRING_COPYPOSTFIELDS, /* if POST, set the fields' values here */
STRING_PROXY, /* proxy to use */ STRING_PROXY, /* proxy to use */
STRING_PROXYUSERPWD, /* Proxy <user:password>, if used */
STRING_SET_RANGE, /* range, if used */ STRING_SET_RANGE, /* range, if used */
STRING_SET_REFERER, /* custom string for the HTTP referer field */ STRING_SET_REFERER, /* custom string for the HTTP referer field */
STRING_SET_URL, /* what original URL to work on */ 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_SSL_ISSUERCERT, /* issuer cert file to check certificate */
STRING_USERNAME, /* <username>, if used */ STRING_USERNAME, /* <username>, if used */
STRING_PASSWORD, /* <password>, if used */ STRING_PASSWORD, /* <password>, if used */
STRING_PROXYUSERNAME, /* Proxy <username>, if used */
STRING_PROXYPASSWORD, /* Proxy <password>, if used */
/* -- end of strings -- */ /* -- end of strings -- */
STRING_LAST /* not used, just an end-of-list marker */ STRING_LAST /* not used, just an end-of-list marker */