From b74647244654836923015846a3bd0363d9fa70c3 Mon Sep 17 00:00:00 2001 From: Lonny Wong Date: Fri, 6 Oct 2023 11:01:03 +0800 Subject: [PATCH] improve binary escaping --- src/comm.ts | 7 +++---- src/escape.ts | 2 +- test/escape.test.ts | 20 ++++++++++++++------ test/transfer.test.ts | 26 ++++++++++++++++++-------- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/comm.ts b/src/comm.ts index 3201a84..114a16d 100644 --- a/src/comm.ts +++ b/src/comm.ts @@ -28,9 +28,8 @@ export const isRunningInBrowser = (function() { require("fs"); return false; } - } catch (err) { - return true; - } + } catch (err) { } + return true; })(); export function strToUint8(str: string): Uint8Array { @@ -139,7 +138,7 @@ export type OpenSaveFile = ( saveParam: any, fileName: string, directory: boolean, - overwrite: boolean + overwrite: boolean, ) => Promise; export interface ProgressCallback { diff --git a/src/escape.ts b/src/escape.ts index 8b4bc30..93cc9ef 100644 --- a/src/escape.ts +++ b/src/escape.ts @@ -12,7 +12,7 @@ export function getEscapeChars(escapeAll: boolean): Array { ["\x7e", "\xee\x31"], ]; if (escapeAll) { - const chars = "\x02\x10\x1b\x1d\x9d"; + const chars = "\x02\x0d\x10\x11\x13\x18\x1b\x1d\x8d\x90\x91\x93\x9d"; for (let i = 0; i < chars.length; i++) { escapeChars.push([chars[i], "\xee" + String.fromCharCode(0x41 + i)]); } diff --git a/test/escape.test.ts b/test/escape.test.ts index d040d79..9c4c35d 100644 --- a/test/escape.test.ts +++ b/test/escape.test.ts @@ -42,15 +42,23 @@ test("escape chars to codes", () => { test("escape data", () => { const escapeChars = getEscapeChars(true); const escapeCodes = escapeCharsToCodes(escapeChars); - const data = strToUint8("\xee\x7e\x02\x10A"); - expect(escapeData(data, [])).toStrictEqual(strToUint8("\xee\x7e\x02\x10A")); - expect(escapeData(data, escapeCodes)).toStrictEqual(strToUint8("\xee\xee\xee\x31\xee\x41\xee\x42A")); + const data = strToUint8("\xee\x7e\x02\x0d\x10\x11\x13\x18\x1b\x1d\x8d\x90\x91\x93\x9dA"); + expect(escapeData(data, [])).toStrictEqual( + strToUint8("\xee\x7e\x02\x0d\x10\x11\x13\x18\x1b\x1d\x8d\x90\x91\x93\x9dA"), + ); + expect(escapeData(data, escapeCodes)).toStrictEqual( + strToUint8("\xee\xee\xee1\xeeA\xeeB\xeeC\xeeD\xeeE\xeeF\xeeG\xeeH\xeeI\xeeJ\xeeK\xeeL\xeeMA"), + ); }); test("unescape data", () => { const escapeChars = getEscapeChars(true); const escapeCodes = escapeCharsToCodes(escapeChars); - const data = strToUint8("\xee\xee\xee\x31\xee\x41\xee\x42A"); - expect(unescapeData(data, [])).toStrictEqual(strToUint8("\xee\xee\xee\x31\xee\x41\xee\x42A")); - expect(unescapeData(data, escapeCodes)).toStrictEqual(strToUint8("\xee\x7e\x02\x10A")); + const data = strToUint8("\xee\xee\xee1\xeeA\xeeB\xeeC\xeeD\xeeE\xeeF\xeeG\xeeH\xeeI\xeeJ\xeeK\xeeL\xeeMA"); + expect(unescapeData(data, [])).toStrictEqual( + strToUint8("\xee\xee\xee1\xeeA\xeeB\xeeC\xeeD\xeeE\xeeF\xeeG\xeeH\xeeI\xeeJ\xeeK\xeeL\xeeMA"), + ); + expect(unescapeData(data, escapeCodes)).toStrictEqual( + strToUint8("\xee\x7e\x02\x0d\x10\x11\x13\x18\x1b\x1d\x8d\x90\x91\x93\x9dA"), + ); }); diff --git a/test/transfer.test.ts b/test/transfer.test.ts index 21dbf1f..97e1014 100644 --- a/test/transfer.test.ts +++ b/test/transfer.test.ts @@ -115,8 +115,9 @@ test("upload files using binary mode", async () => { file.readFile.mockReturnValueOnce(strToUint8("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A")); trzsz.addReceivedData( - "junk\r\n#CFG:eJxNzzsOwjAMgOGrRJ47OBULbLxOESKUFgORoFR5DAXB2XEokrP5/+TBfsHNDRdYKRgnaBR0fnBh4k4hEzfF3o10" + - "7K8uRFZj4JARicruPP3bNsrAR1jPUgJb4bWwRuFNxZ3wtuKT8E54WfEerC0v5HP0T+JrNbYLhuTv9MjpB/j+AivBQi0=\n" + "junk\r\n#CFG:eJxF0LsOwjAMBdB/8ZwhKQwlG+/3F4QIpcWFIigoaQZA8O20FNmb75FlXfkFF1cdQcM5gICsrJx/gK59RAEYcnfHfX5y" + + "PoA2BnZRSsRmrxv+0QoDH0L1y+0sE8Jhh55gRFtKEo4ZFeGEsUc4ZUwJZ4wZ4ZzxQLggTBmXhAOutGLkSmtGrrRh5JtbsLb5aixC+UTQS" + + "iZ9AXV5xVus2yjfX3gwanQ=\n", ); const config = await trzsz.recvConfig(); expect(config.binary).toBe(true); @@ -276,8 +277,9 @@ test("download files using binary mode", async () => { const trzsz = new TrzszTransfer(writer); trzsz.addReceivedData( - "junk\r\n#CFG:eJxNzzsOwjAMgOGrRJ47OBULbLxOESKUFgORoFR5DAXB2XEokrP5/+TBfsHNDRdYKRgnaBR0fnBh4k4hEzfF3o10" + - "7K8uRFZj4JARicruPP3bNsrAR1jPUgJb4bWwRuFNxZ3wtuKT8E54WfEerC0v5HP0T+JrNbYLhuTv9MjpB/j+AivBQi0=\n" + "junk\r\n#CFG:eJxF0LsOwjAMBdB/8ZwhKQwlG+/3F4QIpcWFIigoaQZA8O20FNmb75FlXfkFF1cdQcM5gICsrJx/gK59RAEYcnfHfX5y" + + "PoA2BnZRSsRmrxv+0QoDH0L1y+0sE8Jhh55gRFtKEo4ZFeGEsUc4ZUwJZ4wZ4ZzxQLggTBmXhAOutGLkSmtGrrRh5JtbsLb5aixC+UTQS" + + "iZ9AXV5xVus2yjfX3gwanQ=\n", ); const config = await trzsz.recvConfig(); expect(config.binary).toBe(true); @@ -568,10 +570,18 @@ test("send config to remote", async () => { expect(cfgStr).toContain('["\\u00ee","\\u00ee\\u00ee"]'); expect(cfgStr).toContain('["~","\\u00ee1"]'); expect(cfgStr).toContain('["\\u0002","\\u00eeA"]'); - expect(cfgStr).toContain('["\\u0010","\\u00eeB"]'); - expect(cfgStr).toContain('["\\u001b","\\u00eeC"]'); - expect(cfgStr).toContain('["\\u001d","\\u00eeD"]'); - expect(cfgStr).toContain('["\\u009d","\\u00eeE"]'); + expect(cfgStr).toContain('["\\r","\\u00eeB"]'); + expect(cfgStr).toContain('["\\u0010","\\u00eeC"]'); + expect(cfgStr).toContain('["\\u0011","\\u00eeD"]'); + expect(cfgStr).toContain('["\\u0013","\\u00eeE"]'); + expect(cfgStr).toContain('["\\u0018","\\u00eeF"]'); + expect(cfgStr).toContain('["\\u001b","\\u00eeG"]'); + expect(cfgStr).toContain('["\\u001d","\\u00eeH"]'); + expect(cfgStr).toContain('["\\u008d","\\u00eeI"]'); + expect(cfgStr).toContain('["\\u0090","\\u00eeJ"]'); + expect(cfgStr).toContain('["\\u0091","\\u00eeK"]'); + expect(cfgStr).toContain('["\\u0093","\\u00eeL"]'); + expect(cfgStr).toContain('["\\u009d","\\u00eeM"]'); const config = JSON.parse(cfgStr); expect(config.quiet).toBe(true); expect(config.binary).toBe(true);