|
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 |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
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(): |
|
|
|
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() |
|
|
|
|
|
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')) |
|
|