From a097b1e300531b5747df1a5d5122740cc81d51a6 Mon Sep 17 00:00:00 2001 From: ZacharyZcR Date: Thu, 2 Oct 2025 14:22:25 +0800 Subject: [PATCH] Add encoding fallback for legacy SSH servers - Detect UTF-8 decode failures (replacement characters) - Auto-fallback to latin1 for non-UTF-8 locales - Fixes garbled characters on servers without UTF-8 support Fixes #282 --- src/backend/ssh/terminal.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/backend/ssh/terminal.ts b/src/backend/ssh/terminal.ts index 405afabb..0f0b7a0b 100644 --- a/src/backend/ssh/terminal.ts +++ b/src/backend/ssh/terminal.ts @@ -427,7 +427,18 @@ wss.on("connection", async (ws: WebSocket, req) => { sshStream = stream; stream.on("data", (data: Buffer) => { - ws.send(JSON.stringify({ type: "data", data: data.toString() })); + let decoded = data.toString("utf-8"); + + // Defensive fallback: if UTF-8 decode produces replacement characters + // and buffer contains high bytes, try latin1 (for legacy servers without UTF-8 locale) + if ( + decoded.includes("\uFFFD") && + data.some((byte) => byte >= 0x80 && byte <= 0xff) + ) { + decoded = data.toString("latin1"); + } + + ws.send(JSON.stringify({ type: "data", data: decoded })); }); stream.on("close", () => {