2015-01-01 17:51:46 +00:00
|
|
|
from django.conf import settings
|
2021-04-28 22:26:21 +00:00
|
|
|
from django.utils.translation import gettext_lazy
|
2015-01-01 17:51:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_setting(variable, default=None):
|
|
|
|
|
""" get the 'variable' from settings if not there use the
|
|
|
|
|
provided default """
|
|
|
|
|
return getattr(settings, variable, default)
|
|
|
|
|
|
2017-06-28 21:09:44 +00:00
|
|
|
|
2015-01-01 17:51:46 +00:00
|
|
|
# redis server host
|
2019-11-15 18:22:14 +00:00
|
|
|
DEFENDER_REDIS_URL = get_setting("DEFENDER_REDIS_URL")
|
2015-01-01 17:51:46 +00:00
|
|
|
|
2020-03-13 12:13:54 +00:00
|
|
|
# redis password quote for special character
|
|
|
|
|
DEFENDER_REDIS_PASSWORD_QUOTE = get_setting("DEFENDER_REDIS_PASSWORD_QUOTE", False)
|
|
|
|
|
|
2017-06-24 23:17:15 +00:00
|
|
|
# reuse declared cache from django settings
|
2019-11-15 18:22:14 +00:00
|
|
|
DEFENDER_REDIS_NAME = get_setting("DEFENDER_REDIS_NAME")
|
2017-06-24 23:17:15 +00:00
|
|
|
|
2019-11-15 18:22:14 +00:00
|
|
|
MOCK_REDIS = get_setting("DEFENDER_MOCK_REDIS", False)
|
2015-01-01 17:51:46 +00:00
|
|
|
|
|
|
|
|
# see if the user has overridden the failure limit
|
2019-11-15 18:22:14 +00:00
|
|
|
FAILURE_LIMIT = get_setting("DEFENDER_LOGIN_FAILURE_LIMIT", 3)
|
|
|
|
|
USERNAME_FAILURE_LIMIT = get_setting(
|
|
|
|
|
"DEFENDER_LOGIN_FAILURE_LIMIT_USERNAME", FAILURE_LIMIT
|
|
|
|
|
)
|
|
|
|
|
IP_FAILURE_LIMIT = get_setting("DEFENDER_LOGIN_FAILURE_LIMIT_IP", FAILURE_LIMIT)
|
2015-01-01 17:51:46 +00:00
|
|
|
|
2015-10-21 20:33:08 +00:00
|
|
|
# If this is True, the lockout checks to evaluate if the IP failure limit and
|
|
|
|
|
# the username failure limit has been reached before issuing the lockout.
|
2019-11-15 18:22:14 +00:00
|
|
|
LOCKOUT_BY_IP_USERNAME = get_setting("DEFENDER_LOCK_OUT_BY_IP_AND_USERNAME", False)
|
2015-04-21 22:21:29 +00:00
|
|
|
|
2015-10-21 20:44:12 +00:00
|
|
|
# if this is True, The users IP address will not get locked when
|
|
|
|
|
# there are too many login attempts.
|
2019-11-15 18:22:14 +00:00
|
|
|
DISABLE_IP_LOCKOUT = get_setting("DEFENDER_DISABLE_IP_LOCKOUT", False)
|
2015-10-21 20:33:08 +00:00
|
|
|
|
2016-06-20 04:20:47 +00:00
|
|
|
# If this is True, usernames will not get locked when
|
|
|
|
|
# there are too many login attempts.
|
2019-11-15 18:22:14 +00:00
|
|
|
DISABLE_USERNAME_LOCKOUT = get_setting("DEFENDER_DISABLE_USERNAME_LOCKOUT", False)
|
2016-06-20 04:20:47 +00:00
|
|
|
|
2015-01-01 17:51:46 +00:00
|
|
|
# use a specific username field to retrieve from login POST data
|
2019-11-15 18:22:14 +00:00
|
|
|
USERNAME_FORM_FIELD = get_setting("DEFENDER_USERNAME_FORM_FIELD", "username")
|
2015-01-01 17:51:46 +00:00
|
|
|
|
|
|
|
|
# see if the django app is sitting behind a reverse proxy
|
2019-11-15 18:22:14 +00:00
|
|
|
BEHIND_REVERSE_PROXY = get_setting("DEFENDER_BEHIND_REVERSE_PROXY", False)
|
2015-01-01 17:51:46 +00:00
|
|
|
|
|
|
|
|
# the prefix for these keys in your cache.
|
2019-11-15 18:22:14 +00:00
|
|
|
CACHE_PREFIX = get_setting("DEFENDER_CACHE_PREFIX", "defender")
|
2015-01-01 17:51:46 +00:00
|
|
|
|
|
|
|
|
# if the django app is behind a reverse proxy, look for the
|
|
|
|
|
# ip address using this HTTP header value
|
2019-11-15 18:22:14 +00:00
|
|
|
REVERSE_PROXY_HEADER = get_setting(
|
|
|
|
|
"DEFENDER_REVERSE_PROXY_HEADER", "HTTP_X_FORWARDED_FOR"
|
|
|
|
|
)
|
2015-01-01 17:51:46 +00:00
|
|
|
|
2015-01-02 21:02:09 +00:00
|
|
|
try:
|
2022-10-11 16:33:05 +00:00
|
|
|
# how long to wait before the bad login attempt/lockout gets forgotten, in seconds.
|
2019-11-15 18:22:14 +00:00
|
|
|
COOLOFF_TIME = int(get_setting("DEFENDER_COOLOFF_TIME", 300)) # seconds
|
2022-10-11 16:33:05 +00:00
|
|
|
try:
|
|
|
|
|
# how long to wait before the bad login attempt gets forgotten, in seconds.
|
|
|
|
|
ATTEMPT_COOLOFF_TIME = int(get_setting("DEFENDER_ATTEMPT_COOLOFF_TIME", COOLOFF_TIME)) # measured in seconds
|
2022-10-15 19:06:05 +00:00
|
|
|
except ValueError: # pragma: no cover
|
|
|
|
|
raise Exception("DEFENDER_ATTEMPT_COOLOFF_TIME needs to be an integer") # pragma: no cover
|
2022-10-11 16:33:05 +00:00
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# how long to wait before a lockout gets forgotten, in seconds.
|
|
|
|
|
LOCKOUT_COOLOFF_TIMES = [int(get_setting("DEFENDER_LOCKOUT_COOLOFF_TIME", COOLOFF_TIME))] # measured in seconds
|
2022-10-15 19:06:05 +00:00
|
|
|
except TypeError: # pragma: no cover
|
|
|
|
|
try: # pragma: no cover
|
2022-10-11 16:33:05 +00:00
|
|
|
cooloff_times = get_setting("DEFENDER_LOCKOUT_COOLOFF_TIME", [COOLOFF_TIME]) # measured in seconds
|
2022-10-15 19:06:05 +00:00
|
|
|
for index, cooloff_time in enumerate(cooloff_times): # pragma: no cover
|
|
|
|
|
cooloff_times[index] = int(cooloff_time) # pragma: no cover
|
2022-10-11 16:33:05 +00:00
|
|
|
|
2022-10-15 19:06:05 +00:00
|
|
|
if not len(cooloff_times): # pragma: no cover
|
2022-10-15 18:22:01 +00:00
|
|
|
raise TypeError() # pragma: no cover
|
2022-10-11 16:33:05 +00:00
|
|
|
|
|
|
|
|
LOCKOUT_COOLOFF_TIMES = cooloff_times
|
2022-10-15 19:06:05 +00:00
|
|
|
except (TypeError, ValueError): # pragma: no cover
|
|
|
|
|
raise Exception("DEFENDER_LOCKOUT_COOLOFF_TIME needs to be an integer or list of integers having at least one element") # pragma: no cover
|
|
|
|
|
except ValueError: # pragma: no cover
|
2022-10-15 18:22:01 +00:00
|
|
|
raise Exception("DEFENDER_LOCKOUT_COOLOFF_TIME needs to be an integer or list of integers having at least one element") # pragma: no cover
|
2015-01-02 21:10:12 +00:00
|
|
|
except ValueError: # pragma: no cover
|
2019-11-15 18:22:14 +00:00
|
|
|
raise Exception("DEFENDER_COOLOFF_TIME needs to be an integer") # pragma: no cover
|
2015-01-01 17:51:46 +00:00
|
|
|
|
2019-11-15 18:22:14 +00:00
|
|
|
LOCKOUT_TEMPLATE = get_setting("DEFENDER_LOCKOUT_TEMPLATE")
|
2015-01-01 17:51:46 +00:00
|
|
|
|
2021-04-28 22:26:21 +00:00
|
|
|
ERROR_MESSAGE = gettext_lazy(
|
2019-11-15 18:22:14 +00:00
|
|
|
"Please enter a correct username and password. "
|
|
|
|
|
"Note that both fields are case-sensitive."
|
|
|
|
|
)
|
2015-01-01 17:51:46 +00:00
|
|
|
|
2019-11-15 18:22:14 +00:00
|
|
|
LOCKOUT_URL = get_setting("DEFENDER_LOCKOUT_URL")
|
2015-01-03 15:34:19 +00:00
|
|
|
|
2019-11-15 18:22:14 +00:00
|
|
|
USE_CELERY = get_setting("DEFENDER_USE_CELERY", False)
|
2015-03-20 14:09:39 +00:00
|
|
|
|
2019-11-15 18:22:14 +00:00
|
|
|
STORE_ACCESS_ATTEMPTS = get_setting("DEFENDER_STORE_ACCESS_ATTEMPTS", True)
|
2015-03-20 14:09:39 +00:00
|
|
|
|
|
|
|
|
# Used by the management command to decide how long to keep access attempt
|
|
|
|
|
# recods. Number is # of hours.
|
|
|
|
|
try:
|
2019-11-15 18:22:14 +00:00
|
|
|
ACCESS_ATTEMPT_EXPIRATION = int(
|
|
|
|
|
get_setting("DEFENDER_ACCESS_ATTEMPT_EXPIRATION", 24)
|
|
|
|
|
)
|
2015-03-20 14:09:39 +00:00
|
|
|
except ValueError: # pragma: no cover
|
|
|
|
|
raise Exception(
|
2019-11-15 18:22:14 +00:00
|
|
|
"DEFENDER_ACCESS_ATTEMPT_EXPIRATION" " needs to be an integer"
|
|
|
|
|
) # pragma: no cover
|
2018-05-29 14:32:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
GET_USERNAME_FROM_REQUEST_PATH = get_setting(
|
2019-11-15 18:22:14 +00:00
|
|
|
"DEFENDER_GET_USERNAME_FROM_REQUEST_PATH", "defender.utils.username_from_request"
|
2018-05-29 14:32:08 +00:00
|
|
|
)
|