diff --git a/tests/tools/test_tool_backend_helpers.py b/tests/tools/test_tool_backend_helpers.py index e3d6cf0711c..03bb7f20d7a 100644 --- a/tests/tools/test_tool_backend_helpers.py +++ b/tests/tools/test_tool_backend_helpers.py @@ -242,6 +242,20 @@ class TestHasDirectModalCredentials: with patch.object(Path, "home", return_value=tmp_path): assert has_direct_modal_credentials() is True + def test_home_dir_permission_denied(self, monkeypatch): + """PermissionError on Path.home() should not crash (issue #33525).""" + monkeypatch.delenv("MODAL_TOKEN_ID", raising=False) + monkeypatch.delenv("MODAL_TOKEN_SECRET", raising=False) + with patch.object(Path, "home", side_effect=PermissionError("denied")): + assert has_direct_modal_credentials() is False + + def test_home_dir_permission_denied_with_env_vars(self, monkeypatch): + """PermissionError on Path.home() should not prevent env var detection.""" + monkeypatch.setenv("MODAL_TOKEN_ID", "id-123") + monkeypatch.setenv("MODAL_TOKEN_SECRET", "sec-456") + with patch.object(Path, "home", side_effect=PermissionError("denied")): + assert has_direct_modal_credentials() is True + # --------------------------------------------------------------------------- # prefers_gateway diff --git a/tools/tool_backend_helpers.py b/tools/tool_backend_helpers.py index c4320c68432..b1e0f834c7e 100644 --- a/tools/tool_backend_helpers.py +++ b/tools/tool_backend_helpers.py @@ -84,9 +84,13 @@ def normalize_modal_mode(value: object | None) -> str: def has_direct_modal_credentials() -> bool: """Return True when direct Modal credentials/config are available.""" + try: + modal_file_exists = (Path.home() / ".modal.toml").exists() + except (PermissionError, OSError): + modal_file_exists = False return bool( (os.getenv("MODAL_TOKEN_ID") and os.getenv("MODAL_TOKEN_SECRET")) - or (Path.home() / ".modal.toml").exists() + or modal_file_exists )