diff --git a/agents/MeshCmd-signed.exe b/agents/MeshCmd-signed.exe index 30ead8cb..5f94c7a4 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 847e720c..21c8d4c9 100644 Binary files a/agents/MeshCmd64-signed.exe and b/agents/MeshCmd64-signed.exe differ diff --git a/meshdesktopmultiplex.js b/meshdesktopmultiplex.js index ea49d821..0e2daefc 100644 --- a/meshdesktopmultiplex.js +++ b/meshdesktopmultiplex.js @@ -905,6 +905,9 @@ function CreateMeshRelayEx2(parent, ws, req, domain, user, cookie) { obj.req = req; // Used in multi-server.js obj.viewOnly = ((cookie != null) && (cookie.vo == 1)); // set view only mode + // If the domain has remote desktop viewonly set, force everyone to be in viewonly mode. + if ((typeof domain.desktop == 'object') && (domain.desktop.viewonly == true)) { obj.viewOnly = true; } + // Setup traffic accounting if (parent.trafficStats.desktopMultiplex == null) { parent.trafficStats.desktopMultiplex = { connections: 1, sessions: 0, in: 0, out: 0 }; } else { parent.trafficStats.desktopMultiplex.connections++; } ws._socket.bytesReadEx = 0; diff --git a/views/default-mobile.handlebars b/views/default-mobile.handlebars index 4ca7d3d5..f2970a6b 100644 --- a/views/default-mobile.handlebars +++ b/views/default-mobile.handlebars @@ -2782,7 +2782,7 @@ // Check what keys we are allows to send if (currentNode != null) { var meshrights = GetMeshRights(currentNode.meshid); - var inputAllowed = ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); + var inputAllowed = ((features2 & 0x2000) == 0) && ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); if (inputAllowed == false) return false; var limitedInputAllowed = ((meshrights != 0xFFFFFFFF) && (((meshrights & 8) != 0) && ((meshrights & 256) == 0) && ((meshrights & 4096) != 0))); if (limitedInputAllowed == true) { if ((e.altKey == true) || (e.ctrlKey == true) || ((e.keyCode < 32) && (e.keyCode != 8) && (e.keyCode != 13)) || (e.keyCode > 90)) return false; } @@ -2816,7 +2816,7 @@ // Check what keys we are allows to send if (currentNode != null) { var meshrights = GetMeshRights(currentNode.meshid); - var inputAllowed = ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); + var inputAllowed = ((features2 & 0x2000) == 0) && ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); if (inputAllowed == false) return false; var limitedInputAllowed = ((meshrights != 0xFFFFFFFF) && (((meshrights & 8) != 0) && ((meshrights & 256) == 0) && ((meshrights & 4096) != 0))); if (limitedInputAllowed == true) { if ((e.altKey == true) || (e.ctrlKey == true) || ((e.keyCode < 32) && (e.keyCode != 8) && (e.keyCode != 13)) || (e.keyCode > 90)) return false; } @@ -2851,7 +2851,7 @@ // Check what keys we are allows to send if (currentNode != null) { var meshrights = GetMeshRights(currentNode.meshid); - var inputAllowed = ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); + var inputAllowed = ((features2 & 0x2000) == 0) && ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); if (inputAllowed == false) return false; var limitedInputAllowed = ((meshrights != 0xFFFFFFFF) && (((meshrights & 8) != 0) && ((meshrights & 256) == 0) && ((meshrights & 4096) != 0))); if (limitedInputAllowed == true) { if ((e.altKey == true) || (e.ctrlKey == true) || ((e.keyCode < 32) && (e.keyCode != 8) && (e.keyCode != 13)) || (e.keyCode > 90)) return false; } @@ -3991,6 +3991,7 @@ if (tsid != null) { desktop.options.tsid = tsid; } if (consent != null) { desktop.options.consent = consent; } desktop.onStateChanged = onDesktopStateChange; + if ((features2 & 0x2000) != 0) desktop.m.stopInput = true; desktop.onConsoleMessageChange = function () { if (desktop.consoleMessage) { Q('p11DeskConsoleMsg').innerHTML += formatAgentConsoleMessage(desktop.consoleMessage, desktop.consoleMessageId, desktop.consoleMessageArgs); @@ -4351,7 +4352,7 @@ QV('termarea4', !fullscreen); var rights = GetNodeRights(currentNode); - var inputAllowed = (currentNode.agent.id != 14) && ((rights == 0xFFFFFFFF) || (((rights & 8) != 0) && ((rights & 256) == 0) && ((rights & 4096) == 0))); + var inputAllowed = ((features2 & 0x2000) == 0) && (currentNode.agent.id != 14) && ((rights == 0xFFFFFFFF) || (((rights & 8) != 0) && ((rights & 256) == 0) && ((rights & 4096) == 0))); // Show full screen buttons if needed QV('deskkeybutton1', fullscreen); diff --git a/views/default.handlebars b/views/default.handlebars index e268c8f7..37b58869 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -3567,7 +3567,7 @@ // Check what keys we are allows to send if (currentNode != null) { var meshrights = GetNodeRights(currentNode); - var inputAllowed = ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); + var inputAllowed = ((features2 & 0x2000) == 0) && ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); if (inputAllowed == false) return false; var limitedInputAllowed = ((meshrights != 0xFFFFFFFF) && (((meshrights & 8) != 0) && ((meshrights & 256) == 0) && ((meshrights & 4096) != 0))); if (limitedInputAllowed == true) { if ((e.altKey == true) || (e.ctrlKey == true) || ((e.keyCode < 32) && (e.keyCode != 8) && (e.keyCode != 13)) || (e.keyCode > 90)) return false; } @@ -3626,7 +3626,7 @@ // Check what keys we are allows to send if (currentNode != null) { var meshrights = GetNodeRights(currentNode); - var inputAllowed = ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); + var inputAllowed = ((features2 & 0x2000) == 0) && ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); if (inputAllowed == false) return false; var limitedInputAllowed = ((meshrights != 0xFFFFFFFF) && (((meshrights & 8) != 0) && ((meshrights & 256) == 0) && ((meshrights & 4096) != 0))); if (limitedInputAllowed == true) { if ((e.altKey == true) || (e.ctrlKey == true) || ((e.keyCode < 32) && (e.keyCode != 8) && (e.keyCode != 13)) || (e.keyCode > 90)) return false; } @@ -3660,7 +3660,7 @@ // Check what keys we are allows to send if (currentNode != null) { var meshrights = GetNodeRights(currentNode); - var inputAllowed = ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); + var inputAllowed = ((features2 & 0x2000) == 0) && ((meshrights == 0xFFFFFFFF) || (((meshrights & 8) != 0) && ((meshrights & 256) == 0))); if (inputAllowed == false) return false; var limitedInputAllowed = ((meshrights != 0xFFFFFFFF) && (((meshrights & 8) != 0) && ((meshrights & 256) == 0) && ((meshrights & 4096) != 0))); if (limitedInputAllowed == true) { if ((e.altKey == true) || (e.ctrlKey == true) || ((e.keyCode < 32) && (e.keyCode != 8) && (e.keyCode != 13)) || (e.keyCode > 90)) return false; } @@ -7640,6 +7640,7 @@ if (desktop.m.SendCompressionLevel) { desktop.m.SendCompressionLevel(1, desktopsettings.quality, desktopsettings.scaling, desktopsettings.framerate); } desktop.onStateChanged = onDesktopStateChange; desktop.onMetadataChange = function(metadata) { updateMetadata(desktop, 'deskmetadata'); } + if ((features2 & 0x2000) != 0) desktop.m.stopInput = true; if (desktop && desktop.m.mouseCursorActive) { desktop.m.mouseCursorActive(true); } QV('DeskInputLockedButton', desktop.m.RemoteInputLock === 1); QV('DeskInputUnLockedButton', desktop.m.RemoteInputLock === 0); @@ -7700,7 +7701,7 @@ QV('d7meshkvm', (webRtcDesktop) || ((currentNode.agent != null) && (currentNode.agent.caps & 1) && ((deskState == false) || (desktop.contype == 1)))); // Enable buttons - var inputAllowed = ((currentNode.agent == null) || (currentNode.agent.id != 14)) && ((rights == 0xFFFFFFFF) || (((rights & 8) != 0) && ((rights & 256) == 0) && ((rights & 4096) == 0))); + var inputAllowed = ((features2 & 0x2000) == 0) && ((currentNode.agent == null) || (currentNode.agent.id != 14)) && ((rights == 0xFFFFFFFF) || (((rights & 8) != 0) && ((rights & 256) == 0) && ((rights & 4096) == 0))); var online = ((currentNode.conn & 1) != 0); // If Agent (1) connected, enable remote desktop QE('connectbutton1', online); var hwonline = ((currentNode.conn & 6) != 0); // If CIRA (2) or AMT (4) connected, enable hardware terminal @@ -7859,6 +7860,7 @@ if (tsid != null) { desktop.options.tsid = tsid; } if (consent != null) { desktop.options.consent = consent; } desktop.onStateChanged = onDesktopStateChange; + if ((features2 & 0x2000) != 0) desktop.m.stopInput = true; desktop.m.onRemoteInputLockChanged = function(obj, state) { QV('DeskInputLockedButton', state); QV('DeskInputUnLockedButton', !state); } desktop.onConsoleMessageChange = function () { if (desktop.consoleMessage) { diff --git a/webserver.js b/webserver.js index faa1b467..c2a35e16 100644 --- a/webserver.js +++ b/webserver.js @@ -2818,7 +2818,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { if (domain.localsessionrecording === false) { features2 += 0x00000400; } // Disable local recording feature if (domain.clipboardget == false) { features2 += 0x00000800; } // Disable clipboard get if (domain.clipboardset == false) { features2 += 0x00001000; } // Disable clipboard set - if ((typeof domain.desktop != 'object') || (domain.desktop.viewonly != false)) { features2 += 0x00002000; } // Indicates remote desktop is viewonly + if ((typeof domain.desktop == 'object') && (domain.desktop.viewonly == true)) { features2 += 0x00002000; } // Indicates remote desktop is viewonly return { features: features, features2: features2 }; }