diff --git a/server/src/__tests__/board-mutation-guard.test.ts b/server/src/__tests__/board-mutation-guard.test.ts index 6dc222d7..eb3721ab 100644 --- a/server/src/__tests__/board-mutation-guard.test.ts +++ b/server/src/__tests__/board-mutation-guard.test.ts @@ -5,7 +5,7 @@ import { boardMutationGuard } from "../middleware/board-mutation-guard.js"; function createApp( actorType: "board" | "agent", - boardSource: "session" | "local_implicit" | "board_key" = "session", + boardSource: "session" | "local_implicit" | "board_key" | "cloud_tenant" = "session", ) { const app = express(); app.use(express.json()); @@ -66,6 +66,12 @@ describe("boardMutationGuard", () => { expect([200, 204]).toContain(res.status); }); + it("allows trusted Cloud tenant mutations without origin", async () => { + const app = createApp("board", "cloud_tenant"); + const res = await request(app).post("/mutate").send({ ok: true }); + expect([200, 204]).toContain(res.status); + }); + it("allows board mutations from trusted origin", async () => { const app = createApp("board"); const res = await request(app) diff --git a/server/src/middleware/board-mutation-guard.ts b/server/src/middleware/board-mutation-guard.ts index 96e2a461..a6347b86 100644 --- a/server/src/middleware/board-mutation-guard.ts +++ b/server/src/middleware/board-mutation-guard.ts @@ -56,9 +56,14 @@ export function boardMutationGuard(): RequestHandler { return; } - // Local-trusted mode and board bearer keys are not browser-session requests. + // Local-trusted mode, board bearer keys, and trusted Cloud tenant calls are + // not browser-session requests. // In these modes, origin/referer headers can be absent; do not block those mutations. - if (req.actor.source === "local_implicit" || req.actor.source === "board_key") { + if ( + req.actor.source === "local_implicit" + || req.actor.source === "board_key" + || req.actor.source === "cloud_tenant" + ) { next(); return; }