import json import pytest from plugins.argus_supervisor.helpers.models import SupervisorError from plugins.argus_supervisor.helpers.security import ( clean, endpoint, evidence_envelope, identifier, ) def test_masks_environment_tokens_headers_and_embedded_a2a_paths(monkeypatch): monkeypatch.setenv("OPENTRAINING_A2A_TOKEN", "private-test-token") value = clean( { "authorization": "Bearer private-test-token", "text": "https://host/a2a/t-private-test-token Bearer other-credential token=hidden", } ) text = json.dumps(value) assert all( secret not in text for secret in ("private-test-token", "other-credential", "hidden") ) assert "authorization" not in value def test_evidence_is_bounded_and_marked_untrusted(): envelope = evidence_envelope( {"html": "" * 10000, "token": "secret"} ) assert envelope["trust"] == "UNTRUSTED_REMOTE_DATA" assert len(json.dumps(envelope)) < 17000 and "secret" not in json.dumps(envelope) @pytest.mark.parametrize( "url", [ "http://host/a2a", "https://user:pass@host/a2a", "https://host/a2a/t-secret", "https://host/a2a?token=x", ], ) def test_configuration_refuses_unsafe_or_tokenized_endpoint(url): with pytest.raises(SupervisorError): endpoint(url) @pytest.mark.parametrize("value", ["../x", "/absolute", "", None]) def test_campaign_paths_cannot_escape(value): with pytest.raises(SupervisorError): identifier(value) def test_authenticated_api_classes_keep_normal_auth_csrf(): from plugins.argus_supervisor.api.campaign_action import CampaignAction from plugins.argus_supervisor.api.campaigns import Campaigns from plugins.argus_supervisor.api.health import Health from plugins.argus_supervisor.api.status import Status for cls in (CampaignAction, Campaigns, Health, Status): assert cls.requires_auth() and cls.requires_csrf() assert cls.get_methods() == ["POST"] @pytest.mark.asyncio @pytest.mark.parametrize("kind", ["argus", "foreman"]) async def test_model_process_environment_excludes_remote_credentials( tmp_path, monkeypatch, kind ): from plugins.argus_supervisor.helpers import runtime_bridge captured = {} monkeypatch.setenv("OPENTRAINING_A2A_TOKEN", "private-test-token") monkeypatch.setenv("TINYFISH_API_KEY", "private-fetch-key") monkeypatch.setenv("TYPESAFE_API_KEY", "private-model-key") class Process: pid = 987654321 returncode = 0 async def communicate(self, payload): captured["payload"] = payload.decode() return b'{"ok":true}', b"" async def wait(self): return 0 async def spawn(*args, **kwargs): captured.update(kwargs) return Process() monkeypatch.setattr(runtime_bridge.asyncio, "create_subprocess_exec", spawn) monkeypatch.setattr(runtime_bridge.os, "killpg", lambda *args: None) await runtime_bridge.invoke( "isolated-python", "worker.py", {"evidence": "private-test-token"}, tmp_path, kind=kind, ) assert "OPENTRAINING_A2A_TOKEN" not in captured["env"] assert "TINYFISH_API_KEY" not in captured["env"] assert "private-test-token" not in captured["payload"] assert ("TYPESAFE_API_KEY" in captured["env"]) == (kind == "foreman") assert ( captured["env"]["PIP_NO_INDEX"] == "1" and captured["start_new_session"] is True )