Updated to support Connection Bar for KVM

Bryan Roe committed Oct 11, 2019 at 10:53 UTC e3419f4d9dcca0198f0cbb515ff69395d4be4211
1 file changed +93 -6
agents/meshcore.js
+93 -6
@@ -1192,7 +1192,8 @@ function createMeshCore(agent)
1192 this.httprequest.desktop.kvm.parent = this.httprequest.desktop;
1193 this.desktop = this.httprequest.desktop;
1194
1195 - this.end = function () {
1195 + this.end = function ()
1196 + {
1197 --this.desktop.kvm.connectionCount;
1198
1199 // Unpipe the web socket
@@ -1205,14 +1206,55 @@ function createMeshCore(agent)
1206 this.httprequest.desktop.kvm.unpipe(this.rtcchannel);
1207 }
1208
1208 - if (this.desktop.kvm.connectionCount == 0) {
1209 + if (this.desktop.kvm.connectionCount == 0)
1210 + {
1211 // Display a toast message. This may not be supported on all platforms.
1212 // try { require('toaster').Toast('MeshCentral', 'Remote Desktop Control Ended.'); } catch (ex) { }
1213
1214 this.httprequest.desktop.kvm.end();
1215 + if(this.httprequest.desktop.kvm.connectionBar)
1216 + {
1217 + this.httprequest.desktop.kvm.connectionBar.removeAllListeners('close');
1218 + this.httprequest.desktop.kvm.connectionBar.close();
1219 + this.httprequest.desktop.kvm.connectionBar = null;
1220 + }
1221 + }
1222 + else
1223 + {
1224 + for(var i in this.httprequest.desktop.kvm.users)
1225 + {
1226 + if(this.httprequest.desktop.kvm.users[i] == this.httprequest.username)
1227 + {
1228 + this.httprequest.desktop.kvm.users.splice(i, 1);
1229 + this.httprequest.desktop.kvm.connectionBar.removeAllListeners('close');
1230 + this.httprequest.desktop.kvm.connectionBar.close();
1231 +
1232 + this.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')('Sharing desktop with: ' + this.httprequest.desktop.kvm.users.sort().join(', '));
1233 + this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;
1234 + this.httprequest.desktop.kvm.connectionBar.on('close', function ()
1235 + {
1236 + MeshServerLog('Remote Desktop Connection forcefully closed by local user (' + this.httprequest.remoteaddr + ')', this.httprequest);
1237 + for (var i in this.httprequest.desktop.kvm._pipedStreams)
1238 + {
1239 + this.httprequest.desktop.kvm._pipedStreams[i].end();
1240 + }
1241 + this.httprequest.desktop.kvm.end();
1242 + });
1243 + break;
1244 + }
1245 + }
1246 }
1247 };
1215 - if (this.httprequest.desktop.kvm.hasOwnProperty("connectionCount")) { this.httprequest.desktop.kvm.connectionCount++; } else { this.httprequest.desktop.kvm.connectionCount = 1; }
1248 + if (this.httprequest.desktop.kvm.hasOwnProperty("connectionCount"))
1249 + {
1250 + this.httprequest.desktop.kvm.connectionCount++;
1251 + this.httprequest.desktop.kvm.users.push(this.httprequest.username);
1252 + }
1253 + else
1254 + {
1255 + this.httprequest.desktop.kvm.connectionCount = 1;
1256 + this.httprequest.desktop.kvm.users = [this.httprequest.username];
1257 + }
1258
1259 if ((this.httprequest.rights == 0xFFFFFFFF) || (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) != 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0))) {
1260 // If we have remote control rights, pipe the KVM input
@@ -1239,10 +1281,32 @@ function createMeshCore(agent)
1281 // Success
1282 MeshServerLog('Starting remote desktop after local user accepted (' + this.ws.httprequest.remoteaddr + ')', this.ws.httprequest);
1283 this.ws.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: null }));
1242 - if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 1)) {
1284 + if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 1))
1285 + {
1286 // User Notifications is required
1287 try { require('toaster').Toast('MeshCentral', this.ws.httprequest.username + ' started a remote desktop session.'); } catch (ex) { }
1288 }
1289 + if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 0x40))
1290 + {
1291 + // Connection Bar is required
1292 + MeshServerLog('Remote Desktop Connection Bar Activated/Updated (' + this.ws.httprequest.remoteaddr + ')', this.ws.httprequest);
1293 + if (this.ws.httprequest.desktop.kvm.connectionBar)
1294 + {
1295 + this.ws.httprequest.desktop.kvm.connectionBar.removeAllListeners('close');
1296 + this.ws.httprequest.desktop.kvm.connectionBar.close();
1297 + }
1298 + this.ws.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')('Sharing desktop with: ' + this.ws.httprequest.desktop.kvm.users.sort().join(', '));
1299 + this.ws.httprequest.desktop.kvm.connectionBar.httprequest = this.ws.httprequest;
1300 + this.ws.httprequest.desktop.kvm.connectionBar.on('close', function ()
1301 + {
1302 + MeshServerLog('Remote Desktop Connection forcefully closed by local user (' + this.httprequest.remoteaddr + ')', this.httprequest);
1303 + for (var i in this.httprequest.desktop.kvm._pipedStreams)
1304 + {
1305 + this.httprequest.desktop.kvm._pipedStreams[i].end();
1306 + }
1307 + this.httprequest.desktop.kvm.end();
1308 + });
1309 + }
1310 this.ws.httprequest.desktop.kvm.pipe(this.ws, { dataTypeSkip: 1 });
1311 this.ws.resume();
1312 },
@@ -1256,13 +1320,36 @@ function createMeshCore(agent)
1320 else
1321 {
1322 // User Consent Prompt is not required
1259 - if (this.httprequest.consent && (this.httprequest.consent & 1)) {
1323 + if (this.httprequest.consent && (this.httprequest.consent & 1))
1324 + {
1325 // User Notifications is required
1326 MeshServerLog('Started remote desktop with toast notification (' + this.httprequest.remoteaddr + ')', this.httprequest);
1327 try { require('toaster').Toast('MeshCentral', this.httprequest.username + ' started a remote desktop session.'); } catch (ex) { }
1263 - } else {
1328 + } else
1329 + {
1330 MeshServerLog('Started remote desktop without notification (' + this.httprequest.remoteaddr + ')', this.httprequest);
1331 }
1332 + if (this.httprequest.consent && (this.httprequest.consent & 0x40))
1333 + {
1334 + // Connection Bar is required
1335 + MeshServerLog('Remote Desktop Connection Bar Activated/Updated (' + this.httprequest.remoteaddr + ')', this.httprequest);
1336 + if(this.httprequest.desktop.kvm.connectionBar)
1337 + {
1338 + this.httprequest.desktop.kvm.connectionBar.removeAllListeners('close');
1339 + this.httprequest.desktop.kvm.connectionBar.close();
1340 + }
1341 + this.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')('Sharing desktop with: ' + this.httprequest.desktop.kvm.users.sort().join(', '));
1342 + this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;
1343 + this.httprequest.desktop.kvm.connectionBar.on('close', function ()
1344 + {
1345 + MeshServerLog('Remote Desktop Connection forcefully closed by local user (' + this.httprequest.remoteaddr + ')', this.httprequest);
1346 + for (var i in this.httprequest.desktop.kvm._pipedStreams)
1347 + {
1348 + this.httprequest.desktop.kvm._pipedStreams[i].end();
1349 + }
1350 + this.httprequest.desktop.kvm.end();
1351 + });
1352 + }
1353 this.httprequest.desktop.kvm.pipe(this, { dataTypeSkip: 1 });
1354 }
1355