diff --git a/src/channels/telegram/allow-from.ts b/src/channels/telegram/allow-from.ts new file mode 100644 index 0000000000..d1e0209bc2 --- /dev/null +++ b/src/channels/telegram/allow-from.ts @@ -0,0 +1,11 @@ +export function normalizeTelegramAllowFromEntry(raw: unknown): string { + const base = typeof raw === "string" ? raw : typeof raw === "number" ? String(raw) : ""; + return base + .trim() + .replace(/^(telegram|tg):/i, "") + .trim(); +} + +export function isNumericTelegramUserId(raw: string): boolean { + return /^\d+$/.test(raw); +} diff --git a/src/commands/doctor-config-flow.ts b/src/commands/doctor-config-flow.ts index 511141e366..287a2ac8ca 100644 --- a/src/commands/doctor-config-flow.ts +++ b/src/commands/doctor-config-flow.ts @@ -3,6 +3,10 @@ import fs from "node:fs/promises"; import path from "node:path"; import type { OpenClawConfig } from "../config/config.js"; import type { DoctorOptions } from "./doctor-prompter.js"; +import { + isNumericTelegramUserId, + normalizeTelegramAllowFromEntry, +} from "../channels/telegram/allow-from.js"; import { formatCliCommand } from "../cli/command-format.js"; import { OpenClawSchema, @@ -143,18 +147,6 @@ function noteOpencodeProviderOverrides(cfg: OpenClawConfig) { note(lines.join("\n"), "OpenCode Zen"); } -function normalizeTelegramAllowFromEntry(raw: unknown): string { - const base = typeof raw === "string" ? raw : typeof raw === "number" ? String(raw) : ""; - return base - .trim() - .replace(/^(telegram|tg):/i, "") - .trim(); -} - -function isNumericTelegramUserId(raw: string): boolean { - return /^\d+$/.test(raw); -} - type TelegramAllowFromUsernameHit = { path: string; entry: string }; function scanTelegramAllowFromUsernameEntries(cfg: OpenClawConfig): TelegramAllowFromUsernameHit[] { diff --git a/src/security/audit-channel.ts b/src/security/audit-channel.ts index ee55f7b23a..d862212626 100644 --- a/src/security/audit-channel.ts +++ b/src/security/audit-channel.ts @@ -3,6 +3,10 @@ import type { ChannelId } from "../channels/plugins/types.js"; import type { OpenClawConfig } from "../config/config.js"; import type { SecurityAuditFinding, SecurityAuditSeverity } from "./audit.js"; import { resolveChannelDefaultAccountId } from "../channels/plugins/helpers.js"; +import { + isNumericTelegramUserId, + normalizeTelegramAllowFromEntry, +} from "../channels/telegram/allow-from.js"; import { formatCliCommand } from "../cli/command-format.js"; import { resolveNativeCommandsEnabled, resolveNativeSkillsEnabled } from "../config/commands.js"; import { readChannelAllowFromStore } from "../pairing/pairing-store.js"; @@ -14,18 +18,6 @@ function normalizeAllowFromList(list: Array | undefined | null) return list.map((v) => String(v).trim()).filter(Boolean); } -function normalizeTelegramAllowFromEntry(raw: unknown): string { - const base = typeof raw === "string" ? raw : typeof raw === "number" ? String(raw) : ""; - return base - .trim() - .replace(/^(telegram|tg):/i, "") - .trim(); -} - -function isNumericTelegramUserId(raw: string): boolean { - return /^\d+$/.test(raw); -} - function classifyChannelWarningSeverity(message: string): SecurityAuditSeverity { const s = message.toLowerCase(); if (