from flask import Blueprint, flash, redirect, render_template, request, session, url_for from sqlalchemy import text from werkzeug.security import check_password_hash from app import db auth_bp = Blueprint("auth", __name__) @auth_bp.route("/", methods=["GET", "POST"]) def index(): if "user_id" in session: return redirect(url_for("menu.menu")) if "login_attempts" not in session: session["login_attempts"] = 0 if request.method == "POST": user_login = request.form.get("login") user_pass = request.form.get("pass") query = text( "SELECT id, pass AS user_pass, nom, prenom FROM login " "WHERE login = :login AND actif = 1" ) result = db.session.execute(query, {"login": user_login}).fetchone() if result and check_password_hash(result.user_pass, user_pass): # Régénération de session : protection contre la fixation de session session.clear() session["user_id"] = result.id session["user_name"] = f"{result.prenom} {result.nom}" session["login_attempts"] = 0 return redirect(url_for("menu.menu")) else: session["login_attempts"] += 1 essais = session["login_attempts"] if essais >= 3: session["login_attempts"] = 0 flash( "Trop de tentatives. Réessayez dans quelques instants.", "danger", ) else: flash( f"Identifiant ou mot de passe incorrect. " f"Il vous reste {3 - essais} essai(s).", "danger", ) return render_template("index.html") @auth_bp.route("/logout") def logout(): session.clear() return redirect(url_for("auth.index"))