Add e2e for username/password over HTTP
This commit is contained in:
parent
dbd0567882
commit
af6b96ab74
|
|
@ -0,0 +1,49 @@
|
||||||
|
# Copyright 2023 The Kubernetes Authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
# Stolen from https://github.com/linuxkit/linuxkit/tree/master/pkg/sshd/
|
||||||
|
|
||||||
|
FROM alpine AS base
|
||||||
|
|
||||||
|
RUN mkdir -p /out/etc/apk && cp -r /etc/apk/* /out/etc/apk/
|
||||||
|
RUN apk add --no-cache --initdb -p /out \
|
||||||
|
alpine-baselayout \
|
||||||
|
apk-tools \
|
||||||
|
busybox \
|
||||||
|
git \
|
||||||
|
git-daemon \
|
||||||
|
nginx \
|
||||||
|
fcgiwrap \
|
||||||
|
apache2-utils \
|
||||||
|
tini \
|
||||||
|
&& true
|
||||||
|
|
||||||
|
###############
|
||||||
|
|
||||||
|
FROM scratch
|
||||||
|
|
||||||
|
ENTRYPOINT []
|
||||||
|
WORKDIR /
|
||||||
|
|
||||||
|
COPY --from=base /out/ /
|
||||||
|
|
||||||
|
RUN htpasswd -b -c /etc/htpasswd testuser testpass
|
||||||
|
|
||||||
|
# Callers should mount a directory with git repos here.
|
||||||
|
VOLUME /git
|
||||||
|
|
||||||
|
COPY nginx.conf /etc/nginx/
|
||||||
|
COPY run.sh /
|
||||||
|
|
||||||
|
CMD ["/sbin/tini", "/run.sh"]
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
# A server for tests git-over-http
|
||||||
|
|
||||||
|
DO NOT USE THIS FOR ANYTHING BUT TESTING GIT OVER HTTP!!!
|
||||||
|
|
||||||
|
## How to use it
|
||||||
|
|
||||||
|
Build yourself a test image. We use example.com so you can't accidentally push
|
||||||
|
it.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ docker build -t example.com/test/test-httpd .
|
||||||
|
...lots of output...
|
||||||
|
Successfully tagged example.com/test/test-httpd:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
Run it.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ docker run -d -v /tmp/repo:/git/repo:ro example.com/test/test-httpd
|
||||||
|
60d5b41110bc669037031e3cd758763f0e4fb6c50fac33c4a8a28432b448ae
|
||||||
|
```
|
||||||
|
|
||||||
|
Find your IP.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ docker inspect 60d5b41110bc669037031e3cd758763f0e4fb6c50fac33c4a8a28432b448ae7 | jq -r .[0].NetworkSettings.IPAddress
|
||||||
|
192.168.1.2
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you can git clone from it.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git clone testuser:testpass@192.168.9.2/repo
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
# /etc/nginx/nginx.conf
|
||||||
|
|
||||||
|
user root;
|
||||||
|
worker_processes 1;
|
||||||
|
daemon off;
|
||||||
|
error_log /dev/stdout info;
|
||||||
|
|
||||||
|
events {
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
access_log /dev/stdout;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80 default_server;
|
||||||
|
listen [::]:80 default_server;
|
||||||
|
|
||||||
|
# Everything is a 404
|
||||||
|
location / {
|
||||||
|
# First attempt to serve request as file, then
|
||||||
|
# as directory, then fall back to displaying a 404.
|
||||||
|
try_files $uri $uri/ =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ (/.*) {
|
||||||
|
client_max_body_size 0; # Git pushes can be massive, just to make sure nginx doesn't suddenly cut the connection add this.
|
||||||
|
auth_basic "Git Login"; # Whatever text will do.
|
||||||
|
auth_basic_user_file "/etc/htpasswd";
|
||||||
|
include /etc/nginx/fastcgi_params; # Include the default fastcgi configs
|
||||||
|
fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend; # Tells fastcgi to pass the request to the git http backend executable
|
||||||
|
fastcgi_param GIT_HTTP_EXPORT_ALL "";
|
||||||
|
fastcgi_param GIT_PROJECT_ROOT /git; # the location of all of your git repositories.
|
||||||
|
fastcgi_param REMOTE_USER $remote_user;
|
||||||
|
fastcgi_param PATH_INFO $1; # Takes the capture group from our location directive and gives git that.
|
||||||
|
fastcgi_pass unix:/var/run/fcgiwrap.socket; # Pass the request to fastcgi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright 2023 The Kubernetes Authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
SOCKET="/var/run/fcgiwrap.socket"
|
||||||
|
rm -f "$SOCKET"
|
||||||
|
fcgiwrap -s "unix:$SOCKET" &
|
||||||
|
|
||||||
|
exec nginx
|
||||||
71
test_e2e.sh
71
test_e2e.sh
|
|
@ -2697,6 +2697,77 @@ function e2e::submodule_sync_relative() {
|
||||||
rm -rf $SUBMODULE
|
rm -rf $SUBMODULE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
##############################################
|
||||||
|
# Test HTTP with password
|
||||||
|
##############################################
|
||||||
|
function e2e::auth_http_password() {
|
||||||
|
# Run a git-over-HTTP server.
|
||||||
|
CTR=$(docker_run \
|
||||||
|
-v "$DOT_SSH/server/3":/dot_ssh:ro \
|
||||||
|
-v "$REPO":/git/repo:ro \
|
||||||
|
e2e/test/httpd)
|
||||||
|
IP=$(docker_ip "$CTR")
|
||||||
|
|
||||||
|
# Try with wrong username
|
||||||
|
GIT_SYNC \
|
||||||
|
--one-time \
|
||||||
|
--repo="http://$IP/repo" \
|
||||||
|
--root="$ROOT" \
|
||||||
|
--link="link" \
|
||||||
|
--username="wrong" \
|
||||||
|
--password="testpass" \
|
||||||
|
|| true
|
||||||
|
assert_file_absent "$ROOT/link/file"
|
||||||
|
|
||||||
|
# Try with wrong password
|
||||||
|
GIT_SYNC \
|
||||||
|
--one-time \
|
||||||
|
--repo="http://$IP/repo" \
|
||||||
|
--root="$ROOT" \
|
||||||
|
--link="link" \
|
||||||
|
--username="testuser" \
|
||||||
|
--password="wrong" \
|
||||||
|
|| true
|
||||||
|
assert_file_absent "$ROOT/link/file"
|
||||||
|
|
||||||
|
# Configure the repo.
|
||||||
|
echo "$FUNCNAME 1" > "$REPO/file"
|
||||||
|
git -C "$REPO" commit -qam "$FUNCNAME 1"
|
||||||
|
|
||||||
|
GIT_SYNC \
|
||||||
|
--period=100ms \
|
||||||
|
--repo="http://$IP/repo" \
|
||||||
|
--root="$ROOT" \
|
||||||
|
--link="link" \
|
||||||
|
--username="testuser" \
|
||||||
|
--password="testpass" \
|
||||||
|
&
|
||||||
|
|
||||||
|
# First sync
|
||||||
|
wait_for_sync "${MAXWAIT}"
|
||||||
|
assert_link_exists "$ROOT/link"
|
||||||
|
assert_file_exists "$ROOT/link/file"
|
||||||
|
assert_file_eq "$ROOT/link/file" "$FUNCNAME 1"
|
||||||
|
assert_metric_eq "${METRIC_GOOD_SYNC_COUNT}" 1
|
||||||
|
|
||||||
|
# Move HEAD forward
|
||||||
|
echo "$FUNCNAME 2" > "$REPO/file"
|
||||||
|
git -C "$REPO" commit -qam "$FUNCNAME 2"
|
||||||
|
wait_for_sync "${MAXWAIT}"
|
||||||
|
assert_link_exists "$ROOT/link"
|
||||||
|
assert_file_exists "$ROOT/link/file"
|
||||||
|
assert_file_eq "$ROOT/link/file" "$FUNCNAME 2"
|
||||||
|
assert_metric_eq "${METRIC_GOOD_SYNC_COUNT}" 2
|
||||||
|
|
||||||
|
# Move HEAD backward
|
||||||
|
git -C "$REPO" reset -q --hard HEAD^
|
||||||
|
wait_for_sync "${MAXWAIT}"
|
||||||
|
assert_link_exists "$ROOT/link"
|
||||||
|
assert_file_exists "$ROOT/link/file"
|
||||||
|
assert_file_eq "$ROOT/link/file" "$FUNCNAME 1"
|
||||||
|
assert_metric_eq "${METRIC_GOOD_SYNC_COUNT}" 3
|
||||||
|
}
|
||||||
|
|
||||||
##############################################
|
##############################################
|
||||||
# Test SSH with bad key
|
# Test SSH with bad key
|
||||||
##############################################
|
##############################################
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue