byceps/blueprints/admin/authn/login/views.py
"""
byceps.blueprints.admin.authn.login.views
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Copyright: 2014-2024 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""
from flask import g, request
from flask_babel import gettext
from byceps.services.user import user_service
from byceps.signals import authn as authn_signals
from byceps.util.framework.blueprint import create_blueprint
from byceps.util.framework.flash import flash_notice, flash_success
from byceps.util.framework.templating import templated
from byceps.util.views import redirect_to
from . import service
from .forms import LogInForm
blueprint = create_blueprint('authn_login_admin', __name__)
class AuthorizationFailed:
pass
@blueprint.get('/log_in')
@templated
def log_in_form(erroneous_form=None):
"""Show form to log in."""
if g.user.authenticated:
flash_notice(
gettext(
'You are already logged in as "%(screen_name)s".',
screen_name=g.user.screen_name,
)
)
return redirect_to('core_admin.homepage')
form = erroneous_form if erroneous_form else LogInForm()
users_exist = user_service.do_users_exist()
return {
'form': form,
'users_exist': users_exist,
}
@blueprint.post('/log_in')
def log_in():
"""Allow the user to authenticate with e-mail address and password."""
if g.user.authenticated:
return redirect_to('core_admin.homepage')
form = LogInForm(request.form)
if not form.validate():
return log_in_form(form)
username = form.username.data.strip()
password = form.password.data
permanent = form.permanent.data
log_in_result = service.log_in_user(
username, password, permanent, ip_address=request.remote_addr
)
if log_in_result.is_err():
form.form_errors.append(gettext('Login failed.'))
return log_in_form(form)
user, logged_in_event = log_in_result.unwrap()
flash_success(
gettext(
'Successfully logged in as %(screen_name)s.',
screen_name=user.screen_name,
)
)
authn_signals.user_logged_in.send(None, event=logged_in_event)
return redirect_to('core_admin.homepage')
@blueprint.get('/log_out')
@templated
def log_out_form():
"""Show form to log out."""
if not g.user.authenticated:
return redirect_to('core_admin.homepage')
@blueprint.post('/log_out')
def log_out():
"""Log out user by deleting the corresponding cookie."""
service.log_out_user(g.user)
flash_success(gettext('Successfully logged out.'))
return redirect_to('.log_in_form')