mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-01-28 08:03:36 +00:00
81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
"""
|
|
Controller to provide login and logout actions
|
|
"""
|
|
|
|
import cherrypy
|
|
import cfg
|
|
from django import forms
|
|
from gettext import gettext as _
|
|
from plugin_mount import PagePlugin
|
|
import auth
|
|
import util
|
|
|
|
|
|
class LoginForm(forms.Form): # pylint: disable-msg=W0232
|
|
"""Login form"""
|
|
from_page = forms.CharField(widget=forms.HiddenInput(), required=False)
|
|
|
|
username = forms.CharField(label=_('Username'))
|
|
password = forms.CharField(label=_('Passphrase'),
|
|
widget=forms.PasswordInput())
|
|
|
|
def clean(self):
|
|
"""Check for valid credentials"""
|
|
# pylint: disable-msg=E1101
|
|
if 'username' in self._errors or 'password' in self._errors:
|
|
return self.cleaned_data
|
|
|
|
error_msg = auth.check_credentials(self.cleaned_data['username'],
|
|
self.cleaned_data['password'])
|
|
if error_msg:
|
|
raise forms.ValidationError(error_msg, code='invalid_credentials')
|
|
|
|
return self.cleaned_data
|
|
|
|
|
|
class AuthController(PagePlugin):
|
|
"""Login and logout pages"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
PagePlugin.__init__(self, *args, **kwargs)
|
|
|
|
self.register_page('auth')
|
|
|
|
def on_login(self, username):
|
|
"""Called on successful login"""
|
|
|
|
def on_logout(self, username):
|
|
"""Called on logout"""
|
|
|
|
@cherrypy.expose
|
|
def login(self, from_page=cfg.server_dir+"/", **kwargs):
|
|
"""Serve the login page"""
|
|
form = None
|
|
|
|
if kwargs:
|
|
form = LoginForm(kwargs, prefix='auth')
|
|
# pylint: disable-msg=E1101
|
|
if form.is_valid():
|
|
username = form.cleaned_data['username']
|
|
cherrypy.session[cfg.session_key] = username
|
|
cherrypy.request.login = username
|
|
self.on_login(username)
|
|
raise cherrypy.HTTPRedirect(from_page or
|
|
(cfg.server_dir + "/"))
|
|
else:
|
|
form = LoginForm(prefix='auth')
|
|
|
|
return util.render_template(template='form', title=_('Login'),
|
|
form=form, submit_text=_('Login'))
|
|
|
|
@cherrypy.expose
|
|
def logout(self, from_page=cfg.server_dir+"/"):
|
|
sess = cherrypy.session
|
|
username = sess.get(cfg.session_key, None)
|
|
sess[cfg.session_key] = None
|
|
if username:
|
|
cherrypy.request.login = None
|
|
self.on_logout(username)
|
|
|
|
raise cherrypy.HTTPRedirect(from_page or (cfg.server_dir + "/"))
|