auth: cleanups
No binary (build failed)
—
(log yok)
| @@ -174,7 +174,7 @@ static void h1_tunnel_go_state(struct Curl_cfilter *cf, | |
| /* If a proxy-authorization header was used for the proxy, then we should | |
| make sure that it is not accidentally used for the document request | |
| after we have connected. Let's thus free and clear it here. */ | |
| - | curlx_safefree(data->req.proxyuserpwd); |
| + | curlx_safefree(data->req.hd_proxy_auth); |
| break; | |
| } | |
| } | |
| @@ -461,7 +461,7 @@ static CURLcode recv_CONNECT_resp(struct Curl_cfilter *cf, | |
| if(!nread) { | |
| if(data->set.proxyauth && data->state.authproxy.avail && | |
| - | data->req.proxyuserpwd) { |
| + | data->req.hd_proxy_auth) { |
| /* proxy auth was requested and there was proxy auth available, | |
| then deem this as "mere" proxy disconnect */ | |
| ts->close_connection = TRUE; | |
| @@ -702,7 +702,7 @@ static CURLcode cf_h1_proxy_connect(struct Curl_cfilter *cf, | |
| result = H1_CONNECT(cf, data, ts); | |
| if(result) | |
| goto out; | |
| - | curlx_safefree(data->req.proxyuserpwd); |
| + | curlx_safefree(data->req.hd_proxy_auth); |
| out: | |
| *done = (result == CURLE_OK) && tunnel_is_established(cf->ctx); | |
| @@ -154,7 +154,7 @@ static void h2_tunnel_go_state(struct Curl_cfilter *cf, | |
| /* If a proxy-authorization header was used for the proxy, then we should | |
| make sure that it is not accidentally used for the document request | |
| after we have connected. Let's thus free and clear it here. */ | |
| - | curlx_safefree(data->req.proxyuserpwd); |
| + | curlx_safefree(data->req.hd_proxy_auth); |
| break; | |
| } | |
| } | |
| @@ -254,7 +254,7 @@ static CURLcode http_output_basic(struct Curl_easy *data, bool proxy) | |
| { | |
| size_t size = 0; | |
| char *authorization = NULL; | |
| - | char **userp; |
| + | char **p_hd; |
| const char *user; | |
| const char *pwd; | |
| CURLcode result; | |
| @@ -264,7 +264,7 @@ static CURLcode http_output_basic(struct Curl_easy *data, bool proxy) | |
| connection */ | |
| if(proxy) { | |
| #ifndef CURL_DISABLE_PROXY | |
| - | userp = &data->req.proxyuserpwd; |
| + | p_hd = &data->req.hd_proxy_auth; |
| user = data->state.aptr.proxyuser; | |
| pwd = data->state.aptr.proxypasswd; | |
| #else | |
| @@ -272,7 +272,7 @@ static CURLcode http_output_basic(struct Curl_easy *data, bool proxy) | |
| #endif | |
| } | |
| else { | |
| - | userp = &data->req.userpwd; |
| + | p_hd = &data->req.hd_auth; |
| user = data->state.aptr.user; | |
| pwd = data->state.aptr.passwd; | |
| } | |
| @@ -291,12 +291,12 @@ static CURLcode http_output_basic(struct Curl_easy *data, bool proxy) | |
| goto fail; | |
| } | |
| - | curlx_free(*userp); |
| - | *userp = curl_maprintf("%sAuthorization: Basic %s\r\n", |
| - | proxy ? "Proxy-" : "", |
| - | authorization); |
| + | curlx_free(*p_hd); |
| + | *p_hd = curl_maprintf("%sAuthorization: Basic %s\r\n", |
| + | proxy ? "Proxy-" : "", |
| + | authorization); |
| curlx_free(authorization); | |
| - | if(!*userp) { |
| + | if(!*p_hd) { |
| result = CURLE_OUT_OF_MEMORY; | |
| goto fail; | |
| } | |
| @@ -320,7 +320,7 @@ static CURLcode http_output_bearer(struct Curl_easy *data) | |
| char **userp; | |
| CURLcode result = CURLE_OK; | |
| - | userp = &data->req.userpwd; |
| + | userp = &data->req.hd_auth; |
| curlx_free(*userp); | |
| *userp = curl_maprintf("Authorization: Bearer %s\r\n", | |
| data->set.str[STRING_BEARER]); | |
| @@ -760,53 +760,48 @@ static CURLcode output_auth_headers(struct Curl_easy *data, | |
| return result; | |
| } | |
| - | /** |
| - | * Curl_http_output_auth() setups the authentication headers for the |
| - | * host/proxy and the correct authentication |
| - | * method. data->state.authdone is set to TRUE when authentication is |
| - | * done. |
| - | * |
| - | * @param conn all information about the current connection |
| - | * @param request pointer to the request keyword |
| - | * @param path pointer to the requested path; should include query part |
| - | * @param proxytunnel boolean if this is the request setting up a "proxy |
| - | * tunnel" |
| - | * |
| - | * @returns CURLcode |
| - | */ |
| CURLcode Curl_http_output_auth(struct Curl_easy *data, | |
| struct connectdata *conn, | |
| const char *request, | |
| Curl_HttpReq httpreq, | |
| const char *path, | |
| - | bool proxytunnel) /* TRUE if this is |
| - | the request setting up |
| - | the proxy tunnel */ |
| + | const char *query, |
| + | bool is_connect) |
| { | |
| CURLcode result = CURLE_OK; | |
| struct auth *authhost; | |
| struct auth *authproxy; | |
| + | const char *path_and_query = path; |
| + | char *tmp_str = NULL; |
| DEBUGASSERT(data); | |
| - | |
| authhost = &data->state.authhost; | |
| authproxy = &data->state.authproxy; | |
| if( | |
| #ifndef CURL_DISABLE_PROXY | |
| - | (conn->bits.httpproxy && conn->bits.proxy_user_passwd) || |
| + | (!conn->bits.httpproxy || !conn->bits.proxy_user_passwd) && |
| #endif | |
| - | data->state.aptr.user || |
| + | !data->state.aptr.user && |
| #ifdef USE_SPNEGO | |
| - | authhost->want & CURLAUTH_NEGOTIATE || |
| - | authproxy->want & CURLAUTH_NEGOTIATE || |
| + | !(authhost->want & CURLAUTH_NEGOTIATE) && |
| + | !(authproxy->want & CURLAUTH_NEGOTIATE) && |
| #endif | |
| - | data->set.str[STRING_BEARER]) |
| - | /* continue please */; |
| - | else { |
| + | !data->set.str[STRING_BEARER]) { |
| + | /* no authentication with no user or password */ |
| authhost->done = TRUE; | |
| authproxy->done = TRUE; | |
| - | return CURLE_OK; /* no authentication with no user or password */ |
| + | result = CURLE_OK; |
| + | goto out; |
| + | } |
| + | |
| + | if(query) { |
| + | tmp_str = curl_maprintf("%s?%s", path, query); |
| + | if(!tmp_str) { |
| + | result = CURLE_OUT_OF_MEMORY; |
| + | goto out; |
| + | } |
| + | path_and_query = tmp_str; |
| } | |
| if(authhost->want && !authhost->picked) | |
| @@ -823,15 +818,15 @@ CURLcode Curl_http_output_auth(struct Curl_easy *data, | |
| #ifndef CURL_DISABLE_PROXY | |
| /* Send proxy authentication header if needed */ | |
| - | if(conn->bits.httpproxy && |
| - | (conn->bits.tunnel_proxy == (curl_bit)proxytunnel)) { |
| - | result = output_auth_headers(data, conn, authproxy, request, path, TRUE); |
| + | if(conn->bits.httpproxy && (!conn->bits.tunnel_proxy || is_connect)) { |
| + | result = output_auth_headers(data, conn, authproxy, request, |
| + | path_and_query, TRUE); |
| if(result) | |
| - | return result; |
| + | goto out; |
| } | |
| else | |
| #else | |
| - | (void)proxytunnel; |
| + | (void)is_connect; |
| #endif /* CURL_DISABLE_PROXY */ | |
| /* we have no proxy so let's pretend we are done authenticating | |
| with it */ | |
| @@ -844,7 +839,8 @@ CURLcode Curl_http_output_auth(struct Curl_easy *data, | |
| || conn->bits.netrc | |
| #endif | |
| ) | |
| - | result = output_auth_headers(data, conn, authhost, request, path, FALSE); |
| + | result = output_auth_headers(data, conn, authhost, request, |
| + | path_and_query, FALSE); |
| else | |
| authhost->done = TRUE; | |
| @@ -859,27 +855,31 @@ CURLcode Curl_http_output_auth(struct Curl_easy *data, | |
| else | |
| data->req.authneg = FALSE; | |
| + | out: |
| + | curlx_free(tmp_str); |
| return result; | |
| } | |
| - | #else |
| + | #else /* !CURL_DISABLE_HTTP_AUTH */ |
| /* when disabled */ | |
| CURLcode Curl_http_output_auth(struct Curl_easy *data, | |
| struct connectdata *conn, | |
| const char *request, | |
| Curl_HttpReq httpreq, | |
| const char *path, | |
| - | bool proxytunnel) |
| + | const char *query, |
| + | bool is_connect) |
| { | |
| (void)data; | |
| (void)conn; | |
| (void)request; | |
| (void)httpreq; | |
| (void)path; | |
| - | (void)proxytunnel; |
| + | (void)query; |
| + | (void)is_connect; |
| return CURLE_OK; | |
| } | |
| - | #endif |
| + | #endif /* !CURL_DISABLE_HTTP_AUTH, else */ |
| #if defined(USE_SPNEGO) || defined(USE_NTLM) || \ | |
| !defined(CURL_DISABLE_DIGEST_AUTH) || \ | |
| @@ -2059,8 +2059,8 @@ static CURLcode http_set_aptr_host(struct Curl_easy *data) | |
| } | |
| else { | |
| /* Use the hostname as present in the URL if it was IPv6. */ | |
| - | char *host = (data->state.up.hostname[0] == '[') ? |
| - | data->state.up.hostname : conn->origin->hostname; |
| + | char *host = (conn->origin->user_hostname[0] == '[') ? |
| + | conn->origin->user_hostname : conn->origin->hostname; |
| if(((conn->given->protocol & (CURLPROTO_HTTPS | CURLPROTO_WSS)) && | |
| (conn->origin->port == PORT_HTTPS)) || | |
| @@ -2834,7 +2834,7 @@ typedef enum { | |
| #ifndef CURL_DISABLE_PROXY | |
| H1_HD_PROXY_AUTH, | |
| #endif | |
| - | H1_HD_USER_AUTH, |
| + | H1_HD_AUTH, |
| H1_HD_RANGE, | |
| H1_HD_USER_AGENT, | |
| H1_HD_ACCEPT, | |
| @@ -2889,14 +2889,14 @@ static CURLcode http_add_hd(struct Curl_easy *data, | |
| #ifndef CURL_DISABLE_PROXY | |
| case H1_HD_PROXY_AUTH: | |
| - | if(data->req.proxyuserpwd) |
| - | result = curlx_dyn_add(req, data->req.proxyuserpwd); |
| + | if(data->req.hd_proxy_auth) |
| + | result = curlx_dyn_add(req, data->req.hd_proxy_auth); |
| break; | |
| #endif | |
| - | case H1_HD_USER_AUTH: |
| - | if(data->req.userpwd) |
| - | result = curlx_dyn_add(req, data->req.userpwd); |
| + | case H1_HD_AUTH: |
| + | if(data->req.hd_auth) |
| + | result = curlx_dyn_add(req, data->req.hd_auth); |
| break; | |
| case H1_HD_RANGE: | |
| @@ -3054,29 +3054,16 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done) | |
| /* select host to send */ | |
| result = http_set_aptr_host(data); | |
| - | if(!result) { |
| - | /* setup the authentication headers, how that method and host are known */ |
| - | char *pq = NULL; |
| - | if(data->state.up.query) { |
| - | pq = curl_maprintf("%s?%s", data->state.up.path, data->state.up.query); |
| - | if(!pq) { |
| - | result = CURLE_OUT_OF_MEMORY; |
| - | goto out; |
| - | } |
| - | } |
| + | /* setup the authentication headers, how that method and host are known */ |
| + | if(!result) |
| result = Curl_http_output_auth(data, data->conn, method, httpreq, | |
| - | (pq ? pq : data->state.up.path), FALSE); |
| - | curlx_free(pq); |
| - | } |
| - | if(result) |
| - | goto out; |
| - | |
| - | result = http_useragent(data); |
| - | if(result) |
| - | goto out; |
| - | |
| + | data->state.up.path, |
| + | data->state.up.query, FALSE); |
| + | if(!result) |
| + | result = http_useragent(data); |
| /* Setup input reader, resume information and ranges */ | |
| - | result = set_reader(data, httpreq); |
| + | if(!result) |
| + | result = set_reader(data, httpreq); |
| if(!result) | |
| result = http_resume(data, httpreq); | |
| if(!result) | |
| @@ -180,8 +180,9 @@ CURLcode Curl_http_write_resp_hds(struct Curl_easy *data, | |
| * @param request pointer to the request keyword | |
| * @param httpreq is the request type | |
| * @param path pointer to the requested path | |
| - | * @param proxytunnel boolean if this is the request setting up a "proxy |
| - | * tunnel" |
| + | * @param query pointer to the requested query or NULL |
| + | * @param is_connect boolean if this is a CONNECT request |
| + | * (where httpreq is HTTPREQ_GET since there is no HTTPREQ_CONNECT) |
| * | |
| * @returns CURLcode | |
| */ | |
| @@ -190,9 +191,8 @@ CURLcode Curl_http_output_auth(struct Curl_easy *data, | |
| const char *request, | |
| Curl_HttpReq httpreq, | |
| const char *path, | |
| - | bool proxytunnel); /* TRUE if this is |
| - | the request setting up |
| - | the proxy tunnel */ |
| + | const char *query, |
| + | bool is_connect); |
| /* Decode HTTP status code string. */ | |
| CURLcode Curl_http_decode_status(int *pstatus, const char *s, size_t len); | |
| @@ -1113,8 +1113,8 @@ CURLcode Curl_output_aws_sigv4(struct Curl_easy *data) | |
| Curl_strntoupper(&auth_headers[sizeof("Authorization: ") - 1], | |
| curlx_str(&provider0), curlx_strlen(&provider0)); | |
| - | curlx_free(data->req.userpwd); |
| - | data->req.userpwd = auth_headers; |
| + | curlx_free(data->req.hd_auth); |
| + | data->req.hd_auth = auth_headers; |
| data->state.authhost.done = TRUE; | |
| result = CURLE_OK; | |
| @@ -91,7 +91,7 @@ CURLcode Curl_output_digest(struct Curl_easy *data, | |
| return CURLE_NOT_BUILT_IN; | |
| #else | |
| digest = &data->state.proxydigest; | |
| - | allocuserpwd = &data->req.proxyuserpwd; |
| + | allocuserpwd = &data->req.hd_proxy_auth; |
| userp = data->state.aptr.proxyuser; | |
| passwdp = data->state.aptr.proxypasswd; | |
| authp = &data->state.authproxy; | |
| @@ -99,7 +99,7 @@ CURLcode Curl_output_digest(struct Curl_easy *data, | |
| } | |
| else { | |
| digest = &data->state.digest; | |
| - | allocuserpwd = &data->req.userpwd; |
| + | allocuserpwd = &data->req.hd_auth; |
| userp = data->state.aptr.user; | |
| passwdp = data->state.aptr.passwd; | |
| authp = &data->state.authhost; | |
| @@ -217,13 +217,13 @@ CURLcode Curl_output_negotiate(struct Curl_easy *data, | |
| if(proxy) { | |
| #ifndef CURL_DISABLE_PROXY | |
| - | curlx_free(data->req.proxyuserpwd); |
| - | data->req.proxyuserpwd = userp; |
| + | curlx_free(data->req.hd_proxy_auth); |
| + | data->req.hd_proxy_auth = userp; |
| #endif | |
| } | |
| else { | |
| - | curlx_free(data->req.userpwd); |
| - | data->req.userpwd = userp; |
| + | curlx_free(data->req.hd_auth); |
| + | data->req.hd_auth = userp; |
| } | |
| curlx_free(base64); | |
| @@ -139,7 +139,7 @@ CURLcode Curl_output_ntlm(struct Curl_easy *data, bool proxy) | |
| if(proxy) { | |
| #ifndef CURL_DISABLE_PROXY | |
| - | allocuserpwd = &data->req.proxyuserpwd; |
| + | allocuserpwd = &data->req.hd_proxy_auth; |
| userp = data->state.aptr.proxyuser; | |
| passwdp = data->state.aptr.proxypasswd; | |
| service = data->set.str[STRING_PROXY_SERVICE_NAME] ? | |
| @@ -152,7 +152,7 @@ CURLcode Curl_output_ntlm(struct Curl_easy *data, bool proxy) | |
| #endif | |
| } | |
| else { | |
| - | allocuserpwd = &data->req.userpwd; |
| + | allocuserpwd = &data->req.hd_auth; |
| userp = data->state.aptr.user; | |
| passwdp = data->state.aptr.passwd; | |
| service = data->set.str[STRING_SERVICE_NAME] ? | |
| @@ -196,7 +196,7 @@ CURLcode Curl_http_proxy_create_CONNECT(struct httpreq **preq, | |
| /* Setup the proxy-authorization header, if any */ | |
| result = Curl_http_output_auth(data, cf->conn, req->method, HTTPREQ_GET, | |
| - | req->authority, TRUE); |
| + | req->authority, NULL, TRUE); |
| if(result) | |
| goto out; | |
| @@ -208,9 +208,9 @@ CURLcode Curl_http_proxy_create_CONNECT(struct httpreq **preq, | |
| goto out; | |
| } | |
| - | if(data->req.proxyuserpwd) { |
| + | if(data->req.hd_proxy_auth) { |
| result = Curl_dynhds_h1_cadd_line(&req->headers, | |
| - | data->req.proxyuserpwd); |
| + | data->req.hd_proxy_auth); |
| if(result) | |
| goto out; | |
| } | |
| @@ -65,9 +65,9 @@ CURLcode Curl_req_soft_reset(struct SingleRequest *req, | |
| req->httpversion = 0; | |
| req->sendbuf_hds_len = 0; | |
| - | curlx_safefree(req->userpwd); |
| + | curlx_safefree(req->hd_auth); |
| #ifndef CURL_DISABLE_PROXY | |
| - | curlx_safefree(req->proxyuserpwd); |
| + | curlx_safefree(req->hd_proxy_auth); |
| #endif | |
| result = Curl_client_start(data); | |
| @@ -115,9 +115,9 @@ void Curl_req_hard_reset(struct SingleRequest *req, struct Curl_easy *data) | |
| struct curltime t0 = { 0, 0 }; | |
| curlx_safefree(req->newurl); | |
| - | curlx_safefree(req->userpwd); |
| + | curlx_safefree(req->hd_auth); |
| #ifndef CURL_DISABLE_PROXY | |
| - | curlx_safefree(req->proxyuserpwd); |
| + | curlx_safefree(req->hd_proxy_auth); |
| #endif | |
| #ifndef CURL_DISABLE_COOKIES | |
| curlx_safefree(req->cookiehost); | |
| @@ -175,9 +175,9 @@ void Curl_req_hard_reset(struct SingleRequest *req, struct Curl_easy *data) | |
| void Curl_req_free(struct SingleRequest *req, struct Curl_easy *data) | |
| { | |
| curlx_safefree(req->newurl); | |
| - | curlx_safefree(req->userpwd); |
| + | curlx_safefree(req->hd_auth); |
| #ifndef CURL_DISABLE_PROXY | |
| - | curlx_safefree(req->proxyuserpwd); |
| + | curlx_safefree(req->hd_proxy_auth); |
| #endif | |
| if(req->sendbuf_init) | |
| Curl_bufq_free(&req->sendbuf); | |
| @@ -114,9 +114,9 @@ struct SingleRequest { | |
| wanted */ | |
| uint8_t io_flags; /* REQ_IO_RECV | REQ_IO_SEND */ | |
| - | char *userpwd; /* auth header */ |
| + | char *hd_auth; /* Authorization header, full HTTP/1.x line */ |
| #ifndef CURL_DISABLE_PROXY | |
| - | char *proxyuserpwd; /* proxy auth header */ |
| + | char *hd_proxy_auth; /* Proxy-Authorization header, full HTTP/1.x line */ |
| #endif | |
| #ifndef CURL_DISABLE_COOKIES | |
| char *cookiehost; | |
| @@ -288,8 +288,8 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done) | |
| const char *p_stream_uri = NULL; | |
| const char *p_transport = NULL; | |
| const char *p_uagent = NULL; | |
| - | const char *p_proxyuserpwd = NULL; |
| - | const char *p_userpwd = NULL; |
| + | const char *p_hd_proxy_auth = NULL; |
| + | const char *p_hd_auth = NULL; |
| *done = TRUE; | |
| if(!rtsp) | |
| @@ -442,14 +442,14 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done) | |
| /* setup the authentication headers */ | |
| result = Curl_http_output_auth(data, conn, p_request, HTTPREQ_GET, | |
| - | p_stream_uri, FALSE); |
| + | p_stream_uri, NULL, FALSE); |
| if(result) | |
| goto out; | |
| #ifndef CURL_DISABLE_PROXY | |
| - | p_proxyuserpwd = data->req.proxyuserpwd; |
| + | p_hd_proxy_auth = data->req.hd_proxy_auth; |
| #endif | |
| - | p_userpwd = data->req.userpwd; |
| + | p_hd_auth = data->req.hd_auth; |
| /* Referrer */ | |
| curlx_safefree(data->state.aptr.ref); | |
| @@ -520,8 +520,8 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done) | |
| "%s" /* range */ | |
| "%s" /* referrer */ | |
| "%s" /* user-agent */ | |
| - | "%s" /* proxyuserpwd */ |
| - | "%s" /* userpwd */ |
| + | "%s" /* hd_proxy_auth */ |
| + | "%s" /* hd_auth */ |
| , | |
| p_transport ? p_transport : "", | |
| p_accept ? p_accept : "", | |
| @@ -529,8 +529,8 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done) | |
| p_range ? p_range : "", | |
| p_referrer ? p_referrer : "", | |
| p_uagent ? p_uagent : "", | |
| - | p_proxyuserpwd ? p_proxyuserpwd : "", |
| - | p_userpwd ? p_userpwd : ""); |
| + | p_hd_proxy_auth ? p_hd_proxy_auth : "", |
| + | p_hd_auth ? p_hd_auth : ""); |
| if(result) | |
| goto out; | |