278 lines
6.1 KiB
Bash
Executable File
278 lines
6.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
export CLEANUP="$1"
|
|
|
|
## Main Methods
|
|
|
|
|
|
# Dep check
|
|
|
|
command -v oathtool ;
|
|
if [[ "$?" = "1" ]] ; then
|
|
echo "Please install oathtool or add it to \$PATH before continuing."
|
|
exit 1;
|
|
fi
|
|
|
|
# Get the git working directory base if CI build dir isn't set
|
|
if [[ "$CI_BUILD_DIR" == "" ]] ; then
|
|
export CI_BUILD_DIR="$(git rev-parse --show-toplevel)/v2"
|
|
fi
|
|
|
|
# Fix semantic version naming
|
|
echo "Fixing CI_BUILD_DIR"
|
|
[[ $CI_BUILD_DIR == */v2 ]] || export CI_BUILD_DIR=$CI_BUILD_DIR/v2
|
|
|
|
# This script requires that "$CI_BUILD_DIR" is set to the repo root
|
|
|
|
GOOS="$(go env GOOS)"
|
|
GOARCH="$(go env GOARCH)"
|
|
if [[ "$GOARCH" = "arm" ]]; then
|
|
DIST_ARCH="arm-$(go env GOARM)"
|
|
else
|
|
DIST_ARCH="$GOARCH"
|
|
fi
|
|
GLAUTH_BINARY="$CI_BUILD_DIR/bin/$GOOS$GOARCH/glauth"
|
|
if [[ ! -x "$GLAUTH_BINARY" ]]; then
|
|
GLAUTH_BINARY="$CI_BUILD_DIR/bin/glauth-$GOOS-$DIST_ARCH"
|
|
fi
|
|
if [[ ! -x "$GLAUTH_BINARY" ]]; then
|
|
echo "Unable to find a runnable GLAuth binary: $GLAUTH_BINARY"
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure ldap utils are installed (for example - when running this outside of CI)
|
|
if [[ ! `which ldapsearch` ]]; then
|
|
sudo apt-get -qq update && sudo apt-get -qq install -y ldap-utils || exit 1;
|
|
fi
|
|
|
|
# Display version string
|
|
echo "";
|
|
echo ""
|
|
echo "Version string of tested binary:"
|
|
"$GLAUTH_BINARY" --version
|
|
echo ""
|
|
|
|
# Start in background, capture PID
|
|
"$GLAUTH_BINARY" -c "$CI_BUILD_DIR/scripts/ci/test-config.cfg" &> /dev/null &
|
|
|
|
# Use this instead to see glauth logs while running
|
|
# "$CI_BUILD_DIR/bin/$(go env GOOS)$(go env GOARCH)/glauth" -c "$CI_BUILD_DIR/scripts/ci/test-config.cfg" &
|
|
glauthPid="$!"
|
|
|
|
echo "Running glauth at PID=$glauthPid"
|
|
|
|
# Sleep 2 sec, to ensure it comes online successfully and stays up
|
|
sleep 2;
|
|
|
|
# Check if process is still running before continuing
|
|
ps aux | grep -v "grep" | grep "$glauthPid" &> /dev/null || FAIL="1"
|
|
|
|
if [[ "$FAIL" = "1" ]] ; then
|
|
echo "Integration test FAILED - process did not remain running > 2 sec"
|
|
exit 255;
|
|
fi
|
|
|
|
|
|
FAIL="0"
|
|
|
|
# Used for OTP testing
|
|
# Arguments:
|
|
# $1 - Full Bind DN
|
|
# $2 - Full Bind PW
|
|
# $3 - query to run
|
|
# $4 - test name
|
|
function bindTest() {
|
|
ldapsearch -LLL \
|
|
-H ldap://localhost:3893 \
|
|
-D "$1" \
|
|
-w "$2" \
|
|
-x -bdc=glauth,dc=com \
|
|
"$3" > /dev/null
|
|
|
|
exitCode="$?"
|
|
|
|
if [[ "$exitCode" = "0" ]] ; then
|
|
echo " - PASS : Bind test '$4'";
|
|
else
|
|
echo " - FAIL : Bind test '$4'";
|
|
FAIL="1"
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
# Arguments:
|
|
# $1 - query
|
|
# $2 - name of snapshot
|
|
function snapshotTest() {
|
|
|
|
goodResults="$CI_BUILD_DIR/scripts/ci/good-results"
|
|
testResults="$CI_BUILD_DIR/scripts/ci/test-results"
|
|
|
|
mkdir "$testResults" &> /dev/null
|
|
|
|
# Run tests here
|
|
ldapCmd="ldapsearch -LLL \
|
|
-H ldap://localhost:3893 \
|
|
-D cn=serviceuser,ou=svcaccts,dc=glauth,dc=com \
|
|
-w mysecret \
|
|
-x -bdc=glauth,dc=com \
|
|
$1";
|
|
|
|
# Run the ldap command, pipe to file
|
|
# "$ldapCmd" &> "$testResults/$2"
|
|
|
|
# Useful for debugging - output the command run
|
|
# echo "$ldapCmd";
|
|
|
|
ldapsearch -LLL \
|
|
-H ldap://localhost:3893 \
|
|
-D cn=serviceuser,ou=svcaccts,dc=glauth,dc=com \
|
|
-w mysecret \
|
|
-x -bdc=glauth,dc=com \
|
|
$1 > "$testResults/$2"
|
|
|
|
|
|
# Handle the first-run case, saving the test results
|
|
if [ ! -f "$goodResults/$2" ]; then
|
|
echo " - FIRST RUN - SAVING SNAPSHOT, RUN AGAIN TO PASS : '$2'";
|
|
|
|
# Copy the results to the goodResults dir, for future runs.
|
|
cp "$testResults/$2" "$goodResults/$2";
|
|
|
|
# NOTE: fail=1 must still be set, otherwise CI runs would succeed when they shouldn't
|
|
FAIL="1"
|
|
else
|
|
|
|
THISFAIL="0"
|
|
diff -u "$goodResults/$2" "$testResults/$2" || THISFAIL="1"
|
|
|
|
|
|
if [[ "$CLEANUP" = "cleanup" ]] ; then
|
|
rm -rf "$testResults"
|
|
fi
|
|
|
|
if [[ "$THISFAIL" = "0" ]] ; then
|
|
echo " - PASS : snapshot '$2'";
|
|
else
|
|
echo " - FAIL : snapshot '$2'";
|
|
FAIL="1"
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
echo "";
|
|
echo "";
|
|
echo "RUNNING TESTS:"
|
|
echo "";
|
|
|
|
#################
|
|
## TEST RUNS
|
|
#################
|
|
|
|
## Query output tests
|
|
|
|
# Regular single-user fetches
|
|
snapshotTest "cn=hackers" userFetchTest0
|
|
snapshotTest "cn=johndoe" userFetchTest1
|
|
snapshotTest "cn=serviceuser" userFetchTest2
|
|
snapshotTest "cn=jamesdoe" userFetchTest3
|
|
snapshotTest "cn=alexdoe" userFetchTest4
|
|
|
|
# Test result of fetching nonexistent users
|
|
snapshotTest "cn=fakeuser" userFetchNonexistentUser0
|
|
snapshotTest "cn=janedoe" userFetchNonexistentUser1
|
|
|
|
# List all posixgroups
|
|
snapshotTest "objectClass=posixgroup" posixGroupList0
|
|
snapshotTest "objectClass=posixaccount" posixAccountList0
|
|
|
|
|
|
## 2FA Bind Test
|
|
# Fetch the OTP for this moment
|
|
otpCode="$(oathtool --totp -b -d 6 '3hnvnk4ycv44glzigd6s25j4dougs3rk')"
|
|
|
|
pass="ThisAloneWontWork!"
|
|
|
|
# Try to bind with it
|
|
bindTest "cn=alexdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"$pass$otpCode" \
|
|
"cn=alexdoe" \
|
|
"OtpAlexDoe"
|
|
|
|
## App Password Bind Test
|
|
|
|
# Test the main pw
|
|
bindTest "cn=jackdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"dogood1" \
|
|
"cn=jackdoe" \
|
|
"AppPwNoOtp0"
|
|
|
|
# App passwords on user
|
|
bindTest "cn=jackdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"TestAppPw1" \
|
|
"cn=jackdoe" \
|
|
"AppPwNoOtp1"
|
|
|
|
bindTest "cn=jackdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"TestAppPw2" \
|
|
"cn=jackdoe" \
|
|
"AppPwNoOtp2"
|
|
|
|
bindTest "cn=jackdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"TestAppPw3" \
|
|
"cn=jackdoe" \
|
|
"AppPwNoOtp3"
|
|
|
|
|
|
####
|
|
# Test for a user who also uses OTP
|
|
####
|
|
otpCode="$(oathtool --totp -b -d 6 '3hnvnk4ycv44glzigd6s25j4dougs3rk')"
|
|
|
|
pass="dogood1"
|
|
|
|
# Test the main pw
|
|
bindTest "cn=sarahdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"$pass$otpCode" \
|
|
"cn=sarahdoe" \
|
|
"AppPwOtp0"
|
|
|
|
# App passwords on user
|
|
bindTest "cn=sarahdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"TestAppPw1" \
|
|
"cn=sarahdoe" \
|
|
"AppPwOtp1"
|
|
|
|
bindTest "cn=sarahdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"TestAppPw2" \
|
|
"cn=sarahdoe" \
|
|
"AppPwOtp2"
|
|
|
|
bindTest "cn=sarahdoe,ou=superheros,dc=glauth,dc=com" \
|
|
"TestAppPw3" \
|
|
"cn=sarahdoe" \
|
|
"AppPwOtp3"
|
|
|
|
#############
|
|
## Cleanup
|
|
#############
|
|
|
|
echo "";
|
|
echo "";
|
|
|
|
# Kill saved PID when done
|
|
# However - throw the fail flag if the process isn't there (ie, exited prematurely)
|
|
echo "Killing glauth"
|
|
kill "$glauthPid" || FAIL="1"
|
|
|
|
if [[ "$FAIL" = "0" ]] ; then
|
|
echo "Integration test success"
|
|
exit 0;
|
|
else
|
|
echo "Integration test FAILED"
|
|
exit 255;
|
|
fi
|