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"))