""" Authentication Blueprint Handles user registration, login, and logout """ from flask import Blueprint, render_template, redirect, url_for, request, flash from flask_login import login_user, logout_user, login_required, current_user from models import db, User import logging logger = logging.getLogger(__name__) auth_bp = Blueprint('auth', __name__) @auth_bp.route('/register', methods=['GET', 'POST']) def register(): """User registration page.""" logger.info("--- AUTH/REGISTER: Accesso alla pagina di registrazione.") if current_user.is_authenticated: return redirect(url_for('chat.chat_interface')) if request.method == 'POST': logger.info("--- AUTH/REGISTER: Ricevuto POST per la registrazione.") username = request.form.get('username', '').strip() email = request.form.get('email', '').strip() password = request.form.get('password', '') password_confirm = request.form.get('password_confirm', '') # Validation errors = [] if not username or len(username) < 3: errors.append('Username must be at least 3 characters long.') if not email or '@' not in email: errors.append('Please enter a valid email address.') if not password or len(password) < 6: errors.append('Password must be at least 6 characters long.') if password != password_confirm: errors.append('Passwords do not match.') # Check if user already exists try: logger.info(f"--- AUTH/REGISTER: Controllo se l'utente '{username}' esiste...") if User.query.filter_by(username=username).first(): errors.append('Username already exists.') logger.warning(f"--- AUTH/REGISTER: L'utente '{username}' esiste già.") logger.info(f"--- AUTH/REGISTER: Controllo se l'email '{email}' esiste...") if User.query.filter_by(email=email).first(): errors.append('Email already registered.') logger.warning(f"--- AUTH/REGISTER: L'email '{email}' esiste già.") except Exception as e: logger.error(f"--- AUTH/REGISTER: ERRORE DB durante il controllo utente: {e}", exc_info=True) flash('An error occurred checking user data. Please try again.', 'danger') return render_template('register.html', username=username, email=email) if errors: for error in errors: flash(error, 'danger') return render_template('register.html', username=username, email=email) # Create new user try: logger.info(f"--- AUTH/REGISTER: Creazione nuovo utente: {username}") user = User(username=username, email=email) user.set_password(password) db.session.add(user) db.session.commit() logger.info(f"--- AUTH/REGISTER: Utente {username} salvato nel DB.") flash('Registration successful! Please log in.', 'success') return redirect(url_for('auth.login')) except Exception as e: db.session.rollback() logger.error(f"Error during registration: {e}", exc_info=True) flash('An error occurred during registration. Please try again.', 'danger') return render_template('register.html') @auth_bp.route('/login', methods=['GET', 'POST']) def login(): """User login page.""" logger.info(f"--- AUTH/LOGIN: Accesso alla pagina di login (Metodo: {request.method}).") if current_user.is_authenticated: logger.info("--- AUTH/LOGIN: Utente già autenticato, redirect alla chat.") return redirect(url_for('chat.chat_interface')) if request.method == 'POST': logger.info("--- AUTH/LOGIN: Ricevuto POST per il login.") username = request.form.get('username', '').strip() password = request.form.get('password', '') remember = request.form.get('remember', False) == 'on' if not username or not password: logger.warning("--- AUTH/LOGIN: Username o password vuoti.") flash('Please enter both username and password.', 'warning') return render_template('login.html', username=username) # Find user user = None try: logger.info(f"--- AUTH/LOGIN: Ricerca utente '{username}' nel DB...") user = User.query.filter_by(username=username).first() except Exception as e: logger.error(f"--- AUTH/LOGIN: ERRORE DB durante la ricerca utente: {e}", exc_info=True) flash('An error occurred during login. Please try again.', 'danger') return render_template('login.html', username=username) if user: logger.info(f"--- AUTH/LOGIN: Utente '{username}' trovato. Controllo password...") if user.check_password(password): logger.info(f"--- AUTH/LOGIN: Password CORRETTA. Chiamata a login_user() per '{username}'.") # Chiamata a Flask-Login login_user(user, remember=remember) # AGGIUNGI QUESTA RIGA QUI from flask import session logger.info(f"--- AUTH/LOGIN: login_user() completata. _user_id nella sessione: {session.get('_user_id')}") logger.info(f"--- AUTH/LOGIN: Funzione login_user() completata. Reindirizzamento alla chat...") # Redirect alla chat (o alla pagina 'next') next_page = request.args.get('next') if next_page and next_page.startswith('/'): return redirect(next_page) return redirect(url_for('chat.chat_interface')) else: logger.warning(f"--- AUTH/LOGIN: Password ERRATA per l'utente '{username}'.") flash('Invalid username or password.', 'danger') return render_template('login.html', username=username) else: logger.warning(f"--- AUTH/LOGIN: Utente '{username}' NON TROVATO nel DB.") flash('Invalid username or password.', 'danger') return render_template('login.html', username=username) return render_template('login.html') @auth_bp.route('/logout') @login_required def logout(): """User logout.""" username = current_user.username logout_user() logger.info(f"--- AUTH/LOGOUT: Utente {username} disconnesso.") flash('You have been logged out successfully.', 'info') return redirect(url_for('auth.login'))