diff --git a/agents/MeshCmd-signed.exe b/agents/MeshCmd-signed.exe index 4edd965f..76e77e99 100644 Binary files a/agents/MeshCmd-signed.exe and b/agents/MeshCmd-signed.exe differ diff --git a/agents/MeshCmd64-signed.exe b/agents/MeshCmd64-signed.exe index 51e4827f..e1289c90 100644 Binary files a/agents/MeshCmd64-signed.exe and b/agents/MeshCmd64-signed.exe differ diff --git a/agents/MeshService-signed.exe b/agents/MeshService-signed.exe index 395d948e..e608eddc 100644 Binary files a/agents/MeshService-signed.exe and b/agents/MeshService-signed.exe differ diff --git a/agents/MeshService.exe b/agents/MeshService.exe index c381e8a5..0fded0c2 100644 Binary files a/agents/MeshService.exe and b/agents/MeshService.exe differ diff --git a/agents/MeshService64-signed.exe b/agents/MeshService64-signed.exe index 4f15e564..5cb14260 100644 Binary files a/agents/MeshService64-signed.exe and b/agents/MeshService64-signed.exe differ diff --git a/agents/MeshService64.exe b/agents/MeshService64.exe index f70cde69..a8ff8ad0 100644 Binary files a/agents/MeshService64.exe and b/agents/MeshService64.exe differ diff --git a/agents/meshcmd.js b/agents/meshcmd.js index 2e8864bf..a3970781 100644 --- a/agents/meshcmd.js +++ b/agents/meshcmd.js @@ -1353,10 +1353,12 @@ function discoverMeshServerOnce() { multicastSockets[i] = dgram.createSocket({ type: (addr.family == "IPv4" ? "udp4" : "udp6") }); multicastSockets[i].bind({ address: addr.address, exclusive: false }); if (addr.family == "IPv4") { - multicastSockets[i].addMembership(membershipIPv4); - //multicastSockets[i].setMulticastLoopback(true); - multicastSockets[i].once('message', OnMulticastMessage); - multicastSockets[i].send(settings.serverId, 16989, membershipIPv4); + try { + multicastSockets[i].addMembership(membershipIPv4); + //multicastSockets[i].setMulticastLoopback(true); + multicastSockets[i].once('message', OnMulticastMessage); + multicastSockets[i].send(settings.serverId, 16989, membershipIPv4); + } catch (e) { } } } } diff --git a/agents/meshcore.js b/agents/meshcore.js index c4fd737e..4083ce0a 100644 --- a/agents/meshcore.js +++ b/agents/meshcore.js @@ -112,13 +112,9 @@ function createMeshCore(agent) { try { getIpLocationDataExInProgress = true; getIpLocationDataExCounts[0]++; - http.request({ - host: 'ipinfo.io', // TODO: Use a HTTP proxy if needed!!!! - port: 80, - path: 'http://ipinfo.io/json', // Use this service to get our geolocation - headers: { Host: "ipinfo.io" } - }, - function (resp) { + var options = http.parseUri("http://ipinfo.io/json"); + options.method = 'GET'; + http.request(options, function (resp) { if (resp.statusCode == 200) { var geoData = ''; resp.data = function (geoipdata) { geoData += geoipdata; }; @@ -755,7 +751,7 @@ function createMeshCore(agent) { function onTunnelWebRTCControlData(data) { if (typeof data != 'string') return; var obj; - try { obj = JSON.parse(data); } catch (e) { sendConsoleText('Invalid control JSON on WebRTC'); return; } + try { obj = JSON.parse(data); } catch (e) { sendConsoleText('Invalid control JSON on WebRTC: ' + data); return; } if (obj.type == 'close') { //sendConsoleText('Tunnel #' + this.xrtc.websocket.tunnel.index + ' WebRTC control close'); try { this.close(); } catch (e) { } @@ -767,11 +763,27 @@ function createMeshCore(agent) { function onTunnelControlData(data, ws) { var obj; if (ws == null) { ws = this; } - if (typeof data == 'string') { try { obj = JSON.parse(data); } catch (e) { sendConsoleText('Invalid control JSON'); return; } } + if (typeof data == 'string') { try { obj = JSON.parse(data); } catch (e) { sendConsoleText('Invalid control JSON: ' + data); return; } } else if (typeof data == 'object') { obj = data; } else { return; } //sendConsoleText('onTunnelControlData(' + ws.httprequest.protocol + '): ' + JSON.stringify(data)); //console.log('onTunnelControlData: ' + JSON.stringify(data)); + if (obj.action) { + switch (obj.action) { + case 'lock': { + // Lock the current user out of the desktop + try { + if (process.platform == 'win32') { + var child = require('child_process'); + child.execFile(process.env['windir'] + '\\system32\\cmd.exe', ['/c', 'RunDll32.exe user32.dll,LockWorkStation'], { type: 1 }); + } + } catch (e) { } + break; + } + } + return; + } + if (obj.type == 'close') { // We received the close on the websocket //sendConsoleText('Tunnel #' + ws.tunnel.index + ' WebSocket control close'); @@ -850,7 +862,7 @@ function createMeshCore(agent) { var response = null; switch (cmd) { case 'help': { // Displays available commands - response = 'Available commands: help, info, args, print, type, dbget, dbset, dbcompact, eval, parseuri, httpget,\r\nwslist, wsconnect, wssend, wsclose, notify, ls, ps, kill, amt, netinfo, location, power, wakeonlan, scanwifi,\r\nscanamt, setdebug, smbios, rawsmbios, toast.'; + response = 'Available commands: help, info, args, print, type, dbget, dbset, dbcompact, eval, parseuri, httpget,\r\nwslist, wsconnect, wssend, wsclose, notify, ls, ps, kill, amt, netinfo, location, power, wakeonlan, scanwifi,\r\nscanamt, setdebug, smbios, rawsmbios, toast, lock.'; break; } case 'toast': { @@ -1117,6 +1129,15 @@ function createMeshCore(agent) { } break; } + case 'lsx': { // Show list of files and folders + response = objToString(getDirectoryInfo(args['_'][0]), 0, ' ', true); + break; + } + case 'lock': { // Lock the current user out of the desktop + if (process.platform == 'win32') { var child = require('child_process'); child.execFile(process.env['windir'] + '\\system32\\cmd.exe', ['/c', 'RunDll32.exe user32.dll,LockWorkStation'], { type: 1 }); response = 'Ok'; } + else { response = 'Not supported on the platform'; } + break; + } case 'amt': { // Show Intel AMT status getAmtInfo(function (state) { var resp = 'Intel AMT not detected.'; @@ -1463,7 +1484,7 @@ function createMeshCore(agent) { if (((reqpath == undefined) || (reqpath == '')) && (process.platform == 'win32')) { // List all the drives in the root, or the root itself var results = null; - try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar. + try { results = fs.readDrivesSync(); } catch (e) { sendConsoleText(e); } // TODO: Anyway to get drive total size and free space? Could draw a progress bar. //console.log('a', objToString(results, 0, ' ')); if (results != null) { for (var i = 0; i < results.length; ++i) { @@ -1478,7 +1499,7 @@ function createMeshCore(agent) { var xpath = path.join(reqpath, '*'); var results = null; - try { results = fs.readdirSync(xpath); } catch (e) { } + try { results = fs.readdirSync(xpath); } catch (e) { sendConsoleText(e); } if (results != null) { for (var i = 0; i < results.length; ++i) { if ((results[i] != '.') && (results[i] != '..')) { @@ -1514,6 +1535,7 @@ function createMeshCore(agent) { return; } //console.log('KVM Ctrl Data', cmd); + //sendConsoleText('KVM Ctrl Data: ' + cmd); try { cmd = JSON.parse(cmd); } catch (ex) { console.error('Invalid JSON: ' + cmd); return; } if ((cmd.path != null) && (process.platform != 'win32') && (cmd.path[0] != '/')) { cmd.path = '/' + cmd.path; } // Add '/' to paths on non-windows @@ -1523,6 +1545,11 @@ function createMeshCore(agent) { channel.write({ action: 'pong' }); break; } + case 'lock': { + // Lock the current user out of the desktop + if (process.platform == 'win32') { var child = require('child_process'); child.execFile(process.env['windir'] + '\\system32\\cmd.exe', ['/c', 'RunDll32.exe user32.dll,LockWorkStation'], { type: 1 }); } + break; + } case 'ls': { /* // Close the watcher if required diff --git a/amtscanner.js b/amtscanner.js index 4f1c9b5f..9fdbcd1c 100644 --- a/amtscanner.js +++ b/amtscanner.js @@ -112,7 +112,7 @@ module.exports.CreateAmtScanner = function (parent) { obj.performScan = function () { //console.log('performScan'); if (obj.action == false) { return false; } - obj.parent.db.getLocalAmtNodes(10, function (err, docs) { // TODO: handler more than 10 computer scan at the same time. + obj.parent.db.getLocalAmtNodes(10, function (err, docs) { // TODO: handler more than 10 computer scan at the same time. DNS resolved may need to be a seperate module. for (var i in obj.scanTable) { obj.scanTable[i].present = false; } if (err == null && docs.length > 0) { for (var i in docs) { diff --git a/certoperations.js b/certoperations.js index 433e2161..ed49b77c 100644 --- a/certoperations.js +++ b/certoperations.js @@ -283,6 +283,9 @@ module.exports.CertificateOperations = function () { // Fetch the name of the server var webCertificate = obj.pki.certificateFromPem(r.web.cert); r.CommonName = webCertificate.subject.getField('CN').value; + r.CommonNames = [ r.CommonName.toLowerCase() ]; + var altNames = webCertificate.getExtension('subjectAltName') + if (altNames) { for (var i in altNames.altNames) { r.CommonNames.push(altNames.altNames[i].value.toLowerCase()); } } var rootCertificate = obj.pki.certificateFromPem(r.root.cert); r.RootName = rootCertificate.subject.getField('CN').value; @@ -294,14 +297,14 @@ module.exports.CertificateOperations = function () { if (certargs == null) { commonName = r.CommonName; country = xcountry; organization = xorganization; } // Check if we have correct certificates - if ((r.CommonName == commonName) && (xcountry == country) && (xorganization == organization) && (r.AmtMpsName == mpsCommonName)) { + if ((r.CommonNames.indexOf(commonName.toLowerCase()) >= 0) && (r.AmtMpsName == mpsCommonName)) { // Certificate matches what we want, keep it. if (func != undefined) { func(r); } return r; } else { // Check what certificates we really need to re-generate. - if ((r.CommonName != commonName) || (xcountry != country) || (xorganization != organization)) { forceWebCertGen = 1; } + if ((r.CommonNames.indexOf(commonName.toLowerCase()) < 0)) { forceWebCertGen = 1; } if (r.AmtMpsName != mpsCommonName) { forceMpsCertGen = 1; } - } + } } console.log('Generating certificates, may take a few minutes...'); parent.updateServerState('state', 'generatingcertificates'); diff --git a/meshcentral.js b/meshcentral.js index d89f47f1..dcff8ab8 100644 --- a/meshcentral.js +++ b/meshcentral.js @@ -77,7 +77,7 @@ function CreateMeshCentralServer(config, args) { // Start the Meshcentral server obj.Start = function () { try { require('./pass').hash('test', function () { }); } catch (e) { console.log('Old version of node, must upgrade.'); return; } // TODO: Not sure if this test works or not. - + // Check for invalid arguments var validArguments = ['_', 'notls', 'user', 'port', 'aliasport', 'mpsport', 'mpsaliasport', 'redirport', 'cert', 'mpscert', 'deletedomain', 'deletedefaultdomain', 'showall', 'showusers', 'shownodes', 'showmeshes', 'showevents', 'showpower', 'clearpower', 'showiplocations', 'help', 'exactports', 'install', 'uninstall', 'start', 'stop', 'restart', 'debug', 'filespath', 'datapath', 'noagentupdate', 'launch', 'noserverbackup', 'mongodb', 'mongodbcol', 'wanonly', 'lanonly', 'nousers', 'mpsdebug', 'mpspass', 'ciralocalfqdn', 'dbexport', 'dbimport', 'selfupdate', 'tlsoffload', 'userallowedip', 'fastcert', 'swarmport', 'swarmdebug', 'logintoken', 'logintokenkey', 'logintokengen', 'logintokengen', 'mailtokengen', 'admin', 'unadmin']; for (var arg in obj.args) { obj.args[arg.toLocaleLowerCase()] = obj.args[arg]; if (validArguments.indexOf(arg.toLocaleLowerCase()) == -1) { console.log('Invalid argument "' + arg + '", use --help.'); return; } } diff --git a/meshscanner.js b/meshscanner.js index c484f262..bbd6350c 100644 --- a/meshscanner.js +++ b/meshscanner.js @@ -61,13 +61,11 @@ module.exports.CreateMeshScanner = function (parent) { if (server4.xxlocal != '*') { bindOptions.address = server4.xxlocal; } server4.bind(bindOptions, function () { try { - this.setBroadcast(true); - this.setMulticastTTL(128); - this.addMembership(membershipIPv4); + var doscan = true; + try { this.setBroadcast(true); this.setMulticastTTL(128); this.addMembership(membershipIPv4); } catch (e) { doscan = false; } this.on('error', function (error) { console.log('Error: ' + error); }); this.on('message', function (msg, info) { onUdpPacket(msg, info, this); }); - obj.performScan(this); - obj.performScan(this); + if (doscan == true) { obj.performScan(this); obj.performScan(this); } } catch (e) { console.log(e); } }); obj.servers4[localAddress] = server4; @@ -94,13 +92,11 @@ module.exports.CreateMeshScanner = function (parent) { if (server6.xxlocal != '*') { bindOptions.address = server6.xxlocal; } server6.bind(bindOptions, function () { try { - this.setBroadcast(true); - this.setMulticastTTL(128); - this.addMembership(membershipIPv6); + var doscan = true; + try { this.setBroadcast(true); this.setMulticastTTL(128); this.addMembership(membershipIPv6); } catch (e) { doscan = false; } this.on('error', function (error) { console.log('Error: ' + error); }); this.on('message', function (msg, info) { onUdpPacket(msg, info, this); }); - obj.performScan(this); - obj.performScan(this); + if (doscan == true) { obj.performScan(this); obj.performScan(this); } } catch (e) { console.log(e); } }); obj.servers6[localAddress] = server6; diff --git a/mpsserver.js b/mpsserver.js index 4c9e91a1..6b9ec5e5 100644 --- a/mpsserver.js +++ b/mpsserver.js @@ -414,7 +414,7 @@ module.exports.CreateMpsServer = function (parent, db, args, certificates) { var WindowSize = common.ReadInt(data, 9); socket.tag.activetunnels++; var cirachannel = socket.tag.channels[RecipientChannel]; - if (cirachannel == undefined) { /*console.log("MPS Error in CHANNEL_OPEN_CONFIRMATION: Unable to find channelid " + RecipientChannel);*/ return; } + if (cirachannel == undefined) { /*console.log("MPS Error in CHANNEL_OPEN_CONFIRMATION: Unable to find channelid " + RecipientChannel);*/ return 17; } cirachannel.amtchannelid = SenderChannel; cirachannel.sendcredits = cirachannel.amtCiraWindow = WindowSize; Debug(3, 'MPS:CHANNEL_OPEN_CONFIRMATION', RecipientChannel, SenderChannel, WindowSize); @@ -450,7 +450,7 @@ module.exports.CreateMpsServer = function (parent, db, args, certificates) { var ReasonCode = common.ReadInt(data, 5); Debug(3, 'MPS:CHANNEL_OPEN_FAILURE', RecipientChannel, ReasonCode); var cirachannel = socket.tag.channels[RecipientChannel]; - if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_OPEN_FAILURE: Unable to find channelid " + RecipientChannel); return; } + if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_OPEN_FAILURE: Unable to find channelid " + RecipientChannel); return 17; } if (cirachannel.state > 0) { cirachannel.state = 0; if (cirachannel.onStateChange) { cirachannel.onStateChange(cirachannel, cirachannel.state); } @@ -464,7 +464,7 @@ module.exports.CreateMpsServer = function (parent, db, args, certificates) { var RecipientChannel = common.ReadInt(data, 1); Debug(3, 'MPS:CHANNEL_CLOSE', RecipientChannel); var cirachannel = socket.tag.channels[RecipientChannel]; - if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_CLOSE: Unable to find channelid " + RecipientChannel); return; } + if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_CLOSE: Unable to find channelid " + RecipientChannel); return 5; } socket.tag.activetunnels--; if (cirachannel.state > 0) { cirachannel.state = 0; @@ -479,7 +479,7 @@ module.exports.CreateMpsServer = function (parent, db, args, certificates) { var RecipientChannel = common.ReadInt(data, 1); var ByteToAdd = common.ReadInt(data, 5); var cirachannel = socket.tag.channels[RecipientChannel]; - if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_WINDOW_ADJUST: Unable to find channelid " + RecipientChannel); return; } + if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_WINDOW_ADJUST: Unable to find channelid " + RecipientChannel); return 9; } cirachannel.sendcredits += ByteToAdd; Debug(3, 'MPS:CHANNEL_WINDOW_ADJUST', RecipientChannel, ByteToAdd, cirachannel.sendcredits); if (cirachannel.state == 2 && cirachannel.sendBuffer != undefined) { @@ -507,7 +507,7 @@ module.exports.CreateMpsServer = function (parent, db, args, certificates) { if (len < (9 + LengthOfData)) return 0; Debug(4, 'MPS:CHANNEL_DATA', RecipientChannel, LengthOfData); var cirachannel = socket.tag.channels[RecipientChannel]; - if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_DATA: Unable to find channelid " + RecipientChannel); return; } + if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_DATA: Unable to find channelid " + RecipientChannel); return 9 + LengthOfData; } cirachannel.amtpendingcredits += LengthOfData; if (cirachannel.onData) cirachannel.onData(cirachannel, data.substring(9, 9 + LengthOfData)); if (cirachannel.amtpendingcredits > (cirachannel.ciraWindow / 2)) { diff --git a/package.json b/package.json index 74445d95..ecabb958 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "meshcentral", - "version": "0.1.8-r", + "version": "0.1.8-y", "keywords": [ "Remote Management", "Intel AMT", diff --git a/public/scripts/agent-desktop-0.0.2.js b/public/scripts/agent-desktop-0.0.2.js index 761fb1da..30ec62f6 100644 --- a/public/scripts/agent-desktop-0.0.2.js +++ b/public/scripts/agent-desktop-0.0.2.js @@ -272,7 +272,7 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) { } obj.SendKeyMsgKC = function (action, kc) { - console.log('SendKeyMsgKC', action, kc); + //console.log('SendKeyMsgKC', action, kc); if (obj.State != 3) return; if (typeof action == 'object') { for (var i in action) { obj.SendKeyMsgKC(action[i][0], action[i][1]); } } else { obj.send(String.fromCharCode(0x00, obj.InputType.KEY, 0x00, 0x06, (action - 1), kc)); } diff --git a/public/scripts/agent-redir-ws-0.1.0.js b/public/scripts/agent-redir-ws-0.1.0.js index ef66aa11..fc643429 100644 --- a/public/scripts/agent-redir-ws-0.1.0.js +++ b/public/scripts/agent-redir-ws-0.1.0.js @@ -63,26 +63,25 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { obj.webSwitchOk = true; // Other side is ready for switch over performWebRtcSwitch(); } else if (controlMsg.type == 'webrtc1') { - sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc2\"}"); // Confirm we got end of data marker, indicates data will no longer be received on websocket. + obj.sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc2\"}"); // Confirm we got end of data marker, indicates data will no longer be received on websocket. } else if (controlMsg.type == 'webrtc2') { // TODO: Resume/Start sending data over WebRTC } } } - function sendCtrlMsg(x) { if (obj.ctrlMsgAllowed == true) { try { obj.socket.send(x); } catch (ex) { } } } + obj.sendCtrlMsg = function (x) { if (obj.ctrlMsgAllowed == true) { if (args && args.redirtrace) { console.log('RedirSend', typeof x, x); } try { obj.socket.send(x); } catch (ex) { } } } function performWebRtcSwitch() { if ((obj.webSwitchOk == true) && (obj.webRtcActive == true)) { - sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc0\"}"); // Indicate to the meshagent that it can start traffic switchover - sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc1\"}"); // Indicate to the meshagent that data traffic will no longer be sent over websocket. + obj.sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc0\"}"); // Indicate to the meshagent that it can start traffic switchover + obj.sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc1\"}"); // Indicate to the meshagent that data traffic will no longer be sent over websocket. // TODO: Hold/Stop sending data over websocket if (obj.onStateChanged != null) { obj.onStateChanged(obj, obj.State); } } } obj.xxOnMessage = function (e) { - //if (obj.debugmode == 1) { console.log('Recv', e.data); } //console.log('Recv', e.data, obj.State); if (obj.State < 3) { if (e.data == 'c') { @@ -149,7 +148,6 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { } } else { // If we get a string object, it maybe the WebRTC confirm. Ignore it. - //obj.debug("Agent Redir Relay - OnData - " + typeof e.data + " - " + e.data.length); obj.xxOnSocketData(e.data); } }; @@ -164,6 +162,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { } else if (typeof data !== 'string') return; //console.log("xxOnSocketData", rstr2hex(data)); + if (args && args.redirtrace) { console.log("RedirRecv", typeof data, data.length, data); } return obj.m.ProcessData(data); } @@ -175,6 +174,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { obj.send = function (x) { //obj.debug("Agent Redir Send(" + obj.webRtcActive + ", " + x.length + "): " + rstr2hex(x)); //console.log("Agent Redir Send(" + obj.webRtcActive + ", " + x.length + "): " + ((typeof x == 'string')?x:rstr2hex(x))); + if (args && args.redirtrace) { console.log('RedirSend', typeof x, x.length, x); } try { if (obj.socket != null && obj.socket.readyState == WebSocket.OPEN) { if (typeof x == 'string') { @@ -225,7 +225,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { //obj.debug("Agent Redir Socket Stopped"); obj.connectstate = -1; if (obj.socket != null) { - try { if (obj.socket.readyState == 1) { sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"close\"}"); obj.socket.close(); } } catch (e) { } + try { if (obj.socket.readyState == 1) { obj.sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"close\"}"); obj.socket.close(); } } catch (e) { } obj.socket = null; } obj.xxStateChange(0); diff --git a/readme.txt b/readme.txt index d3535d7f..5aa9e7c5 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ MeshCentral For more information, [visit MeshCommander.com/MeshCentral2](http://www.meshcommander.com/meshcentral2). -Download the [full PDF user's guide](http://info.meshcentral.com/downloads/meshcentral2/MeshCentral2UserGuide.pdf) with more information on installing, configuring and running MeshCentral2. +Download the [full PDF user's guide](http://info.meshcentral.com/downloads/meshcentral2/MeshCentral2UserGuide.pdf) with more information on configuring and running MeshCentral2. In addition, the [installation guide](http://info.meshcentral.com/downloads/meshcentral2/MeshCentral2InstallGuide.pdf) can help get MeshCentral installed on Amazon AWS, Microsoft Azure, Ubuntu and the Raspberry Pi. This is a full computer management web site. With MeshCentral, you can run your own web server to remotely manage and control computers on a local network or anywhere on the internet. Once you get the server started, create a mesh (a group of computers) and then download and install a mesh agent on each computer you want to manage. A minute later, the new computer will show up on the web site and you can take control of it. MeshCentral includes full web-based remote desktop, terminal and file management capability. diff --git a/sample-config.json b/sample-config.json index 6aec674b..fa94978d 100644 --- a/sample-config.json +++ b/sample-config.json @@ -1,15 +1,17 @@ { "__comment__" : "This is a sample configuration file, edit a section and remove the _ in front of the name. Refer to the user's guide for details.", - "_settings": { - "MongoDb": "mongodb://127.0.0.1:27017/meshcentral", - "MongoDbCol": "meshcentral", - "Port": 443, - "RedirPort": 80, - "AllowLoginToken": true, - "AllowFraming": true, - "WebRTC": false, - "ClickOnce": false, - "UserAllowedIP" : "127.0.0.1,::1,192.168.0.100" + "settings": { + "_MongoDb": "mongodb://127.0.0.1:27017/meshcentral", + "_MongoDbCol": "meshcentral", + "_WANonly": true, + "_LANonly": true, + "_Port": 443, + "_RedirPort": 80, + "_AllowLoginToken": true, + "_AllowFraming": true, + "_WebRTC": false, + "_ClickOnce": false, + "_UserAllowedIP" : "127.0.0.1,::1,192.168.0.100" }, "_domains": { "": { diff --git a/views/default.handlebars b/views/default.handlebars index 50e50f5b..ed4adb5e 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -3622,11 +3622,12 @@ if (desktop.contype == 2) { desktop.m.sendkey([[0xffe7,1],[0x6c,1],[0x6c,0],[0xffe7,0]]); // Intel AMT: Meta-left down, 'l' press, 'l' release, Meta-left release } else { + desktop.sendCtrlMsg('{"action":"lock"}'); //desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,0x5B],[desktop.m.KeyAction.DOWN,76],[desktop.m.KeyAction.UP,76],[desktop.m.KeyAction.EXUP,0x5B]]); // MeshAgent: L-Winkey press, 'L' press, 'L' release, L-Winkey release - desktop.m.SendKeyMsgKC(desktop.m.KeyAction.EXDOWN, 0x5B); + //desktop.m.SendKeyMsgKC(desktop.m.KeyAction.EXDOWN, 0x5B); //desktop.m.SendKeyMsgKC(desktop.m.KeyAction.DOWN, 76); //desktop.m.SendKeyMsgKC(desktop.m.KeyAction.UP, 76); - desktop.m.SendKeyMsgKC(desktop.m.KeyAction.EXUP, 0x5B); + //desktop.m.SendKeyMsgKC(desktop.m.KeyAction.EXUP, 0x5B); } } else if (ks == 3) { // WIN+M arrow if (desktop.contype == 2) { @@ -5190,6 +5191,7 @@ x += ''; if (hiddenUsers == 1) { x += '
1 more user not shown, use search box to look for users...
'; } else if (hiddenUsers > 1) { x += '
' + hiddenUsers + ' more users not shown, use search box to look for users...
'; } + if (maxUsers == 100) { x += '
No users found.
'; } QH('p3users', x); // Update current user panel if needed