Windows hashing fix for MeshAssistant.

Ylian Saint-Hilaire committed May 18, 2021 at 15:44 UTC db03a0959e9fa427a1863452dd9db6bea867f108
2 files changed +42 -24
agents/MeshCentralAssistant.exe
Binary files a/agents/MeshCentralAssistant.exe and b/agents/MeshCentralAssistant.exe differ
meshcentral.js
+42 -24
@@ -2401,40 +2401,58 @@ function CreateMeshCentralServer(config, args) {
2401 // List of possible mesh agent install scripts
2402 var meshToolsList = {
2403 'MeshCentralRouter': { localname: 'MeshCentralRouter.exe', dlname: 'winrouter' },
2404 - 'MeshCentralAssistant': { localname: 'MeshCentralAssistant.exe', dlname: 'winassistant' }
2404 + 'MeshCentralAssistant': { localname: 'MeshCentralAssistant.exe', dlname: 'winassistant', winhash: true }
2405 //'MeshCentralRouterMacOS': { localname: 'MeshCentralRouter.dmg', dlname: 'MeshCentralRouter.dmg' }
2406 };
2407
2408 // Update the list of available mesh agents
2409 obj.updateMeshTools = function () {
2410 for (var toolname in meshToolsList) {
2411 - var toolpath = obj.path.join(__dirname, 'agents', meshToolsList[toolname].localname);
2412 - var stream = null;
2413 - try {
2414 - stream = obj.fs.createReadStream(toolpath);
2415 - stream.on('data', function (data) { this.hash.update(data, 'binary'); this.hashx += data.length; });
2416 - stream.on('error', function (data) {
2417 - // If there is an error reading this file, make sure this agent is not in the agent table
2418 - if (obj.meshToolsBinaries[this.toolname] != null) { delete obj.meshToolsBinaries[this.toolname]; }
2419 - });
2420 - stream.on('end', function () {
2421 - // Add the agent to the agent table with all information and the hash
2422 - obj.meshToolsBinaries[this.toolname] = {};
2423 - obj.meshToolsBinaries[this.toolname].hash = this.hash.digest('hex');
2424 - obj.meshToolsBinaries[this.toolname].hashx = this.hashx;
2425 - obj.meshToolsBinaries[this.toolname].path = this.agentpath;
2426 - obj.meshToolsBinaries[this.toolname].dlname = this.dlname;
2411 + if (meshToolsList[toolname].winhash === true) {
2412 + var toolpath = obj.path.join(__dirname, 'agents', meshToolsList[toolname].localname);
2413 + var hashStream = obj.crypto.createHash('sha384');
2414 + hashStream.toolname = toolname;
2415 + hashStream.toolpath = toolpath;
2416 + hashStream.dlname = meshToolsList[toolname].dlname;
2417 + hashStream.hashx = 0;
2418 + hashStream.on('data', function (data) {
2419 + obj.meshToolsBinaries[this.toolname] = { hash: data.toString('hex'), hashx: this.hashx, path: this.toolpath, dlname: this.dlname, url: this.url };
2420 obj.meshToolsBinaries[this.toolname].url = 'https://' + obj.certificates.CommonName + ':' + ((typeof obj.args.aliasport == 'number') ? obj.args.aliasport : obj.args.port) + '/meshagents?meshaction=' + this.dlname;
2421 var stats = null;
2429 - try { stats = obj.fs.statSync(this.agentpath); } catch (e) { }
2422 + try { stats = obj.fs.statSync(this.toolpath); } catch (e) { }
2423 if (stats != null) { obj.meshToolsBinaries[this.toolname].size = stats.size; }
2424 });
2432 - stream.toolname = toolname;
2433 - stream.agentpath = toolpath;
2434 - stream.dlname = meshToolsList[toolname].dlname;
2435 - stream.hash = obj.crypto.createHash('sha384', stream);
2436 - stream.hashx = 0;
2437 - } catch (e) { }
2425 + var options = { sourcePath: toolpath, targetStream: hashStream };
2426 + obj.exeHandler.hashExecutableFile(options);
2427 + } else {
2428 + var toolpath = obj.path.join(__dirname, 'agents', meshToolsList[toolname].localname);
2429 + var stream = null;
2430 + try {
2431 + stream = obj.fs.createReadStream(toolpath);
2432 + stream.on('data', function (data) { this.hash.update(data, 'binary'); this.hashx += data.length; });
2433 + stream.on('error', function (data) {
2434 + // If there is an error reading this file, make sure this agent is not in the agent table
2435 + if (obj.meshToolsBinaries[this.toolname] != null) { delete obj.meshToolsBinaries[this.toolname]; }
2436 + });
2437 + stream.on('end', function () {
2438 + // Add the agent to the agent table with all information and the hash
2439 + obj.meshToolsBinaries[this.toolname] = {};
2440 + obj.meshToolsBinaries[this.toolname].hash = this.hash.digest('hex');
2441 + obj.meshToolsBinaries[this.toolname].hashx = this.hashx;
2442 + obj.meshToolsBinaries[this.toolname].path = this.agentpath;
2443 + obj.meshToolsBinaries[this.toolname].dlname = this.dlname;
2444 + obj.meshToolsBinaries[this.toolname].url = 'https://' + obj.certificates.CommonName + ':' + ((typeof obj.args.aliasport == 'number') ? obj.args.aliasport : obj.args.port) + '/meshagents?meshaction=' + this.dlname;
2445 + var stats = null;
2446 + try { stats = obj.fs.statSync(this.agentpath); } catch (e) { }
2447 + if (stats != null) { obj.meshToolsBinaries[this.toolname].size = stats.size; }
2448 + });
2449 + stream.toolname = toolname;
2450 + stream.agentpath = toolpath;
2451 + stream.dlname = meshToolsList[toolname].dlname;
2452 + stream.hash = obj.crypto.createHash('sha384', stream);
2453 + stream.hashx = 0;
2454 + } catch (e) { }
2455 + }
2456 }
2457 };
2458