77 lines
2.4 KiB
Python
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")) |