# 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