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.
62 lines
2.2 KiB
62 lines
2.2 KiB
#!/usr/bin/env bash
|
|
# Build an isolated runtime image and verify its public authentication boundary.
|
|
set -euo pipefail
|
|
|
|
image_tag="${IMAGE_TAG:-webfilebrowser:e2e}"
|
|
test_suffix="${RANDOM}-$$"
|
|
container_name="webfilebrowser-e2e-${test_suffix}"
|
|
volume_name="webfilebrowser-e2e-data-${test_suffix}"
|
|
work_directory="$(mktemp -d)"
|
|
|
|
cleanup() {
|
|
docker rm --force "${container_name}" >/dev/null 2>&1 || true
|
|
docker volume rm --force "${volume_name}" >/dev/null 2>&1 || true
|
|
rm -rf "${work_directory}"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
mkdir -p "${work_directory}/media"
|
|
cp config/roots.example.json "${work_directory}/roots.json"
|
|
|
|
docker build --tag "${image_tag}" .
|
|
docker volume create "${volume_name}" >/dev/null
|
|
docker run --detach --rm --name "${container_name}" \
|
|
--publish 127.0.0.1::8080 \
|
|
--env WEB_FILE_BROWSER_ROOTS_FILE=/etc/webfilebrowser/roots.json \
|
|
--volume "${work_directory}/roots.json:/etc/webfilebrowser/roots.json:ro" \
|
|
--volume "${work_directory}/media:/mnt/media:ro" \
|
|
--volume "${volume_name}:/var/lib/webfilebrowser" \
|
|
"${image_tag}" >/dev/null
|
|
|
|
port="$(docker port "${container_name}" 8080/tcp | sed -n '1s/.*://p')"
|
|
base_url="http://127.0.0.1:${port}"
|
|
headers_file="${work_directory}/headers"
|
|
body_file="${work_directory}/body"
|
|
|
|
for _ in {1..30}; do
|
|
if curl --silent --output "${body_file}" --dump-header "${headers_file}" "${base_url}/login"; then
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
if ! rg -q '^HTTP/[0-9.]+ 200' "${headers_file}" || ! rg -q 'Sign in' "${body_file}"; then
|
|
docker logs "${container_name}"
|
|
echo "container did not serve the login page" >&2
|
|
exit 1
|
|
fi
|
|
|
|
curl --silent --show-error --output "${body_file}" --dump-header "${headers_file}" "${base_url}/"
|
|
if ! rg -q '^HTTP/[0-9.]+ 303' "${headers_file}" || ! rg -qi '^Location: /login' "${headers_file}"; then
|
|
docker logs "${container_name}"
|
|
echo "unauthenticated root request was not redirected to login" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$(docker image inspect --format '{{.Config.User}}' "${image_tag}")" != "webfilebrowser" ]]; then
|
|
echo "container image must run as the webfilebrowser user" >&2
|
|
exit 1
|
|
fi
|
|
docker run --rm --entrypoint /bin/sh "${image_tag}" -c '! command -v go'
|
|
|
|
echo "production deployment smoke test passed"
|
|
|