canaille-globuzma/oidc_ldap_bridge/account.py

73 lines
2.1 KiB
Python
Raw Normal View History

2020-10-20 09:44:45 +00:00
from flask import Blueprint, request, flash, url_for, current_app
from flask import render_template, redirect
2020-08-19 14:20:57 +00:00
from flask_babel import gettext
2020-10-20 09:44:45 +00:00
from .forms import LoginForm, ProfileForm
from .flaskutils import current_user, user_needed
2020-08-19 14:20:57 +00:00
from .models import User
2020-08-14 11:18:08 +00:00
2020-08-16 17:39:14 +00:00
bp = Blueprint(__name__, "home")
2020-08-14 11:18:08 +00:00
2020-08-19 14:20:57 +00:00
@bp.route("/")
def index():
if not current_user():
2020-10-19 12:30:43 +00:00
return redirect(url_for("oidc_ldap_bridge.account.login"))
2020-10-20 09:44:45 +00:00
return redirect(url_for("oidc_ldap_bridge.account.profile"))
2020-08-19 14:20:57 +00:00
@bp.route("/login", methods=("GET", "POST"))
def login():
form = LoginForm(request.form or None)
2020-08-14 13:26:14 +00:00
2020-08-19 14:20:57 +00:00
if request.form:
2020-08-21 08:23:39 +00:00
if not form.validate() or not User.authenticate(
form.login.data, form.password.data, True
):
2020-08-19 14:20:57 +00:00
flash(gettext("Login failed, please check your information"), "error")
return render_template("login.html", form=form)
2020-08-17 07:45:35 +00:00
2020-10-19 12:30:43 +00:00
return redirect(url_for("oidc_ldap_bridge.account.index"))
2020-08-17 07:45:35 +00:00
2020-08-19 14:20:57 +00:00
return render_template("login.html", form=form)
2020-08-14 11:18:08 +00:00
2020-08-16 17:39:14 +00:00
@bp.route("/logout")
2020-08-14 13:26:14 +00:00
def logout():
2020-08-21 08:23:39 +00:00
if current_user():
current_user().logout()
2020-08-16 17:39:14 +00:00
return redirect("/")
2020-10-20 09:44:45 +00:00
@bp.route("/profile", methods=("GET", "POST"))
@user_needed()
def profile(user):
claims = current_app.config["JWT"]["MAPPING"]
data = {
k.lower(): getattr(user, v)[0]
if getattr(user, v) and isinstance(getattr(user, v), list)
else getattr(user, v) or ""
for k, v in claims.items()
}
form = ProfileForm(request.form or None, data=data)
2020-10-21 08:26:31 +00:00
2020-10-20 09:44:45 +00:00
if request.form:
if not form.validate():
flash(gettext("Profile edition failed."), "error")
else:
for attribute in form:
model_attribute_name = claims.get(attribute.name.upper())
if not model_attribute_name or not hasattr(user, model_attribute_name):
continue
user[model_attribute_name] = [attribute.data]
2020-10-21 08:26:31 +00:00
if not form.password1.data or user.set_password(form.password1.data):
flash(gettext("Profile updated successfuly."), "success")
2020-10-20 09:44:45 +00:00
user.save()
2020-10-21 10:14:35 +00:00
return render_template("profile.html", form=form, menuitem="profile")