|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
#
|
|
|
|
|
|
|
|
from django import forms
|
|
|
|
from django.contrib.auth.forms import AuthenticationForm
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from captcha.fields import CaptchaField
|
|
|
|
from django.conf import settings
|
|
|
|
from users.utils import get_login_failed_count
|
|
|
|
|
|
|
|
|
|
|
|
class UserLoginForm(AuthenticationForm):
|
|
|
|
username = forms.CharField(label=_('Username'), max_length=100)
|
|
|
|
password = forms.CharField(
|
|
|
|
label=_('Password'), widget=forms.PasswordInput,
|
|
|
|
max_length=128, strip=False
|
|
|
|
)
|
|
|
|
|
|
|
|
error_messages = {
|
|
|
|
'invalid_login': _(
|
|
|
|
"The username or password you entered is incorrect, "
|
|
|
|
"please enter it again."
|
|
|
|
),
|
|
|
|
'inactive': _("This account is inactive."),
|
|
|
|
'limit_login': _(
|
|
|
|
"You can also try {times_try} times "
|
|
|
|
"(The account will be temporarily locked for {block_time} minutes)"
|
|
|
|
),
|
|
|
|
'block_login': _(
|
|
|
|
"The account has been locked "
|
|
|
|
"(please contact admin to unlock it or try again after {} minutes)"
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
def confirm_login_allowed(self, user):
|
|
|
|
if not user.is_staff:
|
|
|
|
raise forms.ValidationError(
|
|
|
|
self.error_messages['inactive'],
|
|
|
|
code='inactive',)
|
|
|
|
|
|
|
|
def get_limit_login_error_message(self, username, ip):
|
|
|
|
times_up = settings.SECURITY_LOGIN_LIMIT_COUNT
|
|
|
|
times_failed = get_login_failed_count(username, ip)
|
|
|
|
times_try = int(times_up) - int(times_failed)
|
|
|
|
block_time = settings.SECURITY_LOGIN_LIMIT_TIME
|
|
|
|
if times_try <= 0:
|
|
|
|
error_message = self.error_messages['block_login']
|
|
|
|
error_message = error_message.format(block_time)
|
|
|
|
else:
|
|
|
|
error_message = self.error_messages['limit_login']
|
|
|
|
error_message = error_message.format(
|
|
|
|
times_try=times_try, block_time=block_time,
|
|
|
|
)
|
|
|
|
return error_message
|
|
|
|
|
|
|
|
def add_limit_login_error(self, username, ip):
|
|
|
|
error = self.get_limit_login_error_message(username, ip)
|
|
|
|
self.add_error('password', error)
|
|
|
|
|
|
|
|
|
|
|
|
class UserLoginCaptchaForm(UserLoginForm):
|
|
|
|
captcha = CaptchaField()
|
|
|
|
|
|
|
|
|
|
|
|
class UserCheckOtpCodeForm(forms.Form):
|
|
|
|
otp_code = forms.CharField(label=_('MFA code'), max_length=6)
|