From 421a6349d5377e5e381b9c05960e763592c7677b Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Tue, 3 Mar 2020 16:22:50 -0800 Subject: [PATCH] Many fixes with desktop recording indexor and player. --- mcrec.js | 44 ++++++++++++++++++++--------------------- meshrelay.js | 24 +++++++++++----------- redirserver.js | 3 ++- views/player.handlebars | 22 +++++++++++---------- 4 files changed, 49 insertions(+), 44 deletions(-) diff --git a/mcrec.js b/mcrec.js index 6fa02519..267130e1 100644 --- a/mcrec.js +++ b/mcrec.js @@ -113,13 +113,13 @@ function processBlock(state, block, err) { // MeshCentral Remote Desktop // TODO if (block.data.length >= 4) { - var command = block.data.readInt16BE(0); - var cmdsize = block.data.readInt16BE(2); + var command = block.data.readUInt16BE(0); + var cmdsize = block.data.readUInt16BE(2); if ((command == 27) && (cmdsize == 8)) { // Jumbo packet if (block.data.length >= 12) { - command = block.data.readInt16BE(8); - cmdsize = block.data.readInt32BE(4); + command = block.data.readUInt16BE(8); + cmdsize = block.data.readUInt32BE(4); if (block.data.length == (cmdsize + 8)) { block.data = block.data.slice(8, block.data.length); } else { @@ -131,8 +131,8 @@ function processBlock(state, block, err) { switch (command) { case 3: // Tile - var x = block.data.readInt16BE(4); - var y = block.data.readInt16BE(6); + var x = block.data.readUInt16BE(4); + var y = block.data.readUInt16BE(6); var dimensions = require('image-size')(block.data.slice(8)); //log("Tile", x, y, dimensions.width, dimensions.height, block.ptr); //console.log(elapseSeconds); @@ -148,13 +148,13 @@ function processBlock(state, block, err) { break; case 4: // Tile copy - var x = block.data.readInt16BE(4); - var y = block.data.readInt16BE(6); + var x = block.data.readUInt16BE(4); + var y = block.data.readUInt16BE(6); //log("TileCopy", x, y); break; case 7: // Screen Size, clear the screen state and computer the tile count - state.width = block.data.readInt16BE(4); - state.height = block.data.readInt16BE(6); + state.width = block.data.readUInt16BE(4); + state.height = block.data.readUInt16BE(6); state.swidth = state.width / 16; state.sheight = state.height / 16; if (Math.floor(state.swidth) != state.swidth) { state.swidth = Math.floor(state.swidth) + 1; } @@ -232,20 +232,20 @@ function recordingEntry(fd, type, flags, time, data, func, tag, position) { function readLastBlock(state, func) { var buf = Buffer.alloc(32); fs.read(state.recFile, buf, 0, 32, state.recFileSize - 32, function (err, bytesRead, buf) { - var type = buf.readInt16BE(0); - var flags = buf.readInt16BE(2); - var size = buf.readInt32BE(4); - var time = (buf.readInt32BE(8) << 32) + buf.readInt32BE(12); + var type = buf.readUInt16BE(0); + var flags = buf.readUInt16BE(2); + var size = buf.readUInt32BE(4); + var time = (buf.readUInt32BE(8) << 32) + buf.readUInt32BE(12); var magic = buf.toString('utf8', 16, 32); if ((type == 3) && (size == 16) && (magic == 'MeshCentralMCNDX')) { // Extra metadata present, lets read it. extraMetadata = null; var buf2 = Buffer.alloc(16); fs.read(state.recFile, buf2, 0, 16, time, function (err, bytesRead, buf2) { - var xtype = buf2.readInt16BE(0); - var xflags = buf2.readInt16BE(2); - var xsize = buf2.readInt32BE(4); - var xtime = (buf2.readInt32BE(8) << 32) + buf.readInt32BE(12); + var xtype = buf2.readUInt16BE(0); + var xflags = buf2.readUInt16BE(2); + var xsize = buf2.readUInt32BE(4); + var xtime = (buf2.readUInt32BE(8) << 32) + buf.readUInt32BE(12); var buf3 = Buffer.alloc(xsize); fs.read(state.recFile, buf3, 0, xsize, time + 16, function (err, bytesRead, buf3) { func(state, true, xtime, JSON.parse(buf3.toString())); @@ -263,10 +263,10 @@ function readNextBlock(state, func) { var r = {}, buf = Buffer.alloc(16); fs.read(state.recFile, buf, 0, 16, state.recFilePtr, function (err, bytesRead, buf) { if (bytesRead != 16) { func(state, null, true); return; } // Error - r.type = buf.readInt16BE(0); - r.flags = buf.readInt16BE(2); - r.size = buf.readInt32BE(4); - r.time = buf.readIntBE(8, 8); + r.type = buf.readUInt16BE(0); + r.flags = buf.readUInt16BE(2); + r.size = buf.readUInt32BE(4); + r.time = buf.readUIntBE(8, 8); r.date = new Date(r.time); r.ptr = state.recFilePtr; if ((state.recFilePtr + 16 + r.size) > state.recFileSize) { func(state, null, true); return; } // Error diff --git a/meshrelay.js b/meshrelay.js index 1b9bed40..37ff750c 100644 --- a/meshrelay.js +++ b/meshrelay.js @@ -330,17 +330,6 @@ module.exports.CreateMeshRelay = function (parent, ws, req, domain, user, cookie if (relayinfo.state == 2) { var peer = (relayinfo.peer1 == obj) ? relayinfo.peer2 : relayinfo.peer1; - // Close the recording file - if (ws.logfile != null) { - recordingEntry(ws.logfile.fd, 3, 0, 'MeshCentralMCREC', function (fd, tag) { - parent.parent.fs.close(fd); - tag.ws.logfile = null; - tag.pws.logfile = null; - // Now that the recording file is closed, check if we need to index this file. - if (domain.sessionrecording.index !== false) { parent.parent.certificateOperations.acceleratorPerformOperation('indexMcRec', tag.logfile.filename); } - }, { ws: ws, pws: peer.ws, logfile: ws.logfile }); - } - // Disconnect the peer try { if (peer.relaySessionCounted) { parent.relaySessionCount--; delete peer.relaySessionCounted; } } catch (ex) { console.log(ex); } parent.parent.debug('relay', 'Relay disconnect: ' + obj.id + ' (' + cleanRemoteAddr(obj.req.ip) + ' --> ' + cleanRemoteAddr(peer.req.ip) + ')'); @@ -369,6 +358,19 @@ module.exports.CreateMeshRelay = function (parent, ws, req, domain, user, cookie } else { parent.parent.debug('relay', 'Relay disconnect: ' + obj.id + ' (' + cleanRemoteAddr(obj.req.ip) + ')'); } + + // Close the recording file if needed + if (ws.logfile != null) { + var logfile = ws.logfile; + delete ws.logfile; + if (peer.ws) { delete peer.ws.logfile; } + recordingEntry(logfile.fd, 3, 0, 'MeshCentralMCREC', function (fd, tag) { + parent.parent.fs.close(fd); + // Now that the recording file is closed, check if we need to index this file. + if (domain.sessionrecording.index !== false) { parent.parent.certificateOperations.acceleratorPerformOperation('indexMcRec', tag.logfile.filename); } + }, { ws: ws, pws: peer.ws, logfile: logfile }); + } + try { ws.close(); } catch (ex) { } delete parent.wsrelays[obj.id]; } diff --git a/redirserver.js b/redirserver.js index 884bda73..50d560dd 100644 --- a/redirserver.js +++ b/redirserver.js @@ -113,7 +113,8 @@ module.exports.CreateRedirServer = function (parent, db, args, func) { if (parent.config.domains[i].dns != null) { continue; } var url = parent.config.domains[i].url; obj.app.get(url, performRedirection); // Root redirection - obj.app.use(url + "clickonce", obj.express.static(obj.parent.path.join(__dirname, "public/clickonce"))); // Indicates the clickonce folder is public + obj.app.get(url + 'player.htm', performRedirection); // Player redirection + obj.app.use(url + 'clickonce', obj.express.static(obj.parent.path.join(__dirname, "public/clickonce"))); // Indicates the clickonce folder is public // Setup all of the redirections to HTTPS const redirections = ['terms', 'logout', 'MeshServerRootCert.cer', 'mescript.ashx', 'checkmail', 'agentinvite', 'messenger', 'meshosxagent', 'devicepowerevents.ashx', 'downloadfile.ashx', 'userfiles/*', 'webrelay.ashx', 'health.ashx', 'logo.png', 'welcome.jpg']; diff --git a/views/player.handlebars b/views/player.handlebars index f39fe627..ba7cee12 100644 --- a/views/player.handlebars +++ b/views/player.handlebars @@ -288,15 +288,18 @@ if ((playing == false) && (forced !== true)) return; var flagBinary = (flags & 1) != 0, flagUser = (flags & 2) != 0; - // Update the clock - var deltaTimeTotalSec = Math.floor((time - recFileStartTime) / 1000); - if (currentDeltaTimeTotalSec != deltaTimeTotalSec) { - // Hours, minutes and seconds - currentDeltaTimeTotalSec = deltaTimeTotalSec; - var hrs = Math.floor(deltaTimeTotalSec / 3600); - var mins = Math.floor((deltaTimeTotalSec % 3600) / 60); - var secs = Math.floor(deltaTimeTotalSec % 60); - QH('timespan', pad2(hrs) + ':' + pad2(mins) + ':' + pad2(secs)) + if (type == 2) { + // Update the clock + recFileLastTime = time; + var deltaTimeTotalSec = Math.floor((time - recFileStartTime) / 1000); + if (currentDeltaTimeTotalSec != deltaTimeTotalSec) { + // Hours, minutes and seconds + currentDeltaTimeTotalSec = deltaTimeTotalSec; + var hrs = Math.floor(deltaTimeTotalSec / 3600); + var mins = Math.floor((deltaTimeTotalSec % 3600) / 60); + var secs = Math.floor(deltaTimeTotalSec % 60); + QH('timespan', pad2(hrs) + ':' + pad2(mins) + ':' + pad2(secs)) + } } if ((type == 2) && flagBinary && !flagUser) { @@ -325,7 +328,6 @@ } } - recFileLastTime = time; if (playing) { readNextBlock(processBlock); } }