From 1b590dba5e04c5e80eb4af842a45a7e7ed399cfa Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Tue, 3 Nov 2020 18:44:43 -0800 Subject: [PATCH] Updated MeshCentral Assistant with self-update system. --- agents/MeshCentralAssistant.exe | Bin 876336 -> 876032 bytes agents/meshcore.js | 7 +++++++ meshagent.js | 10 ++++++++++ meshcentral.js | 1 + views/default.handlebars | 2 +- webserver.js | 24 +++++++++++++++++++++++- 6 files changed, 42 insertions(+), 2 deletions(-) diff --git a/agents/MeshCentralAssistant.exe b/agents/MeshCentralAssistant.exe index 9c92d8dd2ae3a0e007e892e1b2f3fe9d5341ccf9..de236ad60d928e7dbf8637c31becb6cb7edb682a 100644 GIT binary patch delta 33657 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 N^q2RP6AzZe{vWQ?UUmQg delta 33872 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
lnj}b(F5- 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 RbZAi9XBwS(!?t$h{{t9iW%>XB diff --git a/agents/meshcore.js b/agents/meshcore.js index 8b8d59c5..88bf8795 100644 --- a/agents/meshcore.js +++ b/agents/meshcore.js @@ -218,6 +218,9 @@ function createMeshCore(agent) { case 'sessions': this._send({ cmd: 'sessions', sessions: tunnelUserCount }); break; + case 'meshToolInfo': + try { mesh.SendCommand({ action: 'meshToolInfo', name: data.name, hash: data.hash, cookie: data.cookie?true:false, pipe: true }); } catch (e) { } + break; } } catch (e) { removeRegisteredApp(this); this.end(); return; } @@ -1133,6 +1136,10 @@ function createMeshCore(agent) { r.corehashhex = getSHA384FileHash(coreDumpPath).toString('hex'); // Hash of core dump file } mesh.SendCommand(JSON.stringify(r)); + break; + case 'meshToolInfo': + if (data.pipe == true) { delete data.pipe; delete data.action; data.cmd = 'meshToolInfo'; broadcastToRegisteredApps(data); } + break; default: // Unknown action, ignore it. break; diff --git a/meshagent.js b/meshagent.js index addef162..f44906db 100644 --- a/meshagent.js +++ b/meshagent.js @@ -1397,6 +1397,16 @@ module.exports.CreateMeshAgent = function (parent, db, ws, req, args, domain) { } break; } + case 'meshToolInfo': { + if (typeof command.name != 'string') break; + var info = parent.parent.meshToolsBinaries[command.name]; + if ((command.hash != null) && (info.hash == command.hash)) return; + const responseCmd = { action: 'meshToolInfo', name: command.name, hash: info.hash, size: info.size, url: info.url }; + if (command.cookie === true) { responseCmd.url += ('&auth=' + parent.parent.encodeCookie({ download: info.dlname }, parent.parent.loginCookieEncryptionKey)); } + if (command.pipe === true) { responseCmd.pipe = true; } + try { ws.send(JSON.stringify(responseCmd)); } catch (ex) { } + break; + } default: { parent.agentStats.unknownAgentActionCount++; parent.parent.debug('agent', 'Unknown agent action (' + obj.remoteaddrport + '): ' + JSON.stringify(command) + '.'); diff --git a/meshcentral.js b/meshcentral.js index da24097c..7ee3789e 100644 --- a/meshcentral.js +++ b/meshcentral.js @@ -2106,6 +2106,7 @@ function CreateMeshCentralServer(config, args) { obj.meshToolsBinaries[this.toolname].hash = this.hash.digest('hex'); obj.meshToolsBinaries[this.toolname].hashx = this.hashx; obj.meshToolsBinaries[this.toolname].path = this.agentpath; + obj.meshToolsBinaries[this.toolname].dlname = this.dlname; obj.meshToolsBinaries[this.toolname].url = ((obj.args.notls == true) ? 'http://' : 'https://') + obj.certificates.CommonName + ':' + ((typeof obj.args.aliasport == 'number') ? obj.args.aliasport : obj.args.port) + '/meshagents?meshaction=' + this.dlname; var stats = null; try { stats = obj.fs.statSync(this.agentpath); } catch (e) { } diff --git a/views/default.handlebars b/views/default.handlebars index eb3ef8a0..f982323e 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -13608,7 +13608,7 @@ if (r.rights == 0xFFFFFFFF) { return 0xFFFFFFFF; } // User has full rights thru a device group link, stop here. rights = r.rights; } - + // Check permissions thru user groups var user = null; if (userid == userinfo._id) { user = userinfo; } else { if (users != null) { user = users[userid]; } } diff --git a/webserver.js b/webserver.js index 17b38d6f..8ad5186e 100644 --- a/webserver.js +++ b/webserver.js @@ -4178,8 +4178,30 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL key var user = obj.users[req.session.userid]; if (user == null) { + // Check if we have an authentication cookie var c = obj.parent.decodeCookie(req.query.auth, obj.parent.loginCookieEncryptionKey); - if ((c == null) || (c.userid == null)) { res.sendStatus(404); return; } + if (c == null) { res.sendStatus(404); return; } + + // Download tools using a cookie + if (c.download == req.query.meshaction) { + if (req.query.meshaction == 'winrouter') { + var p = obj.path.join(__dirname, 'agents', 'MeshCentralRouter.exe'); + if (obj.fs.existsSync(p)) { + setContentDispositionHeader(res, 'application/octet-stream', 'MeshCentralRouter.exe', null, 'MeshCentralRouter.exe'); + try { res.sendFile(p); } catch (e) { res.sendStatus(404); } + } else { res.sendStatus(404); } + } else if (req.query.meshaction == 'winassistant') { + var p = obj.path.join(__dirname, 'agents', 'MeshCentralAssistant.exe'); + if (obj.fs.existsSync(p)) { + setContentDispositionHeader(res, 'application/octet-stream', 'MeshCentralAssistant.exe', null, 'MeshCentralAssistant.exe'); + try { res.sendFile(p); } catch (e) { res.sendStatus(404); } + } else { res.sendStatus(404); } + } + return; + } + + // Check if the cookie authenticates a user + if (c.userid == null) { res.sendStatus(404); return; } user = obj.users[c.userid]; if (user == null) { res.sendStatus(404); return; } }