1
0
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:
Steve Holme 2013-04-20 08:47:59 +01:00
parent 49184c3723
commit fddb7b44a7
2 changed files with 39 additions and 28 deletions

View File

@ -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:
/* /*

View File

@ -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