Newer
Older
hard-panel / panel / backend / app / security.py
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",
        )