- Updated the .env.example file to reflect a development environment setup with enhanced secret key requirements and local host settings. - Modified the Docker Compose configuration to enhance security with read-only settings and no-new-privileges options. - Updated requirements.txt to pin package versions for better dependency management. - Enhanced the FastAPI application to include dynamic OpenAPI and documentation URLs based on the environment. - Implemented session versioning in JWT tokens to improve security and user session management. - Added new validation for user roles and password strength in schemas. - Improved email sending logic to handle recipient lists more robustly and added logging for SMTP operations. - Updated dashboard and profile templates to reflect new features and improve user experience.
47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
from pydantic import BaseModel, EmailStr, Field, field_validator
|
|
|
|
from app.core.password_policy import validate_password_strength
|
|
|
|
|
|
class UserCreate(BaseModel):
|
|
email: EmailStr
|
|
full_name: str = Field(min_length=2, max_length=255)
|
|
password: str = Field(min_length=10, max_length=255)
|
|
role: str = Field(default="reader", pattern="^(admin|editor|reader)$")
|
|
|
|
@field_validator("password")
|
|
@classmethod
|
|
def strong_password(cls, value: str) -> str:
|
|
validate_password_strength(value)
|
|
return value
|
|
|
|
|
|
class ProfileUpdate(BaseModel):
|
|
email: EmailStr
|
|
full_name: str = Field(min_length=2, max_length=255)
|
|
|
|
|
|
class PasswordChange(BaseModel):
|
|
new_password: str = Field(min_length=10, max_length=255)
|
|
|
|
@field_validator("new_password")
|
|
@classmethod
|
|
def strong_password(cls, value: str) -> str:
|
|
validate_password_strength(value)
|
|
return value
|
|
|
|
|
|
class UserRoleUpdate(BaseModel):
|
|
role: str = Field(pattern="^(admin|editor|reader)$")
|
|
|
|
|
|
class UserOut(BaseModel):
|
|
id: int
|
|
email: EmailStr
|
|
full_name: str
|
|
role: str
|
|
is_active: bool
|
|
|
|
class Config:
|
|
from_attributes = True
|