KP, was ich gemacht habe

Dieser Commit ist enthalten in:
2025-06-08 01:32:11 +02:00
Ursprung ff99b2c4dd
Commit f9e5823eeb
4 geänderte Dateien mit 42 neuen und 10 gelöschten Zeilen

Datei anzeigen

@@ -1180,4 +1180,34 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier
- ✅ OCSP Stapling aktiviert
- ✅ Chrome Sicherheitswarnung behoben
**Hinweis:** Nach dem Rebuild des nginx Containers wird die Verbindung als sicher angezeigt.
**Hinweis:** Nach dem Rebuild des nginx Containers wird die Verbindung als sicher angezeigt.
## 2025-06-08: CAPTCHA-Login-Bug behoben
**Problem:**
- Nach 2 fehlgeschlagenen Login-Versuchen wurde CAPTCHA angezeigt
- Da keine CAPTCHA-Keys konfiguriert waren (für PoC), konnte man sich nicht mehr einloggen
- Selbst mit korrektem Passwort war Login blockiert
- Fehlermeldung "CAPTCHA ERFORDERLICH!" erschien immer
**Lösung:**
1. **CAPTCHA-Prüfung nur wenn Keys vorhanden:**
- `recaptcha_site_key` wird vor CAPTCHA-Prüfung geprüft
- Wenn keine Keys konfiguriert → kein CAPTCHA-Check
- CAPTCHA wird nur angezeigt wenn Keys existieren
2. **Template-Anpassungen:**
- login.html zeigt CAPTCHA nur wenn `recaptcha_site_key` vorhanden
- Kein Test-Key mehr als Fallback
3. **Konsistente Logik:**
- show_captcha prüft jetzt auch ob Keys vorhanden sind
- Bei GET und POST Requests gleiche Logik
**Änderungen:**
- `v2_adminpanel/app.py`: CAPTCHA-Check nur wenn `RECAPTCHA_SITE_KEY` existiert
- `v2_adminpanel/templates/login.html`: CAPTCHA nur anzeigen wenn Keys vorhanden
**Status:**
- ✅ Login funktioniert wieder nach 2+ Fehlversuchen
- ✅ CAPTCHA wird nur angezeigt wenn Keys konfiguriert sind
- ✅ Für PoC-Phase ohne CAPTCHA nutzbar
- ✅ Produktiv-ready wenn CAPTCHA-Keys eingetragen werden

Dateidiff unterdrückt, weil mindestens eine Zeile zu lang ist

Datei anzeigen

@@ -618,8 +618,9 @@ def login():
password = request.form.get("password")
captcha_response = request.form.get("g-recaptcha-response")
# CAPTCHA-Prüfung wenn nötig
if attempt_count >= CAPTCHA_AFTER_ATTEMPTS:
# CAPTCHA-Prüfung nur wenn Keys konfiguriert sind
recaptcha_site_key = os.getenv('RECAPTCHA_SITE_KEY')
if attempt_count >= CAPTCHA_AFTER_ATTEMPTS and recaptcha_site_key:
if not captcha_response:
# Timing-Attack Schutz
elapsed = time.time() - start_time
@@ -630,7 +631,7 @@ def login():
show_captcha=True,
error_type="captcha",
attempts_left=max(0, MAX_LOGIN_ATTEMPTS - attempt_count),
recaptcha_site_key=os.getenv('RECAPTCHA_SITE_KEY'))
recaptcha_site_key=recaptcha_site_key)
# CAPTCHA validieren
if not verify_recaptcha(captcha_response):
@@ -643,7 +644,7 @@ def login():
show_captcha=True,
error_type="captcha",
attempts_left=max(0, MAX_LOGIN_ATTEMPTS - attempt_count),
recaptcha_site_key=os.getenv('RECAPTCHA_SITE_KEY'))
recaptcha_site_key=recaptcha_site_key)
# Check gegen beide Admin-Accounts aus .env
admin1_user = os.getenv("ADMIN1_USERNAME")
@@ -685,14 +686,14 @@ def login():
return render_template("login.html",
error=error_message,
show_captcha=(new_attempt_count >= CAPTCHA_AFTER_ATTEMPTS),
show_captcha=(new_attempt_count >= CAPTCHA_AFTER_ATTEMPTS and os.getenv('RECAPTCHA_SITE_KEY')),
error_type="failed",
attempts_left=max(0, MAX_LOGIN_ATTEMPTS - new_attempt_count),
recaptcha_site_key=os.getenv('RECAPTCHA_SITE_KEY'))
# GET Request
return render_template("login.html",
show_captcha=(attempt_count >= CAPTCHA_AFTER_ATTEMPTS),
show_captcha=(attempt_count >= CAPTCHA_AFTER_ATTEMPTS and os.getenv('RECAPTCHA_SITE_KEY')),
attempts_left=max(0, MAX_LOGIN_ATTEMPTS - attempt_count),
recaptcha_site_key=os.getenv('RECAPTCHA_SITE_KEY'))

Datei anzeigen

@@ -100,9 +100,9 @@
<input type="password" class="form-control" id="password" name="password" required>
</div>
{% if show_captcha %}
{% if show_captcha and recaptcha_site_key %}
<div class="mb-3">
<div class="g-recaptcha" data-sitekey="{{ recaptcha_site_key|default('6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI') }}"></div>
<div class="g-recaptcha" data-sitekey="{{ recaptcha_site_key }}"></div>
</div>
{% endif %}
@@ -118,7 +118,7 @@
</div>
</div>
{% if show_captcha %}
{% if show_captcha and recaptcha_site_key %}
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
{% endif %}
</body>