Browse Source
Allow information carried on the WWW-AUthenticate header to be passed to the credential helpers. * mc/credential-helper-www-authenticate: credential: add WWW-Authenticate header to cred requests http: read HTTP WWW-Authenticate response headers t5563: add tests for basic and anoymous HTTP accessmain
Junio C Hamano
2 years ago
9 changed files with 538 additions and 1 deletions
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
#!/bin/sh |
||||
|
||||
VALID_CREDS_FILE=custom-auth.valid |
||||
CHALLENGE_FILE=custom-auth.challenge |
||||
|
||||
# |
||||
# If $VALID_CREDS_FILE exists in $HTTPD_ROOT_PATH, consider each line as a valid |
||||
# credential for the current request. Each line in the file is considered a |
||||
# valid HTTP Authorization header value. For example: |
||||
# |
||||
# Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA== |
||||
# |
||||
# If $CHALLENGE_FILE exists in $HTTPD_ROOT_PATH, output the contents as headers |
||||
# in a 401 response if no valid authentication credentials were included in the |
||||
# request. For example: |
||||
# |
||||
# WWW-Authenticate: Bearer authorize_uri="id.example.com" p=1 q=0 |
||||
# WWW-Authenticate: Basic realm="example.com" |
||||
# |
||||
|
||||
if test -n "$HTTP_AUTHORIZATION" && \ |
||||
grep -Fqsx "${HTTP_AUTHORIZATION}" "$VALID_CREDS_FILE" |
||||
then |
||||
# Note that although git-http-backend returns a status line, it |
||||
# does so using a CGI 'Status' header. Because this script is an |
||||
# No Parsed Headers (NPH) script, we must return a real HTTP |
||||
# status line. |
||||
# This is only a test script, so we don't bother to check for |
||||
# the actual status from git-http-backend and always return 200. |
||||
echo 'HTTP/1.1 200 OK' |
||||
exec "$GIT_EXEC_PATH"/git-http-backend |
||||
fi |
||||
|
||||
echo 'HTTP/1.1 401 Authorization Required' |
||||
if test -f "$CHALLENGE_FILE" |
||||
then |
||||
cat "$CHALLENGE_FILE" |
||||
fi |
||||
echo |
@ -0,0 +1,325 @@
@@ -0,0 +1,325 @@
|
||||
#!/bin/sh |
||||
|
||||
test_description='test http auth header and credential helper interop' |
||||
|
||||
. ./test-lib.sh |
||||
. "$TEST_DIRECTORY"/lib-httpd.sh |
||||
|
||||
start_httpd |
||||
|
||||
test_expect_success 'setup_credential_helper' ' |
||||
mkdir "$TRASH_DIRECTORY/bin" && |
||||
PATH=$PATH:"$TRASH_DIRECTORY/bin" && |
||||
export PATH && |
||||
|
||||
CREDENTIAL_HELPER="$TRASH_DIRECTORY/bin/git-credential-test-helper" && |
||||
write_script "$CREDENTIAL_HELPER" <<-\EOF |
||||
cmd=$1 |
||||
teefile=$cmd-query.cred |
||||
catfile=$cmd-reply.cred |
||||
sed -n -e "/^$/q" -e "p" >>$teefile |
||||
if test "$cmd" = "get" |
||||
then |
||||
cat $catfile |
||||
fi |
||||
EOF |
||||
' |
||||
|
||||
set_credential_reply () { |
||||
cat >"$TRASH_DIRECTORY/$1-reply.cred" |
||||
} |
||||
|
||||
expect_credential_query () { |
||||
cat >"$TRASH_DIRECTORY/$1-expect.cred" && |
||||
test_cmp "$TRASH_DIRECTORY/$1-expect.cred" \ |
||||
"$TRASH_DIRECTORY/$1-query.cred" |
||||
} |
||||
|
||||
per_test_cleanup () { |
||||
rm -f *.cred && |
||||
rm -f "$HTTPD_ROOT_PATH"/custom-auth.valid \ |
||||
"$HTTPD_ROOT_PATH"/custom-auth.challenge |
||||
} |
||||
|
||||
test_expect_success 'setup repository' ' |
||||
test_commit foo && |
||||
git init --bare "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && |
||||
git push --mirror "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" |
||||
' |
||||
|
||||
test_expect_success 'access using basic auth' ' |
||||
test_when_finished "per_test_cleanup" && |
||||
|
||||
set_credential_reply get <<-EOF && |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
|
||||
# Basic base64(alice:secret-passwd) |
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF && |
||||
Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA== |
||||
EOF |
||||
|
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF && |
||||
WWW-Authenticate: Basic realm="example.com" |
||||
EOF |
||||
|
||||
test_config_global credential.helper test-helper && |
||||
git ls-remote "$HTTPD_URL/custom_auth/repo.git" && |
||||
|
||||
expect_credential_query get <<-EOF && |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
wwwauth[]=Basic realm="example.com" |
||||
EOF |
||||
|
||||
expect_credential_query store <<-EOF |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
' |
||||
|
||||
test_expect_success 'access using basic auth invalid credentials' ' |
||||
test_when_finished "per_test_cleanup" && |
||||
|
||||
set_credential_reply get <<-EOF && |
||||
username=baduser |
||||
password=wrong-passwd |
||||
EOF |
||||
|
||||
# Basic base64(alice:secret-passwd) |
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF && |
||||
Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA== |
||||
EOF |
||||
|
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF && |
||||
WWW-Authenticate: Basic realm="example.com" |
||||
EOF |
||||
|
||||
test_config_global credential.helper test-helper && |
||||
test_must_fail git ls-remote "$HTTPD_URL/custom_auth/repo.git" && |
||||
|
||||
expect_credential_query get <<-EOF && |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
wwwauth[]=Basic realm="example.com" |
||||
EOF |
||||
|
||||
expect_credential_query erase <<-EOF |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
username=baduser |
||||
password=wrong-passwd |
||||
wwwauth[]=Basic realm="example.com" |
||||
EOF |
||||
' |
||||
|
||||
test_expect_success 'access using basic auth with extra challenges' ' |
||||
test_when_finished "per_test_cleanup" && |
||||
|
||||
set_credential_reply get <<-EOF && |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
|
||||
# Basic base64(alice:secret-passwd) |
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF && |
||||
Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA== |
||||
EOF |
||||
|
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF && |
||||
WWW-Authenticate: FooBar param1="value1" param2="value2" |
||||
WWW-Authenticate: Bearer authorize_uri="id.example.com" p=1 q=0 |
||||
WWW-Authenticate: Basic realm="example.com" |
||||
EOF |
||||
|
||||
test_config_global credential.helper test-helper && |
||||
git ls-remote "$HTTPD_URL/custom_auth/repo.git" && |
||||
|
||||
expect_credential_query get <<-EOF && |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
wwwauth[]=FooBar param1="value1" param2="value2" |
||||
wwwauth[]=Bearer authorize_uri="id.example.com" p=1 q=0 |
||||
wwwauth[]=Basic realm="example.com" |
||||
EOF |
||||
|
||||
expect_credential_query store <<-EOF |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
' |
||||
|
||||
test_expect_success 'access using basic auth mixed-case wwwauth header name' ' |
||||
test_when_finished "per_test_cleanup" && |
||||
|
||||
set_credential_reply get <<-EOF && |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
|
||||
# Basic base64(alice:secret-passwd) |
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF && |
||||
Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA== |
||||
EOF |
||||
|
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF && |
||||
www-authenticate: foobar param1="value1" param2="value2" |
||||
WWW-AUTHENTICATE: BEARER authorize_uri="id.example.com" p=1 q=0 |
||||
WwW-aUtHeNtIcAtE: baSiC realm="example.com" |
||||
EOF |
||||
|
||||
test_config_global credential.helper test-helper && |
||||
git ls-remote "$HTTPD_URL/custom_auth/repo.git" && |
||||
|
||||
expect_credential_query get <<-EOF && |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
wwwauth[]=foobar param1="value1" param2="value2" |
||||
wwwauth[]=BEARER authorize_uri="id.example.com" p=1 q=0 |
||||
wwwauth[]=baSiC realm="example.com" |
||||
EOF |
||||
|
||||
expect_credential_query store <<-EOF |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
' |
||||
|
||||
test_expect_success 'access using basic auth with wwwauth header continuations' ' |
||||
test_when_finished "per_test_cleanup" && |
||||
|
||||
set_credential_reply get <<-EOF && |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
|
||||
# Basic base64(alice:secret-passwd) |
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF && |
||||
Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA== |
||||
EOF |
||||
|
||||
# Note that leading and trailing whitespace is important to correctly |
||||
# simulate a continuation/folded header. |
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.challenge" <<-EOF && |
||||
WWW-Authenticate: FooBar param1="value1" |
||||
param2="value2" |
||||
WWW-Authenticate: Bearer authorize_uri="id.example.com" |
||||
p=1 |
||||
q=0 |
||||
WWW-Authenticate: Basic realm="example.com" |
||||
EOF |
||||
|
||||
test_config_global credential.helper test-helper && |
||||
git ls-remote "$HTTPD_URL/custom_auth/repo.git" && |
||||
|
||||
expect_credential_query get <<-EOF && |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
wwwauth[]=FooBar param1="value1" param2="value2" |
||||
wwwauth[]=Bearer authorize_uri="id.example.com" p=1 q=0 |
||||
wwwauth[]=Basic realm="example.com" |
||||
EOF |
||||
|
||||
expect_credential_query store <<-EOF |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
' |
||||
|
||||
test_expect_success 'access using basic auth with wwwauth header empty continuations' ' |
||||
test_when_finished "per_test_cleanup" && |
||||
|
||||
set_credential_reply get <<-EOF && |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
|
||||
# Basic base64(alice:secret-passwd) |
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF && |
||||
Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA== |
||||
EOF |
||||
|
||||
CHALLENGE="$HTTPD_ROOT_PATH/custom-auth.challenge" && |
||||
|
||||
# Note that leading and trailing whitespace is important to correctly |
||||
# simulate a continuation/folded header. |
||||
printf "">$CHALLENGE && |
||||
printf "WWW-Authenticate: FooBar param1=\"value1\"\r\n" >$CHALLENGE && |
||||
printf " \r\n" >>$CHALLENGE && |
||||
printf " param2=\"value2\"\r\n" >>$CHALLENGE && |
||||
printf "WWW-Authenticate: Bearer authorize_uri=\"id.example.com\"\r\n" >>$CHALLENGE && |
||||
printf " p=1\r\n" >>$CHALLENGE && |
||||
printf " \r\n" >>$CHALLENGE && |
||||
printf " q=0\r\n" >>$CHALLENGE && |
||||
printf "WWW-Authenticate: Basic realm=\"example.com\"\r\n" >>$CHALLENGE && |
||||
|
||||
test_config_global credential.helper test-helper && |
||||
git ls-remote "$HTTPD_URL/custom_auth/repo.git" && |
||||
|
||||
expect_credential_query get <<-EOF && |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
wwwauth[]=FooBar param1="value1" param2="value2" |
||||
wwwauth[]=Bearer authorize_uri="id.example.com" p=1 q=0 |
||||
wwwauth[]=Basic realm="example.com" |
||||
EOF |
||||
|
||||
expect_credential_query store <<-EOF |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
' |
||||
|
||||
test_expect_success 'access using basic auth with wwwauth header mixed line-endings' ' |
||||
test_when_finished "per_test_cleanup" && |
||||
|
||||
set_credential_reply get <<-EOF && |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
|
||||
# Basic base64(alice:secret-passwd) |
||||
cat >"$HTTPD_ROOT_PATH/custom-auth.valid" <<-EOF && |
||||
Basic YWxpY2U6c2VjcmV0LXBhc3N3ZA== |
||||
EOF |
||||
|
||||
CHALLENGE="$HTTPD_ROOT_PATH/custom-auth.challenge" && |
||||
|
||||
# Note that leading and trailing whitespace is important to correctly |
||||
# simulate a continuation/folded header. |
||||
printf "">$CHALLENGE && |
||||
printf "WWW-Authenticate: FooBar param1=\"value1\"\r\n" >$CHALLENGE && |
||||
printf " \r\n" >>$CHALLENGE && |
||||
printf "\tparam2=\"value2\"\r\n" >>$CHALLENGE && |
||||
printf "WWW-Authenticate: Basic realm=\"example.com\"" >>$CHALLENGE && |
||||
|
||||
test_config_global credential.helper test-helper && |
||||
git ls-remote "$HTTPD_URL/custom_auth/repo.git" && |
||||
|
||||
expect_credential_query get <<-EOF && |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
wwwauth[]=FooBar param1="value1" param2="value2" |
||||
wwwauth[]=Basic realm="example.com" |
||||
EOF |
||||
|
||||
expect_credential_query store <<-EOF |
||||
protocol=http |
||||
host=$HTTPD_DEST |
||||
username=alice |
||||
password=secret-passwd |
||||
EOF |
||||
' |
||||
|
||||
test_done |
Loading…
Reference in new issue