diff --git a/backend/app/app.py b/backend/app/app.py index 6004d715..eab44337 100644 --- a/backend/app/app.py +++ b/backend/app/app.py @@ -306,26 +306,62 @@ def login(): error = None if request.method == "POST": - # Unterscheiden zwischen JSON-Anfragen und normalen Formular-Anfragen - is_json_request = request.is_json or request.headers.get('Content-Type') == 'application/json' + # Debug-Logging für Request-Details + auth_logger.debug(f"Login-Request: Content-Type={request.content_type}, Headers={dict(request.headers)}") - # Daten je nach Anfrageart auslesen - if is_json_request: - data = request.get_json() - username = data.get("username") or data.get("email") # Fallback für email - password = data.get("password") - remember_me = data.get("remember_me", False) - else: - # Korrigierte Feldnamen - Template verwendet "email" nicht "username" - username = request.form.get("email") # Geändert von "username" zu "email" - password = request.form.get("password") - remember_me = request.form.get("remember_me") == "on" # Geändert von "remember-me" + # Erweiterte Content-Type-Erkennung für AJAX-Anfragen + content_type = request.content_type or "" + is_json_request = ( + request.is_json or + "application/json" in content_type or + request.headers.get('X-Requested-With') == 'XMLHttpRequest' or + request.headers.get('Accept', '').startswith('application/json') + ) + + # Robuste Datenextraktion + username = None + password = None + remember_me = False + + try: + if is_json_request: + # JSON-Request verarbeiten + try: + data = request.get_json(force=True) or {} + username = data.get("username") or data.get("email") + password = data.get("password") + remember_me = data.get("remember_me", False) + except Exception as json_error: + auth_logger.warning(f"JSON-Parsing fehlgeschlagen: {str(json_error)}") + # Fallback zu Form-Daten + username = request.form.get("email") + password = request.form.get("password") + remember_me = request.form.get("remember_me") == "on" + else: + # Form-Request verarbeiten + username = request.form.get("email") + password = request.form.get("password") + remember_me = request.form.get("remember_me") == "on" + + # Zusätzlicher Fallback für verschiedene Feldnamen + if not username: + username = request.form.get("username") or request.values.get("email") or request.values.get("username") + if not password: + password = request.form.get("password") or request.values.get("password") + + except Exception as extract_error: + auth_logger.error(f"Fehler beim Extrahieren der Login-Daten: {str(extract_error)}") + error = "Fehler beim Verarbeiten der Anmeldedaten." + if is_json_request: + return jsonify({"error": error, "success": False}), 400 if not username or not password: - error = "Benutzername und Passwort müssen angegeben werden." + error = "E-Mail-Adresse und Passwort müssen angegeben werden." + auth_logger.warning(f"Unvollständige Login-Daten: username={bool(username)}, password={bool(password)}") if is_json_request: - return jsonify({"error": error}), 400 + return jsonify({"error": error, "success": False}), 400 else: + db_session = None try: db_session = get_db_session() # Suche nach Benutzer mit übereinstimmendem Benutzernamen oder E-Mail @@ -339,30 +375,39 @@ def login(): db_session.commit() login_user(user, remember=remember_me) - auth_logger.info(f"Benutzer {username} hat sich angemeldet") + auth_logger.info(f"Benutzer {username} hat sich erfolgreich angemeldet") next_page = request.args.get("next") - db_session.close() if is_json_request: - return jsonify({"success": True, "redirect_url": next_page or url_for("index")}) + return jsonify({ + "success": True, + "message": "Anmeldung erfolgreich", + "redirect_url": next_page or url_for("index") + }) else: if next_page: return redirect(next_page) return redirect(url_for("index")) else: - error = "Ungültiger Benutzername oder Passwort." + error = "Ungültige E-Mail-Adresse oder Passwort." auth_logger.warning(f"Fehlgeschlagener Login-Versuch für Benutzer {username}") - db_session.close() if is_json_request: - return jsonify({"error": error}), 401 + return jsonify({"error": error, "success": False}), 401 except Exception as e: # Fehlerbehandlung für Datenbankprobleme error = "Anmeldefehler. Bitte versuchen Sie es später erneut." auth_logger.error(f"Fehler bei der Anmeldung: {str(e)}") if is_json_request: - return jsonify({"error": error}), 500 + return jsonify({"error": error, "success": False}), 500 + finally: + # Sicherstellen, dass die Datenbankverbindung geschlossen wird + if db_session: + try: + db_session.close() + except Exception as close_error: + auth_logger.error(f"Fehler beim Schließen der DB-Session: {str(close_error)}") return render_template("login.html", error=error) diff --git a/backend/app/database/myp.db b/backend/app/database/myp.db index 7a498da4..348f4353 100644 Binary files a/backend/app/database/myp.db and b/backend/app/database/myp.db differ diff --git a/backend/app/database/myp.db-shm b/backend/app/database/myp.db-shm index 6ce06244..0ddbc85d 100644 Binary files a/backend/app/database/myp.db-shm and b/backend/app/database/myp.db-shm differ diff --git a/backend/app/database/myp.db-wal b/backend/app/database/myp.db-wal index e69de29b..020ad648 100644 Binary files a/backend/app/database/myp.db-wal and b/backend/app/database/myp.db-wal differ