2026-04-24 17:47:48 +02:00
|
|
|
#!/bin/bash
|
|
|
|
|
# Verifikations-Hook fuer dual_agent-Pipeline.
|
|
|
|
|
# Wird nach dem Executor-Lauf aufgerufen; Exit 0 = gruen.
|
|
|
|
|
# stdout/stderr landen bei Retry als Kontext beim Planner.
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
set -euo pipefail
|
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
2026-04-24 17:47:48 +02:00
|
|
|
FAIL=0
|
|
|
|
|
|
|
|
|
|
# --- 1. Statisch: JS-Syntax in index.html ------------------------------
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
if [ -f "$ROOT/web/index.html" ]; then
|
2026-04-24 17:47:48 +02:00
|
|
|
python3 - <<'PY' || FAIL=1
|
|
|
|
|
import re, subprocess, tempfile, sys
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
html = open(sys.argv[1] if len(sys.argv) > 1 else 'web/index.html').read()
|
2026-04-24 17:47:48 +02:00
|
|
|
for i, s in enumerate(re.findall(r'<script[^>]*>([\s\S]*?)</script>', html)):
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
with tempfile.NamedTemporaryFile('w', suffix='.js', delete=True) as f:
|
2026-04-24 17:47:48 +02:00
|
|
|
f.write(s); p = f.name
|
2026-05-03 14:10:03 +02:00
|
|
|
try:
|
|
|
|
|
r = subprocess.run(['node', '--check', p], capture_output=True, text=True)
|
|
|
|
|
except FileNotFoundError:
|
|
|
|
|
print('WARN: node nicht gefunden — JS-Syntax-Check übersprungen')
|
|
|
|
|
sys.exit(0)
|
2026-04-24 17:47:48 +02:00
|
|
|
if r.returncode != 0:
|
|
|
|
|
print(f'JS[{i}] syntax error:\n{r.stderr}')
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
print('JS syntax OK')
|
|
|
|
|
PY
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
else
|
|
|
|
|
echo "FAIL: web/index.html fehlt"
|
|
|
|
|
FAIL=1
|
2026-04-24 17:47:48 +02:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# --- 2. Dynamisch: Smoke-Test (alle Endpunkte) -------------------------
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
if [ -x "$ROOT/scripts/smoke_test.sh" ]; then
|
|
|
|
|
SMOKE_PORT=$(( $$ % 1000 + 9000 ))
|
|
|
|
|
"$ROOT/scripts/smoke_test.sh" "$SMOKE_PORT" || FAIL=1
|
2026-04-24 17:47:48 +02:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# --- 3. Semantisch: Pseudo-Fix-Muster verbieten ------------------------
|
|
|
|
|
# Diese Patterns haben wir als No-Op-Fixes im JSON-Editor erlebt.
|
|
|
|
|
# Ein neuer Bugfix darf sie nicht wieder einfuehren.
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
if [ -f "$ROOT/web/index.html" ]; then
|
2026-04-24 17:47:48 +02:00
|
|
|
# Doppeldeklaration einer Funktion
|
|
|
|
|
for fn in buildJsonForm extractJsonFromForm createJsonEditUI createTextEditUI applyFilters; do
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
count=$(grep -cE "function[[:space:]]+${fn}" "$ROOT/web/index.html" 2>/dev/null || echo 0)
|
2026-04-24 17:47:48 +02:00
|
|
|
if [ "$count" -gt 1 ]; then
|
|
|
|
|
echo "FAIL: Funktion '$fn' ist $count mal deklariert (erwartet: 1)"
|
|
|
|
|
FAIL=1
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
# Platzhalter-Leichen in geaenderten HTML-Attributen
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
if grep -qE 'an[[:space:]][[:space:]]+und[[:space:]][[:space:]]+angehaengt' "$ROOT/web/index.html"; then
|
2026-04-24 17:47:48 +02:00
|
|
|
echo "FAIL: Platzhalter-Leichen in der Datei (Variablen nicht interpoliert)"
|
|
|
|
|
FAIL=1
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# --- 4. Git-Hygiene: Commit-Message ohne Platzhalter-Leichen ----------
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
if ! git rev-parse HEAD >/dev/null 2>&1; then
|
|
|
|
|
echo "WARN: Kein Commit im Repo"
|
|
|
|
|
fi
|
2026-04-24 17:47:48 +02:00
|
|
|
last_msg=$(git log -1 --pretty=%B 2>/dev/null || true)
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
if printf '%s\n' "$last_msg" | grep -qE '\b(an|in|mit)[[:space:]][[:space:]]+und'; then
|
2026-04-24 17:47:48 +02:00
|
|
|
echo "FAIL: letzter Commit hat doppelte Leerzeichen (Platzhalter nicht ersetzt):"
|
fix: 26 kritische + 29 wichtige Sicherheits- und Robustheitsprobleme behoben
- serve.py: URL-Encoding fix, Body-Limit (10MB), Port-Reuse, TOCTOU-Race, Logging
- index.html: XSS in renderTemplates geheilt, Escape-Key für Edit-Modal, Accessibility
- templates.json: Pfade ohne ../, leere Descriptions ergänzt
- validate.py: categories/ entfernt, CLI-Flags umbenannt, zu mutually_exclusive_group
- smoke_test.sh: set -euo pipefail, Port-Validation, Timeout 5s, code-Fallback
- cleanup_server.sh: lsof statt pgrep, Graceful-Term + SIGKILL-Fallback
- agent_verify.sh: set -euo pipefail, ROOT-Pfade, dynamischer Port, grep-Crash fix
- AGENTS.md: history/ entfernt, Pfad-Schema präzisiert
- README.md: categories/ entfernt, Web-Ansicht + API-Endpunkte hinzugefügt
2026-05-03 14:00:55 +02:00
|
|
|
printf '%s\n' "$last_msg" | head -3
|
2026-04-24 17:47:48 +02:00
|
|
|
FAIL=1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
exit $FAIL
|