"""Local agent authentication dependency for LOCAL_MODE registration.""" import secrets from fastapi import Header, HTTPException, status from app.config import get_settings async def verify_local_agent_key( x_local_agent_key: str = Header(..., alias="X-Local-Agent-Key"), ) -> None: """ Verify LOCAL_AGENT_KEY for local agent registration. This is a narrow-scope credential that can ONLY register the local agent. It is NOT the same as ADMIN_API_KEY. HTTP Status Codes: - 404: LOCAL_MODE is false (endpoint hidden by design) - 401: LOCAL_AGENT_KEY is missing, invalid, or not configured Raises: HTTPException: 404 if not in LOCAL_MODE, 401 if key is invalid """ settings = get_settings() # Endpoint only exists in LOCAL_MODE (security by obscurity) if not settings.LOCAL_MODE: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Not found", ) # LOCAL_AGENT_KEY must be configured if not settings.LOCAL_AGENT_KEY: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Local agent key not configured", headers={"WWW-Authenticate": "ApiKey"}, ) # Use timing-safe comparison to prevent timing attacks if not secrets.compare_digest(x_local_agent_key, settings.LOCAL_AGENT_KEY): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid local agent key", headers={"WWW-Authenticate": "ApiKey"}, )