Skip to content

Commit 3285a10

Browse files
committed
fix(scripts): shell quote Telegram Crabbox remotes
1 parent e451a4e commit 3285a10

2 files changed

Lines changed: 61 additions & 10 deletions

File tree

scripts/e2e/telegram-user-crabbox-proof.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,9 +1463,9 @@ async function sshRun(
14631463
});
14641464
}
14651465

1466-
function renderRemoteSetup(params: { tdlibSha256?: string; tdlibUrl?: string }) {
1467-
const tdlibSha256 = JSON.stringify(params.tdlibSha256 ?? "");
1468-
const tdlibUrl = JSON.stringify(params.tdlibUrl ?? "");
1466+
export function renderRemoteSetup(params: { tdlibSha256?: string; tdlibUrl?: string }) {
1467+
const tdlibSha256 = shellQuote(params.tdlibSha256 ?? "");
1468+
const tdlibUrl = shellQuote(params.tdlibUrl ?? "");
14691469
return `#!/usr/bin/env bash
14701470
set -euo pipefail
14711471
root=${REMOTE_ROOT}
@@ -1617,10 +1617,10 @@ sleep 6
16171617
`;
16181618
}
16191619

1620-
function renderSelectDesktopChat(params: { chatTitle: string }) {
1620+
export function renderSelectDesktopChat(params: { chatTitle: string }) {
16211621
return `#!/usr/bin/env bash
16221622
set -euo pipefail
1623-
chat_title=${JSON.stringify(params.chatTitle)}
1623+
chat_title=${shellQuote(params.chatTitle)}
16241624
export DISPLAY="\${DISPLAY:-:99}"
16251625
win="$(wmctrl -l | awk 'tolower($0) ~ /telegram/ {print $1; exit}')"
16261626
test -n "$win"
@@ -1639,7 +1639,7 @@ sleep 1
16391639
`;
16401640
}
16411641

1642-
function renderRemoteProbe(params: {
1642+
export function renderRemoteProbe(params: {
16431643
expect: string[];
16441644
outputPath?: string;
16451645
sutUsername: string;
@@ -1659,12 +1659,12 @@ function renderRemoteProbe(params: {
16591659
for (const expected of params.expect) {
16601660
args.push("--expect", expected);
16611661
}
1662-
const escapedArgs = args.map((arg) => JSON.stringify(arg)).join(" ");
1662+
const escapedArgs = args.map(shellQuote).join(" ");
16631663
return `#!/usr/bin/env bash
16641664
set -euo pipefail
16651665
root=${REMOTE_ROOT}
16661666
export TELEGRAM_USER_DRIVER_STATE_DIR="$root/user-driver"
1667-
export TELEGRAM_USER_DRIVER_SUT_USERNAME=${JSON.stringify(params.sutUsername)}
1667+
export TELEGRAM_USER_DRIVER_SUT_USERNAME=${shellQuote(params.sutUsername)}
16681668
python3 "$root/user-driver.py" ${escapedArgs}
16691669
`;
16701670
}
@@ -1926,7 +1926,7 @@ async function writeRemoteSessionScripts(params: {
19261926
params.inspect,
19271927
`cat >${REMOTE_ROOT}/env.sh <<'EOF'
19281928
export TELEGRAM_USER_DRIVER_STATE_DIR=${REMOTE_ROOT}/user-driver
1929-
export TELEGRAM_USER_DRIVER_SUT_USERNAME=${params.sutUsername}
1929+
export TELEGRAM_USER_DRIVER_SUT_USERNAME=${shellQuote(params.sutUsername)}
19301930
EOF
19311931
`,
19321932
);
@@ -1956,7 +1956,7 @@ async function stopRemoteRecording(root: string, inspect: CrabboxInspect, sessio
19561956
root,
19571957
inspect,
19581958
`set -euo pipefail
1959-
pid_file=${JSON.stringify(session.recorder.pidFile)}
1959+
pid_file=${shellQuote(session.recorder.pidFile)}
19601960
if [ -s "$pid_file" ]; then
19611961
pid="$(cat "$pid_file")"
19621962
kill -INT "$pid" >/dev/null 2>&1 || true

test/scripts/telegram-user-crabbox-proof.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import {
1313
recordProbeVideo,
1414
REMOTE_SETUP_COMMAND_TIMEOUT_MS,
1515
renderLaunchDesktop,
16+
renderRemoteProbe,
17+
renderRemoteSetup,
18+
renderSelectDesktopChat,
1619
runCommand,
1720
startLocalSut,
1821
waitForLog,
@@ -197,6 +200,54 @@ describe("telegram user Crabbox proof log polling", () => {
197200
expect(script).not.toContain('cat "$root/telegram-desktop.log"');
198201
});
199202

203+
it("shell-quotes generated remote setup and chat literals", () => {
204+
const payload = "name $(touch /tmp/openclaw-proof-injected) `touch /tmp/also-injected`";
205+
206+
expect(renderRemoteSetup({ tdlibSha256: payload, tdlibUrl: payload })).toContain(
207+
`tdlib_url='${payload}'`,
208+
);
209+
expect(renderSelectDesktopChat({ chatTitle: payload })).toContain(`chat_title='${payload}'`);
210+
});
211+
212+
posixIt("does not expand generated remote probe arguments in the shell", () => {
213+
const root = makeTempDir();
214+
const fakePython = path.join(root, "python3");
215+
const scriptPath = path.join(root, "remote-probe.sh");
216+
const argvPath = path.join(root, "argv.json");
217+
const injectedPath = path.join(root, "injected");
218+
const payload = `literal ' $(touch ${injectedPath})`;
219+
writeExecutable(
220+
fakePython,
221+
`#!/usr/bin/env node
222+
import fs from "node:fs";
223+
fs.writeFileSync(process.env.OPENCLAW_TEST_ARGV_PATH, JSON.stringify(process.argv.slice(1)));
224+
`,
225+
);
226+
writeExecutable(
227+
scriptPath,
228+
renderRemoteProbe({
229+
expect: [payload],
230+
sutUsername: payload,
231+
text: payload,
232+
timeoutMs: 1000,
233+
}),
234+
);
235+
236+
const result = spawnSync("bash", [scriptPath], {
237+
cwd: root,
238+
encoding: "utf8",
239+
env: {
240+
...process.env,
241+
OPENCLAW_TEST_ARGV_PATH: argvPath,
242+
PATH: `${root}${path.delimiter}${process.env.PATH ?? ""}`,
243+
},
244+
});
245+
246+
expect(result.status).toBe(0);
247+
expect(fs.existsSync(injectedPath)).toBe(false);
248+
expect(JSON.parse(fs.readFileSync(argvPath, "utf8"))).toContain(payload);
249+
});
250+
200251
posixIt("kills timed-out command process groups when the leader exits first", async () => {
201252
const root = makeTempDir();
202253
const scriptPath = path.join(root, "trap-term.mjs");

0 commit comments

Comments
 (0)