From 4e16a85aedbda2c3b629b97891280d111d759220 Mon Sep 17 00:00:00 2001 From: Ken Cochrane Date: Sun, 25 Nov 2012 18:20:56 -0500 Subject: [PATCH] added ipaddress as a param to the user_locked_out signal; also added a signal reciever for user_logged_out so that we can log when the user logs out in the accessLog table. --- axes/decorators.py | 3 ++- axes/signals.py | 28 ++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/axes/decorators.py b/axes/decorators.py index c97199d..2ab3c01 100644 --- a/axes/decorators.py +++ b/axes/decorators.py @@ -298,7 +298,8 @@ def check_request(request, login_unsuccessful): log.warn('AXES: locked out %s after repeated login attempts.' % (ip_address,)) # send signal when someone is locked out. - user_locked_out.send(request=request, username=username) + user_locked_out.send(request=request, username=username, + ip_address=ip_address) # if a trusted login has violated lockout, revoke trust for attempt in [a for a in attempts if a.trusted]: diff --git a/axes/signals.py b/axes/signals.py index 81fb9db..7878961 100644 --- a/axes/signals.py +++ b/axes/signals.py @@ -1,3 +1,27 @@ -from django.dispatch import Signal +from django.dispatch import Signal, receiver +from django.contrib.auth.signals import user_logged_out +from django.core.exceptions import ObjectDoesNotExist +from axes.models import AccessLog -user_locked_out = Signal(providing_args=['request', 'username']) \ No newline at end of file +# django 1.4 has a new timezone aware now() use if available. +try: + from django.utils.timezone import now +except ImportError: + # fall back to none timezone aware now() + from datetime import datetime + now = datetime.now + +user_locked_out = Signal(providing_args=['request', 'username', 'ip_address']) + +@receiver(user_logged_out) +def log_user_lockout(sender, request, user, signal, *args, **kwargs): + """ When a user logs out, update the access log""" + if not user: + return + + access_log = AccessLog.objects.filter(username=user.username, + logout_time__isnull=True).order_by("-attempt_time")[0] + + if access_log: + access_log.logout_time = now() + access_log.save() \ No newline at end of file