jellyfin-accounts/jellyfin_accounts/validate_password.py

52 lines
1.7 KiB
Python
Raw Permalink Normal View History

specials = ['[', '@', '_', '!', '#', '$', '%', '^', '&', '*', '(', ')',
'<', '>', '?', '/', '\\', '|', '}', '{', '~', ':', ']']
class PasswordValidator:
def __init__(self, min_length, upper, lower, number, special):
2020-06-21 19:29:53 +00:00
self.criteria = {
"characters": int(min_length),
"uppercase characters": int(upper),
"lowercase characters": int(lower),
"numbers": int(number),
"special characters": int(special),
}
def validate(self, password):
2020-06-21 19:29:53 +00:00
count = {
"characters": 0,
"uppercase characters": 0,
"lowercase characters": 0,
"numbers": 0,
"special characters": 0,
}
for c in password:
2020-06-21 19:29:53 +00:00
count["characters"] += 1
if c.isupper():
2020-06-21 19:29:53 +00:00
count["uppercase characters"] += 1
elif c.islower():
2020-06-21 19:29:53 +00:00
count["lowercase characters"] += 1
elif c.isnumeric():
2020-06-21 19:29:53 +00:00
count["numbers"] += 1
elif c in specials:
2020-06-21 19:29:53 +00:00
count["special characters"] += 1
for criterion in count:
if count[criterion] < self.criteria[criterion]:
count[criterion] = False
else:
count[criterion] = True
return count
2020-06-21 19:29:53 +00:00
def getCriteria(self):
lines = {}
for criterion in self.criteria:
min = self.criteria[criterion]
if min > 0:
text = f"Must have at least {min} "
if min == 1:
text += criterion[:-1]
else:
text += criterion
lines[criterion] = text
return lines