Files
Hasscall/app/views/auth.py
T

77 lines
2.4 KiB
Python

import functools
from flask import flash
from flask import g
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import url_for
from werkzeug.security import check_password_hash
from werkzeug.security import generate_password_hash
from app import webapp
from app.models.settings import Setting
def login_required(view):
"""View decorator that redirects anonymous users to the login page."""
@functools.wraps(view)
def wrapped_view(**kwargs):
login_required = Setting.get_value(Setting.Keys.HASSCALL_LOGIN_REQUIRED)
if login_required == 'true':
if g.user is None:
flash("You need to be logged in to access that page!", "warning")
return redirect(url_for("login"))
return view(**kwargs)
return wrapped_view
@webapp.before_request
def load_logged_in_user():
"""If a user id is stored in the session, load the user object from
the database into ``g.user``."""
user_id = session.get("user_id")
if user_id is None:
g.user = None
else:
g.user = (
Setting.get_value(Setting.Keys.HASSCALL_USERNAME)
)
@webapp.route("/login", methods=("GET", "POST"))
def login():
"""Log in a registered user by adding the user id to the session."""
if request.method == "GET":
auth_enabled = Setting.get_value(Setting.Keys.HASSCALL_LOGIN_REQUIRED)
if not auth_enabled == 'true':
flash("Authorization is not enabled.", "error")
return redirect(url_for('index'))
elif request.method == "POST":
username = request.form["username"]
password = request.form["password"]
setting_user = Setting.get_value(Setting.Keys.HASSCALL_USERNAME)
setting_password = Setting.get_value(Setting.Keys.HASSCALL_PASSWORD)
if username != setting_user or not check_password_hash(setting_password, password):
flash("Incorrect username or password!", "error")
else:
session.clear()
session["user_id"] = setting_user
flash("Successfully logged in!", 'success')
return redirect(url_for("callbacks"))
return render_template("auth/login.html")
@webapp.route("/logout")
def logout():
"""Clear the current session, including the stored user id."""
session.clear()
flash("Logged out", "success")
return redirect(url_for("index"))