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)