diff --git a/app/utils/validators.py b/app/utils/validators.py index 5705f1c..04efbf6 100644 --- a/app/utils/validators.py +++ b/app/utils/validators.py @@ -50,9 +50,40 @@ def email(form, email): def password(form, password): - if len(password.data) != 0 and len(password.data) < 10: - raise ValidationError('Mot de passe est trop court (10 caractères minimum).') - # TODO: add more rules >:] + MIN_CHARS = 10 + # To avoid errors in forms where password is optionnal + if len(password.data) != 0: + errors = [] + if len(password.data) < MIN_CHARS: + errors.append(f'Le mot de passe doit faire au moins {MIN_CHARS} caractères.') + + checks = { + 'lower': False, + 'upper': False, + 'numeric': False, + 'other': False + } + for c in password.data: + if c in "abcdefghijklmnopqrstuvwxyz": + checks['lower'] = True + elif c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": + checks['upper'] = True + elif c in "0123456789": + checks['numeric'] = True + else: + checks['other'] = True + + if not checks['lower']: + errors.append('Le mot de passe doit contenir au moins une minuscule.') + if not checks['upper']: + errors.append('Le mot de passe doit contenir au moins une majuscule.') + if not checks['numeric']: + errors.append('Le mot de passe doit contenir au moins une chiffre.') + if not checks['other']: + errors.append('Le mot de passe doit contenir au moins un caractère spécial.') + + if errors != []: + raise ValidationError(' '.join(errors)) def avatar(form, avatar):