from flask import Blueprint, render_template, redirect, url_for, request from flask_login import login_user, logout_user, login_required, current_user from sqlalchemy.exc import IntegrityError from models import db, User from utils import get_client_ip from models import RegistrationForm, LoginForm, PasswordField, RecaptchaField, SubmitField from flask_bcrypt import Bcrypt from wtforms.validators import DataRequired, Length, EqualTo auth_bp = Blueprint('auth', __name__) bcrypt = Bcrypt() password = PasswordField('Password', validators=[DataRequired(), Length(min=6)]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) recaptcha = RecaptchaField() submit = SubmitField('Register') @auth_bp.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8') ip_address = get_client_ip() existing_user = User.query.filter_by(ip_address=ip_address).first() if existing_user: return render_template('register.html', form=form) username = form.username.data.lower() user = User(username=username, encrypted_password=hashed_password, ip_address=ip_address) try: db.session.add(user) db.session.commit() return redirect(url_for('auth.login')) except IntegrityError: db.session.rollback() return render_template('register.html', form=form) @auth_bp.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.username.data).first() if user and user.check_password(form.password.data): login_user(user) if user.ip_address is None: ip_address = get_client_ip() user.ip_address = ip_address db.session.commit() return redirect(url_for('profile', username=user.username)) return render_template('login.html', form=form) @auth_bp.route('/logout') def logout(): logout_user() return redirect(url_for('index'))