fix (commands): keep webchat auth on internal provider

This commit is contained in:
Vignesh Natarajan
2026-02-16 11:30:31 -08:00
parent 72e228e14b
commit e95134ba3f
2 changed files with 38 additions and 1 deletions

View File

@@ -4,6 +4,7 @@ import type { OpenClawConfig } from "../config/config.js";
import type { MsgContext } from "./templating.js";
import { getChannelDock, listChannelDocks } from "../channels/dock.js";
import { normalizeAnyChannelId } from "../channels/registry.js";
import { INTERNAL_MESSAGE_CHANNEL, normalizeMessageChannel } from "../utils/message-channel.js";
export type CommandAuthorization = {
providerId?: ChannelId;
@@ -16,7 +17,15 @@ export type CommandAuthorization = {
};
function resolveProviderFromContext(ctx: MsgContext, cfg: OpenClawConfig): ChannelId | undefined {
const explicitMessageChannel =
normalizeMessageChannel(ctx.Provider) ??
normalizeMessageChannel(ctx.Surface) ??
normalizeMessageChannel(ctx.OriginatingChannel);
if (explicitMessageChannel === INTERNAL_MESSAGE_CHANNEL) {
return undefined;
}
const direct =
normalizeAnyChannelId(explicitMessageChannel ?? undefined) ??
normalizeAnyChannelId(ctx.Provider) ??
normalizeAnyChannelId(ctx.Surface) ??
normalizeAnyChannelId(ctx.OriginatingChannel);
@@ -27,7 +36,13 @@ function resolveProviderFromContext(ctx: MsgContext, cfg: OpenClawConfig): Chann
.filter((value): value is string => Boolean(value?.trim()))
.flatMap((value) => value.split(":").map((part) => part.trim()));
for (const candidate of candidates) {
const normalized = normalizeAnyChannelId(candidate);
const normalizedCandidateChannel = normalizeMessageChannel(candidate);
if (normalizedCandidateChannel === INTERNAL_MESSAGE_CHANNEL) {
return undefined;
}
const normalized =
normalizeAnyChannelId(normalizedCandidateChannel ?? undefined) ??
normalizeAnyChannelId(candidate);
if (normalized) {
return normalized;
}

View File

@@ -212,6 +212,28 @@ describe("resolveCommandAuthorization", () => {
expect(auth.ownerList).toEqual(["123"]);
});
it("does not infer a provider from channel allowlists for webchat command contexts", () => {
const cfg = {
channels: { whatsapp: { allowFrom: ["+15551234567"] } },
} as OpenClawConfig;
const ctx = {
Provider: "webchat",
Surface: "webchat",
OriginatingChannel: "webchat",
SenderId: "openclaw-control-ui",
} as MsgContext;
const auth = resolveCommandAuthorization({
ctx,
cfg,
commandAuthorized: true,
});
expect(auth.providerId).toBeUndefined();
expect(auth.isAuthorizedSender).toBe(true);
});
describe("commands.allowFrom", () => {
const commandsAllowFromConfig = {
commands: {