mirror of
https://github.com/jazzband/django-defender.git
synced 2026-03-16 22:10:32 +00:00
Update README further and make another adjustment to the tests
This commit is contained in:
parent
1bf9d6e7d1
commit
717d44aa7d
2 changed files with 16 additions and 5 deletions
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue