diff --git a/src/telegram/bot-access.test.ts b/src/telegram/bot-access.test.ts new file mode 100644 index 00000000000..b52e51faf87 --- /dev/null +++ b/src/telegram/bot-access.test.ts @@ -0,0 +1,15 @@ +import { describe, expect, it } from "vitest"; +import { normalizeAllowFrom } from "./bot-access.js"; + +describe("normalizeAllowFrom", () => { + it("accepts signed numeric Telegram IDs and rejects usernames", () => { + const result = normalizeAllowFrom(["-1001234567890", " tg:-100999 ", "745123456", "@someone"]); + + expect(result).toEqual({ + entries: ["-1001234567890", "-100999", "745123456"], + hasWildcard: false, + hasEntries: true, + invalidEntries: ["@someone"], + }); + }); +}); diff --git a/src/telegram/bot-access.ts b/src/telegram/bot-access.ts index d08a54616f0..ac1e70f12bf 100644 --- a/src/telegram/bot-access.ts +++ b/src/telegram/bot-access.ts @@ -44,11 +44,12 @@ export const normalizeAllowFrom = (list?: Array): NormalizedAll const normalized = entries .filter((value) => value !== "*") .map((value) => value.replace(/^(telegram|tg):/i, "")); - const invalidEntries = normalized.filter((value) => !/^\d+$/.test(value)); + // Support negative IDs for Telegram group/channel IDs (e.g., -1001234567890) + const invalidEntries = normalized.filter((value) => !/^-?\d+$/.test(value)); if (invalidEntries.length > 0) { warnInvalidAllowFromEntries([...new Set(invalidEntries)]); } - const ids = normalized.filter((value) => /^\d+$/.test(value)); + const ids = normalized.filter((value) => /^-?\d+$/.test(value)); return { entries: ids, hasWildcard,