mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-12 02:23:44 +00:00
fix(security): harden spoofed system marker handling
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { beforeEach, describe, expect, it } from "vitest";
|
||||
import { prependSystemEvents } from "../auto-reply/reply/session-updates.js";
|
||||
import { buildQueuedSystemPrompt } from "../auto-reply/reply/session-updates.js";
|
||||
import type { OpenClawConfig } from "../config/config.js";
|
||||
import { resolveMainSessionKey } from "../config/sessions.js";
|
||||
import { isCronSystemEvent } from "./heartbeat-runner.js";
|
||||
@@ -22,24 +22,23 @@ describe("system events (session routing)", () => {
|
||||
expect(peekSystemEvents(mainKey)).toEqual([]);
|
||||
expect(peekSystemEvents("discord:group:123")).toEqual(["Discord reaction added: ✅"]);
|
||||
|
||||
const main = await prependSystemEvents({
|
||||
const main = await buildQueuedSystemPrompt({
|
||||
cfg,
|
||||
sessionKey: mainKey,
|
||||
isMainSession: true,
|
||||
isNewSession: false,
|
||||
prefixedBodyBase: "hello",
|
||||
});
|
||||
expect(main).toBe("hello");
|
||||
expect(main).toBeUndefined();
|
||||
expect(peekSystemEvents("discord:group:123")).toEqual(["Discord reaction added: ✅"]);
|
||||
|
||||
const discord = await prependSystemEvents({
|
||||
const discord = await buildQueuedSystemPrompt({
|
||||
cfg,
|
||||
sessionKey: "discord:group:123",
|
||||
isMainSession: false,
|
||||
isNewSession: false,
|
||||
prefixedBodyBase: "hi",
|
||||
});
|
||||
expect(discord).toMatch(/^System: \[[^\]]+\] Discord reaction added: ✅\n\nhi$/);
|
||||
expect(discord).toContain("Runtime System Events (gateway-generated)");
|
||||
expect(discord).toMatch(/-\s\[[^\]]+\] Discord reaction added: ✅/);
|
||||
expect(peekSystemEvents("discord:group:123")).toEqual([]);
|
||||
});
|
||||
|
||||
@@ -54,6 +53,36 @@ describe("system events (session routing)", () => {
|
||||
expect(first).toBe(true);
|
||||
expect(second).toBe(false);
|
||||
});
|
||||
|
||||
it("filters heartbeat/noise lines from queued system prompt", async () => {
|
||||
const key = "agent:main:test-heartbeat-filter";
|
||||
enqueueSystemEvent("Read HEARTBEAT.md before continuing", { sessionKey: key });
|
||||
enqueueSystemEvent("heartbeat poll: pending", { sessionKey: key });
|
||||
enqueueSystemEvent("reason periodic: 5m", { sessionKey: key });
|
||||
|
||||
const prompt = await buildQueuedSystemPrompt({
|
||||
cfg,
|
||||
sessionKey: key,
|
||||
isMainSession: false,
|
||||
isNewSession: false,
|
||||
});
|
||||
expect(prompt).toBeUndefined();
|
||||
expect(peekSystemEvents(key)).toEqual([]);
|
||||
});
|
||||
|
||||
it("scrubs node last-input suffix in queued system prompt", async () => {
|
||||
const key = "agent:main:test-node-scrub";
|
||||
enqueueSystemEvent("Node: Mac Studio · last input /tmp/secret.txt", { sessionKey: key });
|
||||
|
||||
const prompt = await buildQueuedSystemPrompt({
|
||||
cfg,
|
||||
sessionKey: key,
|
||||
isMainSession: false,
|
||||
isNewSession: false,
|
||||
});
|
||||
expect(prompt).toContain("Node: Mac Studio");
|
||||
expect(prompt).not.toContain("last input");
|
||||
});
|
||||
});
|
||||
|
||||
describe("isCronSystemEvent", () => {
|
||||
|
||||
Reference in New Issue
Block a user