import { describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../config/config.js"; import { resolveCommandAuthorization } from "./command-auth.js"; import type { MsgContext } from "./templating.js"; import { installDiscordRegistryHooks } from "./test-helpers/command-auth-registry-fixture.js"; installDiscordRegistryHooks(); describe("senderIsOwner only reflects explicit owner authorization", () => { it("does not treat direct-message senders as owners when no ownerAllowFrom is configured", () => { const cfg = { channels: { discord: {} }, } as OpenClawConfig; const ctx = { Provider: "discord", Surface: "discord", ChatType: "direct", From: "discord:123", SenderId: "123", } as MsgContext; const auth = resolveCommandAuthorization({ ctx, cfg, commandAuthorized: true, }); expect(auth.senderIsOwner).toBe(false); expect(auth.isAuthorizedSender).toBe(true); }); it("does not treat group-chat senders as owners when no ownerAllowFrom is configured", () => { const cfg = { channels: { discord: {} }, } as OpenClawConfig; const ctx = { Provider: "discord", Surface: "discord", ChatType: "group", From: "discord:123", SenderId: "123", } as MsgContext; const auth = resolveCommandAuthorization({ ctx, cfg, commandAuthorized: true, }); expect(auth.senderIsOwner).toBe(false); expect(auth.isAuthorizedSender).toBe(true); }); it("senderIsOwner is false when ownerAllowFrom is configured and sender does not match", () => { const cfg = { channels: { discord: {} }, commands: { ownerAllowFrom: ["456"] }, } as OpenClawConfig; const ctx = { Provider: "discord", Surface: "discord", From: "discord:789", SenderId: "789", } as MsgContext; const auth = resolveCommandAuthorization({ ctx, cfg, commandAuthorized: true, }); expect(auth.senderIsOwner).toBe(false); }); it("senderIsOwner is true when ownerAllowFrom matches sender", () => { const cfg = { channels: { discord: {} }, commands: { ownerAllowFrom: ["456"] }, } as OpenClawConfig; const ctx = { Provider: "discord", Surface: "discord", From: "discord:456", SenderId: "456", } as MsgContext; const auth = resolveCommandAuthorization({ ctx, cfg, commandAuthorized: true, }); expect(auth.senderIsOwner).toBe(true); }); it("senderIsOwner is true when ownerAllowFrom is wildcard (*)", () => { const cfg = { channels: { discord: {} }, commands: { ownerAllowFrom: ["*"] }, } as OpenClawConfig; const ctx = { Provider: "discord", Surface: "discord", From: "discord:anyone", SenderId: "anyone", } as MsgContext; const auth = resolveCommandAuthorization({ ctx, cfg, commandAuthorized: true, }); expect(auth.senderIsOwner).toBe(true); }); it("senderIsOwner is true for internal operator.admin sessions", () => { const cfg = {} as OpenClawConfig; const ctx = { Provider: "webchat", Surface: "webchat", GatewayClientScopes: ["operator.admin"], } as MsgContext; const auth = resolveCommandAuthorization({ ctx, cfg, commandAuthorized: true, }); expect(auth.senderIsOwner).toBe(true); }); });