1
0
Fork 0
mirror of https://github.com/Ylianst/MeshCentral.git synced 2025-02-12 11:01:52 +00:00

Fixed desktop multiplexor view-only mode.

This commit is contained in:
Ylian Saint-Hilaire 2021-06-30 00:01:44 -07:00
parent 200fa9514b
commit 85f8db041b
3 changed files with 60 additions and 38 deletions

View file

@ -2156,7 +2156,7 @@ function onTunnelData(data) {
this.pipe(this.httprequest.desktop.kvm, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. Pipe the Browser --> KVM input. this.pipe(this.httprequest.desktop.kvm, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. Pipe the Browser --> KVM input.
} else { } else {
// We need to only pipe non-mouse & non-keyboard inputs. // We need to only pipe non-mouse & non-keyboard inputs.
//sendConsoleText('Warning: No Remote Desktop Input Rights.'); // sendConsoleText('Warning: No Remote Desktop Input Rights.');
// TODO!!! // TODO!!!
} }

View file

@ -339,6 +339,12 @@ function CreateDesktopMultiplexor(parent, domain, nodeid, func) {
for (var i in obj.viewers) { obj.sendToViewer(obj.viewers[i], data); } for (var i in obj.viewers) { obj.sendToViewer(obj.viewers[i], data); }
} }
// Send this command to all viewers
obj.sendToAllInputViewers = function (data) {
if (obj.viewers == null) return;
for (var i in obj.viewers) { if (obj.viewers[i].viewOnly != true) { obj.sendToViewer(obj.viewers[i], data); } }
}
// Send data to the viewer or queue it up for sending // Send data to the viewer or queue it up for sending
obj.sendToViewer = function (viewer, data) { obj.sendToViewer = function (viewer, data) {
if ((viewer == null) || (obj.viewers == null)) return; if ((viewer == null) || (obj.viewers == null)) return;
@ -665,10 +671,10 @@ function CreateDesktopMultiplexor(parent, domain, nodeid, func) {
case 11: // GetDisplays case 11: // GetDisplays
// Store and send this to all viewers right away // Store and send this to all viewers right away
obj.lastDisplayInfoData = data; obj.lastDisplayInfoData = data;
obj.sendToAllViewers(data); obj.sendToAllInputViewers(data);
break; break;
case 12: // SetDisplay case 12: // SetDisplay
obj.sendToAllViewers(data); obj.sendToAllInputViewers(data);
break; break;
case 14: // KVM_INIT_TOUCH case 14: // KVM_INIT_TOUCH
break; break;
@ -688,16 +694,16 @@ function CreateDesktopMultiplexor(parent, domain, nodeid, func) {
// Display information // Display information
if ((data.length < 14) || (((data.length - 4) % 10) != 0)) break; // Command must be 14 bytes and have header + 10 byte for each display. if ((data.length < 14) || (((data.length - 4) % 10) != 0)) break; // Command must be 14 bytes and have header + 10 byte for each display.
obj.lastDisplayLocationData = data; obj.lastDisplayLocationData = data;
obj.sendToAllViewers(data); obj.sendToAllInputViewers(data);
break; break;
case 87: // MNG_KVM_INPUT_LOCK case 87: // MNG_KVM_INPUT_LOCK
// Send this to all viewers right away // Send this to all viewers right away
// This will update all views on the current state of the input lock // This will update all views on the current state of the input lock
obj.sendToAllViewers(data); obj.sendToAllInputViewers(data);
break; break;
case 88: // MNG_KVM_MOUSE_CURSOR case 88: // MNG_KVM_MOUSE_CURSOR
// Send this to all viewers right away // Send this to all viewers right away
obj.sendToAllViewers(data); obj.sendToAllInputViewers(data);
break; break;
default: default:
console.log('Un-handled agent command: ' + command); console.log('Un-handled agent command: ' + command);
@ -915,6 +921,22 @@ function CreateMeshRelayEx2(parent, ws, req, domain, user, cookie) {
// If there is no authentication, drop this connection // If there is no authentication, drop this connection
if ((obj.id != null) && (obj.user == null) && (obj.ruserid == null)) { try { ws.close(); parent.parent.debug('relay', 'DesktopRelay: Connection with no authentication (' + obj.req.clientIp + ')'); } catch (e) { console.log(e); } return; } if ((obj.id != null) && (obj.user == null) && (obj.ruserid == null)) { try { ws.close(); parent.parent.debug('relay', 'DesktopRelay: Connection with no authentication (' + obj.req.clientIp + ')'); } catch (e) { console.log(e); } return; }
// Check if this user has input access on the device
if ((obj.user != null) && (obj.viewOnly == false)) {
obj.viewOnly = true; // Set a view only for now until we figure out otherwise
parent.db.Get(obj.nodeid, function (err, docs) {
if (obj.req == null) return; // This connection was closed.
if (docs.length == 0) { console.log('ERR: Node not found'); try { obj.close(); } catch (e) { } return; } // Disconnect websocket
const node = docs[0];
// Check if this user has permission to manage this computer
const rights = parent.GetNodeRights(obj.user, node.meshid, node._id);
if ((rights & 0x00000008) == 0) { try { obj.close(); } catch (e) { } return; } // Check MESHRIGHT_ADMIN or MESHRIGHT_REMOTECONTROL
if ((rights != 0xFFFFFFFF) && ((rights & 0x00010000) != 0)) { try { obj.close(); } catch (e) { } return; } // Check MESHRIGHT_NODESKTOP
if ((rights == 0xFFFFFFFF) || ((rights & 0x00000100) == 0)) { obj.viewOnly = false; } // Check MESHRIGHT_REMOTEVIEWONLY
});
}
// Relay session count (we may remove this in the future) // Relay session count (we may remove this in the future)
obj.relaySessionCounted = true; obj.relaySessionCounted = true;
parent.relaySessionCount++; parent.relaySessionCount++;

View file

@ -31,41 +31,41 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
const USERCONSENT_ShowConnectionToolbar = 64; const USERCONSENT_ShowConnectionToolbar = 64;
// Mesh Rights // Mesh Rights
const MESHRIGHT_EDITMESH = 0x00000001; const MESHRIGHT_EDITMESH = 0x00000001; // 1
const MESHRIGHT_MANAGEUSERS = 0x00000002; const MESHRIGHT_MANAGEUSERS = 0x00000002; // 2
const MESHRIGHT_MANAGECOMPUTERS = 0x00000004; const MESHRIGHT_MANAGECOMPUTERS = 0x00000004; // 4
const MESHRIGHT_REMOTECONTROL = 0x00000008; const MESHRIGHT_REMOTECONTROL = 0x00000008; // 8
const MESHRIGHT_AGENTCONSOLE = 0x00000010; const MESHRIGHT_AGENTCONSOLE = 0x00000010; // 16
const MESHRIGHT_SERVERFILES = 0x00000020; const MESHRIGHT_SERVERFILES = 0x00000020; // 32
const MESHRIGHT_WAKEDEVICE = 0x00000040; const MESHRIGHT_WAKEDEVICE = 0x00000040; // 64
const MESHRIGHT_SETNOTES = 0x00000080; const MESHRIGHT_SETNOTES = 0x00000080; // 128
const MESHRIGHT_REMOTEVIEWONLY = 0x00000100; const MESHRIGHT_REMOTEVIEWONLY = 0x00000100; // 256
const MESHRIGHT_NOTERMINAL = 0x00000200; const MESHRIGHT_NOTERMINAL = 0x00000200; // 512
const MESHRIGHT_NOFILES = 0x00000400; const MESHRIGHT_NOFILES = 0x00000400; // 1024
const MESHRIGHT_NOAMT = 0x00000800; const MESHRIGHT_NOAMT = 0x00000800; // 2048
const MESHRIGHT_DESKLIMITEDINPUT = 0x00001000; const MESHRIGHT_DESKLIMITEDINPUT = 0x00001000; // 4096
const MESHRIGHT_LIMITEVENTS = 0x00002000; const MESHRIGHT_LIMITEVENTS = 0x00002000; // 8192
const MESHRIGHT_CHATNOTIFY = 0x00004000; const MESHRIGHT_CHATNOTIFY = 0x00004000; // 16384
const MESHRIGHT_UNINSTALL = 0x00008000; const MESHRIGHT_UNINSTALL = 0x00008000; // 32768
const MESHRIGHT_NODESKTOP = 0x00010000; const MESHRIGHT_NODESKTOP = 0x00010000; // 65536
const MESHRIGHT_REMOTECOMMAND = 0x00020000; const MESHRIGHT_REMOTECOMMAND = 0x00020000; // 131072
const MESHRIGHT_RESETOFF = 0x00040000; const MESHRIGHT_RESETOFF = 0x00040000; // 262144
const MESHRIGHT_GUESTSHARING = 0x00080000; const MESHRIGHT_GUESTSHARING = 0x00080000; // 524288
const MESHRIGHT_ADMIN = 0xFFFFFFFF; const MESHRIGHT_ADMIN = 0xFFFFFFFF;
// Site rights // Site rights
const SITERIGHT_SERVERBACKUP = 0x00000001; const SITERIGHT_SERVERBACKUP = 0x00000001; // 1
const SITERIGHT_MANAGEUSERS = 0x00000002; const SITERIGHT_MANAGEUSERS = 0x00000002; // 2
const SITERIGHT_SERVERRESTORE = 0x00000004; const SITERIGHT_SERVERRESTORE = 0x00000004; // 4
const SITERIGHT_FILEACCESS = 0x00000008; const SITERIGHT_FILEACCESS = 0x00000008; // 8
const SITERIGHT_SERVERUPDATE = 0x00000010; const SITERIGHT_SERVERUPDATE = 0x00000010; // 16
const SITERIGHT_LOCKED = 0x00000020; const SITERIGHT_LOCKED = 0x00000020; // 32
const SITERIGHT_NONEWGROUPS = 0x00000040; const SITERIGHT_NONEWGROUPS = 0x00000040; // 64
const SITERIGHT_NOMESHCMD = 0x00000080; const SITERIGHT_NOMESHCMD = 0x00000080; // 128
const SITERIGHT_USERGROUPS = 0x00000100; const SITERIGHT_USERGROUPS = 0x00000100; // 256
const SITERIGHT_RECORDINGS = 0x00000200; const SITERIGHT_RECORDINGS = 0x00000200; // 512
const SITERIGHT_LOCKSETTINGS = 0x00000400; const SITERIGHT_LOCKSETTINGS = 0x00000400; // 1024
const SITERIGHT_ALLEVENTS = 0x00000800; const SITERIGHT_ALLEVENTS = 0x00000800; // 2048
const SITERIGHT_ADMIN = 0xFFFFFFFF; const SITERIGHT_ADMIN = 0xFFFFFFFF;
// Events // Events