import logging from dataclasses import dataclass from datetime import datetime, timedelta, timezone from pathlib import Path from typing import Any import jwt from jwt.exceptions import InvalidTokenError from common.core import security from common.core.config import settings logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) def generate_password_reset_token(email: str) -> str: delta = timedelta(hours=settings.EMAIL_RESET_TOKEN_EXPIRE_HOURS) now = datetime.now(timezone.utc) expires = now + delta exp = expires.timestamp() encoded_jwt = jwt.encode( {"exp": exp, "nbf": now, "sub": email}, settings.SECRET_KEY, algorithm=security.ALGORITHM, ) return encoded_jwt def verify_password_reset_token(token: str) -> str | None: try: decoded_token = jwt.decode( token, settings.SECRET_KEY, algorithms=[security.ALGORITHM] ) return str(decoded_token["sub"]) except InvalidTokenError: return None def deepcopy_ignore_extra(src, dest): import copy for attr in vars(src): if hasattr(dest, attr): src_value = getattr(src, attr) dest_value = copy.deepcopy(src_value) # deep copy setattr(dest, attr, dest_value) return dest