From f710290357909049342a87c4d73424de82ace60b Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Tue, 14 Jun 2022 22:03:49 -0700 Subject: [PATCH] 1. Added CycleCount, MinimumDelay, MaximumDelay, support to Self Update Test 2. Fixed edge case resource leak with clipboard on linux --- microscript/ILibDuktape_Polyfills.c | 2 +- modules/clipboard.js | 18 +++- test/update-test.js | 141 +++++++++++++++++++++------- 3 files changed, 123 insertions(+), 38 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 3310be8..d7b74d1 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2339,7 +2339,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('http-digest', Buffer.from('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', 'base64'), '2021-09-29T19:36:45.000-07:00');"); // Clipboard. Refer to /modules/clipboard.js for a human readable version - duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'), '2022-01-03T19:17:33.000-08:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'), '2022-06-14T21:57:38.000-07:00');"); // Promise: This is very important, as it is used everywhere. Refer to /modules/promise.js to see a human readable version of promise.js duk_peval_string_noresult(ctx, "addCompressedModule('promise', Buffer.from('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', 'base64'), '2021-08-23T14:25:14.000-07:00');"); diff --git a/modules/clipboard.js b/modules/clipboard.js index 0c065a8..2a25bcd 100644 --- a/modules/clipboard.js +++ b/modules/clipboard.js @@ -382,7 +382,7 @@ function lin_xclip_copy(txt) ret.child.promise = ret; ret.child.stderr.on('data', function (c) { console.log(c.toString()); }); ret.child.stdout.on('data', function (c) { console.log(c.toString()); }); - ret.child._cleanup = function _cleanup(p) + ret.child._helper = function _helper(p) { var ch = require('child_process').execFile('/bin/sh', ['sh']); ch.stdout.str = ''; ch.stdout.on('data', function (c) { this.str += c.toString(); }); @@ -412,8 +412,20 @@ function lin_xclip_copy(txt) ch.waitExit(); if (ch.stdout.str != '') { - process.kill(parseInt(ch.stdout.str), 'SIGKILL'); + try + { + return (parseInt(ch.stdout.str.trim())); + } + catch (x) + { + return (-1); + } } + return (-1); + }; + ret.child._cleanup = function _cleanup(p) + { + process.kill(this._xclip_PID, 'SIGKILL'); delete xclipTable[p._hashCode()]; }; ret.child.on('exit', function () @@ -435,7 +447,7 @@ function lin_xclip_copy(txt) this._cleanup(this.promise); } }); - + ret.child._xclip_PID = ret.child._helper(ret); return (ret); } diff --git a/test/update-test.js b/test/update-test.js index e3f3b75..18bf8d5 100644 --- a/test/update-test.js +++ b/test/update-test.js @@ -70,6 +70,11 @@ var agentBinary_Size = 0; var agentBinary_BytesSent = 0; const recoveryCore = require('fs').readFileSync('recoverycore.js'); +var cycleCount = -1; +var targetCount = 1; +var delayMinimum = 0; +var delayMaximum = 100; + process.stdout.write('Generating Certificate...'); var cert = require('tls').generateCertificate('test', { certType: 2, noUsages: 1 }); var server = require('https').createServer({ pfx: cert, passphrase: 'test' }); @@ -276,6 +281,78 @@ server.on('upgrade', function (msg, sck, head) case MeshCommand_AgentHash: var hash = buffer.slice(4).toString('hex'); console.log('AgentHash=' + hash); + console.log(''); + console.log('==> CycleCount: ' + (++cycleCount) + ' of ' + targetCount); + console.log(''); + + if (cycleCount < targetCount) + { + // Need to do another round of updates + updateState = 0; + + var delay = Math.floor((Math.random() * delayMaximum) + delayMinimum); + console.log('==> Performing Update in: ' + delay + 'ms'); + global._delay = setTimeout(function () + { + if (process.argv.getParameter('JS') === '1') + { + // Recovery Core Update Path + switch (updateState) + { + case 0: + console.log('Pushing Recovery Core'); + updateState = 1; + var b = Buffer.alloc(recoveryCore.length + 48 + 4 + 4); + b.writeUInt16BE(MeshCommand_CoreModule); + b.writeUInt16BE(1, 2); + recoveryCore.copy(b, 56); + require('SHA384Stream').create().syncHash(b.slice(52)).copy(b, 4); + this.write(b); + break; + case 1: + updateState = 2; + var b = Buffer.alloc(4); + b.writeUInt16BE(MeshCommand_CoreOk); + b.writeUInt16BE(1, 2); + this.write(b); + + this.command({ url: 'https://127.0.0.1:9250/update', action: 'agentupdate', hash: getSHA384FileHash(process.execPath).toString('hex'), sessionid: 'none' }); + + // this.console('eval "sendConsoleText(\'this is testing\');"'); + break; + default: + console.log('Agent Update State: ' + updateState); + break; + } + } + else + { + // Native Update Path + switch(updateState) + { + case 0: + updateState = 1; + agentBinaryFD = require('fs').openSync(process.execPath, 'rb'); + agentBinary_Size = require('fs').statSync(process.execPath).size; + process.stdout.write('Sending update to Agent... [0%]'); + + var b = Buffer.alloc(4); + b.writeUInt16BE(MeshCommand_AgentUpdate); + b.writeUInt16BE(1, 2); + this.write(b); + + b = Buffer.alloc(4100); + b.writeUInt16BE(MeshCommand_AgentUpdateBlock); + b.writeUInt16BE(1, 2); + agentBinary_BytesSent = require('fs').readSync(agentBinaryFD, b, 4, 4096, -1); + this.write(b); + break; + } + } + + }.bind(this), delay); + } + break; case MeshCommand_CoreModuleHash: var hash = buffer.slice(4).toString('hex'); @@ -289,26 +366,13 @@ server.on('upgrade', function (msg, sck, head) { switch (updateState) { - case 0: - console.log('Pushing Recovery Core'); - updateState = 1; - var b = Buffer.alloc(recoveryCore.length + 48 + 4 + 4); - b.writeUInt16BE(MeshCommand_CoreModule); - b.writeUInt16BE(1, 2); - recoveryCore.copy(b, 56); - require('SHA384Stream').create().syncHash(b.slice(52)).copy(b, 4); - this.write(b); - break; case 1: updateState = 2; var b = Buffer.alloc(4); b.writeUInt16BE(MeshCommand_CoreOk); b.writeUInt16BE(1, 2); this.write(b); - this.command({ url: 'https://127.0.0.1:9250/update', action: 'agentupdate', hash: getSHA384FileHash(process.execPath).toString('hex'), sessionid: 'none' }); - - // this.console('eval "sendConsoleText(\'this is testing\');"'); break; default: console.log('Agent Update State: ' + updateState); @@ -316,27 +380,6 @@ server.on('upgrade', function (msg, sck, head) } break; } - - switch(updateState) - { - case 0: - updateState = 1; - agentBinaryFD = require('fs').openSync(process.execPath, 'rb'); - agentBinary_Size = require('fs').statSync(process.execPath).size; - process.stdout.write('Sending update to Agent... [0%]'); - - var b = Buffer.alloc(4); - b.writeUInt16BE(MeshCommand_AgentUpdate); - b.writeUInt16BE(1, 2); - this.write(b); - - b = Buffer.alloc(4100); - b.writeUInt16BE(MeshCommand_AgentUpdateBlock); - b.writeUInt16BE(1, 2); - agentBinary_BytesSent = require('fs').readSync(agentBinaryFD, b, 4, 4096, -1); - this.write(b); - break; - } break; case MeshCommand_AgentUpdateBlock: if (agentBinary_BytesSent < agentBinary_Size) @@ -377,7 +420,9 @@ server.on('upgrade', function (msg, sck, head) console.log('Agent reports successfully downloaded update'); break; case 'coreinfo': + console.log(''); console.log('Agent is running core: ' + j.value); + console.log(''); break; case 'msg': if (j.type == 'console') @@ -511,6 +556,34 @@ function getPID() } +if (process.argv.getParameter('CycleCount') != null) +{ + try + { + targetCount = parseInt(process.argv.getParameter('CycleCount')); + } + catch(e) + {} +} +if (process.argv.getParameter('MinimumDelay') != null) +{ + try + { + delayMinimum = parseInt(process.argv.getParameter('MinimumDelay')); + } + catch (e) + { } +} +if (process.argv.getParameter('MaximumDelay') != null) +{ + try + { + delayMaximum = parseInt(process.argv.getParameter('MaximumDelay')); + } + catch (e) + { } +} + if (process.argv.getParameter('NoInstall') == null) { //