Mailix / decorators.py
ernestmindres's picture
Update decorators.py
e5e7de9 verified
# decorators.py
from functools import wraps
from flask import session, redirect, url_for, flash, request, jsonify
# Import nécessaire pour le décorateur API (Importation paresseuse pour éviter les problèmes d'importation circulaire)
# Assurez-vous que ce module contient bien les fonctions get_client_user_by_uuid et get_client_user_by_api_key.
import auth_backend
def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if session.get('user_id') is None:
flash("Vous devez être connecté pour accéder à cette page.", "error")
# REDIRECTION VERS LA ROUTE DE CONNEXION DU BACKEND
return redirect(url_for('web_bp.connexion_page'))
return f(*args, **kwargs)
return decorated_function
def api_key_required(f):
"""
Décorateur pour les routes d'API nécessitant une clé API valide (pour les clients externes).
... (Reste inchangé)
"""
@wraps(f)
def decorated_function(*args, **kwargs):
# 1. Récupérer la clé depuis l'en-tête ou les paramètres de requête
api_key = request.headers.get('X-API-Key')
if not api_key:
api_key = request.args.get('api_key')
if not api_key:
return jsonify({
"message": "Authentification requise. Clé API manquante dans l'en-tête X-API-Key ou le paramètre api_key.",
"status": "Unauthorized"
}), 401
# 2. Valider la clé et récupérer l'utilisateur principal
client_user = auth_backend.get_client_user_by_api_key(api_key)
if not client_user:
return jsonify({
"message": "Clé API invalide ou non reconnue.",
"status": "Forbidden"
}), 403
# 3. Injecter les données de l'utilisateur principal (le client)
kwargs['client_user'] = client_user
return f(*args, **kwargs)
return decorated_function
# NOUVEAU DÉCORATEUR : Pour les routes d'API qui doivent utiliser l'authentification par session
def api_session_required(f):
"""
Décorateur pour les routes d'API nécessitant une session utilisateur active (Web UI via session cookie).
Récupère l'ID utilisateur de la session et injecte les données de l'utilisateur dans la fonction.
"""
@wraps(f)
def decorated_function(*args, **kwargs):
# 1. Récupérer l'ID utilisateur de la session
user_uuid = session.get('user_id')
if not user_uuid:
# Si l'ID est manquant, on renvoie une réponse JSON 401 (standard pour une API).
return jsonify({
"message": "Authentification par session requise. Utilisateur non connecté.",
"status": "Unauthorized"
}), 401
# 2. Récupérer l'utilisateur principal (client) à partir de son UUID
# On utilise le UUID stocké dans la session
client_user = auth_backend.get_client_user_by_uuid(user_uuid)
if not client_user:
# L'utilisateur existe en session mais pas/plus dans la base.
session.pop('user_id', None) # Vider la session
return jsonify({
"message": "Session invalide ou utilisateur non reconnu.",
"status": "Forbidden"
}), 403
# 3. Injecter les données de l'utilisateur principal (le client)
kwargs['client_user'] = client_user
return f(*args, **kwargs)
return decorated_function