def dologin(request): """Try to authenticate.""" error = None if request.method == "POST": form = forms.LoginForm(request.POST) if form.is_valid(): logger = logging.getLogger('modoboa.auth') user = authenticate(username=form.cleaned_data["username"], password=form.cleaned_data["password"]) if user and user.is_active: login(request, user) if not form.cleaned_data["rememberme"]: request.session.set_expiry(0) translation.activate(request.user.language) request.session[translation.LANGUAGE_SESSION_KEY] = ( request.user.language) logger.info( _("User '%s' successfully logged in") % user.username) signals.user_login.send(sender="dologin", username=form.cleaned_data["username"], password=form.cleaned_data["password"]) return HttpResponseRedirect(find_nextlocation(request, user)) error = _( "Your username and password didn't match. Please try again.") logger.warning( "Failed connection attempt from '%(addr)s' as user '%(user)s'" % { "addr": request.META["REMOTE_ADDR"], "user": form.cleaned_data["username"] }) nextlocation = request.POST.get("next", None) httpcode = 401 else: form = forms.LoginForm() nextlocation = request.GET.get("next", None) httpcode = 200 announcements = signals.get_announcements.send(sender="login", location="loginpage") announcements = [announcement[1] for announcement in announcements] return HttpResponse(render_to_string( "registration/login.html", { "form": form, "error": error, "next": nextlocation, "annoucements": announcements }, request), status=httpcode)
def dologin(request): """Try to authenticate.""" error = None if request.method == "POST": form = forms.LoginForm(request.POST) if form.is_valid(): logger = logging.getLogger("modoboa.auth") user = authenticate(username=form.cleaned_data["username"], password=form.cleaned_data["password"]) if user and user.is_active: if param_tools.get_global_parameter("update_scheme", raise_exception=False): # check if password scheme is correct scheme = param_tools.get_global_parameter( "password_scheme", raise_exception=False) # use SHA512CRYPT as default fallback if scheme is None: pwhash = get_password_hasher('sha512crypt')() else: pwhash = get_password_hasher(scheme)() if not user.password.startswith(pwhash.scheme): logging.info( _("Password scheme mismatch. Updating %s password"), user.username ) user.set_password(form.cleaned_data["password"]) user.save() if pwhash.needs_rehash(user.password): logging.info( _("Password hash parameter missmatch. " "Updating %s password"), user.username ) user.set_password(form.cleaned_data["password"]) user.save() login(request, user) if not form.cleaned_data["rememberme"]: request.session.set_expiry(0) translation.activate(request.user.language) request.session[translation.LANGUAGE_SESSION_KEY] = ( request.user.language) logger.info( _("User '%s' successfully logged in") % user.username ) signals.user_login.send( sender="dologin", username=form.cleaned_data["username"], password=form.cleaned_data["password"]) return HttpResponseRedirect(find_nextlocation(request, user)) error = _( "Your username and password didn't match. Please try again.") logger.warning( "Failed connection attempt from '%(addr)s' as user '%(user)s'" % {"addr": request.META["REMOTE_ADDR"], "user": form.cleaned_data["username"]} ) nextlocation = request.POST.get("next", "") httpcode = 401 else: form = forms.LoginForm() nextlocation = request.GET.get("next", "") httpcode = 200 announcements = signals.get_announcements.send( sender="login", location="loginpage") announcements = [announcement[1] for announcement in announcements] return HttpResponse( render_to_string( "registration/login.html", { "form": form, "error": error, "next": nextlocation, "annoucements": announcements}, request), status=httpcode)