You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
6.4 KiB
307 lines
6.4 KiB
# Shell library for testing credential handling including helpers. See t0302 |
|
# for an example of testing a specific helper. |
|
|
|
# Try a set of credential helpers; the expected stdin, |
|
# stdout and stderr should be provided on stdin, |
|
# separated by "--". |
|
check() { |
|
credential_opts= |
|
credential_cmd=$1 |
|
shift |
|
for arg in "$@"; do |
|
credential_opts="$credential_opts -c credential.helper='$arg'" |
|
done |
|
read_chunk >stdin && |
|
read_chunk >expect-stdout && |
|
read_chunk >expect-stderr && |
|
if ! eval "git $credential_opts credential $credential_cmd <stdin >stdout 2>stderr"; then |
|
echo "git credential failed with code $?" && |
|
cat stderr && |
|
false |
|
fi && |
|
test_cmp expect-stdout stdout && |
|
test_i18ncmp expect-stderr stderr |
|
} |
|
|
|
read_chunk() { |
|
while read line; do |
|
case "$line" in |
|
--) break ;; |
|
*) echo "$line" ;; |
|
esac |
|
done |
|
} |
|
|
|
# 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 |
|
reject $1 https sso.tld |
|
} |
|
|
|
reject() { |
|
( |
|
echo protocol=$2 |
|
echo host=$3 |
|
echo username=$4 |
|
) | git -c credential.helper=$1 credential reject |
|
} |
|
|
|
helper_test() { |
|
HELPER=$1 |
|
|
|
test_expect_success "helper ($HELPER) has no existing data" ' |
|
check fill $HELPER <<-\EOF |
|
protocol=https |
|
host=example.com |
|
-- |
|
protocol=https |
|
host=example.com |
|
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 |
|
-- |
|
protocol=https |
|
host=example.com |
|
username=store-user |
|
password=store-pass |
|
-- |
|
EOF |
|
' |
|
|
|
test_expect_success "helper ($HELPER) requires matching protocol" ' |
|
check fill $HELPER <<-\EOF |
|
protocol=http |
|
host=example.com |
|
-- |
|
protocol=http |
|
host=example.com |
|
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 |
|
-- |
|
protocol=https |
|
host=other.tld |
|
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 |
|
-- |
|
protocol=https |
|
host=example.com |
|
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 |
|
-- |
|
protocol=http |
|
host=path.tld |
|
path=bar.git |
|
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 |
|
-- |
|
protocol=https |
|
host=example.com |
|
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 |
|
-- |
|
protocol=https |
|
host=example.com |
|
username=user1 |
|
password=pass1 |
|
EOF |
|
check fill $HELPER <<-\EOF |
|
protocol=https |
|
host=example.com |
|
username=user2 |
|
-- |
|
protocol=https |
|
host=example.com |
|
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 |
|
-- |
|
protocol=https |
|
host=example.com |
|
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 |
|
-- |
|
protocol=https |
|
host=example.com |
|
username=user2 |
|
password=pass2 |
|
EOF |
|
' |
|
|
|
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 |
|
' |
|
} |
|
|
|
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 |
|
-- |
|
protocol=https |
|
host=timeout.tld |
|
username=askpass-username |
|
password=askpass-password |
|
-- |
|
askpass: Username for '\''https://timeout.tld'\'': |
|
askpass: Password for '\''https://askpass-username@timeout.tld'\'': |
|
EOF |
|
' |
|
} |
|
|
|
write_script askpass <<\EOF |
|
echo >&2 askpass: $* |
|
what=$(echo $1 | cut -d" " -f1 | tr A-Z a-z | tr -cd a-z) |
|
echo "askpass-$what" |
|
EOF |
|
GIT_ASKPASS="$PWD/askpass" |
|
export GIT_ASKPASS
|
|
|