import os import logging from typing import Optional def get_db_path(): if "JARVIS_APP_DATA_DIR" in os.environ: return os.path.join(os.environ["JARVIS_APP_DATA_DIR"], "memory.db") project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) return os.path.join(project_root, "memory.db") async def resolve_vault_key(key_name: str) -> Optional[str]: """Retrieve a token from the SQLite vault secrets.""" try: from backend.services.usb_vault import get_secret return get_secret(key_name) except Exception as e: logging.error(f"Failed to fetch vault key {key_name}: {e}") return None async def exchange_refresh_for_access(refresh_token: str) -> Optional[str]: """Exchanges a long-lived Google refresh token for a short-lived access token.""" import aiohttp client_id = os.environ.get("GMAIL_OAUTH_CLIENT_ID") client_secret = os.environ.get("GMAIL_OAUTH_CLIENT_SECRET") if not refresh_token or not client_id or not client_secret: logging.error("Missing Google OAuth credentials.") return None try: async with aiohttp.ClientSession() as session: data = { "client_id": client_id, "client_secret": client_secret, "refresh_token": refresh_token, "grant_type": "refresh_token" } async with session.post("https://oauth2.googleapis.com/token", data=data) as response: if response.status == 200: json_data = await response.json() return json_data.get("access_token") else: logging.error(f"Failed to refresh Google token: {await response.text()}") return None except Exception as e: logging.error(f"Error during token exchange: {e}") return None async def resolve_vault_key_oauth(key_name: str) -> Optional[str]: """ Convenience method for connectors expecting an OAuth access token. For GMAIL_OAUTH, it fetches the refresh token and exchanges it. """ if key_name == "GMAIL_OAUTH": refresh_token = await resolve_vault_key("GMAIL_REFRESH_TOKEN") # If not in vault, try environment variable as fallback if not refresh_token: refresh_token = os.environ.get("GMAIL_REFRESH_TOKEN") return await exchange_refresh_for_access(refresh_token) return None