""" Security utilities for password hashing and JWT token management. """ from datetime import ( datetime, timedelta, ) import bcrypt from jose import JWTError, jwt from config import settings def hash_password(password: str) -> str: """ Hash a plain text password using bcrypt """ password_bytes = password.encode('utf-8') salt = bcrypt.gensalt() hashed = bcrypt.hashpw(password_bytes, salt) return hashed.decode('utf-8') def verify_password( plain_password: str, hashed_password: str ) -> bool: """ Verify a plain text password against a hashed password """ password_bytes = plain_password.encode('utf-8') hashed_bytes = hashed_password.encode('utf-8') return bcrypt.checkpw(password_bytes, hashed_bytes) def create_access_token( data: dict[str, str], expires_delta: timedelta | None = None ) -> str: """ Create a JWT access token """ to_encode = data.copy() if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta( minutes = settings.ACCESS_TOKEN_EXPIRE_MINUTES ) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode( to_encode, settings.SECRET_KEY, algorithm = settings.ALGORITHM ) return encoded_jwt def decode_token(token: str) -> dict[str, str]: """ Decode and verify a JWT token """ try: payload = jwt.decode( token, settings.SECRET_KEY, algorithms = [settings.ALGORITHM] ) return payload except JWTError as e: raise ValueError(f"Invalid token: {str(e)}") from e