"""Authentication utilities""" from fastapi import Depends, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from passlib.context import CryptContext from sqlalchemy.orm import Session from .jwt import verify_token from ..database import get_db from ..crud import employees from ..models.employee import Employee pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") security = HTTPBearer(auto_error=False) def get_password_hash(password: str) -> str: """Hash password""" return pwd_context.hash(password) def verify_password(plain_password: str, hashed_password: str) -> bool: """Verify password""" return pwd_context.verify(plain_password, hashed_password) def get_current_admin( credentials: HTTPAuthorizationCredentials = Depends(security), db: Session = Depends(get_db) ) -> Employee: """Get current admin from token""" if not credentials: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated", headers={"WWW-Authenticate": "Bearer"}, ) try: token = credentials.credentials token_data = verify_token(token, db) if not token_data: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication credentials", headers={"WWW-Authenticate": "Bearer"}, ) # Проверяем, что это админ employee = employees.get_employee(db, token_data.employee_id) if not employee or not employee.is_admin: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Not enough permissions", headers={"WWW-Authenticate": "Bearer"}, ) return employee except Exception: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication credentials", headers={"WWW-Authenticate": "Bearer"}, ) def get_current_employee( credentials: HTTPAuthorizationCredentials = Depends(security), db: Session = Depends(get_db) ) -> Employee: """Get current employee from token""" if not credentials: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated", headers={"WWW-Authenticate": "Bearer"}, ) try: token = credentials.credentials token_data = verify_token(token, db) if not token_data: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication credentials", headers={"WWW-Authenticate": "Bearer"}, ) # Проверяем существование сотрудника employee = employees.get_employee(db, token_data.employee_id) if not employee: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Employee not found", headers={"WWW-Authenticate": "Bearer"}, ) return employee except Exception: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication credentials", headers={"WWW-Authenticate": "Bearer"}, )