Repository navigation
fix(meetings): keep a shared agenda's private folders and sources private - #325
Conversation
…vate The Keycloak integration suites (not run in CI) failed on dev. Fixing them showed that a shared agenda handed the owner's private data to other viewers. Privacy fix, in the shared meeting service, so the web API, MCP user callers and the MCP service client get the same viewer-correct data. With an agenda filed into Organization and private folders: - Folders: each viewer sees only folders they can see (the owner their own, a receiver of a person-shared folder their received filing, curators, the Organization account and the service client the Organization's folders), in detail, lists, the folderId filter (which no longer reveals a hidden folder) and meetingFolderPaths (whose fallback no longer leaks a name). - Suggestions: a stored suggestion is returned only when every recording, task and mail source is visible to the viewer, withdrawn sources included. Generation applies the same rule to previous suggestions and sourced points before anything reaches the model, so a curator's run cannot paraphrase the owner's private text. - taskSourceItemId and snapshotSourceItemId are null when hidden. - Meeting-list task counts count only visible tasks. The owner's view and all write permissions are unchanged. Keycloak suites: - SSO and MCP sign-in import and remove their own realm (the browser e2e realm), so all suites run against one bare local Keycloak; before, they needed the docker-compose.e2e.sso.yml realm pre-imported. - The service client's tool lists include the meeting (#293) and task (#264) tools, with assertions that they return only Organization data. - Curator: the owner of a shared recording writes it like a curator since #221; non-owner members and administrators are still refused. closes #324
Review: fix(meetings): keep a shared agenda's private folders and sources privateFixes a real privacy leak: an agenda filed into both an Organization folder and the owner's private folder previously exposed the union of both folders' folders/suggestions/sources to every viewer. The fix centralizes viewer-scoped projection in the shared meeting service ( Verdict: APPROVE Findings: Blocker 0 | Critical 0 | Major 0 | Minor 0 | Nit 0 FindingsNone. Specifically checked and found correct:
Missing testsNone found — |
Summary
The Keycloak integration suites don't run in CI, and on
dev7 of their tests failed (#324). While fixing them, the MCP authorization suite showed that a shared agenda handed the owner's private data to other viewers. This PR fixes that leak and brings the suites up to date.Privacy fix
The fix lives in the shared meeting service, so the web API (
/api/meetings/*), MCP user callers and the MCP service client all get the same data for each viewer. The setting: an agenda filed into an Organization folder and into a private folder of its owner.folderIdfilter (which no longer reveals that a hidden folder exists) andmeetingFolderPaths(whose fallback no longer leaks a name).taskSourceItemIdandsnapshotSourceItemIdarenullwhen the viewer cannot see them.The owner's own view and all write permissions are unchanged. No schema, env or compose changes.
Keycloak suites
docker-compose.e2e.sso.ymlrealm imported beforehand. On a bare Keycloak they failedTesting
src/tests/regressions/324-shared-agenda-privacy.integration.test.ts: checks each viewer (owner, receiver, curator, Organization account, service client) for folders, suggestions (read and generation), source ids and counts. Each case fails ondev.*.keycloak.integration.test.tsfiles pass against Keycloak 26.7.2 (88 tests, single worker).To run the Keycloak suites: start a bare Keycloak, then set
KEYCLOAK_TEST_ISSUER=http://<host>:<port>/realms/mastertogether withTEST_DATABASE_URL.