from flask import Blueprint, render_template, request, redirect, url_for, flash, session from flask_login import login_user, login_required, logout_user, current_user from werkzeug.security import generate_password_hash, check_password_hash from sqlalchemy.exc import IntegrityError from web.db import db, User from web.helpers import is_safe_url from core import config auth_bp = Blueprint('auth', __name__) @auth_bp.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form.get('username') password = request.form.get('password') user = User.query.filter_by(username=username).first() if user and check_password_hash(user.password, password): login_user(user) next_page = request.args.get('next') if not next_page or not is_safe_url(next_page): next_page = url_for('project.index') return redirect(next_page) if user and user.is_admin: print(f"⚠️ System: Admin login failed for '{username}'. Password hash mismatch.") flash('Invalid credentials') return render_template('login.html') @auth_bp.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form.get('username') password = request.form.get('password') if User.query.filter_by(username=username).first(): flash('Username exists') return redirect(url_for('auth.register')) new_user = User(username=username, password=generate_password_hash(password, method='pbkdf2:sha256')) if config.ADMIN_USER and username == config.ADMIN_USER: new_user.is_admin = True try: db.session.add(new_user) db.session.commit() login_user(new_user) return redirect(url_for('project.index')) except IntegrityError: db.session.rollback() flash('Username exists') return redirect(url_for('auth.register')) return render_template('register.html') @auth_bp.route('/logout') def logout(): logout_user() return redirect(url_for('auth.login'))