feat: register local agent project workspaces

This commit is contained in:
Hamza Ayed
2026-10-04 01:57:44 +03:00
parent d29275043a
commit 1feeb372a4
12 changed files with 806 additions and 45 deletions
+75
View File
@@ -320,6 +320,81 @@ class AuthenticationTests(unittest.TestCase):
self.assertEqual(second_own.status_code, 200, second_own.text)
self.assertEqual(second_own.json()["files"], ["two.md"])
def test_desktop_project_registration_grants_only_selected_folder_to_owner(self) -> None:
_first_user, first_token = self._register()
_second_user, second_token = self._register()
with tempfile.TemporaryDirectory() as directory:
root = Path(directory) / "sample-project"
root.mkdir()
(root / "README.md").write_text("project details", encoding="utf-8")
first_headers = {"Authorization": f"Bearer {first_token}"}
second_headers = {"Authorization": f"Bearer {second_token}"}
registered = self.client.post(
"/v1/agent/projects",
headers=first_headers,
json={"workspace_path": str(root)},
)
first_files = self.client.post(
"/v1/agent/workspace/files",
headers=first_headers,
json={"workspace_path": str(root)},
)
second_files = self.client.post(
"/v1/agent/workspace/files",
headers=second_headers,
json={"workspace_path": str(root)},
)
overlap_registration = self.client.post(
"/v1/agent/projects",
headers=second_headers,
json={"workspace_path": str(root.parent)},
)
revoked = self.client.request(
"DELETE",
"/v1/agent/projects",
headers=first_headers,
json={"workspace_path": str(root)},
)
after_revoke = self.client.post(
"/v1/agent/workspace/files",
headers=first_headers,
json={"workspace_path": str(root)},
)
self.assertEqual(registered.status_code, 201, registered.text)
self.assertEqual(registered.json()["files"], ["README.md"])
self.assertEqual(first_files.status_code, 200, first_files.text)
self.assertEqual(second_files.status_code, 403, second_files.text)
self.assertEqual(overlap_registration.status_code, 409, overlap_registration.text)
self.assertEqual(revoked.status_code, 200, revoked.text)
self.assertTrue(revoked.json()["removed"])
self.assertEqual(after_revoke.status_code, 403, after_revoke.text)
def test_deleted_project_folder_can_still_be_unregistered(self) -> None:
_user_id, token = self._register()
with tempfile.TemporaryDirectory() as directory:
root = Path(directory) / "vanished-project"
root.mkdir()
headers = {"Authorization": f"Bearer {token}"}
registered = self.client.post(
"/v1/agent/projects",
headers=headers,
json={"workspace_path": str(root)},
)
self.assertEqual(registered.status_code, 201, registered.text)
root.rmdir()
revoked = self.client.request(
"DELETE",
"/v1/agent/projects",
headers=headers,
json={"workspace_path": str(root)},
)
self.assertEqual(revoked.status_code, 200, revoked.text)
self.assertTrue(revoked.json()["removed"])
def test_local_bootstrap_is_restricted_to_loopback_clients(self) -> None:
remote_client = TestClient(app, client=("192.0.2.10", 43210))
remote = remote_client.post("/v1/auth/local-session", json={})