import { describe, expect, it, vi } from "vitest"; import { startWebhookServer } from "./monitor.test-harness.js"; import { generateNextcloudTalkSignature } from "./signature.js"; describe("createNextcloudTalkWebhookServer backend allowlist", () => { it("rejects requests from unexpected backend origins", async () => { const onMessage = vi.fn(async () => {}); const harness = await startWebhookServer({ path: "/nextcloud-backend-check", isBackendAllowed: (backend) => backend === "https://nextcloud.expected", onMessage, }); const payload = { type: "Create", actor: { type: "Person", id: "alice", name: "Alice" }, object: { type: "Note", id: "msg-1", name: "hello", content: "hello", mediaType: "text/plain", }, target: { type: "Collection", id: "room-1", name: "Room 1" }, }; const body = JSON.stringify(payload); const { random, signature } = generateNextcloudTalkSignature({ body, secret: "nextcloud-secret", }); const response = await fetch(harness.webhookUrl, { method: "POST", headers: { "content-type": "application/json", "x-nextcloud-talk-random": random, "x-nextcloud-talk-signature": signature, "x-nextcloud-talk-backend": "https://nextcloud.unexpected", }, body, }); expect(response.status).toBe(401); expect(await response.json()).toEqual({ error: "Invalid backend" }); expect(onMessage).not.toHaveBeenCalled(); }); });