#!/usr/bin/env bash set -euo pipefail BASE_URL="${BASE_URL:-http://127.0.0.1:8080}" CALDAV_USER="${CALDAV_USER:-rw_user@example.test}" CALDAV_PASSWORD="${CALDAV_PASSWORD:-rwpass123456}" require_contains() { local haystack="$1" local needle="$2" local msg="$3" if ! printf '%s' "$haystack" | grep -q "$needle"; then echo "[caldav-compat] FAIL: $msg" exit 1 fi } require_contains_ci() { local haystack="$1" local needle="$2" local msg="$3" if ! printf '%s' "$haystack" | grep -qi "$needle"; then echo "[caldav-compat] FAIL: $msg" exit 1 fi } echo "[caldav-compat] checking unauthenticated challenge" unauth_headers="$(curl -sS -i "$BASE_URL/caldav/" | tr -d '\r')" require_contains "$unauth_headers" ' 401 ' "expected 401 from /caldav/" require_contains_ci "$unauth_headers" 'www-authenticate: basic' "missing WWW-Authenticate Basic challenge" echo "[caldav-compat] checking OPTIONS capability advertisement" opt_headers="$(curl -sS -i -u "$CALDAV_USER:$CALDAV_PASSWORD" -X OPTIONS "$BASE_URL/caldav/" | tr -d '\r')" require_contains_ci "$opt_headers" 'dav:' "missing DAV header" require_contains_ci "$opt_headers" 'calendar-access' "missing DAV calendar-access advertisement" require_contains_ci "$opt_headers" 'allow: ' "missing Allow header for CalDAV OPTIONS" require_contains_ci "$opt_headers" 'options' "Allow header missing OPTIONS" require_contains_ci "$opt_headers" 'propfind' "Allow header missing PROPFIND" require_contains_ci "$opt_headers" 'report' "Allow header missing REPORT" echo "[caldav-compat] checking root PROPFIND discovery" root_xml="$(curl -fsS -u "$CALDAV_USER:$CALDAV_PASSWORD" -X PROPFIND \ -H 'Depth: 1' \ -H 'Content-Type: application/xml' \ --data '' \ "$BASE_URL/caldav/")" require_contains "$root_xml" '' "root discovery missing current-user-principal" require_contains "$root_xml" '/caldav/calendars/public/' "root discovery missing public calendar href" require_contains "$root_xml" '' "root discovery missing calendar collection marker" principal_href="$(printf '%s' "$root_xml" | grep -oE '/caldav/principals/[^<"]+/' | head -n 1 || true)" if [ -z "$principal_href" ]; then echo "[caldav-compat] FAIL: unable to locate principal href in root PROPFIND" exit 1 fi echo "[caldav-compat] checking principal calendar-home-set" principal_xml="$(curl -fsS -u "$CALDAV_USER:$CALDAV_PASSWORD" -X PROPFIND \ -H 'Depth: 0' \ -H 'Content-Type: application/xml' \ --data '' \ "$BASE_URL$principal_href")" require_contains "$principal_xml" '' "principal missing calendar-home-set" require_contains "$principal_xml" '/caldav/calendars/' "calendar-home-set does not point to /caldav/calendars/" echo "[caldav-compat] checking calendars home-set collection listing" home_xml="$(curl -fsS -u "$CALDAV_USER:$CALDAV_PASSWORD" -X PROPFIND \ -H 'Depth: 1' \ -H 'Content-Type: application/xml' \ --data '' \ "$BASE_URL/caldav/calendars/")" require_contains "$home_xml" '/caldav/calendars/public/' "calendar home-set listing missing public calendar href" require_contains "$home_xml" '' "calendar home-set listing missing calendar marker" require_contains "$home_xml" '' "calendar home-set listing missing supported component set" echo "[caldav-compat] all checks passed"