1# HTTPS clones: Caddy hands git's paths (smart and dumb) to git2# http-backend, which by itself serves only repos with git-daemon-export-ok,3# and serves nothing else from inside a bare repo. A private repo gets the4# 404 a missing one gets from it; only a token has one served5# (private-web-clone).6. "$(dirname "$0")/../lib.sh"7user dami8repo --private dami/secret9repo dami/open10for r in secret open; do11 clone dami "dami/$r" "$T/w/$r"12 at "$T/w/$r" commit "first"13 ok push_as dami "$T/w/$r" origin main14done1516# The Caddyfile, as on a host with fcgiwrap.17mkdir "$T/bin"18printf '#!/bin/sh\n' >"$T/bin/fcgiwrap"19chmod +x "$T/bin/fcgiwrap"20PATH="$T/bin:$PATH" forge server caddyfile git.test >"$T/Caddyfile" 2>"$T_LOG" || fail "caddyfile"21eq "$(grep -c 'GIT_HTTP_EXPORT_ALL' "$T/Caddyfile")" 122lacks "$T/Caddyfile" "root \\* $FORGE_ROOT\$"23has "$T/Caddyfile" 'SCRIPT_FILENAME .*/git-http-backend$'24has "$T/Caddyfile" 'respond 404'25eq "$(grep -c 'file_server' "$T/Caddyfile")" 126if command -v caddy >/dev/null 2>&1; then ok caddy adapt --config "$T/Caddyfile" --adapter caddyfile; fi27re=$(sed -n 's/^ @git path_regexp git //p' "$T/Caddyfile")28[ -n "$re" ] || fail "no @git route"29h40=0123456789abcdef0123456789abcdef0123456730for p in info/refs git-upload-pack HEAD objects/info/packs "objects/01/${h40#01}" "objects/pack/pack-$h40.pack" "objects/pack/pack-$h40.idx"; do31 printf '/dami/open.git/%s\n' "$p" | grep -Eq "$re" || fail "@git doesn't route $p"32done33for p in config description forge/reviews/1 forge/readers hooks/pre-receive git-receive-pack objects/info/commit-graphs/x refs/heads/main packed-refs; do34 if printf '/dami/open.git/%s\n' "$p" | grep -Eq "$re"; then fail "@git routes $p"; fi35done3637# git http-backend itself, as fcgiwrap runs it.38cgi() {39 env -u GIT_HTTP_EXPORT_ALL GIT_PROJECT_ROOT="$FORGE_ROOT" PATH_INFO="$1" REQUEST_METHOD=GET QUERY_STRING="${2:-}" \40 "$(git --exec-path)/git-http-backend" </dev/null >"$T_LOG" 2>/dev/null || true41}42cgi /dami/open.git/info/refs service=git-upload-pack43has "$T_LOG" 'application/x-git-upload-pack-advertisement'44has "$T_LOG" 'refs/heads/main'45cgi /dami/secret.git/info/refs service=git-upload-pack46has "$T_LOG" '^Status: 404'47lacks "$T_LOG" 'refs/heads'48denied=$(output)49cgi /dami/nope.git/info/refs service=git-upload-pack50eq "$denied" "$(output)"51cgi /dami/open.git/HEAD52has "$T_LOG" 'ref: refs/heads/main'53cgi /dami/secret.git/HEAD54has "$T_LOG" '^Status: 404'55cgi /dami/secret.git/info/refs56has "$T_LOG" '^Status: 404'