summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/utils
diff options
context:
space:
mode:
authorLuke Parker <[email protected]>2026-03-09 20:26:53 +1000
committerGitHub <[email protected]>2026-03-09 20:26:53 +1000
commitf27ef595f65aa719be3f8d08665d683e95083ed3 (patch)
tree052aa60b17e4ca671cda1f752ceff9865a280bee /packages/app/src/utils
parent34328828ae9d28afe28202d8122a6983a6b2dc0f (diff)
downloadopencode-f27ef595f65aa719be3f8d08665d683e95083ed3.tar.gz
opencode-f27ef595f65aa719be3f8d08665d683e95083ed3.zip
fix(app): sanitize workspace store filenames on Windows (#16703)
Diffstat (limited to 'packages/app/src/utils')
-rw-r--r--packages/app/src/utils/persist.test.ts8
-rw-r--r--packages/app/src/utils/persist.ts3
2 files changed, 10 insertions, 1 deletions
diff --git a/packages/app/src/utils/persist.test.ts b/packages/app/src/utils/persist.test.ts
index 2a2c349b7..673acd224 100644
--- a/packages/app/src/utils/persist.test.ts
+++ b/packages/app/src/utils/persist.test.ts
@@ -104,4 +104,12 @@ describe("persist localStorage resilience", () => {
const result = persistTesting.normalize({ value: "ok" }, '{"value":"\\x"}')
expect(result).toBeUndefined()
})
+
+ test("workspace storage sanitizes Windows filename characters", () => {
+ const result = persistTesting.workspaceStorage("C:\\Users\\foo")
+
+ expect(result).toStartWith("opencode.workspace.")
+ expect(result.endsWith(".dat")).toBeTrue()
+ expect(/[:\\/]/.test(result)).toBeFalse()
+ })
})
diff --git a/packages/app/src/utils/persist.ts b/packages/app/src/utils/persist.ts
index 91c504742..bee2f3e7d 100644
--- a/packages/app/src/utils/persist.ts
+++ b/packages/app/src/utils/persist.ts
@@ -204,7 +204,7 @@ function normalize(defaults: unknown, raw: string, migrate?: (value: unknown) =>
}
function workspaceStorage(dir: string) {
- const head = dir.slice(0, 12) || "workspace"
+ const head = (dir.slice(0, 12) || "workspace").replace(/[^a-zA-Z0-9._-]/g, "-")
const sum = checksum(dir) ?? "0"
return `opencode.workspace.${head}.${sum}.dat`
}
@@ -300,6 +300,7 @@ export const PersistTesting = {
localStorageDirect,
localStorageWithPrefix,
normalize,
+ workspaceStorage,
}
export const Persist = {