diff --git a/agents/MeshCentralRouter.dmg b/agents/MeshCentralRouter.dmg new file mode 100644 index 00000000..2dad1296 Binary files /dev/null and b/agents/MeshCentralRouter.dmg differ diff --git a/meshcentral.js b/meshcentral.js index 762844cd..3de11080 100644 --- a/meshcentral.js +++ b/meshcentral.js @@ -2205,7 +2205,8 @@ function CreateMeshCentralServer(config, args) { // List of possible mesh agent install scripts var meshToolsList = { 'MeshCentralRouter': { localname: 'MeshCentralRouter.exe', dlname: 'winrouter' }, - 'MeshCentralAssistant': { localname: 'MeshCentralAssistant.exe', dlname: 'winassistant' } + 'MeshCentralAssistant': { localname: 'MeshCentralAssistant.exe', dlname: 'winassistant' }, + 'MeshCentralRouterMacOS': { localname: 'MeshCentralRouter.dmg', dlname: 'MeshCentralRouter.dmg' } }; // Update the list of available mesh agents diff --git a/meshuser.js b/meshuser.js index a7b4fa9b..e13c0266 100644 --- a/meshuser.js +++ b/meshuser.js @@ -447,7 +447,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Build server information object var serverinfo = { domain: domain.id, name: domain.dns ? domain.dns : parent.certificates.CommonName, mpsname: parent.certificates.AmtMpsName, mpsport: mpsport, mpspass: args.mpspass, port: httpport, emailcheck: ((parent.parent.mailserver != null) && (domain.auth != 'sspi') && (domain.auth != 'ldap') && (args.lanonly != true) && (parent.certificates.CommonName != null) && (parent.certificates.CommonName.indexOf('.') != -1) && (user._id.split('/')[2].startsWith('~') == false)), domainauth: (domain.auth == 'sspi'), serverTime: Date.now() }; serverinfo.languages = parent.renderLanguages; - serverinfo.tlshash = Buffer.from(parent.webCertificateHashs[domain.id], 'binary').toString('hex').toUpperCase(); // SHA384 of server HTTPS certificate + serverinfo.tlshash = Buffer.from(parent.webCertificateFullHashs[domain.id], 'binary').toString('hex').toUpperCase(); // SHA384 of server HTTPS certificate if ((domain.sessionrecording) && (domain.sessionrecording.onlyselecteddevicegroups === true)) { serverinfo.devGroupSessionRecording = 1; } // Allow enabling of session recording if ((parent.parent.config.domains[domain.id].amtacmactivation != null) && (parent.parent.config.domains[domain.id].amtacmactivation.acmmatch != null)) { var matchingDomains = []; diff --git a/views/default.handlebars b/views/default.handlebars index 454b0cd3..73c41f75 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -3672,7 +3672,7 @@ } if ((userinfo.siteadmin == 0xFFFFFFFF) || ((userinfo.siteadmin & 128) == 0)) { r += '' + "MeshCmd" + ' '; - if (navigator.platform.toLowerCase() == 'win32') { r += '' + "Router" + ' '; } + if ((navigator.platform.toLowerCase() == 'win32') || (navigator.platform.toLowerCase() == 'macintel')) { r += '' + "Router" + ' '; } } r += '
'; @@ -5978,11 +5978,15 @@ if ((args.xterm === 0) && (node.agent) && ((node.agent.caps & 2) != 0) && ((meshrights & 8) != 0) && ((meshrights == 0xFFFFFFFF) || ((meshrights & 512) == 0))) { x += '' + "XTerm" + ' '; } // RDP link, show this link only of the remote machine is Windows. - if (((connectivity & 1) != 0) && (windowsBrowser == true) && (node.agent) && ((meshrights & 8) != 0)) { + if (((connectivity & 1) != 0) && (node.agent) && ((meshrights & 8) != 0)) { if ((node.agent.id > 0) && (node.agent.id < 5)) { x += '' + "RDP" + ' '; } if (node.agent.id > 4) { - x += '' + "Putty" + ' '; - x += '' + "WinSCP" + ' '; + if ((navigator.platform.toLowerCase() == 'win32') || (navigator.platform.toLowerCase() == 'macintel')) { + x += '' + "SSH" + ' '; + } + if (navigator.platform.toLowerCase() == 'win32') { + x += '' + "SCP" + ' '; + } } } @@ -6694,6 +6698,7 @@ if (xxdialogMode) return; var x = '
' + "MeshCentral Router is a Windows tool for TCP port mapping. You can, for example, RDP into a remote device thru this server." + '

'; x += addHtmlValue("Win32 Executable", 'MeshCentralRouter.exe'); + x += addHtmlValue("MacOS Installer", 'MeshCentralRouter.dwg'); var servername = serverinfo.name; if ((servername.indexOf('.') == -1) || ((features & 2) != 0)) { servername = window.location.hostname; } // If the server name is not set or it's in LAN-only mode, use the URL hostname as server name. var domainUrlNoSlash = domainUrl.substring(0, domainUrl.length - 1); diff --git a/webserver.js b/webserver.js index 02b788d1..a20d1f34 100644 --- a/webserver.js +++ b/webserver.js @@ -4419,6 +4419,12 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { setContentDispositionHeader(res, 'application/octet-stream', 'MeshCentralAssistant.exe', null, 'MeshCentralAssistant.exe'); try { res.sendFile(p); } catch (e) { res.sendStatus(404); } } else { res.sendStatus(404); } + } else if (req.query.meshaction == 'macrouter') { + var p = obj.path.join(__dirname, 'agents', 'MeshCentralRouter.dmg'); + if (obj.fs.existsSync(p)) { + setContentDispositionHeader(res, 'application/octet-stream', 'MeshCentralRouter.dmg', null, 'MeshCentralRouter.dmg'); + try { res.sendFile(p); } catch (e) { res.sendStatus(404); } + } else { res.sendStatus(404); } } return; } @@ -4470,6 +4476,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { setContentDispositionHeader(res, 'application/octet-stream', 'meshaction.txt', null, 'meshaction.txt'); res.send(JSON.stringify(meshaction, null, ' ')); } else if (req.query.meshaction == 'winrouter') { + console.log('t2'); var p = obj.path.join(__dirname, 'agents', 'MeshCentralRouter.exe'); if (obj.fs.existsSync(p)) { setContentDispositionHeader(res, 'application/octet-stream', 'MeshCentralRouter.exe', null, 'MeshCentralRouter.exe'); @@ -4481,6 +4488,12 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { setContentDispositionHeader(res, 'application/octet-stream', 'MeshCentralAssistant.exe', null, 'MeshCentralAssistant.exe'); try { res.sendFile(p); } catch (e) { res.sendStatus(404); } } else { res.sendStatus(404); } + } else if (req.query.meshaction == 'macrouter') { + var p = obj.path.join(__dirname, 'agents', 'MeshCentralRouter.dmg'); + if (obj.fs.existsSync(p)) { + setContentDispositionHeader(res, 'application/octet-stream', 'MeshCentralRouter.dmg', null, 'MeshCentralRouter.dmg'); + try { res.sendFile(p); } catch (e) { res.sendStatus(404); } + } else { res.sendStatus(404); } } else { res.sendStatus(401); }