import hashlib
import secrets
from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from app.config import get_settings
_bearer = HTTPBearer(auto_error=False)
def generate_server_key() -> str:
"""Plaintext-ключ агента. Показывается один раз при создании сервера."""
return "ghm_" + secrets.token_urlsafe(24)
def hash_key(key: str) -> str:
return hashlib.sha256(key.encode()).hexdigest()
async def require_admin(
creds: HTTPAuthorizationCredentials | None = Depends(_bearer),
) -> None:
"""Админ-доступ к API панели.
GHARD_ADMIN_TOKEN не задан — API открыт (личная панель без логина).
Задан — требуется Bearer-токен.
"""
token = get_settings().admin_token
if not token:
return
if creds is None or creds.scheme.lower() != "bearer" or creds.credentials != token:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="invalid admin token",
)