2020-03-26 09:25:27 +01:00
|
|
|
# Shell library for testing credential handling including helpers. See t0302
|
|
|
|
# for an example of testing a specific helper.
|
2011-12-10 11:31:11 +01:00
|
|
|
|
|
|
|
# Try a set of credential helpers; the expected stdin,
|
|
|
|
# stdout and stderr should be provided on stdin,
|
|
|
|
# separated by "--".
|
|
|
|
check() {
|
2012-06-24 13:39:59 +02:00
|
|
|
credential_opts=
|
|
|
|
credential_cmd=$1
|
|
|
|
shift
|
|
|
|
for arg in "$@"; do
|
|
|
|
credential_opts="$credential_opts -c credential.helper='$arg'"
|
|
|
|
done
|
2011-12-10 11:31:11 +01:00
|
|
|
read_chunk >stdin &&
|
|
|
|
read_chunk >expect-stdout &&
|
|
|
|
read_chunk >expect-stderr &&
|
2012-06-24 13:39:59 +02:00
|
|
|
if ! eval "git $credential_opts credential $credential_cmd <stdin >stdout 2>stderr"; then
|
|
|
|
echo "git credential failed with code $?" &&
|
|
|
|
cat stderr &&
|
|
|
|
false
|
|
|
|
fi &&
|
2011-12-10 11:31:11 +01:00
|
|
|
test_cmp expect-stdout stdout &&
|
2021-02-11 02:53:53 +01:00
|
|
|
test_cmp expect-stderr stderr
|
2011-12-10 11:31:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
read_chunk() {
|
|
|
|
while read line; do
|
|
|
|
case "$line" in
|
|
|
|
--) break ;;
|
|
|
|
*) echo "$line" ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2011-12-10 11:34:14 +01:00
|
|
|
# Clear any residual data from previous tests. We only
|
|
|
|
# need this when testing third-party helpers which read and
|
|
|
|
# write outside of our trash-directory sandbox.
|
|
|
|
#
|
|
|
|
# Don't bother checking for success here, as it is
|
|
|
|
# outside the scope of tests and represents a best effort to
|
|
|
|
# clean up after ourselves.
|
|
|
|
helper_test_clean() {
|
|
|
|
reject $1 https example.com store-user
|
|
|
|
reject $1 https example.com user1
|
|
|
|
reject $1 https example.com user2
|
|
|
|
reject $1 http path.tld user
|
|
|
|
reject $1 https timeout.tld user
|
2017-10-30 18:20:12 +01:00
|
|
|
reject $1 https sso.tld
|
2011-12-10 11:34:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
reject() {
|
|
|
|
(
|
|
|
|
echo protocol=$2
|
|
|
|
echo host=$3
|
|
|
|
echo username=$4
|
2012-06-24 13:39:59 +02:00
|
|
|
) | git -c credential.helper=$1 credential reject
|
2011-12-10 11:34:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
helper_test() {
|
|
|
|
HELPER=$1
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) has no existing data" '
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=askpass-username
|
|
|
|
password=askpass-password
|
|
|
|
--
|
|
|
|
askpass: Username for '\''https://example.com'\'':
|
|
|
|
askpass: Password for '\''https://askpass-username@example.com'\'':
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) stores password" '
|
|
|
|
check approve $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=store-user
|
|
|
|
password=store-pass
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) can retrieve password" '
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=store-user
|
|
|
|
password=store-pass
|
|
|
|
--
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) requires matching protocol" '
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=http
|
|
|
|
host=example.com
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=http
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=askpass-username
|
|
|
|
password=askpass-password
|
|
|
|
--
|
|
|
|
askpass: Username for '\''http://example.com'\'':
|
|
|
|
askpass: Password for '\''http://askpass-username@example.com'\'':
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) requires matching host" '
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=other.tld
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=other.tld
|
2011-12-10 11:34:14 +01:00
|
|
|
username=askpass-username
|
|
|
|
password=askpass-password
|
|
|
|
--
|
|
|
|
askpass: Username for '\''https://other.tld'\'':
|
|
|
|
askpass: Password for '\''https://askpass-username@other.tld'\'':
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) requires matching username" '
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=other
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=other
|
|
|
|
password=askpass-password
|
|
|
|
--
|
|
|
|
askpass: Password for '\''https://other@example.com'\'':
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) requires matching path" '
|
|
|
|
test_config credential.usehttppath true &&
|
|
|
|
check approve $HELPER <<-\EOF &&
|
|
|
|
protocol=http
|
|
|
|
host=path.tld
|
|
|
|
path=foo.git
|
|
|
|
username=user
|
|
|
|
password=pass
|
|
|
|
EOF
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=http
|
|
|
|
host=path.tld
|
|
|
|
path=bar.git
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=http
|
|
|
|
host=path.tld
|
|
|
|
path=bar.git
|
2011-12-10 11:34:14 +01:00
|
|
|
username=askpass-username
|
|
|
|
password=askpass-password
|
|
|
|
--
|
|
|
|
askpass: Username for '\''http://path.tld/bar.git'\'':
|
|
|
|
askpass: Password for '\''http://askpass-username@path.tld/bar.git'\'':
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) can forget host" '
|
|
|
|
check reject $HELPER <<-\EOF &&
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
EOF
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=askpass-username
|
|
|
|
password=askpass-password
|
|
|
|
--
|
|
|
|
askpass: Username for '\''https://example.com'\'':
|
|
|
|
askpass: Password for '\''https://askpass-username@example.com'\'':
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) can store multiple users" '
|
|
|
|
check approve $HELPER <<-\EOF &&
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=user1
|
|
|
|
password=pass1
|
|
|
|
EOF
|
|
|
|
check approve $HELPER <<-\EOF &&
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=user2
|
|
|
|
password=pass2
|
|
|
|
EOF
|
|
|
|
check fill $HELPER <<-\EOF &&
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=user1
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=user1
|
|
|
|
password=pass1
|
|
|
|
EOF
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=user2
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=user2
|
|
|
|
password=pass2
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) can forget user" '
|
|
|
|
check reject $HELPER <<-\EOF &&
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=user1
|
|
|
|
EOF
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=user1
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=user1
|
|
|
|
password=askpass-password
|
|
|
|
--
|
|
|
|
askpass: Password for '\''https://user1@example.com'\'':
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) remembers other user" '
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=example.com
|
|
|
|
username=user2
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=example.com
|
2011-12-10 11:34:14 +01:00
|
|
|
username=user2
|
|
|
|
password=pass2
|
|
|
|
EOF
|
|
|
|
'
|
2017-10-30 18:20:12 +01:00
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) can store empty username" '
|
|
|
|
check approve $HELPER <<-\EOF &&
|
|
|
|
protocol=https
|
|
|
|
host=sso.tld
|
|
|
|
username=
|
|
|
|
password=
|
|
|
|
EOF
|
|
|
|
check fill $HELPER <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=sso.tld
|
|
|
|
--
|
|
|
|
protocol=https
|
|
|
|
host=sso.tld
|
|
|
|
username=
|
|
|
|
password=
|
|
|
|
EOF
|
|
|
|
'
|
2011-12-10 11:34:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
helper_test_timeout() {
|
|
|
|
HELPER="$*"
|
|
|
|
|
|
|
|
test_expect_success "helper ($HELPER) times out" '
|
|
|
|
check approve "$HELPER" <<-\EOF &&
|
|
|
|
protocol=https
|
|
|
|
host=timeout.tld
|
|
|
|
username=user
|
|
|
|
password=pass
|
|
|
|
EOF
|
|
|
|
sleep 2 &&
|
|
|
|
check fill "$HELPER" <<-\EOF
|
|
|
|
protocol=https
|
|
|
|
host=timeout.tld
|
|
|
|
--
|
2012-06-24 13:40:00 +02:00
|
|
|
protocol=https
|
|
|
|
host=timeout.tld
|
2011-12-10 11:34:14 +01:00
|
|
|
username=askpass-username
|
|
|
|
password=askpass-password
|
|
|
|
--
|
|
|
|
askpass: Username for '\''https://timeout.tld'\'':
|
|
|
|
askpass: Password for '\''https://askpass-username@timeout.tld'\'':
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
}
|
2011-12-10 11:31:11 +01:00
|
|
|
|
2014-09-29 09:02:07 +02:00
|
|
|
write_script askpass <<\EOF
|
2011-12-10 11:31:11 +01:00
|
|
|
echo >&2 askpass: $*
|
2014-04-23 15:44:03 +02:00
|
|
|
what=$(echo $1 | cut -d" " -f1 | tr A-Z a-z | tr -cd a-z)
|
2011-12-10 11:31:11 +01:00
|
|
|
echo "askpass-$what"
|
|
|
|
EOF
|
|
|
|
GIT_ASKPASS="$PWD/askpass"
|
|
|
|
export GIT_ASKPASS
|