mirror of
https://github.com/moparisthebest/curl
synced 2025-01-08 12:28:06 -05:00
url: Added support for parsing login options from the CURLOPT_USERPWD
In addition to parsing the optional login options from the URL, added support for parsing them from CURLOPT_USERPWD, to allow the following supported command line: --user username:password;options
This commit is contained in:
parent
49184c3723
commit
fddb7b44a7
66
lib/url.c
66
lib/url.c
@ -298,43 +298,52 @@ static CURLcode setstropt(char **charp, char * s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
||||||
char **pwd_storage)
|
char **pwd_storage, char **options_storage)
|
||||||
{
|
{
|
||||||
char* separator;
|
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
|
char *userp = NULL;
|
||||||
|
char *passwdp = NULL;
|
||||||
|
char *optionsp = NULL;
|
||||||
|
|
||||||
if(!option) {
|
if(!option) {
|
||||||
/* we treat a NULL passed in as a hint to clear existing info */
|
/* we treat a NULL passed in as a hint to clear existing info */
|
||||||
Curl_safefree(*user_storage);
|
if(user_storage) {
|
||||||
*user_storage = (char *) NULL;
|
Curl_safefree(*user_storage);
|
||||||
Curl_safefree(*pwd_storage);
|
*user_storage = (char *) NULL;
|
||||||
*pwd_storage = (char *) NULL;
|
}
|
||||||
|
|
||||||
|
if(pwd_storage) {
|
||||||
|
Curl_safefree(*pwd_storage);
|
||||||
|
*pwd_storage = (char *) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(options_storage) {
|
||||||
|
Curl_safefree(*options_storage);
|
||||||
|
*options_storage = (char *) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
separator = strchr(option, ':');
|
/* Parse the login details */
|
||||||
if(separator != NULL) {
|
result = parse_login_details(option, strlen(option),
|
||||||
|
(user_storage ? &userp : NULL),
|
||||||
|
(pwd_storage ? &passwdp : NULL),
|
||||||
|
(options_storage ? &optionsp : NULL));
|
||||||
|
if(!result) {
|
||||||
/* store username part of option */
|
/* store username part of option */
|
||||||
char * p;
|
if(user_storage)
|
||||||
size_t username_len = (size_t)(separator-option);
|
setstropt(user_storage, userp);
|
||||||
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 */
|
/* store password part of option */
|
||||||
if(result == CURLE_OK)
|
if(pwd_storage)
|
||||||
result = setstropt(pwd_storage, separator+1);
|
setstropt(pwd_storage, passwdp);
|
||||||
}
|
|
||||||
else {
|
/* store options part of option */
|
||||||
result = setstropt(user_storage, option);
|
if(options_storage)
|
||||||
|
setstropt(options_storage, optionsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1537,11 +1546,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
|||||||
|
|
||||||
case CURLOPT_USERPWD:
|
case CURLOPT_USERPWD:
|
||||||
/*
|
/*
|
||||||
* user:password to use in the operation
|
* user:password;options to use in the operation
|
||||||
*/
|
*/
|
||||||
result = setstropt_userpwd(va_arg(param, char *),
|
result = setstropt_userpwd(va_arg(param, char *),
|
||||||
&data->set.str[STRING_USERNAME],
|
&data->set.str[STRING_USERNAME],
|
||||||
&data->set.str[STRING_PASSWORD]);
|
&data->set.str[STRING_PASSWORD],
|
||||||
|
&data->set.str[STRING_OPTIONS]);
|
||||||
break;
|
break;
|
||||||
case CURLOPT_USERNAME:
|
case CURLOPT_USERNAME:
|
||||||
/*
|
/*
|
||||||
@ -1614,7 +1624,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
|||||||
*/
|
*/
|
||||||
result = setstropt_userpwd(va_arg(param, char *),
|
result = setstropt_userpwd(va_arg(param, char *),
|
||||||
&data->set.str[STRING_PROXYUSERNAME],
|
&data->set.str[STRING_PROXYUSERNAME],
|
||||||
&data->set.str[STRING_PROXYPASSWORD]);
|
&data->set.str[STRING_PROXYPASSWORD], NULL);
|
||||||
break;
|
break;
|
||||||
case CURLOPT_PROXYUSERNAME:
|
case CURLOPT_PROXYUSERNAME:
|
||||||
/*
|
/*
|
||||||
|
@ -1355,6 +1355,7 @@ 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_OPTIONS, /* <options>, if used */
|
||||||
STRING_PROXYUSERNAME, /* Proxy <username>, if used */
|
STRING_PROXYUSERNAME, /* Proxy <username>, if used */
|
||||||
STRING_PROXYPASSWORD, /* Proxy <password>, if used */
|
STRING_PROXYPASSWORD, /* Proxy <password>, if used */
|
||||||
STRING_NOPROXY, /* List of hosts which should not use the proxy, if
|
STRING_NOPROXY, /* List of hosts which should not use the proxy, if
|
||||||
|
Loading…
Reference in New Issue
Block a user