1- """
1+ '''
22ACFC - Application de Gestion d'Entreprise
33===========================================
44
1717
1818Auteur : ACFC Development Team
1919Version : 1.0
20- """
20+ '''
2121
2222from flask import Flask , Response , render_template , request , Blueprint , session
2323from flask_session import Session
2626from werkzeug .exceptions import HTTPException
2727from services import PasswordService , SecureSessionService
2828from modeles import SessionBdD , User
29+ #TODO: modifier les systèmes de logs
30+ import logging
31+ import sys
32+
33+ logging .basicConfig (
34+ level = logging .DEBUG ,
35+ format = "%(asctime)s [%(levelname)s] %(message)s" ,
36+ handlers = [
37+ logging .StreamHandler (sys .stdout ) # Écrit dans stdout
38+ ]
39+ )
40+
41+ logging .debug ("Ceci est un message de débogage" )
42+ logging .info ("Ceci est un message d'information" )
43+ logging .error ("Ceci est un message d'erreur" )
2944
3045# Création de l'instance Flask principale avec configuration des dossiers statiques et templates
3146acfc = Flask (__name__ ,
96111
97112# Messages d'erreur standardisés pour l'authentification
98113INVALID : str = 'Identifiants invalides.'
114+ WRONG_ROAD : str = 'Méthode non autorisée ou droits insuffisants.'
99115
100116# Instance du service de gestion des mots de passe (hachage Argon2)
101117ph_acfc = PasswordService ()
106122
107123@acfc .before_request
108124def before_request () -> str | None :
109- """
125+ '''
110126 Middleware exécuté avant chaque requête.
111127
112128 Vérifie l'état de la session utilisateur et redirige vers la page de connexion
113129 si aucune session active n'est détectée.
114130
115131 Returns:
116132 str | None: Template de connexion si pas de session, None sinon
117- """
118- if not session :
133+ '''
134+ if 'user_id' not in session and request . endpoint != 'login' :
119135 return render_template (LOGIN ['page' ], title = LOGIN ['title' ], context = LOGIN ['context' ])
120136
121137@acfc .after_request
@@ -182,27 +198,33 @@ def _apply_successful_login(user: User) -> None:
182198 """
183199 session .clear ()
184200 session ['user_id' ] = user .id
185- session ['username' ] = user .username
201+ session ['pseudo' ] = user .pseudo
202+ session ['last_name' ] = user .nom
203+ session ['first_name' ] = user .prenom
186204 session ['email' ] = user .email
187- session ['role' ] = user .role
188205 user .nb_errors = 0 # Remise à zéro du compteur d'erreurs
189206
190207 # === TRAITEMENT GET : Affichage du formulaire de connexion ===
191208 if request .method == 'GET' :
209+ logging .debug ("GET request for login" )
192210 return _render_login ()
193211 elif request .method != 'POST' :
194- return render_template (BASE , title = LOGIN ['title' ], context = '400' )
212+ logging .warning ("Invalid request method" )
213+ return render_template (BASE , title = LOGIN ['title' ], context = '400' , message = WRONG_ROAD )
195214
196215 # === TRAITEMENT POST : Validation des identifiants ===
197216 username , password = _get_credentials ()
217+ logging .debug (f"Attempting login for user: { username } " )
198218 db_session = SessionBdD ()
199- user = db_session .query (User ).filter_by (username = username ).first ()
219+ user = db_session .query (User ).filter_by (pseudo = username ).first ()
220+ logging .debug (f"User found: { user is not None } " )
200221
201222 # Vérification de l'existence de l'utilisateur
202223 if not user :
203- return render_template (BASE , title = LOGIN ['title' ], context = LOGIN ['context' ], message = INVALID )
224+ logging .warning ("User not found" )
225+ return render_template (LOGIN ['page' ], title = LOGIN ['title' ], context = LOGIN ['context' ], message = INVALID )
204226
205- # Vérification du mot de passe avec Argon2
227+ # Vérification du mot de passe avec Argon2... si mot de passe faux
206228 if not ph_acfc .verify_password (password , user .sha_mdp ):
207229 user .nb_errors += 1 # Incrémentation du compteur d'erreurs (sécurité)
208230 try :
@@ -218,12 +240,20 @@ def _apply_successful_login(user: User) -> None:
218240 db_session .commit ()
219241 except Exception as e :
220242 db_session .rollback ()
221- return render_template (BASE , title = LOGIN ['title' ], context = '500' , message = str (e ))
243+ return render_template (LOGIN [ 'page' ] , title = LOGIN ['title' ], context = '500' , message = str (e ))
222244
223- # TODO: Vérification de la nécessité de changement de mot de passe
224- # Note: Fonctionnalité de sécurité pour forcer le renouvellement des mots de passe
245+ # Vérification de la nécessité de re-hashage de mot de passe
246+ if ph_acfc .needs_rehash (user .sha_mdp ):
247+ user .sha_mdp = ph_acfc .hash_password (password )
248+ try :
249+ db_session .commit ()
250+ except Exception as e :
251+ db_session .rollback ()
252+ return render_template (LOGIN ['page' ], title = LOGIN ['title' ], context = '500' , message = str (e ))
253+
254+ # Fonctionnalité de sécurité pour forcer le renouvellement des mots de passe
225255 if user .is_chg_mdp :
226- return render_template (BASE , title = LOGIN ['title' ], context = 'change_password' ,
256+ return render_template (LOGIN [ 'page' ] , title = LOGIN ['title' ], context = 'change_password' ,
227257 message = "Veuillez changer votre mot de passe." )
228258
229259 # Redirection vers la page d'accueil (module Clients)
@@ -245,20 +275,20 @@ def users() -> Any:
245275 Returns:
246276 Any: Template de gestion des utilisateurs ou message d'erreur
247277
248- Note :
278+ TODO :
249279 Fonctionnalité en développement - nécessite l'implémentation complète
250280 de la logique de gestion des utilisateurs et des contrôles d'autorisation.
251281 """
252282 # Traitement de la création/modification d'utilisateur
253283 if request .method == 'POST' :
254- # Note : Logique de création d'utilisateur à implémenter
284+ # TODO : Logique de création d'utilisateur à implémenter
255285 # Devra inclure: validation des données, hashage du mot de passe,
256286 # vérification des autorisations, sauvegarde en base
257287 pass
258288
259289 # Traitement de l'affichage de la liste des utilisateurs
260290 elif request .method == 'GET' :
261- # Note : Récupération et affichage de la liste des utilisateurs
291+ # TODO : Récupération et affichage de la liste des utilisateurs
262292 # Devra inclure: pagination, filtrage, contrôle des autorisations
263293 return render_template (BASE , title = 'ACFC - Gestion Utilisateurs' , context = 'users' )
264294 else :
0 commit comments