8bee65c306
- PROPFIND-Auswertung (mehrere propstat, Kleinbuchstaben-Hex, Speicher -3 = unbegrenzt, nur Zeichenketten) - WebDAV-Schicht mit Zugangsschluessel und Aufrufsperre, Destination immer aus der Basis, Overwrite: F - mapNcFailure als einzige Fehlerabbildung (nie 401/403 an den Browser), sendUpstreamStream prueft vor dem ersten Byte - Dateidienst und Routen files, folders, move, preview im eigenen Konto; zweiter Benutzer bekommt notConnected - Web-API-Funktionen listFolder, createFolder, moveEntry, deleteEntry, previewUrl - e2e-files.sh gegen die Test-Nextcloud Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
135 lines
6.1 KiB
Bash
Executable File
135 lines
6.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Gemeinsame Helfer der End-zu-Ende-Skripte von quick-261008-mzu (wird mit `source` geladen,
|
|
# hat keine Nebenwirkungen beim Laden). Alles gegen den lokalen Stack und die Test-Nextcloud
|
|
# aus nc-test-setup.sh. Nur Testwerte; liest keine .env-Dateien.
|
|
#
|
|
# Aufgabe 2 ergaenzt hier die Helfer "anna verbinden" (e2e_connect_anna) auf Basis dieser Datei.
|
|
|
|
API=${API:-http://localhost:3001}
|
|
WEB=${WEB:-http://localhost:3000/api-proxy}
|
|
NC_BASE=${NC_BASE:-http://172.17.0.1:18080}
|
|
E2E_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
E2E_TMP=${E2E_TMP:-$(mktemp -d)}
|
|
|
|
# Stoppt mit Meldung, wenn eine Erwartung nicht stimmt.
|
|
e2e_fail() { echo "E2E FAIL: $*" >&2; exit 1; }
|
|
|
|
# e2e_login <jar> [benutzer] [passwort] — meldet an, Cookies landen im <jar>.
|
|
e2e_login() {
|
|
local jar=$1 user=${2:-admin} pass=${3:-admin123} code
|
|
code=$(curl -s -o "$E2E_TMP/login.out" -w '%{http_code}' -c "$jar" -H 'Content-Type: application/json' \
|
|
-d "{\"username\":\"$user\",\"password\":\"$pass\"}" "$API/auth/login")
|
|
[ "$code" = "200" ] || [ "$code" = "201" ] || e2e_fail "login $user -> $code"
|
|
}
|
|
|
|
# e2e_status <jar> <methode> <url> [json-body] [ausgabedatei] — gibt den HTTP-Status aus,
|
|
# der Antwortkoerper landet in <ausgabedatei> (Vorgabe $E2E_TMP/body.out).
|
|
e2e_status() {
|
|
local jar=$1 method=$2 url=$3 body=${4:-} out=${5:-$E2E_TMP/body.out}
|
|
if [ -n "$body" ]; then
|
|
curl -s -o "$out" -w '%{http_code}' -b "$jar" -X "$method" -H 'Content-Type: application/json' -d "$body" "$url"
|
|
else
|
|
curl -s -o "$out" -w '%{http_code}' -b "$jar" -X "$method" "$url"
|
|
fi
|
|
}
|
|
|
|
# e2e_expect <erwartet> <ist> <beschreibung>
|
|
e2e_expect() {
|
|
[ "$1" = "$2" ] && return 0
|
|
[ -s "$E2E_TMP/body.out" ] && { echo "--- letzte Antwort:" >&2; head -c 600 "$E2E_TMP/body.out" >&2; echo >&2; }
|
|
e2e_fail "$3: erwartet $1, war $2"
|
|
}
|
|
|
|
# e2e_contains <datei> <text> <beschreibung>
|
|
e2e_contains() { grep -q -- "$2" "$1" || { echo "--- Antwort:" >&2; cat "$1" >&2; echo >&2; e2e_fail "$3: '$2' fehlt"; }; }
|
|
|
|
# e2e_activate <jar> [slug] — aktiviert das Modul, falls noch nicht aktiv.
|
|
e2e_activate() {
|
|
local jar=$1 slug=${2:-nextcloud-files} id active
|
|
e2e_status "$jar" GET "$API/modules/catalog" "" "$E2E_TMP/catalog.out" >/dev/null
|
|
id=$(python3 -I -c 'import json,sys
|
|
slug=sys.argv[1]
|
|
for m in json.load(open(sys.argv[2])):
|
|
if m["slug"]==slug: print(m["id"]); break' "$slug" "$E2E_TMP/catalog.out")
|
|
[ -n "$id" ] || e2e_fail "Modul $slug nicht im Katalog"
|
|
active=$(python3 -I -c 'import json,sys
|
|
slug=sys.argv[1]
|
|
print([str(m.get("isActiveForTenant")) for m in json.load(open(sys.argv[2])) if m["slug"]==slug][0])' "$slug" "$E2E_TMP/catalog.out")
|
|
if [ "$active" != "True" ]; then
|
|
local code
|
|
code=$(e2e_status "$jar" POST "$API/modules/$id/activate")
|
|
case "$code" in 200|201) ;; *) e2e_fail "Aktivierung $slug -> $code" ;; esac
|
|
fi
|
|
}
|
|
|
|
# e2e_set_address <jar> [adresse] — setzt die Nextcloud-Adresse (mit Bestaetigung bei Wechsel).
|
|
e2e_set_address() {
|
|
local jar=$1 base=${2:-$NC_BASE} code
|
|
code=$(e2e_status "$jar" PUT "$API/modules/nextcloud-files/settings" "{\"baseUrl\":\"$base\",\"confirmReconnect\":true}")
|
|
e2e_expect 200 "$code" "Adresse setzen"
|
|
}
|
|
|
|
# e2e_second_user <name> <jar-ausgabe> — legt (als admin) einen Benutzer mit Rolle USER an,
|
|
# setzt sein Passwort auf "<name>-Pass-12345" (Pflicht-Passwortwechsel) und meldet ihn an.
|
|
e2e_second_user() {
|
|
local name=$1 jar=$2 admin_jar="$E2E_TMP/admin-second.jar" code first="Start-Pass-12345" final="${1}-Pass-12345"
|
|
e2e_login "$admin_jar"
|
|
code=$(e2e_status "$admin_jar" POST "$API/users" \
|
|
"{\"username\":\"$name\",\"email\":\"$name@example.com\",\"password\":\"$first\",\"displayName\":\"$name\",\"role\":\"USER\"}")
|
|
case "$code" in 200|201|409) ;; *) e2e_fail "Benutzer $name anlegen -> $code" ;; esac
|
|
if [ "$code" = "409" ]; then
|
|
e2e_login "$jar" "$name" "$final"
|
|
return 0
|
|
fi
|
|
e2e_login "$jar" "$name" "$first"
|
|
code=$(e2e_status "$jar" POST "$API/auth/change-password" "{\"currentPassword\":\"$first\",\"newPassword\":\"$final\"}")
|
|
e2e_expect 200 "$code" "Passwortwechsel $name"
|
|
e2e_login "$jar" "$name" "$final"
|
|
}
|
|
|
|
# --- Aufgabe 2: Konten -------------------------------------------------------------------
|
|
|
|
NC_OCC() { docker exec -u www-data tessera-nc-test php occ "$@"; }
|
|
|
|
# e2e_nc_tokens <nc-benutzer> — Anzahl der Tessera-Zugaenge (Name enthaelt "Tessera") in der
|
|
# Nextcloud. Messweg: occ user:auth-tokens:list --output=json, Zeilen mit "Tessera" im Namen.
|
|
e2e_nc_tokens() {
|
|
NC_OCC user:auth-tokens:list "$1" --output=json 2>/dev/null \
|
|
| python3 -I -c 'import json,sys
|
|
d=json.load(sys.stdin)
|
|
print(len([t for t in d if "Tessera" in str(t.get("name",""))]))'
|
|
}
|
|
|
|
# e2e_connect_anna <jar> — verbindet anna (Passwort-Weg) im Tessera-Benutzer des <jar>.
|
|
# Gibt den HTTP-Status aus; der Antwortkoerper landet in $E2E_TMP/body.out.
|
|
e2e_connect_anna() {
|
|
e2e_status "$1" POST "$API/modules/nextcloud-files/connect/password" \
|
|
'{"loginName":"anna","password":"User1-Pass-12345"}'
|
|
}
|
|
|
|
# e2e_wait_health — wartet bis die API antwortet.
|
|
e2e_wait_health() {
|
|
local i
|
|
for i in $(seq 1 60); do
|
|
curl -sf "$API/health" >/dev/null 2>&1 && return 0
|
|
sleep 2
|
|
done
|
|
e2e_fail "API wurde nicht gesund"
|
|
}
|
|
|
|
# e2e_grant_use <admin-jar> <benutzer-jar> [slug] — gibt dem Benutzer des zweiten <jar> die
|
|
# Freigabestufe Benutzen fuer das Modul (idempotent: ein vorhandener Grant ist in Ordnung).
|
|
e2e_grant_use() {
|
|
local admin_jar=$1 user_jar=$2 slug=${3:-nextcloud-files} code user_id module_id
|
|
code=$(e2e_status "$user_jar" GET "$API/auth/me" "" "$E2E_TMP/me.out")
|
|
e2e_expect 200 "$code" "auth/me"
|
|
user_id=$(python3 -I -c 'import json,sys; print(json.load(open(sys.argv[1]))["id"])' "$E2E_TMP/me.out")
|
|
e2e_status "$admin_jar" GET "$API/modules/catalog" "" "$E2E_TMP/catalog.out" >/dev/null
|
|
module_id=$(python3 -I -c 'import json,sys
|
|
for m in json.load(open(sys.argv[2])):
|
|
if m["slug"]==sys.argv[1]: print(m["id"]); break' "$slug" "$E2E_TMP/catalog.out")
|
|
code=$(e2e_status "$admin_jar" POST "$API/module-grants" \
|
|
"{\"moduleId\":\"$module_id\",\"userId\":\"$user_id\",\"level\":\"USE\"}")
|
|
case "$code" in 200|201|409) ;; *) e2e_fail "Freigabe Benutzen -> $code" ;; esac
|
|
}
|