runv-server

server tooling for runv.club
Log | Files | Refs | README

admin_guard.py (1536B)


      1 #!/usr/bin/env python3
      2 """
      3 Proteção comum para scripts administrativos do runv.club.
      4 
      5 Regra:
      6 - só operadores administrativos autorizados podem executar os entrypoints protegidos
      7 - a conta root directa também é aceite
      8 - a lista de operadores pode ser ajustada com RUNV_ADMIN_USERS=nome1,nome2
      9 """
     10 
     11 from __future__ import annotations
     12 
     13 import getpass
     14 import os
     15 import sys
     16 from typing import Final
     17 
     18 DEFAULT_ALLOWED_ADMIN_USERS: Final[tuple[str, ...]] = ("pmurad-admin",)
     19 
     20 
     21 def resolve_allowed_admin_users() -> set[str]:
     22     raw = os.environ.get("RUNV_ADMIN_USERS", "").strip()
     23     if not raw:
     24         return set(DEFAULT_ALLOWED_ADMIN_USERS)
     25     names = {part.strip() for part in raw.split(",") if part.strip()}
     26     return names or set(DEFAULT_ALLOWED_ADMIN_USERS)
     27 
     28 
     29 def resolve_operator_user() -> str:
     30     sudo_user = os.environ.get("SUDO_USER", "").strip()
     31     if sudo_user:
     32         return sudo_user
     33     user = os.environ.get("USER", "").strip()
     34     if user:
     35         return user
     36     return getpass.getuser().strip()
     37 
     38 
     39 def ensure_admin_cli(*, script_name: str, dry_run: bool = False) -> str:
     40     operator = resolve_operator_user() or "root"
     41     if operator == "root":
     42         return operator
     43     allowed = resolve_allowed_admin_users()
     44     if operator in allowed:
     45         return operator
     46     allowed_list = ", ".join(sorted(allowed))
     47     print(
     48         f"Acesso negado em {script_name}: operador {operator!r} não está autorizado. "
     49         f"Permitidos: root, {allowed_list}.",
     50         file=sys.stderr,
     51     )
     52     raise SystemExit(1)