Skip to content

Commit 18f1585

Browse files
authored
fix(browser): restore proxy attachment media size cap (#43684)
* browser: honor shared proxy file size cap * test(browser): cover proxy file size cap * docs(changelog): note browser proxy size cap fix
1 parent 29dc654 commit 18f1585

3 files changed

Lines changed: 56 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ Docs: https://docs.openclaw.ai
130130
- Telegram/direct delivery: bridge direct delivery sends to internal `message:sent` hooks so internal hook listeners observe successful Telegram deliveries. (#40185) Thanks @vincentkoc.
131131
- Dependencies: refresh workspace dependencies except the pinned Carbon package, and harden ACP session-config writes against non-string SDK values so newer ACP clients fail fast instead of tripping type/runtime mismatches.
132132
- Telegram/polling restarts: clear bounded cleanup timeout handles after `runner.stop()` and `bot.stop()` settle so stall recovery no longer leaves stray 15-second timers behind on clean shutdown. (#43188) thanks @kyohwang.
133+
- Browser/proxy attachments: restore the shared media-store size cap for persisted browser proxy files so oversized payloads are rejected instead of overriding the intended 5 MB limit. (#43684) Thanks @vincentkoc.
133134

134135
## 2026.3.8
135136

src/browser/proxy-files.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import fs from "node:fs/promises";
2+
import path from "node:path";
3+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
4+
import { MEDIA_MAX_BYTES } from "../media/store.js";
5+
import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js";
6+
import { persistBrowserProxyFiles } from "./proxy-files.js";
7+
8+
describe("persistBrowserProxyFiles", () => {
9+
let tempHome: TempHomeEnv;
10+
11+
beforeEach(async () => {
12+
tempHome = await createTempHomeEnv("openclaw-browser-proxy-files-");
13+
});
14+
15+
afterEach(async () => {
16+
await tempHome.restore();
17+
});
18+
19+
it("persists browser proxy files under the shared media store", async () => {
20+
const sourcePath = "/tmp/proxy-file.txt";
21+
const mapping = await persistBrowserProxyFiles([
22+
{
23+
path: sourcePath,
24+
base64: Buffer.from("hello from browser proxy").toString("base64"),
25+
mimeType: "text/plain",
26+
},
27+
]);
28+
29+
const savedPath = mapping.get(sourcePath);
30+
expect(typeof savedPath).toBe("string");
31+
expect(path.normalize(savedPath ?? "")).toContain(
32+
`${path.sep}.openclaw${path.sep}media${path.sep}browser${path.sep}`,
33+
);
34+
await expect(fs.readFile(savedPath ?? "", "utf8")).resolves.toBe("hello from browser proxy");
35+
});
36+
37+
it("rejects browser proxy files that exceed the shared media size limit", async () => {
38+
const oversized = Buffer.alloc(MEDIA_MAX_BYTES + 1, 0x41);
39+
40+
await expect(
41+
persistBrowserProxyFiles([
42+
{
43+
path: "/tmp/oversized.bin",
44+
base64: oversized.toString("base64"),
45+
mimeType: "application/octet-stream",
46+
},
47+
]),
48+
).rejects.toThrow("Media exceeds 5MB limit");
49+
50+
await expect(
51+
fs.stat(path.join(tempHome.home, ".openclaw", "media", "browser")),
52+
).rejects.toThrow();
53+
});
54+
});

src/browser/proxy-files.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export async function persistBrowserProxyFiles(files: BrowserProxyFile[] | undef
1313
const mapping = new Map<string, string>();
1414
for (const file of files) {
1515
const buffer = Buffer.from(file.base64, "base64");
16-
const saved = await saveMediaBuffer(buffer, file.mimeType, "browser", buffer.byteLength);
16+
const saved = await saveMediaBuffer(buffer, file.mimeType, "browser");
1717
mapping.set(file.path, saved.path);
1818
}
1919
return mapping;

0 commit comments

Comments
 (0)