patch auth-validators
This commit is contained in:
parent
a5dbefe757
commit
72de495c02
@ -1,5 +1,4 @@
|
||||
import httpx
|
||||
import re
|
||||
from fastapi import Depends, Request, HTTPException, status
|
||||
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||||
from typing import List
|
||||
@ -7,6 +6,7 @@ from typing import List
|
||||
from dataclasses import dataclass
|
||||
from config import settings
|
||||
from .ssl_transport import ssl_transport
|
||||
from .validators import validate_username as core_validate_username, validate_password as core_validate_password
|
||||
|
||||
auth_scheme = HTTPBearer()
|
||||
|
||||
@ -86,54 +86,15 @@ def validate_username(value: str,
|
||||
- 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"
|
||||
valid, result = core_validate_username(value, field_name, need_back=True, min_length=min_length, max_length=max_length)
|
||||
if not valid:
|
||||
if with_httpexception:
|
||||
raise HTTPException(status_code=error_status_code, detail=error_detail)
|
||||
if need_back:
|
||||
return False, msg
|
||||
raise ValueError(msg)
|
||||
return False, result
|
||||
raise ValueError(result)
|
||||
|
||||
# Пробелы
|
||||
if any(c.isspace() for c in value):
|
||||
msg = f"{field_name.capitalize()} must not contain whitespace characters"
|
||||
if with_httpexception:
|
||||
raise HTTPException(status_code=error_status_code, detail=error_detail)
|
||||
if need_back:
|
||||
return False, msg
|
||||
raise ValueError(msg)
|
||||
|
||||
# Начинается с подчеркивания
|
||||
if value.startswith('_'):
|
||||
msg = f"{field_name.capitalize()} must not start with an underscore"
|
||||
if with_httpexception:
|
||||
raise HTTPException(status_code=error_status_code, detail=error_detail)
|
||||
if need_back:
|
||||
return False, msg
|
||||
raise ValueError(msg)
|
||||
|
||||
# Двойные подчеркивания
|
||||
if '__' in value:
|
||||
msg = f"{field_name.capitalize()} must not contain consecutive underscores"
|
||||
if with_httpexception:
|
||||
raise HTTPException(status_code=error_status_code, detail=error_detail)
|
||||
if need_back:
|
||||
return False, msg
|
||||
raise ValueError(msg)
|
||||
|
||||
# Только допустимые символы
|
||||
if not re.fullmatch(r'[A-Za-z0-9_]+', value):
|
||||
msg = f"{field_name.capitalize()} must contain only English letters, digits, and underscores"
|
||||
if with_httpexception:
|
||||
raise HTTPException(status_code=error_status_code, detail=error_detail)
|
||||
if need_back:
|
||||
return False, msg
|
||||
raise ValueError(msg)
|
||||
|
||||
if need_back:
|
||||
return True, value.lower()
|
||||
return value.lower()
|
||||
return result if need_back else result
|
||||
|
||||
|
||||
def validate_password(value: str,
|
||||
@ -149,27 +110,14 @@ def validate_password(value: str,
|
||||
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"
|
||||
valid, result = core_validate_password(value, field_name, need_back=True, min_length=min_length, max_length=max_length)
|
||||
if not valid:
|
||||
if with_httpexception:
|
||||
raise HTTPException(status_code=error_status_code, detail=error_detail)
|
||||
if need_back:
|
||||
return False, msg
|
||||
raise ValueError(msg)
|
||||
|
||||
# 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 False, result
|
||||
raise ValueError(result)
|
||||
|
||||
if need_back:
|
||||
return True, value
|
||||
return value
|
||||
return True, value.lower()
|
||||
return value.lower()
|
||||
|
||||
71
common_lib/utils/validators.py
Normal file
71
common_lib/utils/validators.py
Normal file
@ -0,0 +1,71 @@
|
||||
import re
|
||||
|
||||
def validate_username(value: str,
|
||||
field_name: str = "login",
|
||||
need_back=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
|
||||
|
||||
return (True, value.lower()) if need_back else value.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
|
||||
@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "common-lib"
|
||||
version = "0.0.14"
|
||||
version = "0.0.15"
|
||||
description = "Библиотека общих компонентов для микросервисов yobble"
|
||||
authors = [{ name = "cheykrym", email = "you@example.com" }]
|
||||
license = "MIT"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user