Commit fddb7b44 authored by Steve Holme's avatar Steve Holme
Browse files

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
parent 49184c37
Loading
Loading
Loading
Loading
+38 −28
Original line number Diff line number Diff line
@@ -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 */
    if(user_storage) {
      Curl_safefree(*user_storage);
      *user_storage = (char *) NULL;
    }

    if(pwd_storage) {
      Curl_safefree(*pwd_storage);
      *pwd_storage = (char *) NULL;
    return CURLE_OK;
    }

  separator = strchr(option, ':');
  if(separator != NULL) {
    if(options_storage) {
      Curl_safefree(*options_storage);
      *options_storage = (char *) 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;
    return CURLE_OK;
  }

  /* 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 */
    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;
}

@@ -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:
    /*
@@ -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:
    /*
+1 −0
Original line number Diff line number Diff line
@@ -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