import re def validate_username(value: str, field_name: str = "login", need_back=False, is_bot=False, min_length=3, max_length=32) -> str: """ Username validator: - checks for length - no spaces - no leading underscore - no consecutive underscores - only [A-Za-z0-9_] """ # Проверка типа и длины if not isinstance(value, str) or not (min_length <= len(value) <= max_length): msg = f"{field_name.capitalize()} must be between {min_length} and {max_length} characters long" return (False, msg) if need_back else False # Пробелы if any(c.isspace() for c in value): msg = f"{field_name.capitalize()} must not contain whitespace characters" return (False, msg) if need_back else False # Начинается с подчеркивания if value.startswith('_'): msg = f"{field_name.capitalize()} must not start with an underscore" return (False, msg) if need_back else False # Двойные подчеркивания if '__' in value: msg = f"{field_name.capitalize()} must not contain consecutive underscores" return (False, msg) if need_back else False # Только допустимые символы if not re.fullmatch(r'[A-Za-z0-9_]+', value): msg = f"{field_name.capitalize()} must contain only English letters, digits, and underscores" return (False, msg) if need_back else False val_lower = value.lower() # Проверка окончания имени в зависимости от is_bot if is_bot and not val_lower.endswith("bot"): msg = f"{field_name.capitalize()} must end with 'bot' for bot accounts" return (False, msg) if need_back else False if not is_bot and val_lower.endswith("bot"): msg = f"{field_name.capitalize()} must not end with 'bot' for non-bot accounts" return (False, msg) if need_back else False # Если заканчивается на 'bot', то перед ним должно быть >=3 символов (кроме '_') if val_lower.endswith("bot"): prefix = re.sub(r'_+', '', val_lower[:-3]) # убираем все подчёркивания if len(prefix) < 3: msg = f"{field_name.capitalize()} must contain at least 3 non-underscore characters before 'bot'" return (False, msg) if need_back else False return (True, val_lower) if need_back else val_lower def validate_password(value: str, field_name: str = "password", need_back=False, min_length=8, max_length=128) -> str: """ Validates password length and (optionally) other rules. Supports HTTPException raising if `with_httpexception=True`. Returns (True, value) or raises ValueError. """ # Проверка типа и длины if not isinstance(value, str) or not (min_length <= len(value) <= max_length): msg = f"{field_name.capitalize()} must be between {min_length} and {max_length} characters long" return (False, msg) if need_back else False # if any(c.isspace() for c in value): # raise ValueError(f"{field_name.capitalize()} must not contain whitespace characters") # if not re.search(r'[A-Z]', value): # raise ValueError(f"{field_name.capitalize()} must contain at least one uppercase letter") # if not re.search(r'\d', value): # raise ValueError(f"{field_name.capitalize()} must contain at least one digit") # if not re.search(r'[!@#$%^&*()\-_=+\[\]{};:\'",.<>?/|\\]', value): # raise ValueError(f"{field_name.capitalize()} must contain at least one special character") return (True, value) if need_back else value