Skip to content

Commit b4c1a55

Browse files
committed
fix: validate windows task script file names
1 parent b25a0d0 commit b4c1a55

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

src/daemon/schtasks.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,32 @@ describe("resolveTaskScriptPath", () => {
149149
env: { HOME: "/home/test", OPENCLAW_PROFILE: "default" },
150150
expected: path.join("/home/test", ".openclaw", "gateway.cmd"),
151151
},
152+
{
153+
name: "uses a custom task script file name inside the state directory",
154+
env: {
155+
USERPROFILE: "C:\\Users\\test",
156+
OPENCLAW_TASK_SCRIPT_NAME: "gateway-node.cmd",
157+
},
158+
expected: path.join("C:\\Users\\test", ".openclaw", "gateway-node.cmd"),
159+
},
152160
])("$name", ({ env, expected }) => {
153161
expect(resolveTaskScriptPath(env)).toBe(expected);
154162
});
163+
164+
it.each([
165+
"../gateway.cmd",
166+
"..\\gateway.cmd",
167+
"nested/gateway.cmd",
168+
"nested\\gateway.cmd",
169+
"gateway..cmd",
170+
])("rejects non-file task script name %s", (scriptName) => {
171+
expect(() =>
172+
resolveTaskScriptPath({
173+
USERPROFILE: "C:\\Users\\test",
174+
OPENCLAW_TASK_SCRIPT_NAME: scriptName,
175+
}),
176+
).toThrow("OPENCLAW_TASK_SCRIPT_NAME must be a file name only");
177+
});
155178
});
156179

157180
describe("readScheduledTaskCommand", () => {

src/daemon/schtasks.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ export function resolveTaskScriptPath(env: GatewayServiceEnv): string {
5050
return override;
5151
}
5252
const scriptName = env.OPENCLAW_TASK_SCRIPT_NAME?.trim() || "gateway.cmd";
53+
if (/[/\\]|\.\./.test(scriptName)) {
54+
throw new Error(
55+
`OPENCLAW_TASK_SCRIPT_NAME must be a file name only, not a path: ${scriptName}`,
56+
);
57+
}
5358
const stateDir = resolveGatewayStateDir(env);
5459
return path.join(stateDir, scriptName);
5560
}

0 commit comments

Comments
 (0)