remove audit's LoginAttempt
This commit is contained in:
parent
e86cae6cac
commit
1a1005f80d
|
@ -75,43 +75,3 @@ class AuditEntry(UUIDModel):
|
||||||
|
|
||||||
verbose_name = _('Audit Entry')
|
verbose_name = _('Audit Entry')
|
||||||
verbose_name_plural = _('Audit Entries')
|
verbose_name_plural = _('Audit Entries')
|
||||||
|
|
||||||
|
|
||||||
class LoginAttempt(CreatedUpdatedModel):
|
|
||||||
"""Track failed login-attempts"""
|
|
||||||
|
|
||||||
target_uid = models.CharField(max_length=254)
|
|
||||||
request_ip = models.GenericIPAddressField()
|
|
||||||
attempts = models.IntegerField(default=1)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def attempt(target_uid, request):
|
|
||||||
"""Helper function to create attempt or count up existing one"""
|
|
||||||
if not target_uid:
|
|
||||||
return
|
|
||||||
client_ip, _ = get_client_ip(request)
|
|
||||||
# Since we can only use 254 chars for target_uid, truncate target_uid.
|
|
||||||
target_uid = target_uid[:254]
|
|
||||||
time_threshold = timezone.now() - timedelta(minutes=10)
|
|
||||||
existing_attempts = LoginAttempt.objects.filter(
|
|
||||||
target_uid=target_uid,
|
|
||||||
request_ip=client_ip,
|
|
||||||
last_updated__gt=time_threshold).order_by('created')
|
|
||||||
if existing_attempts.exists():
|
|
||||||
attempt = existing_attempts.first()
|
|
||||||
attempt.attempts += 1
|
|
||||||
attempt.save()
|
|
||||||
LOGGER.debug("Increased attempts on %s", attempt)
|
|
||||||
else:
|
|
||||||
attempt = LoginAttempt.objects.create(
|
|
||||||
target_uid=target_uid,
|
|
||||||
request_ip=client_ip)
|
|
||||||
LOGGER.debug("Created new attempt %s", attempt)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return "LoginAttempt to %s from %s (x%d)" % (self.target_uid,
|
|
||||||
self.request_ip, self.attempts)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
|
|
||||||
unique_together = (('target_uid', 'request_ip', 'created'),)
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
"""passbook audit signal listener"""
|
"""passbook audit signal listener"""
|
||||||
from django.contrib.auth.signals import (user_logged_in, user_logged_out,
|
from django.contrib.auth.signals import user_logged_in, user_logged_out
|
||||||
user_login_failed)
|
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
|
|
||||||
from passbook.audit.models import AuditEntry, LoginAttempt
|
from passbook.audit.models import AuditEntry
|
||||||
from passbook.core.signals import (invitation_created, invitation_used,
|
from passbook.core.signals import (invitation_created, invitation_used,
|
||||||
user_signed_up)
|
user_signed_up)
|
||||||
|
|
||||||
|
@ -34,8 +33,3 @@ def on_invitation_used(sender, request, invitation, **kwargs):
|
||||||
"""Log Invitation usage"""
|
"""Log Invitation usage"""
|
||||||
AuditEntry.create(AuditEntry.ACTION_INVITE_USED, request,
|
AuditEntry.create(AuditEntry.ACTION_INVITE_USED, request,
|
||||||
invitation_uuid=invitation.uuid.hex)
|
invitation_uuid=invitation.uuid.hex)
|
||||||
|
|
||||||
@receiver(user_login_failed)
|
|
||||||
def on_user_login_failed(sender, request, credentials, **kwargs):
|
|
||||||
"""Log failed login attempt"""
|
|
||||||
LoginAttempt.attempt(target_uid=credentials.get('username'), request=request)
|
|
||||||
|
|
Reference in New Issue