From 44b2cceebe19338eb90b3d46ede85e1b108cc985 Mon Sep 17 00:00:00 2001 From: Jarvis AI Team Date: Sat, 16 May 2026 22:22:21 +0800 Subject: [PATCH 1/2] fix: do not escape callstack fields in sanitizeMetadata (#103) --- src/util.ts | 12 ++++++++- tests/sanitize-metadata.test.ts | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/sanitize-metadata.test.ts diff --git a/src/util.ts b/src/util.ts index 538f985..f355833 100644 --- a/src/util.ts +++ b/src/util.ts @@ -21,7 +21,17 @@ export interface Options/g, ">").replace(/--/g, "--"); + if (!obj) return "null"; + // Extract callstack-related fields that should be preserved unescaped for linking + const { stack, callstack, caller, ...content } = obj; + // Escape content fields normally + const escapedContent = JSON.stringify(content, null, 2).replace(//g, ">").replace(/--/g, "--"); + const contentObj = JSON.parse(escapedContent); + // Merge callstack fields back without additional escaping (they are safe values) + if (stack !== undefined) contentObj.stack = stack; + if (callstack !== undefined) contentObj.callstack = callstack; + if (caller !== undefined) contentObj.caller = caller; + return JSON.stringify(contentObj, null, 2); } /** diff --git a/tests/sanitize-metadata.test.ts b/tests/sanitize-metadata.test.ts new file mode 100644 index 0000000..dd5626d --- /dev/null +++ b/tests/sanitize-metadata.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, it } from "@jest/globals"; +import { sanitizeMetadata } from "../src/util"; + +describe("sanitizeMetadata", () => { + it("escapes dangerous characters in content fields", () => { + const obj = { + message: "", + status: 200, + }; + const result = sanitizeMetadata(obj); + expect(result).toContain("<script>"); + expect(result).not.toContain("