97 lines
3.5 KiB
Python
97 lines
3.5 KiB
Python
# validators.py
|
||
"""
|
||
Модуль валидации данных пользователя
|
||
"""
|
||
import re
|
||
from typing import Tuple
|
||
from config import MIN_USERNAME_LENGTH, MIN_PASSWORD_LENGTH, MESSAGES, DEBUG_MODE
|
||
|
||
|
||
def debug_log(message: str) -> None:
|
||
"""Вывод отладочных сообщений"""
|
||
if DEBUG_MODE:
|
||
print(f"[DEBUG] {message}")
|
||
|
||
|
||
def validate_username(username: str) -> Tuple[bool, str]:
|
||
"""
|
||
Проверка логина на корректность
|
||
|
||
Args:
|
||
username: Логин пользователя
|
||
|
||
Returns:
|
||
Tuple[bool, str]: (валидность, сообщение об ошибке)
|
||
"""
|
||
debug_log(f"Проверка логина: '{username}'")
|
||
|
||
# Проверка на пустой логин
|
||
if not username or username.strip() == '':
|
||
debug_log("Ошибка: пустой логин")
|
||
return False, MESSAGES['error_empty_username']
|
||
|
||
# Проверка на минимальную длину
|
||
if len(username) < MIN_USERNAME_LENGTH:
|
||
debug_log(f"Ошибка: логин слишком короткий ({len(username)} символов)")
|
||
return False, MESSAGES['error_short_username']
|
||
|
||
debug_log("Логин прошел валидацию")
|
||
return True, ''
|
||
|
||
|
||
def validate_password(password: str) -> Tuple[bool, str]:
|
||
"""
|
||
Проверка пароля на соответствие требованиям:
|
||
- Минимум 8 символов
|
||
- Хотя бы одна латинская буква (a-z или A-Z)
|
||
- Хотя бы одна цифра (0-9)
|
||
- Любые другие символы разрешены
|
||
|
||
Args:
|
||
password: Пароль пользователя
|
||
|
||
Returns:
|
||
Tuple[bool, str]: (валидность, сообщение об ошибке)
|
||
"""
|
||
debug_log(f"Проверка пароля (длина: {len(password)})")
|
||
|
||
# Проверка минимальной длины
|
||
if len(password) < MIN_PASSWORD_LENGTH:
|
||
debug_log(f"Ошибка: пароль слишком короткий ({len(password)} символов)")
|
||
return False, MESSAGES['error_invalid_password_format']
|
||
|
||
# Проверка наличия латинских букв
|
||
if not re.search(r'[a-zA-Z]', password):
|
||
debug_log("Ошибка: пароль не содержит латинских букв")
|
||
return False, MESSAGES['error_invalid_password_format']
|
||
|
||
# Проверка наличия цифр
|
||
if not re.search(r'\d', password):
|
||
debug_log("Ошибка: пароль не содержит цифр")
|
||
return False, MESSAGES['error_invalid_password_format']
|
||
|
||
debug_log("Пароль прошел валидацию")
|
||
return True, ''
|
||
|
||
|
||
def validate_password_confirmation(password: str, password_confirm: str) -> Tuple[bool, str]:
|
||
"""
|
||
Проверка совпадения пароля и его подтверждения
|
||
|
||
Args:
|
||
password: Пароль
|
||
password_confirm: Подтверждение пароля
|
||
|
||
Returns:
|
||
Tuple[bool, str]: (валидность, сообщение об ошибке)
|
||
"""
|
||
debug_log("Проверка совпадения паролей")
|
||
|
||
if password != password_confirm:
|
||
debug_log("Ошибка: пароли не совпадают")
|
||
return False, MESSAGES['error_passwords_mismatch']
|
||
|
||
debug_log("Пароли совпадают")
|
||
return True, ''
|
||
|