Merge branch 'jk/credential-parsing-end-of-host-in-URL'
Parsing of URL for the credential helper has been corrected. * jk/credential-parsing-end-of-host-in-URL: credential: treat "?" and "#" in URLs as end of host
This commit is contained in:
@ -399,7 +399,14 @@ int credential_from_url_gently(struct credential *c, const char *url,
|
|||||||
cp = proto_end + 3;
|
cp = proto_end + 3;
|
||||||
at = strchr(cp, '@');
|
at = strchr(cp, '@');
|
||||||
colon = strchr(cp, ':');
|
colon = strchr(cp, ':');
|
||||||
slash = strchrnul(cp, '/');
|
|
||||||
|
/*
|
||||||
|
* A query or fragment marker before the slash ends the host portion.
|
||||||
|
* We'll just continue to call this "slash" for simplicity. Notably our
|
||||||
|
* "trim leading slashes" part won't skip over this part of the path,
|
||||||
|
* but that's what we'd want.
|
||||||
|
*/
|
||||||
|
slash = cp + strcspn(cp, "/?#");
|
||||||
|
|
||||||
if (!at || slash <= at) {
|
if (!at || slash <= at) {
|
||||||
/* Case (1) */
|
/* Case (1) */
|
||||||
|
@ -532,7 +532,7 @@ test_expect_success 'url parser rejects embedded newlines' '
|
|||||||
url=https://one.example.com?%0ahost=two.example.com/
|
url=https://one.example.com?%0ahost=two.example.com/
|
||||||
EOF
|
EOF
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
warning: url contains a newline in its host component: https://one.example.com?%0ahost=two.example.com/
|
warning: url contains a newline in its path component: https://one.example.com?%0ahost=two.example.com/
|
||||||
fatal: credential url cannot be parsed: https://one.example.com?%0ahost=two.example.com/
|
fatal: credential url cannot be parsed: https://one.example.com?%0ahost=two.example.com/
|
||||||
EOF
|
EOF
|
||||||
test_i18ncmp expect stderr
|
test_i18ncmp expect stderr
|
||||||
@ -575,4 +575,38 @@ test_expect_success 'credential system refuses to work with missing protocol' '
|
|||||||
test_i18ncmp expect stderr
|
test_i18ncmp expect stderr
|
||||||
'
|
'
|
||||||
|
|
||||||
|
# usage: check_host_and_path <url> <expected-host> <expected-path>
|
||||||
|
check_host_and_path () {
|
||||||
|
# we always parse the path component, but we need this to make sure it
|
||||||
|
# is passed to the helper
|
||||||
|
test_config credential.useHTTPPath true &&
|
||||||
|
check fill "verbatim user pass" <<-EOF
|
||||||
|
url=$1
|
||||||
|
--
|
||||||
|
protocol=https
|
||||||
|
host=$2
|
||||||
|
path=$3
|
||||||
|
username=user
|
||||||
|
password=pass
|
||||||
|
--
|
||||||
|
verbatim: get
|
||||||
|
verbatim: protocol=https
|
||||||
|
verbatim: host=$2
|
||||||
|
verbatim: path=$3
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_success 'url parser handles bare query marker' '
|
||||||
|
check_host_and_path https://example.com?foo.git example.com ?foo.git
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'url parser handles bare fragment marker' '
|
||||||
|
check_host_and_path https://example.com#foo.git example.com "#foo.git"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'url parser not confused by encoded markers' '
|
||||||
|
check_host_and_path https://example.com%23%3f%2f/foo.git \
|
||||||
|
"example.com#?/" foo.git
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user