64 lines
2.5 KiB
Python
64 lines
2.5 KiB
Python
from datetime import date
|
|
|
|
from django.contrib.auth.backends import BaseBackend
|
|
from django.contrib.auth.models import User
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
from django.utils.translation import gettext_lazy
|
|
|
|
from core.extensions import ValidationError
|
|
from core.models import UsernameLoginAuthCheck
|
|
from core.services.authentication import create_authentication_log_message, handle_login_attempt
|
|
from users.models import UserInfo
|
|
|
|
|
|
class ConsoleAuthSystem(BaseBackend):
|
|
def authenticate(self, request, username=None, password=None):
|
|
if request.META.get("HTTP_X_FORWARDED_FOR"):
|
|
ip_address = request.META.get("HTTP_X_FORWARDED_FOR")
|
|
elif request.META.get("REMOTE_ADDR"):
|
|
ip_address = request.META.get("REMOTE_ADDR")
|
|
else:
|
|
ip_address = None
|
|
try:
|
|
logging_user = User.objects.get(username=username)
|
|
if self.check_user_expire_date(logging_user):
|
|
logging_user.is_active = False
|
|
logging_user.save()
|
|
raise ValidationError(gettext_lazy("The credentials have expired"))
|
|
except User.DoesNotExist:
|
|
create_authentication_log_message('attempt', f'[{username}] does not exist', ip_address)
|
|
return None
|
|
attempt_username_data = UsernameLoginAuthCheck.objects.get_or_create(user=logging_user)[0]
|
|
if logging_user.check_password(password):
|
|
login_allowed, message = handle_login_attempt(attempt_username_data, True, ip_address)
|
|
if login_allowed:
|
|
return logging_user
|
|
else:
|
|
raise ValidationError(message)
|
|
else:
|
|
_, message = handle_login_attempt(attempt_username_data, False, ip_address)
|
|
raise ValidationError(message)
|
|
|
|
def get_user(self, user_id):
|
|
try:
|
|
return User.objects.get(pk=user_id)
|
|
except User.DoesNotExist:
|
|
return None
|
|
|
|
def check_user_expire_date(self, user):
|
|
"""We check whether the user's expiration date has not expired.
|
|
If expired, we return False , if not True. Superuser passed
|
|
"""
|
|
if user.is_superuser:
|
|
return False
|
|
try:
|
|
user_info = UserInfo.objects.get(user=user)
|
|
if user_info.expire_date < date.today():
|
|
return True
|
|
else:
|
|
return False
|
|
except ObjectDoesNotExist:
|
|
UserInfo.objects.create(user=user, expire_date=date.today())
|
|
return False
|
|
except TypeError:
|
|
return False
|