
































@@ -6,7 +6,6 @@ import { copyFile, mkdir, mkdtemp, readFile, rm, unlink, writeFile } from "node:
66import { tmpdir } from "node:os";
77import path from "node:path";
88import { pathToFileURL } from "node:url";
9-import { normalizeCredentialPayloadForKind } from "../../qa/convex-credential-broker/convex/payload-validation.js";
109import { fetchJsonWithTimeout, runCommand } from "./telegram-user-credential-io.ts";
1110import { expandHome, writePrivateJson } from "./telegram-user-credential-paths.ts";
1211@@ -18,6 +17,9 @@ const DEFAULT_BOT_CREDENTIALS_FILE =
1817const DEFAULT_CONVEX_ENV_FILE = "~/.codex/skills/custom/telegram-e2e-bot-to-bot/convex.local.env";
1918const CHUNKED_PAYLOAD_MARKER = "__openclawQaCredentialPayloadChunksV1";
2019const TELEGRAM_USER_QA_CREDENTIAL_KIND = "telegram-user";
20+const SHA256_HEX_RE = /^[a-f0-9]{64}$/u;
21+const TELEGRAM_CHAT_ID_RE = /^-?\d+$/u;
22+const TELEGRAM_USER_ID_RE = /^\d+$/u;
2123const DEFAULT_CHUNKED_PAYLOAD_MAX_BYTES = 64 * 1024 * 1024;
2224const DEFAULT_CHUNKED_PAYLOAD_MAX_CHUNKS = 4096;
2325const COMMAND_TIMEOUT_MS = optionalPositiveInteger(
@@ -175,8 +177,83 @@ function optionalPositiveInteger(value: string | undefined, fallback: number, la
175177return parsed;
176178}
177179180+function throwCredentialPayloadError(message: string): never {
181+throw new Error(message);
182+}
183+184+function requireTelegramUserPayloadString(payload: Record<string, unknown>, key: string): string {
185+const raw = payload[key];
186+if (typeof raw !== "string") {
187+throwCredentialPayloadError(
188+`Credential payload for kind "${TELEGRAM_USER_QA_CREDENTIAL_KIND}" must include "${key}" as a string.`,
189+);
190+}
191+const value = raw.trim();
192+if (!value) {
193+throwCredentialPayloadError(
194+`Credential payload for kind "${TELEGRAM_USER_QA_CREDENTIAL_KIND}" must include a non-empty "${key}" value.`,
195+);
196+}
197+return value;
198+}
199+178200function parseTelegramUserQaCredentialPayload(payload: Record<string, unknown>): JsonObject {
179-return normalizeCredentialPayloadForKind(TELEGRAM_USER_QA_CREDENTIAL_KIND, payload);
201+const groupId = requireTelegramUserPayloadString(payload, "groupId");
202+if (!TELEGRAM_CHAT_ID_RE.test(groupId)) {
203+throwCredentialPayloadError(
204+'Credential payload for kind "telegram-user" must include a numeric "groupId" string.',
205+);
206+}
207+const testerUserId = requireTelegramUserPayloadString(payload, "testerUserId");
208+if (!TELEGRAM_USER_ID_RE.test(testerUserId)) {
209+throwCredentialPayloadError(
210+'Credential payload for kind "telegram-user" must include a numeric "testerUserId" string.',
211+);
212+}
213+const telegramApiId = requireTelegramUserPayloadString(payload, "telegramApiId");
214+if (!TELEGRAM_USER_ID_RE.test(telegramApiId)) {
215+throwCredentialPayloadError(
216+'Credential payload for kind "telegram-user" must include a numeric "telegramApiId" string.',
217+);
218+}
219+const tdlibArchiveSha256 = requireTelegramUserPayloadString(
220+payload,
221+"tdlibArchiveSha256",
222+).toLowerCase();
223+const desktopTdataArchiveSha256 = requireTelegramUserPayloadString(
224+payload,
225+"desktopTdataArchiveSha256",
226+).toLowerCase();
227+if (!SHA256_HEX_RE.test(tdlibArchiveSha256)) {
228+throwCredentialPayloadError(
229+'Credential payload for kind "telegram-user" must include "tdlibArchiveSha256" as a SHA-256 hex string.',
230+);
231+}
232+if (!SHA256_HEX_RE.test(desktopTdataArchiveSha256)) {
233+throwCredentialPayloadError(
234+'Credential payload for kind "telegram-user" must include "desktopTdataArchiveSha256" as a SHA-256 hex string.',
235+);
236+}
237+238+return {
239+ groupId,
240+sutToken: requireTelegramUserPayloadString(payload, "sutToken"),
241+ testerUserId,
242+testerUsername: requireTelegramUserPayloadString(payload, "testerUsername"),
243+ telegramApiId,
244+telegramApiHash: requireTelegramUserPayloadString(payload, "telegramApiHash"),
245+tdlibDatabaseEncryptionKey: requireTelegramUserPayloadString(
246+payload,
247+"tdlibDatabaseEncryptionKey",
248+),
249+tdlibArchiveBase64: requireTelegramUserPayloadString(payload, "tdlibArchiveBase64"),
250+ tdlibArchiveSha256,
251+desktopTdataArchiveBase64: requireTelegramUserPayloadString(
252+payload,
253+"desktopTdataArchiveBase64",
254+),
255+ desktopTdataArchiveSha256,
256+};
180257}
181258182259async function fileSha256(pathValue: string) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。