""" Quem pode falar com o conector. Este servico escreve no banco de producao do cliente — e alvo de alto valor. As duas travas aqui sao o minimo: segredo compartilhado e origem conhecida. Nao e seguranca por obscuridade (URL secreta nao conta). """ import logging import secrets from app.config import settings from fastapi import Header, HTTPException, Request, status def _origem(request: Request) -> str: """ IP de origem. Se um dia entrar proxy na frente, o IP do socket vira o do proxy — ai o uvicorn precisa de --proxy-headers e isto passa a ler X-Forwarded-For. """ return request.client.host if request.client else "" async def autorizar(request: Request, x_token: str = Header(default="")) -> None: """Dependencia de rota: barra quem nao for a VPS.""" permitidos = settings.vps.ips_permitidos if permitidos: ip = _origem(request) if ip not in permitidos: logging.warning(f"Origem recusada: {ip}") raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="origem nao autorizada" ) # compare_digest pra nao vazar o segredo por tempo de resposta. if not secrets.compare_digest(x_token, settings.vps.token): logging.warning(f"Token invalido vindo de {_origem(request)}") raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="token invalido" )