From 1a4b0507bfb318740926edf0ca8a5f0ef743b0df Mon Sep 17 00:00:00 2001 From: Arlind Date: Sun, 23 Nov 2025 13:17:35 +0100 Subject: [PATCH] Update .gitea/workflows/test-skins.yml --- .gitea/workflows/test-skins.yml | 66 ++++++++++++++++----------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/.gitea/workflows/test-skins.yml b/.gitea/workflows/test-skins.yml index 07dbaed0..6b0c6bba 100644 --- a/.gitea/workflows/test-skins.yml +++ b/.gitea/workflows/test-skins.yml @@ -23,43 +23,47 @@ jobs: ERRORS=() ############################################################ - # FIXED: SAFE URL DECODER (no null bytes!) + # Remove all NUL/control characters BEFORE any decoding + ############################################################ + sanitize_url() { + printf '%s' "$1" \ + | tr -d '\000' \ + | tr -d '\r' \ + | sed 's/[[:cntrl:]]//g' + } + + ############################################################ + # Safe unicode URL decode (no null bytes) ############################################################ urldecode() { local url="$1" url="${url//+/ }" - # Perl decoding avoids raw NUL bytes and handles unicode correctly printf '%s' "$url" | perl -pe 's/%([A-Fa-f0-9]{2})/chr(hex($1))/eg' } ############################################################ - # FIXED: Gitea "soft 404" detection (HTML body says 404) + # Detect Gitea "soft 404" even when status=200 OK ############################################################ check_http() { local url="$1" echo " → Checking external: $url" - # HEAD - local status + local status body + + # Try HEAD first status=$(curl -Is --max-time 10 "$url" | head -n1 | awk '{print $2}') - if [[ "$status" =~ ^2|3 ]]; then - local body body=$(curl -Ls --max-time 10 "$url") - if echo "$body" | grep -qiE "404 Not Found|Path .* doesn't exist|File not found|does not exist|Not Found"; then return 1 fi return 0 fi - # GET fallback + # Try GET fallback status=$(curl -Is --max-time 10 -X GET "$url" | head -n1 | awk '{print $2}') - if [[ "$status" =~ ^2|3 ]]; then - local body body=$(curl -Ls --max-time 10 "$url") - if echo "$body" | grep -qiE "404 Not Found|Path .* doesn't exist|File not found|does not exist|Not Found"; then return 1 fi @@ -74,20 +78,17 @@ jobs: ############################################################ check_local() { local path="$1" - path="${path#/}" + path="${path#/}" # strip leading slash local decoded decoded=$(urldecode "$path") echo " → Checking local: $decoded" - if [[ ! -e "$decoded" ]]; then - return 1 - fi - return 0 + [[ -e "$decoded" ]] } ############################################################ - # Extract *all* link types from a Markdown file + # Extract URLs from Markdown + HTML ############################################################ extract_links() { local f="$1" @@ -115,34 +116,31 @@ jobs: echo "🔍 Scanning Markdown files..." echo - ############################################################ - # Process all markdown files - ############################################################ find . -type f -name '*.md' | while IFS= read -r mdfile; do echo "📄 Checking: $mdfile" - ############################################ - # For each file, extract and test links - ############################################ while IFS= read -r url; do [[ -z "$url" ]] && continue [[ "$url" == mailto:* ]] && continue - # Skip versioned /src/tag links inside docs/ (quietly) - if [[ "$mdfile" == ./docs/* ]] && [[ "$url" == *"/src/tag/"* ]]; then + # Clean input BEFORE use + cleaned=$(sanitize_url "$url") + + # Skip tag-version links in docs + if [[ "$mdfile" == ./docs/* ]] && [[ "$cleaned" == *"/src/tag/"* ]]; then continue fi - # External URLs - if [[ "$url" == http* ]]; then - if ! check_http "$url"; then - ERRORS+=("❌ Broken external link: $url (in $mdfile)") + # external + if [[ "$cleaned" == http* ]]; then + if ! check_http "$cleaned"; then + ERRORS+=("❌ Broken external link: $cleaned (in $mdfile)") fi - # Local paths + # local file else - if ! check_local "$url"; then - ERRORS+=("❌ Missing local file: $url (in $mdfile)") + if ! check_local "$cleaned"; then + ERRORS+=("❌ Missing local file: $cleaned (in $mdfile)") fi fi @@ -152,7 +150,7 @@ jobs: done ############################################################ - # Final error reporting + # Final result ############################################################ echo if (( ${#ERRORS[@]} > 0 )); then