30 lines
922 B
Python
30 lines
922 B
Python
import re
|
|
|
|
from django.core.exceptions import ValidationError
|
|
|
|
|
|
class PasswordComplexityValidator:
|
|
lower_pattern = re.compile(r"[a-z]")
|
|
upper_pattern = re.compile(r"[A-Z]")
|
|
digit_pattern = re.compile(r"\d")
|
|
symbol_pattern = re.compile(r"[^A-Za-z0-9]")
|
|
|
|
message = (
|
|
"Password must be at least 8 characters and include at least one lowercase "
|
|
"letter, one uppercase letter, one digit, and one symbol."
|
|
)
|
|
code = "password_no_complexity"
|
|
|
|
def validate(self, password, user=None):
|
|
if (
|
|
len(password) < 8
|
|
or not self.lower_pattern.search(password)
|
|
or not self.upper_pattern.search(password)
|
|
or not self.digit_pattern.search(password)
|
|
or not self.symbol_pattern.search(password)
|
|
):
|
|
raise ValidationError(self.message, code=self.code)
|
|
|
|
def get_help_text(self):
|
|
return self.message
|