ml-intern / tests /unit /test_sandbox_api_auth.py
lewtun's picture
lewtun HF Staff
Make sandboxes private (#195)
15d6506 unverified
from fastapi.testclient import TestClient
from agent.tools.sandbox_client import _SANDBOX_SERVER, Sandbox
def _sandbox_app(
monkeypatch,
token: str | None = "sandbox-secret",
*,
hf_token: str | None = None,
):
monkeypatch.delenv("SANDBOX_API_TOKEN", raising=False)
monkeypatch.delenv("HF_TOKEN", raising=False)
if token is not None:
monkeypatch.setenv("SANDBOX_API_TOKEN", token)
if hf_token is not None:
monkeypatch.setenv("HF_TOKEN", hf_token)
namespace = {}
exec(_SANDBOX_SERVER, namespace)
return namespace["app"]
def test_health_is_public(monkeypatch):
client = TestClient(_sandbox_app(monkeypatch))
response = client.get("/api/health")
assert response.status_code == 200
assert response.json() == {"status": "ok"}
def test_file_and_command_routes_require_bearer_token(monkeypatch):
client = TestClient(_sandbox_app(monkeypatch, "sandbox-secret"))
response = client.post("/api/exists", json={"path": "/tmp"})
assert response.status_code == 401
def test_file_and_command_routes_reject_authorization_bearer_token(monkeypatch):
client = TestClient(_sandbox_app(monkeypatch, "sandbox-secret"))
response = client.post(
"/api/exists",
json={"path": "/tmp"},
headers={"Authorization": "Bearer sandbox-secret"},
)
assert response.status_code == 401
def test_file_and_command_routes_accept_sandbox_header_with_hf_bearer(monkeypatch):
client = TestClient(
_sandbox_app(monkeypatch, "sandbox-secret", hf_token="hf-secret")
)
response = client.post(
"/api/exists",
json={"path": "/tmp"},
headers={
"Authorization": "Bearer hf-secret",
"X-Sandbox-Authorization": "Bearer sandbox-secret",
},
)
assert response.status_code == 200
assert response.json()["success"] is True
def test_hf_bearer_alone_is_rejected_when_sandbox_token_is_configured(monkeypatch):
client = TestClient(
_sandbox_app(monkeypatch, "sandbox-secret", hf_token="hf-secret")
)
response = client.post(
"/api/exists",
json={"path": "/tmp"},
headers={"Authorization": "Bearer hf-secret"},
)
assert response.status_code == 401
def test_legacy_hf_token_fallback_is_rejected(monkeypatch):
client = TestClient(_sandbox_app(monkeypatch, token=None, hf_token="hf-secret"))
response = client.post(
"/api/exists",
json={"path": "/tmp"},
headers={"Authorization": "Bearer hf-secret"},
)
assert response.status_code == 503
def test_protected_routes_fail_closed_without_configured_token(monkeypatch):
client = TestClient(_sandbox_app(monkeypatch, None))
response = client.post(
"/api/exists",
json={"path": "/tmp"},
headers={"Authorization": "Bearer anything"},
)
assert response.status_code == 503
def test_sandbox_sends_hub_auth_and_control_plane_header():
sandbox = Sandbox("owner/name", token="hf-token", api_token="sandbox-secret")
assert sandbox._client.headers["authorization"] == "Bearer hf-token"
assert sandbox._client.headers["x-sandbox-authorization"] == "Bearer sandbox-secret"
def test_sandbox_api_token_is_hidden_from_repr():
sandbox = Sandbox("owner/name", token="hf-token", api_token="sandbox-secret")
assert "sandbox-secret" not in repr(sandbox)