From 779f86b259ae774d076c73ddb8c597996d52bce1 Mon Sep 17 00:00:00 2001 From: KingKDot Date: Thu, 16 Jul 2026 23:55:00 -0500 Subject: [PATCH] fix linux issue --- .../src/server/file-transfer-state.test.ts | 14 ++++++++++++++ Overlord-Server/src/server/file-transfer-state.ts | 5 +++++ .../src/server/routes/file-download-routes.ts | 5 +++-- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 Overlord-Server/src/server/file-transfer-state.test.ts diff --git a/Overlord-Server/src/server/file-transfer-state.test.ts b/Overlord-Server/src/server/file-transfer-state.test.ts new file mode 100644 index 0000000..416f555 --- /dev/null +++ b/Overlord-Server/src/server/file-transfer-state.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, test } from "bun:test"; +import { remotePathBasename } from "./file-transfer-state"; + +describe("remotePathBasename", () => { + test("extracts names from Windows paths on any server platform", () => { + expect(remotePathBasename("C:\\Temp\\overlord-e2e-download.bin")) + .toBe("overlord-e2e-download.bin"); + }); + + test("extracts names from POSIX and mixed-separator paths", () => { + expect(remotePathBasename("/tmp/archive.tar.gz")).toBe("archive.tar.gz"); + expect(remotePathBasename("C:\\Temp/mixed.bin")).toBe("mixed.bin"); + }); +}); diff --git a/Overlord-Server/src/server/file-transfer-state.ts b/Overlord-Server/src/server/file-transfer-state.ts index 6a651a2..5e9e33a 100644 --- a/Overlord-Server/src/server/file-transfer-state.ts +++ b/Overlord-Server/src/server/file-transfer-state.ts @@ -91,6 +91,11 @@ export function isSafeRemotePath(value: string): boolean { return true; } +export function remotePathBasename(value: string): string { + const segments = value.split(/[\\/]+/).filter(Boolean); + return segments.at(-1) || ""; +} + export function notifyPullWaiters(state: StreamingPullState) { const list = state.waiters.splice(0); for (const w of list) { diff --git a/Overlord-Server/src/server/routes/file-download-routes.ts b/Overlord-Server/src/server/routes/file-download-routes.ts index ef88bb0..f9528b2 100644 --- a/Overlord-Server/src/server/routes/file-download-routes.ts +++ b/Overlord-Server/src/server/routes/file-download-routes.ts @@ -13,6 +13,7 @@ import { UUID_TOKEN_RE, getFileTransferLimits, isSafeRemotePath, + remotePathBasename, makeIncrementalPullStream, notifyPullWaiters, streamFileRangeWithCleanup, @@ -125,7 +126,7 @@ async function serveDownloadById( const commandId = uuidv4(); - let fileName = path.basename(downloadPath) || "download.bin"; + let fileName = remotePathBasename(downloadPath) || "download.bin"; try { fileName = deps.sanitizeOutputName(fileName); } catch { @@ -604,7 +605,7 @@ export async function handleFileDownloadRoutes( ip: server.requestIP(req)?.address || "unknown", }); - const fileName = deps.sanitizeOutputName(path.basename(pull.fileName) || "upload.bin"); + const fileName = deps.sanitizeOutputName(remotePathBasename(pull.fileName) || "upload.bin"); const baseHeaders = { ...deps.secureHeaders("application/octet-stream"), "Content-Disposition": `attachment; filename="${fileName}"`,