fix(commands): restrict commands.allowFrom to sender principals

This commit is contained in:
Peter Steinberger
2026-02-24 02:00:54 +00:00
parent 223d7dc23d
commit 08e2aa44e7
3 changed files with 111 additions and 1 deletions

View File

@@ -343,6 +343,79 @@ describe("resolveCommandAuthorization", () => {
expect(auth.isAuthorizedSender).toBe(true);
});
it("does not treat conversation ids in From as sender identities", () => {
const cfg = {
commands: {
allowFrom: {
discord: ["channel:123456789012345678"],
},
},
} as OpenClawConfig;
const auth = resolveCommandAuthorization({
ctx: {
Provider: "discord",
Surface: "discord",
ChatType: "channel",
From: "discord:channel:123456789012345678",
SenderId: "999999999999999999",
} as MsgContext,
cfg,
commandAuthorized: false,
});
expect(auth.isAuthorizedSender).toBe(false);
});
it("still falls back to From for direct messages when sender fields are absent", () => {
const cfg = {
commands: {
allowFrom: {
discord: ["123456789012345678"],
},
},
} as OpenClawConfig;
const auth = resolveCommandAuthorization({
ctx: {
Provider: "discord",
Surface: "discord",
ChatType: "direct",
From: "discord:123456789012345678",
SenderId: " ",
SenderE164: " ",
} as MsgContext,
cfg,
commandAuthorized: false,
});
expect(auth.isAuthorizedSender).toBe(true);
});
it("does not fall back to conversation-shaped From when chat type is missing", () => {
const cfg = {
commands: {
allowFrom: {
"*": ["120363411111111111@g.us"],
},
},
} as OpenClawConfig;
const auth = resolveCommandAuthorization({
ctx: {
Provider: "whatsapp",
Surface: "whatsapp",
From: "120363411111111111@g.us",
SenderId: " ",
SenderE164: " ",
} as MsgContext,
cfg,
commandAuthorized: false,
});
expect(auth.isAuthorizedSender).toBe(false);
});
it("normalizes Discord commands.allowFrom prefixes and mentions", () => {
const cfg = {
commands: {