Skip to content

Commit a9db200

Browse files
committed
feat: Ajout de la gestion des logs, mise à jour des modèles et amélioration de la gestion des mots de passe
1 parent 73afa77 commit a9db200

11 files changed

Lines changed: 142 additions & 68 deletions

File tree

app_acfc/application.py

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""
1+
'''
22
ACFC - Application de Gestion d'Entreprise
33
===========================================
44
@@ -17,7 +17,7 @@
1717
1818
Auteur : ACFC Development Team
1919
Version : 1.0
20-
"""
20+
'''
2121

2222
from flask import Flask, Response, render_template, request, Blueprint, session
2323
from flask_session import Session
@@ -26,6 +26,21 @@
2626
from werkzeug.exceptions import HTTPException
2727
from services import PasswordService, SecureSessionService
2828
from 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
3146
acfc = Flask(__name__,
@@ -96,6 +111,7 @@
96111

97112
# Messages d'erreur standardisés pour l'authentification
98113
INVALID: 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)
101117
ph_acfc = PasswordService()
@@ -106,16 +122,16 @@
106122

107123
@acfc.before_request
108124
def 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:

app_acfc/dockerfile.app

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ WORKDIR /app
3333
# Copie du fichier de dépendances en premier pour optimiser le cache Docker
3434
# Si requirements-app.txt ne change pas, cette couche sera réutilisée
3535
COPY requirements-app.txt /app/requirements.txt
36+
COPY .env /app/.env
3637

3738
# Installation des dépendances Python avec optimisations
3839
# --no-cache-dir : Évite le stockage du cache pip (réduit la taille de l'image)

0 commit comments

Comments
 (0)