Skip to content

Commit

Permalink
url: Added support for parsing login options from the CURLOPT_USERPWD
Browse files Browse the repository at this point in the history
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
  • Loading branch information
captain-caveman2k committed Apr 20, 2013
1 parent 49184c3 commit fddb7b4
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 28 deletions.
66 changes: 38 additions & 28 deletions lib/url.c
Expand Up @@ -298,43 +298,52 @@ static CURLcode setstropt(char **charp, char * s)
}

static CURLcode setstropt_userpwd(char *option, char **user_storage,
char **pwd_storage)
char **pwd_storage, char **options_storage)
{
char* separator;
CURLcode result = CURLE_OK;
char *userp = NULL;
char *passwdp = NULL;
char *optionsp = NULL;

if(!option) {
/* we treat a NULL passed in as a hint to clear existing info */
Curl_safefree(*user_storage);
*user_storage = (char *) NULL;
Curl_safefree(*pwd_storage);
*pwd_storage = (char *) NULL;
if(user_storage) {
Curl_safefree(*user_storage);
*user_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;
}

separator = strchr(option, ':');
if(separator != NULL) {

/* Parse the login details */
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 */
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;
}
if(user_storage)
setstropt(user_storage, userp);

/* store password part of option */
if(result == CURLE_OK)
result = setstropt(pwd_storage, separator+1);
}
else {
result = setstropt(user_storage, option);
if(pwd_storage)
setstropt(pwd_storage, passwdp);

/* store options part of option */
if(options_storage)
setstropt(options_storage, optionsp);
}

return result;
}

Expand Down Expand Up @@ -1537,11 +1546,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,

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 *),
&data->set.str[STRING_USERNAME],
&data->set.str[STRING_PASSWORD]);
&data->set.str[STRING_PASSWORD],
&data->set.str[STRING_OPTIONS]);
break;
case CURLOPT_USERNAME:
/*
Expand Down Expand Up @@ -1614,7 +1624,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
*/
result = setstropt_userpwd(va_arg(param, char *),
&data->set.str[STRING_PROXYUSERNAME],
&data->set.str[STRING_PROXYPASSWORD]);
&data->set.str[STRING_PROXYPASSWORD], NULL);
break;
case CURLOPT_PROXYUSERNAME:
/*
Expand Down
1 change: 1 addition & 0 deletions lib/urldata.h
Expand Up @@ -1355,6 +1355,7 @@ enum dupstring {
STRING_SSL_ISSUERCERT, /* issuer cert file to check certificate */
STRING_USERNAME, /* <username>, if used */
STRING_PASSWORD, /* <password>, if used */
STRING_OPTIONS, /* <options>, if used */
STRING_PROXYUSERNAME, /* Proxy <username>, if used */
STRING_PROXYPASSWORD, /* Proxy <password>, if used */
STRING_NOPROXY, /* List of hosts which should not use the proxy, if
Expand Down

2 comments on commit fddb7b4

@floatingatoll
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that this also affects 'curl -u username', so that when the user is prompted for their password, any who enter a password with a semicolon will unknowingly be activating the new options code as well.

@bagder
Copy link
Member

@bagder bagder commented on fddb7b4 Oct 1, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeps, that seems correct. We need to do something about it.

Please sign in to comment.