| import { describe, expect, it } from "vitest"; |
| import { resolveNextcloudTalkAllowlistMatch, resolveNextcloudTalkGroupAllow } from "./policy.js"; |
|
|
| describe("nextcloud-talk policy", () => { |
| describe("resolveNextcloudTalkAllowlistMatch", () => { |
| it("allows wildcard", () => { |
| expect( |
| resolveNextcloudTalkAllowlistMatch({ |
| allowFrom: ["*"], |
| senderId: "user-id", |
| }).allowed, |
| ).toBe(true); |
| }); |
|
|
| it("allows sender id match with normalization", () => { |
| expect( |
| resolveNextcloudTalkAllowlistMatch({ |
| allowFrom: ["nc:User-Id"], |
| senderId: "user-id", |
| }), |
| ).toEqual({ allowed: true, matchKey: "user-id", matchSource: "id" }); |
| }); |
|
|
| it("blocks when sender id does not match", () => { |
| expect( |
| resolveNextcloudTalkAllowlistMatch({ |
| allowFrom: ["allowed"], |
| senderId: "other", |
| }).allowed, |
| ).toBe(false); |
| }); |
| }); |
|
|
| describe("resolveNextcloudTalkGroupAllow", () => { |
| it("blocks disabled policy", () => { |
| expect( |
| resolveNextcloudTalkGroupAllow({ |
| groupPolicy: "disabled", |
| outerAllowFrom: ["owner"], |
| innerAllowFrom: ["room-user"], |
| senderId: "owner", |
| }), |
| ).toEqual({ |
| allowed: false, |
| outerMatch: { allowed: false }, |
| innerMatch: { allowed: false }, |
| }); |
| }); |
|
|
| it("allows open policy", () => { |
| expect( |
| resolveNextcloudTalkGroupAllow({ |
| groupPolicy: "open", |
| outerAllowFrom: [], |
| innerAllowFrom: [], |
| senderId: "owner", |
| }), |
| ).toEqual({ |
| allowed: true, |
| outerMatch: { allowed: true }, |
| innerMatch: { allowed: true }, |
| }); |
| }); |
|
|
| it("blocks allowlist mode when both outer and inner allowlists are empty", () => { |
| expect( |
| resolveNextcloudTalkGroupAllow({ |
| groupPolicy: "allowlist", |
| outerAllowFrom: [], |
| innerAllowFrom: [], |
| senderId: "owner", |
| }), |
| ).toEqual({ |
| allowed: false, |
| outerMatch: { allowed: false }, |
| innerMatch: { allowed: false }, |
| }); |
| }); |
|
|
| it("requires inner match when only room-specific allowlist is configured", () => { |
| expect( |
| resolveNextcloudTalkGroupAllow({ |
| groupPolicy: "allowlist", |
| outerAllowFrom: [], |
| innerAllowFrom: ["room-user"], |
| senderId: "room-user", |
| }), |
| ).toEqual({ |
| allowed: true, |
| outerMatch: { allowed: false }, |
| innerMatch: { allowed: true, matchKey: "room-user", matchSource: "id" }, |
| }); |
| }); |
|
|
| it("blocks when outer allowlist misses even if inner allowlist matches", () => { |
| expect( |
| resolveNextcloudTalkGroupAllow({ |
| groupPolicy: "allowlist", |
| outerAllowFrom: ["team-owner"], |
| innerAllowFrom: ["room-user"], |
| senderId: "room-user", |
| }), |
| ).toEqual({ |
| allowed: false, |
| outerMatch: { allowed: false }, |
| innerMatch: { allowed: true, matchKey: "room-user", matchSource: "id" }, |
| }); |
| }); |
|
|
| it("allows when both outer and inner allowlists match", () => { |
| expect( |
| resolveNextcloudTalkGroupAllow({ |
| groupPolicy: "allowlist", |
| outerAllowFrom: ["team-owner"], |
| innerAllowFrom: ["room-user"], |
| senderId: "team-owner", |
| }), |
| ).toEqual({ |
| allowed: false, |
| outerMatch: { allowed: true, matchKey: "team-owner", matchSource: "id" }, |
| innerMatch: { allowed: false }, |
| }); |
|
|
| expect( |
| resolveNextcloudTalkGroupAllow({ |
| groupPolicy: "allowlist", |
| outerAllowFrom: ["shared-user"], |
| innerAllowFrom: ["shared-user"], |
| senderId: "shared-user", |
| }), |
| ).toEqual({ |
| allowed: true, |
| outerMatch: { allowed: true, matchKey: "shared-user", matchSource: "id" }, |
| innerMatch: { allowed: true, matchKey: "shared-user", matchSource: "id" }, |
| }); |
| }); |
| }); |
| }); |
|
|