refactor: share config adapter allowFrom and defaultTo helpers

This commit is contained in:
Peter Steinberger
2026-03-07 23:02:59 +00:00
parent feac26c3b7
commit 556aa8a702
17 changed files with 100 additions and 57 deletions

View File

@@ -2,6 +2,7 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
collectOpenGroupPolicyRestrictSendersWarnings, collectOpenGroupPolicyRestrictSendersWarnings,
formatNormalizedAllowFromEntries, formatNormalizedAllowFromEntries,
mapAllowFromEntries,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import type { import type {
ChannelAccountSnapshot, ChannelAccountSnapshot,
@@ -115,9 +116,7 @@ export const bluebubblesPlugin: ChannelPlugin<ResolvedBlueBubblesAccount> = {
baseUrl: account.baseUrl, baseUrl: account.baseUrl,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveBlueBubblesAccount({ cfg: cfg, accountId }).config.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveBlueBubblesAccount({ cfg: cfg, accountId }).config.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatNormalizedAllowFromEntries({ formatNormalizedAllowFromEntries({
allowFrom, allowFrom,

View File

@@ -2,6 +2,8 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
collectOpenGroupPolicyConfiguredRouteWarnings, collectOpenGroupPolicyConfiguredRouteWarnings,
formatAllowFromLowercase, formatAllowFromLowercase,
mapAllowFromEntries,
resolveOptionalConfigString,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
applyAccountNameToChannelSection, applyAccountNameToChannelSection,
@@ -114,12 +116,10 @@ export const discordPlugin: ChannelPlugin<ResolvedDiscordAccount> = {
tokenSource: account.tokenSource, tokenSource: account.tokenSource,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveDiscordAccount({ cfg, accountId }).config.dm?.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveDiscordAccount({ cfg, accountId }).config.dm?.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFromLowercase({ allowFrom }), formatAllowFrom: ({ allowFrom }) => formatAllowFromLowercase({ allowFrom }),
resolveDefaultTo: ({ cfg, accountId }) => resolveDefaultTo: ({ cfg, accountId }) =>
resolveDiscordAccount({ cfg, accountId }).config.defaultTo?.trim() || undefined, resolveOptionalConfigString(resolveDiscordAccount({ cfg, accountId }).config.defaultTo),
}, },
security: { security: {
resolveDmPolicy: ({ cfg, accountId, account }) => { resolveDmPolicy: ({ cfg, accountId, account }) => {

View File

@@ -1,6 +1,7 @@
import { import {
collectOpenGroupPolicyRestrictSendersWarnings, collectOpenGroupPolicyRestrictSendersWarnings,
formatAllowFromLowercase, formatAllowFromLowercase,
mapAllowFromEntries,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import type { ChannelMeta, ChannelPlugin, ClawdbotConfig } from "openclaw/plugin-sdk/feishu"; import type { ChannelMeta, ChannelPlugin, ClawdbotConfig } from "openclaw/plugin-sdk/feishu";
import { import {
@@ -252,7 +253,7 @@ export const feishuPlugin: ChannelPlugin<ResolvedFeishuAccount> = {
}), }),
resolveAllowFrom: ({ cfg, accountId }) => { resolveAllowFrom: ({ cfg, accountId }) => {
const account = resolveFeishuAccount({ cfg, accountId }); const account = resolveFeishuAccount({ cfg, accountId });
return (account.config?.allowFrom ?? []).map((entry) => String(entry)); return mapAllowFromEntries(account.config?.allowFrom);
}, },
formatAllowFrom: ({ allowFrom }) => formatAllowFromLowercase({ allowFrom }), formatAllowFrom: ({ allowFrom }) => formatAllowFromLowercase({ allowFrom }),
}, },

View File

@@ -2,6 +2,8 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
buildOpenGroupPolicyConfigureRouteAllowlistWarning, buildOpenGroupPolicyConfigureRouteAllowlistWarning,
formatNormalizedAllowFromEntries, formatNormalizedAllowFromEntries,
mapAllowFromEntries,
resolveOptionalConfigString,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
applyAccountNameToChannelSection, applyAccountNameToChannelSection,
@@ -69,9 +71,7 @@ export const googlechatDock: ChannelDock = {
outbound: { textChunkLimit: 4000 }, outbound: { textChunkLimit: 4000 },
config: { config: {
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveGoogleChatAccount({ cfg: cfg, accountId }).config.dm?.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveGoogleChatAccount({ cfg: cfg, accountId }).config.dm?.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatNormalizedAllowFromEntries({ formatNormalizedAllowFromEntries({
allowFrom, allowFrom,
@@ -177,19 +177,19 @@ export const googlechatPlugin: ChannelPlugin<ResolvedGoogleChatAccount> = {
credentialSource: account.credentialSource, credentialSource: account.credentialSource,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
( mapAllowFromEntries(
resolveGoogleChatAccount({ resolveGoogleChatAccount({
cfg: cfg, cfg: cfg,
accountId, accountId,
}).config.dm?.allowFrom ?? [] }).config.dm?.allowFrom,
).map((entry) => String(entry)), ),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatNormalizedAllowFromEntries({ formatNormalizedAllowFromEntries({
allowFrom, allowFrom,
normalizeEntry: formatAllowFromEntry, normalizeEntry: formatAllowFromEntry,
}), }),
resolveDefaultTo: ({ cfg, accountId }) => resolveDefaultTo: ({ cfg, accountId }) =>
resolveGoogleChatAccount({ cfg, accountId }).config.defaultTo?.trim() || undefined, resolveOptionalConfigString(resolveGoogleChatAccount({ cfg, accountId }).config.defaultTo),
}, },
security: { security: {
resolveDmPolicy: ({ cfg, accountId, account }) => { resolveDmPolicy: ({ cfg, accountId, account }) => {

View File

@@ -2,6 +2,8 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
buildOpenGroupPolicyWarning, buildOpenGroupPolicyWarning,
formatNormalizedAllowFromEntries, formatNormalizedAllowFromEntries,
mapAllowFromEntries,
resolveOptionalConfigString,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
buildBaseAccountStatusSnapshot, buildBaseAccountStatusSnapshot,
@@ -115,8 +117,8 @@ export const ircPlugin: ChannelPlugin<ResolvedIrcAccount, IrcProbe> = {
passwordSource: account.passwordSource, passwordSource: account.passwordSource,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveIrcAccount({ cfg: cfg as CoreConfig, accountId }).config.allowFrom ?? []).map( mapAllowFromEntries(
(entry) => String(entry), resolveIrcAccount({ cfg: cfg as CoreConfig, accountId }).config.allowFrom,
), ),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatNormalizedAllowFromEntries({ formatNormalizedAllowFromEntries({
@@ -124,8 +126,9 @@ export const ircPlugin: ChannelPlugin<ResolvedIrcAccount, IrcProbe> = {
normalizeEntry: normalizeIrcAllowEntry, normalizeEntry: normalizeIrcAllowEntry,
}), }),
resolveDefaultTo: ({ cfg, accountId }) => resolveDefaultTo: ({ cfg, accountId }) =>
resolveIrcAccount({ cfg: cfg as CoreConfig, accountId }).config.defaultTo?.trim() || resolveOptionalConfigString(
undefined, resolveIrcAccount({ cfg: cfg as CoreConfig, accountId }).config.defaultTo,
),
}, },
security: { security: {
resolveDmPolicy: ({ cfg, accountId, account }) => { resolveDmPolicy: ({ cfg, accountId, account }) => {

View File

@@ -1,6 +1,7 @@
import { import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
collectOpenGroupPolicyRestrictSendersWarnings, collectOpenGroupPolicyRestrictSendersWarnings,
mapAllowFromEntries,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
buildChannelConfigSchema, buildChannelConfigSchema,
@@ -147,10 +148,10 @@ export const linePlugin: ChannelPlugin<ResolvedLineAccount> = {
tokenSource: account.tokenSource ?? undefined, tokenSource: account.tokenSource ?? undefined,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
( mapAllowFromEntries(
getLineRuntime().channel.line.resolveLineAccount({ cfg, accountId: accountId ?? undefined }) getLineRuntime().channel.line.resolveLineAccount({ cfg, accountId: accountId ?? undefined })
.config.allowFrom ?? [] .config.allowFrom,
).map((entry) => String(entry)), ),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
allowFrom allowFrom
.map((entry) => String(entry).trim()) .map((entry) => String(entry).trim())

View File

@@ -1,6 +1,7 @@
import { import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
buildOpenGroupPolicyWarning, buildOpenGroupPolicyWarning,
mapAllowFromEntries,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
applyAccountNameToChannelSection, applyAccountNameToChannelSection,
@@ -156,7 +157,7 @@ export const matrixPlugin: ChannelPlugin<ResolvedMatrixAccount> = {
}), }),
resolveAllowFrom: ({ cfg, accountId }) => { resolveAllowFrom: ({ cfg, accountId }) => {
const matrixConfig = resolveMatrixAccountConfig({ cfg: cfg as CoreConfig, accountId }); const matrixConfig = resolveMatrixAccountConfig({ cfg: cfg as CoreConfig, accountId });
return (matrixConfig.dm?.allowFrom ?? []).map((entry: string | number) => String(entry)); return mapAllowFromEntries(matrixConfig.dm?.allowFrom);
}, },
formatAllowFrom: ({ allowFrom }) => normalizeMatrixAllowList(allowFrom), formatAllowFrom: ({ allowFrom }) => normalizeMatrixAllowList(allowFrom),
}, },

View File

@@ -2,6 +2,7 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
collectOpenGroupPolicyRestrictSendersWarnings, collectOpenGroupPolicyRestrictSendersWarnings,
formatNormalizedAllowFromEntries, formatNormalizedAllowFromEntries,
mapAllowFromEntries,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
applyAccountNameToChannelSection, applyAccountNameToChannelSection,
@@ -276,9 +277,7 @@ export const mattermostPlugin: ChannelPlugin<ResolvedMattermostAccount> = {
baseUrl: account.baseUrl, baseUrl: account.baseUrl,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveMattermostAccount({ cfg, accountId }).config.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveMattermostAccount({ cfg, accountId }).config.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatNormalizedAllowFromEntries({ formatNormalizedAllowFromEntries({
allowFrom, allowFrom,

View File

@@ -2,6 +2,7 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
collectOpenGroupPolicyRouteAllowlistWarnings, collectOpenGroupPolicyRouteAllowlistWarnings,
formatAllowFromLowercase, formatAllowFromLowercase,
mapAllowFromEntries,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
applyAccountNameToChannelSection, applyAccountNameToChannelSection,
@@ -109,9 +110,9 @@ export const nextcloudTalkPlugin: ChannelPlugin<ResolvedNextcloudTalkAccount> =
baseUrl: account.baseUrl ? "[set]" : "[missing]", baseUrl: account.baseUrl ? "[set]" : "[missing]",
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
( mapAllowFromEntries(
resolveNextcloudTalkAccount({ cfg: cfg as CoreConfig, accountId }).config.allowFrom ?? [] resolveNextcloudTalkAccount({ cfg: cfg as CoreConfig, accountId }).config.allowFrom,
).map((entry) => String(entry).toLowerCase()), ).map((entry) => entry.toLowerCase()),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatAllowFromLowercase({ formatAllowFromLowercase({
allowFrom, allowFrom,

View File

@@ -1,6 +1,8 @@
import { import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
collectOpenGroupPolicyRestrictSendersWarnings, collectOpenGroupPolicyRestrictSendersWarnings,
mapAllowFromEntries,
resolveOptionalConfigString,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
applyAccountNameToChannelSection, applyAccountNameToChannelSection,
@@ -143,9 +145,7 @@ export const signalPlugin: ChannelPlugin<ResolvedSignalAccount> = {
baseUrl: account.baseUrl, baseUrl: account.baseUrl,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveSignalAccount({ cfg, accountId }).config.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveSignalAccount({ cfg, accountId }).config.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
allowFrom allowFrom
.map((entry) => String(entry).trim()) .map((entry) => String(entry).trim())
@@ -153,7 +153,7 @@ export const signalPlugin: ChannelPlugin<ResolvedSignalAccount> = {
.map((entry) => (entry === "*" ? "*" : normalizeE164(entry.replace(/^signal:/i, "")))) .map((entry) => (entry === "*" ? "*" : normalizeE164(entry.replace(/^signal:/i, ""))))
.filter(Boolean), .filter(Boolean),
resolveDefaultTo: ({ cfg, accountId }) => resolveDefaultTo: ({ cfg, accountId }) =>
resolveSignalAccount({ cfg, accountId }).config.defaultTo?.trim() || undefined, resolveOptionalConfigString(resolveSignalAccount({ cfg, accountId }).config.defaultTo),
}, },
security: { security: {
resolveDmPolicy: ({ cfg, accountId, account }) => { resolveDmPolicy: ({ cfg, accountId, account }) => {

View File

@@ -2,6 +2,8 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
collectOpenGroupPolicyConfiguredRouteWarnings, collectOpenGroupPolicyConfiguredRouteWarnings,
formatAllowFromLowercase, formatAllowFromLowercase,
mapAllowFromEntries,
resolveOptionalConfigString,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
applyAccountNameToChannelSection, applyAccountNameToChannelSection,
@@ -166,10 +168,10 @@ export const slackPlugin: ChannelPlugin<ResolvedSlackAccount> = {
appTokenSource: account.appTokenSource, appTokenSource: account.appTokenSource,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveSlackAccount({ cfg, accountId }).dm?.allowFrom ?? []).map((entry) => String(entry)), mapAllowFromEntries(resolveSlackAccount({ cfg, accountId }).dm?.allowFrom),
formatAllowFrom: ({ allowFrom }) => formatAllowFromLowercase({ allowFrom }), formatAllowFrom: ({ allowFrom }) => formatAllowFromLowercase({ allowFrom }),
resolveDefaultTo: ({ cfg, accountId }) => resolveDefaultTo: ({ cfg, accountId }) =>
resolveSlackAccount({ cfg, accountId }).config.defaultTo?.trim() || undefined, resolveOptionalConfigString(resolveSlackAccount({ cfg, accountId }).config.defaultTo),
}, },
security: { security: {
resolveDmPolicy: ({ cfg, accountId, account }) => { resolveDmPolicy: ({ cfg, accountId, account }) => {

View File

@@ -2,6 +2,8 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
collectOpenGroupPolicyRouteAllowlistWarnings, collectOpenGroupPolicyRouteAllowlistWarnings,
formatAllowFromLowercase, formatAllowFromLowercase,
mapAllowFromEntries,
resolveOptionalConfigString,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import { import {
applyAccountNameToChannelSection, applyAccountNameToChannelSection,
@@ -176,15 +178,11 @@ export const telegramPlugin: ChannelPlugin<ResolvedTelegramAccount, TelegramProb
tokenSource: account.tokenSource, tokenSource: account.tokenSource,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveTelegramAccount({ cfg, accountId }).config.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveTelegramAccount({ cfg, accountId }).config.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(telegram|tg):/i }), formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(telegram|tg):/i }),
resolveDefaultTo: ({ cfg, accountId }) => { resolveDefaultTo: ({ cfg, accountId }) =>
const val = resolveTelegramAccount({ cfg, accountId }).config.defaultTo; resolveOptionalConfigString(resolveTelegramAccount({ cfg, accountId }).config.defaultTo),
return val != null ? String(val) : undefined;
},
}, },
security: { security: {
resolveDmPolicy: ({ cfg, accountId, account }) => { resolveDmPolicy: ({ cfg, accountId, account }) => {

View File

@@ -2,6 +2,7 @@ import {
buildAccountScopedDmSecurityPolicy, buildAccountScopedDmSecurityPolicy,
buildOpenGroupPolicyRestrictSendersWarning, buildOpenGroupPolicyRestrictSendersWarning,
buildOpenGroupPolicyWarning, buildOpenGroupPolicyWarning,
mapAllowFromEntries,
} from "openclaw/plugin-sdk"; } from "openclaw/plugin-sdk";
import type { import type {
ChannelAccountSnapshot, ChannelAccountSnapshot,
@@ -76,9 +77,7 @@ export const zaloDock: ChannelDock = {
outbound: { textChunkLimit: 2000 }, outbound: { textChunkLimit: 2000 },
config: { config: {
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveZaloAccount({ cfg: cfg, accountId }).config.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveZaloAccount({ cfg: cfg, accountId }).config.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(zalo|zl):/i }), formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(zalo|zl):/i }),
}, },
@@ -133,9 +132,7 @@ export const zaloPlugin: ChannelPlugin<ResolvedZaloAccount> = {
tokenSource: account.tokenSource, tokenSource: account.tokenSource,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveZaloAccount({ cfg: cfg, accountId }).config.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveZaloAccount({ cfg: cfg, accountId }).config.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(zalo|zl):/i }), formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(zalo|zl):/i }),
}, },

View File

@@ -1,4 +1,4 @@
import { buildAccountScopedDmSecurityPolicy } from "openclaw/plugin-sdk"; import { buildAccountScopedDmSecurityPolicy, mapAllowFromEntries } from "openclaw/plugin-sdk";
import type { import type {
ChannelAccountSnapshot, ChannelAccountSnapshot,
ChannelDirectoryEntry, ChannelDirectoryEntry,
@@ -208,9 +208,7 @@ export const zalouserDock: ChannelDock = {
outbound: { textChunkLimit: 2000 }, outbound: { textChunkLimit: 2000 },
config: { config: {
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveZalouserAccountSync({ cfg: cfg, accountId }).config.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveZalouserAccountSync({ cfg: cfg, accountId }).config.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(zalouser|zlu):/i }), formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(zalouser|zlu):/i }),
}, },
@@ -273,9 +271,7 @@ export const zalouserPlugin: ChannelPlugin<ResolvedZalouserAccount> = {
configured: undefined, configured: undefined,
}), }),
resolveAllowFrom: ({ cfg, accountId }) => resolveAllowFrom: ({ cfg, accountId }) =>
(resolveZalouserAccountSync({ cfg: cfg, accountId }).config.allowFrom ?? []).map((entry) => mapAllowFromEntries(resolveZalouserAccountSync({ cfg: cfg, accountId }).config.allowFrom),
String(entry),
),
formatAllowFrom: ({ allowFrom }) => formatAllowFrom: ({ allowFrom }) =>
formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(zalouser|zlu):/i }), formatAllowFromLowercase({ allowFrom, stripPrefixRe: /^(zalouser|zlu):/i }),
}, },

View File

@@ -0,0 +1,27 @@
import { describe, expect, it } from "vitest";
import { mapAllowFromEntries, resolveOptionalConfigString } from "./channel-config-helpers.js";
describe("mapAllowFromEntries", () => {
it("coerces allowFrom entries to strings", () => {
expect(mapAllowFromEntries(["user", 42, null])).toEqual(["user", "42", "null"]);
});
it("returns empty list for missing input", () => {
expect(mapAllowFromEntries(undefined)).toEqual([]);
});
});
describe("resolveOptionalConfigString", () => {
it("trims and returns string values", () => {
expect(resolveOptionalConfigString(" room:123 ")).toBe("room:123");
});
it("coerces numeric values", () => {
expect(resolveOptionalConfigString(123)).toBe("123");
});
it("returns undefined for empty values", () => {
expect(resolveOptionalConfigString(" ")).toBeUndefined();
expect(resolveOptionalConfigString(undefined)).toBeUndefined();
});
});

View File

@@ -4,10 +4,26 @@ import { resolveIMessageAccount } from "../imessage/accounts.js";
import { normalizeAccountId } from "../routing/session-key.js"; import { normalizeAccountId } from "../routing/session-key.js";
import { resolveWhatsAppAccount } from "../web/accounts.js"; import { resolveWhatsAppAccount } from "../web/accounts.js";
export function mapAllowFromEntries(
allowFrom: Array<string | number> | null | undefined,
): string[] {
return (allowFrom ?? []).map((entry) => String(entry));
}
export function formatTrimmedAllowFromEntries(allowFrom: Array<string | number>): string[] { export function formatTrimmedAllowFromEntries(allowFrom: Array<string | number>): string[] {
return allowFrom.map((entry) => String(entry).trim()).filter(Boolean); return allowFrom.map((entry) => String(entry).trim()).filter(Boolean);
} }
export function resolveOptionalConfigString(
value: string | number | null | undefined,
): string | undefined {
if (value == null) {
return undefined;
}
const normalized = String(value).trim();
return normalized || undefined;
}
export function resolveWhatsAppConfigAllowFrom(params: { export function resolveWhatsAppConfigAllowFrom(params: {
cfg: OpenClawConfig; cfg: OpenClawConfig;
accountId?: string | null; accountId?: string | null;
@@ -33,12 +49,12 @@ export function resolveIMessageConfigAllowFrom(params: {
cfg: OpenClawConfig; cfg: OpenClawConfig;
accountId?: string | null; accountId?: string | null;
}): string[] { }): string[] {
return (resolveIMessageAccount(params).config.allowFrom ?? []).map((entry) => String(entry)); return mapAllowFromEntries(resolveIMessageAccount(params).config.allowFrom);
} }
export function resolveIMessageConfigDefaultTo(params: { export function resolveIMessageConfigDefaultTo(params: {
cfg: OpenClawConfig; cfg: OpenClawConfig;
accountId?: string | null; accountId?: string | null;
}): string | undefined { }): string | undefined {
return resolveIMessageAccount(params).config.defaultTo?.trim() || undefined; return resolveOptionalConfigString(resolveIMessageAccount(params).config.defaultTo);
} }

View File

@@ -378,6 +378,8 @@ export { SILENT_REPLY_TOKEN, isSilentReplyText } from "../auto-reply/tokens.js";
export { formatInboundFromLabel } from "../auto-reply/envelope.js"; export { formatInboundFromLabel } from "../auto-reply/envelope.js";
export { export {
formatTrimmedAllowFromEntries, formatTrimmedAllowFromEntries,
mapAllowFromEntries,
resolveOptionalConfigString,
formatWhatsAppConfigAllowFromEntries, formatWhatsAppConfigAllowFromEntries,
resolveIMessageConfigAllowFrom, resolveIMessageConfigAllowFrom,
resolveIMessageConfigDefaultTo, resolveIMessageConfigDefaultTo,