






















@@ -2,8 +2,12 @@
2233import { spawn } from "node:child_process";
44import { createHash } from "node:crypto";
5-import { chmod, copyFile, mkdir, readFile, rm, unlink, writeFile } from "node:fs/promises";
5+import { copyFile, mkdir, mkdtemp, readFile, rm, unlink, writeFile } from "node:fs/promises";
6+import { tmpdir } from "node:os";
7+import path from "node:path";
8+import { pathToFileURL } from "node:url";
69import { normalizeCredentialPayloadForKind } from "../../qa/convex-credential-broker/convex/payload-validation.js";
10+import { expandHome, writePrivateJson } from "./telegram-user-credential-paths.ts";
711812type JsonObject = Record<string, unknown>;
913@@ -38,16 +42,6 @@ function printUsage() {
3842);
3943}
404441-function expandHome(path: string) {
42-if (path === "~") {
43-return process.env.HOME || path;
44-}
45-if (path.startsWith("~/")) {
46-return `${process.env.HOME || "~"}${path.slice(1)}`;
47-}
48-return path;
49-}
50-5145function parseArgs(argv: string[]) {
5246const args = argv.slice(2);
5347const command = args[0] || usage();
@@ -168,17 +162,6 @@ async function tgzBase64(path: string) {
168162return (await readFile(path)).toString("base64");
169163}
170164171-async function writePrivateJson(path: string, payload: JsonObject) {
172-const expanded = expandHome(path);
173-await mkdir(expanded.slice(0, expanded.lastIndexOf("/")), { recursive: true });
174-await writeFile(expanded, `${JSON.stringify(payload, null, 2)}\n`, { mode: 0o600 });
175-await chmodPrivate(expanded);
176-}
177-178-async function chmodPrivate(path: string) {
179-await chmod(path, 0o600);
180-}
181-182165function runCommand(command: string, args: string[], cwd?: string) {
183166return new Promise<void>((resolve, reject) => {
184167const child = spawn(command, args, {
@@ -384,20 +367,17 @@ async function createTelegramUserPayload(opts: Map<string, string>) {
384367throw new Error("Missing group id in env, user-driver config, or bot credentials file.");
385368}
386369387-const tempRoot = `/tmp/openclaw-telegram-user-credential-${Date.now()}-${Math.random()
388- .toString(16)
389- .slice(2)}`;
390-const tdlibArchive = `${tempRoot}/tdlib.tgz`;
391-const desktopArchive = `${tempRoot}/desktop-tdata.tgz`;
392-await mkdir(tempRoot, { recursive: true });
370+const tempRoot = await mkdtemp(path.join(tmpdir(), "openclaw-telegram-user-credential-"));
371+const tdlibArchive = path.join(tempRoot, "tdlib.tgz");
372+const desktopArchive = path.join(tempRoot, "desktop-tdata.tgz");
393373try {
394374await runCommand("tar", ["-C", userDriverDir, "-czf", tdlibArchive, "db", "files"]);
395375if (desktopTdataArchiveInput) {
396376await copyFile(expandHome(desktopTdataArchiveInput), desktopArchive);
397377} else {
398378await runCommand("tar", [
399379"-C",
400-`${expandHome(desktopTdataDir!)}/..`,
380+path.dirname(expandHome(desktopTdataDir!)),
401381"--exclude",
402382"tdata/countries",
403383"--exclude",
@@ -458,12 +438,9 @@ async function restoreTelegramUserPayload(params: {
458438usage();
459439}
460440const payload = parseTelegramUserQaCredentialPayload(params.payload);
461-const tempRoot = `/tmp/openclaw-telegram-user-restore-${Date.now()}-${Math.random()
462- .toString(16)
463- .slice(2)}`;
464-const tdlibArchive = `${tempRoot}/tdlib.tgz`;
465-const desktopArchive = `${tempRoot}/desktop-tdata.tgz`;
466-await mkdir(tempRoot, { recursive: true });
441+const tempRoot = await mkdtemp(path.join(tmpdir(), "openclaw-telegram-user-restore-"));
442+const tdlibArchive = path.join(tempRoot, "tdlib.tgz");
443+const desktopArchive = path.join(tempRoot, "desktop-tdata.tgz");
467444await mkdir(expandHome(userDriverDir), { recursive: true });
468445await mkdir(expandHome(desktopWorkdir), { recursive: true });
469446try {
@@ -610,15 +587,21 @@ async function releaseTelegramUserLease(opts: Map<string, string>) {
610587);
611588}
612589613-const { command, opts } = parseArgs(process.argv);
614-if (command === "export") {
615-await createTelegramUserPayload(opts);
616-} else if (command === "restore") {
617-await restoreTelegramUserPayloadFromFile(opts);
618-} else if (command === "lease-restore") {
619-await leaseAndRestoreTelegramUser(opts);
620-} else if (command === "release") {
621-await releaseTelegramUserLease(opts);
622-} else {
623-usage();
590+async function main(argv = process.argv) {
591+const { command, opts } = parseArgs(argv);
592+if (command === "export") {
593+await createTelegramUserPayload(opts);
594+} else if (command === "restore") {
595+await restoreTelegramUserPayloadFromFile(opts);
596+} else if (command === "lease-restore") {
597+await leaseAndRestoreTelegramUser(opts);
598+} else if (command === "release") {
599+await releaseTelegramUserLease(opts);
600+} else {
601+usage();
602+}
603+}
604+605+if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
606+await main();
624607}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。