from flask import Blueprint, render_template, redirect, url_for, flash, request from flask_login import login_user, logout_user, current_user, login_required from werkzeug.security import check_password_hash from app import db from models import User from forms import LoginForm, RegistrationForm import logging # Set up logger logger = logging.getLogger(__name__) # Create blueprint auth_bp = Blueprint('auth', __name__, url_prefix='/auth') @auth_bp.route('/login', methods=['GET', 'POST']) def login(): if current_user.is_authenticated: return redirect(url_for('forum.index')) form = LoginForm() if form.validate_on_submit(): # Check if login is email or username if '@' in form.username.data: user = User.query.filter_by(email=form.username.data).first() else: user = User.query.filter_by(username=form.username.data).first() if user is None or not user.check_password(form.password.data): flash('Invalid username or password', 'danger') return render_template('auth/login.html', form=form) if user.is_banned: flash('Your account has been banned. Reason: ' + (user.ban_reason or 'Not specified'), 'danger') return render_template('auth/login.html', form=form) login_user(user, remember=form.remember_me.data) user.update_last_seen() # Redirect to the page user tried to access next_page = request.args.get('next') if not next_page or not next_page.startswith('/'): next_page = url_for('forum.index') flash('You have been logged in successfully!', 'success') return redirect(next_page) return render_template('auth/login.html', form=form) @auth_bp.route('/register', methods=['GET', 'POST']) def register(): if current_user.is_authenticated: return redirect(url_for('forum.index')) form = RegistrationForm() if form.validate_on_submit(): user = User( username=form.username.data, email=form.email.data ) user.set_password(form.password.data) try: db.session.add(user) db.session.commit() flash('Registration successful! You can now login.', 'success') return redirect(url_for('auth.login')) except Exception as e: logger.error(f"Registration error: {str(e)}") db.session.rollback() flash('An error occurred during registration. Please try again.', 'danger') return render_template('auth/register.html', form=form) @auth_bp.route('/logout') @login_required def logout(): logout_user() flash('You have been logged out.', 'info') return redirect(url_for('forum.index'))