from flask import Blueprint, request, redirect, url_for, flash, render_template, current_app from flask_login import current_user, login_user, login_required import flask_login from werkzeug.security import check_password_hash, generate_password_hash from datetime import datetime from app.auth.forms import LoginForm, RegisterForm from app.database import User from app import db import ulid bp = Blueprint('auth', __name__, url_prefix='/auth') @bp.route("/login", methods=["GET", "POST"]) def login(): if current_user.is_authenticated: flash("You are already logged in") return redirect(url_for("meta.home")) form = LoginForm(request.form) if request.method == 'POST' and form.validate(): email = request.form.get('username') password = request.form.get('password') u = User.query.filter_by(email=email).first() if u is not None: if check_password_hash(u.password, password): if u.active: login_user(u) u.last_login = datetime.now() db.session.commit() flash("Logged in successfully") return redirect(url_for("meta.home")) else: flash("User is inactive. Contact an administrator") else: flash("Incorrect password") else: flash("Incorrect username") return render_template("login.html", form=form) @bp.route("/register", methods=["GET", "POST"]) def register(): if current_user.is_authenticated: flash("You are already logged in") return redirect(url_for("meta.home")) form = RegisterForm(request.form) if request.method == 'POST' and form.validate(): email = request.form.get("username") pref_name = request.form.get("pref_name") password = request.form.get("password") pw_confirm = request.form.get("password_confirm") if password == pw_confirm: # Passwords match user = User( id=str(ulid.ulid()), email=email, password=generate_password_hash(password), pref_name=pref_name, last_login=datetime.now(), active=True ) db.session.add(user) db.session.commit() flask_login.login_user(user) return redirect(url_for('meta.home')) else: flash("Passwords do not match") return render_template("register.html", form=form) @bp.route("/logout") @login_required def logout(): flask_login.logout_user() return redirect("/") @bp.route("/profile") @login_required def profile(): debug = current_app.config['DEBUG'] peers = current_user.peers networks = current_user.networks return render_template("profile.html", debug=debug, peers=peers, nets=networks)