diff --git a/extensions/feishu/src/policy.ts b/extensions/feishu/src/policy.ts index 051c8bcdf..50eff9372 100644 --- a/extensions/feishu/src/policy.ts +++ b/extensions/feishu/src/policy.ts @@ -3,6 +3,7 @@ import type { ChannelGroupContext, GroupToolPolicyConfig, } from "openclaw/plugin-sdk/feishu"; +import { evaluateSenderGroupAccessForPolicy } from "openclaw/plugin-sdk/feishu"; import { normalizeFeishuTarget } from "./targets.js"; import type { FeishuConfig, FeishuGroupConfig } from "./types.js"; @@ -98,14 +99,12 @@ export function isFeishuGroupAllowed(params: { senderIds?: Array; senderName?: string | null; }): boolean { - const { groupPolicy } = params; - if (groupPolicy === "disabled") { - return false; - } - if (groupPolicy === "open" || groupPolicy === "allowall") { - return true; - } - return resolveFeishuAllowlistMatch(params).allowed; + return evaluateSenderGroupAccessForPolicy({ + groupPolicy: params.groupPolicy === "allowall" ? "open" : params.groupPolicy, + groupAllowFrom: params.allowFrom.map((entry) => String(entry)), + senderId: params.senderId, + isSenderAllowed: () => resolveFeishuAllowlistMatch(params).allowed, + }).allowed; } export function resolveFeishuReplyPolicy(params: { diff --git a/extensions/msteams/src/policy.ts b/extensions/msteams/src/policy.ts index b0fe16336..3d405f94c 100644 --- a/extensions/msteams/src/policy.ts +++ b/extensions/msteams/src/policy.ts @@ -10,6 +10,7 @@ import type { } from "openclaw/plugin-sdk/msteams"; import { buildChannelKeyCandidates, + evaluateSenderGroupAccessForPolicy, normalizeChannelSlug, resolveAllowlistMatchSimple, resolveToolsBySender, @@ -248,12 +249,10 @@ export function isMSTeamsGroupAllowed(params: { senderName?: string | null; allowNameMatching?: boolean; }): boolean { - const { groupPolicy } = params; - if (groupPolicy === "disabled") { - return false; - } - if (groupPolicy === "open") { - return true; - } - return resolveMSTeamsAllowlistMatch(params).allowed; + return evaluateSenderGroupAccessForPolicy({ + groupPolicy: params.groupPolicy, + groupAllowFrom: params.allowFrom.map((entry) => String(entry)), + senderId: params.senderId, + isSenderAllowed: () => resolveMSTeamsAllowlistMatch(params).allowed, + }).allowed; } diff --git a/src/plugin-sdk/feishu.ts b/src/plugin-sdk/feishu.ts index 425d13d7f..9ef52b143 100644 --- a/src/plugin-sdk/feishu.ts +++ b/src/plugin-sdk/feishu.ts @@ -57,6 +57,7 @@ export type { AnyAgentTool, OpenClawPluginApi } from "../plugins/types.js"; export { DEFAULT_ACCOUNT_ID, normalizeAgentId } from "../routing/session-key.js"; export type { RuntimeEnv } from "../runtime.js"; export { formatDocsLink } from "../terminal/links.js"; +export { evaluateSenderGroupAccessForPolicy } from "./group-access.js"; export type { WizardPrompter } from "../wizard/prompts.js"; export { buildAgentMediaPayload } from "./agent-media-payload.js"; export { readJsonFileWithFallback } from "./json-store.js"; diff --git a/src/signal/identity.ts b/src/signal/identity.ts index 244ebc2f6..965a9c88f 100644 --- a/src/signal/identity.ts +++ b/src/signal/identity.ts @@ -1,3 +1,4 @@ +import { evaluateSenderGroupAccessForPolicy } from "../plugin-sdk/group-access.js"; import { normalizeE164 } from "../utils.js"; export type SignalSender = @@ -129,15 +130,10 @@ export function isSignalGroupAllowed(params: { allowFrom: string[]; sender: SignalSender; }): boolean { - const { groupPolicy, allowFrom, sender } = params; - if (groupPolicy === "disabled") { - return false; - } - if (groupPolicy === "open") { - return true; - } - if (allowFrom.length === 0) { - return false; - } - return isSignalSenderAllowed(sender, allowFrom); + return evaluateSenderGroupAccessForPolicy({ + groupPolicy: params.groupPolicy, + groupAllowFrom: params.allowFrom, + senderId: params.sender.raw, + isSenderAllowed: () => isSignalSenderAllowed(params.sender, params.allowFrom), + }).allowed; }