Update README further and make another adjustment to the tests

This commit is contained in:
djmore4 2022-10-12 17:33:33 -04:00 committed by Ken Cochrane
parent 1bf9d6e7d1
commit 717d44aa7d
2 changed files with 16 additions and 5 deletions

View file

@ -446,7 +446,9 @@ There's sample ``BasicAuthenticationDefender`` class based on ``djangorestframew
"Your account is locked for {cooloff_time_seconds} seconds" \ "Your account is locked for {cooloff_time_seconds} seconds" \
"".format( "".format(
failure_limit=config.FAILURE_LIMIT, failure_limit=config.FAILURE_LIMIT,
cooloff_time_seconds=config.LOCKOUT_COOLOFF_TIME cooloff_time_seconds=config.LOCKOUT_COOLOFF_TIME[
defender_utils.get_lockout_cooloff_time(username=self.get_username_from_request(request))
]
) )
raise exceptions.AuthenticationFailed(_(detail)) raise exceptions.AuthenticationFailed(_(detail))
@ -532,7 +534,7 @@ Below is a sample ``BasicAuthenticationDefender`` class based on ``rest_framewor
detail = "You have attempted to login {failure_limit} times with no success. " detail = "You have attempted to login {failure_limit} times with no success. "
.format( .format(
failure_limit=config.FAILURE_LIMIT, failure_limit=config.FAILURE_LIMIT,
cooloff_time_seconds=config.LOCKOUT_COOLOFF_TIME cooloff_time_seconds=config.LOCKOUT_COOLOFF_TIME[defender_utils.get_lockout_cooloff_time(username=userid)]
) )
raise exceptions.AuthenticationFailed(_(detail)) raise exceptions.AuthenticationFailed(_(detail))

View file

@ -3,15 +3,16 @@ import string
import time import time
from unittest.mock import patch from unittest.mock import patch
from django.contrib.auth.models import User from datetime import datetime, timedelta
from django.contrib.auth.models import AnonymousUser
from django.contrib.auth.models import AnonymousUser, User
from django.contrib.sessions.backends.db import SessionStore from django.contrib.sessions.backends.db import SessionStore
from django.db.models import Q
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from django.test.client import RequestFactory from django.test.client import RequestFactory
from redis.client import Redis from redis.client import Redis
from django.urls import reverse from django.urls import reverse
from . import data
from . import utils from . import utils
from . import config from . import config
from .signals import ( from .signals import (
@ -951,6 +952,10 @@ class AccessAttemptTest(DefenderTestCase):
@patch("defender.config.LOCKOUT_COOLOFF_TIMES", [3, 6]) @patch("defender.config.LOCKOUT_COOLOFF_TIMES", [3, 6])
def test_lockout_cooloff_correctly_scales_with_ip_when_set(self): def test_lockout_cooloff_correctly_scales_with_ip_when_set(self):
self.test_ip_failure_limit() self.test_ip_failure_limit()
self.assertTrue(AccessAttempt.objects.filter(
Q(attempt_time__gte=datetime.now() - timedelta(hours=config.ACCESS_ATTEMPT_EXPIRATION)) &
Q(ip_address="127.0.0.1")
).count() > 1)
self.assertEqual(utils.get_lockout_cooloff_time(ip_address="127.0.0.1"), 3) self.assertEqual(utils.get_lockout_cooloff_time(ip_address="127.0.0.1"), 3)
utils.reset_failed_attempts(ip_address="127.0.0.1") utils.reset_failed_attempts(ip_address="127.0.0.1")
self.test_ip_failure_limit() self.test_ip_failure_limit()
@ -964,6 +969,10 @@ class AccessAttemptTest(DefenderTestCase):
@patch("defender.config.LOCKOUT_COOLOFF_TIMES", [3, 6]) @patch("defender.config.LOCKOUT_COOLOFF_TIMES", [3, 6])
def test_lockout_cooloff_correctly_scales_with_username_when_set(self): def test_lockout_cooloff_correctly_scales_with_username_when_set(self):
self.test_username_failure_limit() self.test_username_failure_limit()
self.assertTrue(AccessAttempt.objects.filter(
Q(attempt_time__gte=datetime.now() - timedelta(hours=config.ACCESS_ATTEMPT_EXPIRATION)) &
Q(username=VALID_USERNAME)
).count() > 1)
self.assertEqual(utils.get_lockout_cooloff_time(username=VALID_USERNAME), 3) self.assertEqual(utils.get_lockout_cooloff_time(username=VALID_USERNAME), 3)
utils.reset_failed_attempts(username=VALID_USERNAME) utils.reset_failed_attempts(username=VALID_USERNAME)
self.test_username_failure_limit() self.test_username_failure_limit()