This commit is contained in:
silversword411 2022-02-14 23:31:22 -05:00
commit c65dfdd59e
No known key found for this signature in database
GPG Key ID: 6F4BD176F56B50CA
16 changed files with 76 additions and 39 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -4,7 +4,7 @@
"agentVersion": "New Version", "agentVersion": "New Version",
"group": "Device Group", "group": "Device Group",
"url": "Server URL", "url": "Server URL",
"meshName": "Mesh Name", "meshName": "Group Name",
"meshId": "Group Identifier", "meshId": "Group Identifier",
"serverId": "Server Identifier", "serverId": "Server Identifier",
"setup": "Setup", "setup": "Setup",
@ -311,7 +311,7 @@
"agent": "Agent", "agent": "Agent",
"group": "Apparaat groep", "group": "Apparaat groep",
"url": "Server URL", "url": "Server URL",
"meshName": "Mesh naam", "meshName": "Groepsnaam",
"meshId": "Groepsidentificatie", "meshId": "Groepsidentificatie",
"serverId": "Server identificatie", "serverId": "Server identificatie",
"setup": "Setup", "setup": "Setup",

View File

@ -1,15 +1,15 @@
{ {
"3": { "3": {
"filename": "MeshService-signed.exe", "filename": "MeshService-signed.exe",
"hash": "19F470D41D70288E7E95C8BC8066E68DD112DBCE8A5E7FBF9D1A3AB2FD2E47959820B8AB19835C6B951B036427331318", "hash": "93917AC2C4A3A6A034B39675FA658B0A67F480DDE7BA5607A75F6A711D7ADC553208D98678340796D48813D1F4B56A94",
"size": 3463488, "size": 3656000,
"mtime": "2022-01-07T23:07:37Z" "mtime": "2022-02-13T20:24:29Z"
}, },
"4": { "4": {
"filename": "MeshService64-signed.exe", "filename": "MeshService64-signed.exe",
"hash": "C0A2CB8FEFAA7414F1CD6D37E25CB8FE10D680F614FD0AA338BC2C0786EFC07C3BCE03BD4CBC075FD387B5642A135E25", "hash": "B7AC4F1A3A66D0C377CE8E19FC86A666E9BA85AE233C6278CDCA05D156B5F2E018EC5C9FAE2A5968F2E64D0D0417B4CD",
"size": 3079488, "size": 3272000,
"mtime": "2022-01-07T23:07:40Z" "mtime": "2022-02-13T20:24:32Z"
}, },
"5": { "5": {
"filename": "meshagent_x86", "filename": "meshagent_x86",
@ -132,3 +132,4 @@
"mtime": "2022-01-08T00:23:52Z" "mtime": "2022-01-08T00:23:52Z"
} }
} }
0

View File

@ -171,6 +171,12 @@ var agentFileHttpRequests = {}; // Currently active agent HTTPS GET requests fro
var agentFileHttpPendingRequests = []; // Pending HTTPS GET requests from the server. var agentFileHttpPendingRequests = []; // Pending HTTPS GET requests from the server.
var debugConsole = (global._MSH && (_MSH().debugConsole == 1)); var debugConsole = (global._MSH && (_MSH().debugConsole == 1));
var color_options =
{
background: (global._MSH != null) ? global._MSH().background : '0,54,105',
foreground: (global._MSH != null) ? global._MSH().foreground : '255,255,255'
};
if (process.platform == 'win32' && require('user-sessions').isRoot()) { if (process.platform == 'win32' && require('user-sessions').isRoot()) {
// Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value // Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value
try { try {
@ -1091,7 +1097,7 @@ function handleServerCommand(data) {
ipr.username = data.username; ipr.username = data.username;
global._clientmessage = ipr.then(function (img) global._clientmessage = ipr.then(function (img)
{ {
this.messagebox = require('win-dialog').create(this.title, this.message, this.username, { timeout: 120000, b64Image: img.split(',').pop() }); this.messagebox = require('win-dialog').create(this.title, this.message, this.username, { timeout: 120000, b64Image: img.split(',').pop(), background: color_options.background, foreground: color_options.foreground });
this.__childPromise.addMessage = this.messagebox.addMessage.bind(this.messagebox); this.__childPromise.addMessage = this.messagebox.addMessage.bind(this.messagebox);
return (this.messagebox); return (this.messagebox);
}); });
@ -2072,7 +2078,7 @@ function onTunnelData(data) {
ipr.username = this.httprequest.realname; ipr.username = this.httprequest.realname;
ipr.translations = { Allow: currentTranslation['allow'], Deny: currentTranslation['deny'], Auto: currentTranslation['autoAllowForFive'], Caption: consentMessage }; ipr.translations = { Allow: currentTranslation['allow'], Deny: currentTranslation['deny'], Auto: currentTranslation['autoAllowForFive'], Caption: consentMessage };
this.httprequest.tpromise._consent = ipr.then(function (img) { this.httprequest.tpromise._consent = ipr.then(function (img) {
this.consent = require('win-userconsent').create(this.consentTitle, this.consentMessage, this.username, { b64Image: img.split(',').pop(), timeout: 30000, translations: this.translations }); this.consent = require('win-userconsent').create(this.consentTitle, this.consentMessage, this.username, { b64Image: img.split(',').pop(), timeout: 30000, translations: this.translations, background: color_options.background, foreground: color_options.foreground });
this.__childPromise.close = this.consent.close.bind(this.consent); this.__childPromise.close = this.consent.close.bind(this.consent);
return (this.consent); return (this.consent);
}); });
@ -2372,7 +2378,7 @@ function onTunnelData(data) {
this.httprequest.desktop.kvm.users.splice(i, 1); this.httprequest.desktop.kvm.users.splice(i, 1);
this.httprequest.desktop.kvm.connectionBar.removeAllListeners('close'); this.httprequest.desktop.kvm.connectionBar.removeAllListeners('close');
this.httprequest.desktop.kvm.connectionBar.close(); this.httprequest.desktop.kvm.connectionBar.close();
this.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')(this.httprequest.privacybartext.replace('{0}', this.httprequest.desktop.kvm.rusers.join(', ')).replace('{1}', this.httprequest.desktop.kvm.users.join(', ')), require('MeshAgent')._tsid); this.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')(this.httprequest.privacybartext.replace('{0}', this.httprequest.desktop.kvm.rusers.join(', ')).replace('{1}', this.httprequest.desktop.kvm.users.join(', ')), require('MeshAgent')._tsid, color_options);
this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest; this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;
this.httprequest.desktop.kvm.connectionBar.on('close', function () { this.httprequest.desktop.kvm.connectionBar.on('close', function () {
MeshServerLogEx(29, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest); MeshServerLogEx(29, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);
@ -2433,7 +2439,7 @@ function onTunnelData(data) {
ipr.username = this.httprequest.realname; ipr.username = this.httprequest.realname;
ipr.translation = { Allow: currentTranslation['allow'], Deny: currentTranslation['deny'], Auto: currentTranslation['autoAllowForFive'], Caption: consentMessage }; ipr.translation = { Allow: currentTranslation['allow'], Deny: currentTranslation['deny'], Auto: currentTranslation['autoAllowForFive'], Caption: consentMessage };
pr = ipr.then(function (img) { pr = ipr.then(function (img) {
this.consent = require('win-userconsent').create(this.consentTitle, this.consentMessage, this.username, { b64Image: img.split(',').pop(), uid: this.tsid, timeout: 30000, translations: this.translation }); this.consent = require('win-userconsent').create(this.consentTitle, this.consentMessage, this.username, { b64Image: img.split(',').pop(), uid: this.tsid, timeout: 30000, translations: this.translation, background: color_options.background, foreground: color_options.foreground });
this.__childPromise.close = this.consent.close.bind(this.consent); this.__childPromise.close = this.consent.close.bind(this.consent);
return (this.consent); return (this.consent);
}); });
@ -2478,7 +2484,7 @@ function onTunnelData(data) {
this.ws.httprequest.desktop.kvm.connectionBar.close(); this.ws.httprequest.desktop.kvm.connectionBar.close();
} }
try { try {
this.ws.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')(this.ws.httprequest.privacybartext.replace('{0}', this.ws.httprequest.desktop.kvm.rusers.join(', ')).replace('{1}', this.ws.httprequest.desktop.kvm.users.join(', ')), require('MeshAgent')._tsid); this.ws.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')(this.ws.httprequest.privacybartext.replace('{0}', this.ws.httprequest.desktop.kvm.rusers.join(', ')).replace('{1}', this.ws.httprequest.desktop.kvm.users.join(', ')), require('MeshAgent')._tsid, color_options);
MeshServerLogEx(31, null, "Remote Desktop Connection Bar Activated/Updated (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest); MeshServerLogEx(31, null, "Remote Desktop Connection Bar Activated/Updated (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);
} catch (ex) { } catch (ex) {
if (process.platform != 'darwin') { if (process.platform != 'darwin') {
@ -2530,7 +2536,7 @@ function onTunnelData(data) {
this.httprequest.desktop.kvm.connectionBar.close(); this.httprequest.desktop.kvm.connectionBar.close();
} }
try { try {
this.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')(this.httprequest.privacybartext.replace('{0}', this.httprequest.desktop.kvm.rusers.join(', ')).replace('{1}', this.httprequest.desktop.kvm.users.join(', ')), require('MeshAgent')._tsid); this.httprequest.desktop.kvm.connectionBar = require('notifybar-desktop')(this.httprequest.privacybartext.replace('{0}', this.httprequest.desktop.kvm.rusers.join(', ')).replace('{1}', this.httprequest.desktop.kvm.users.join(', ')), require('MeshAgent')._tsid, color_options);
MeshServerLogEx(31, null, "Remote Desktop Connection Bar Activated/Updated (" + this.httprequest.remoteaddr + ")", this.httprequest); MeshServerLogEx(31, null, "Remote Desktop Connection Bar Activated/Updated (" + this.httprequest.remoteaddr + ")", this.httprequest);
} catch (ex) { } catch (ex) {
MeshServerLogEx(32, null, "Remote Desktop Connection Bar Failed or not Supported (" + this.httprequest.remoteaddr + ")", this.httprequest); MeshServerLogEx(32, null, "Remote Desktop Connection Bar Failed or not Supported (" + this.httprequest.remoteaddr + ")", this.httprequest);
@ -2616,7 +2622,7 @@ function onTunnelData(data) {
ipr.username = this.httprequest.realname; ipr.username = this.httprequest.realname;
ipr.translations = { Allow: currentTranslation['allow'], Deny: currentTranslation['deny'], Auto: currentTranslation['autoAllowForFive'], Caption: consentMessage }; ipr.translations = { Allow: currentTranslation['allow'], Deny: currentTranslation['deny'], Auto: currentTranslation['autoAllowForFive'], Caption: consentMessage };
pr = ipr.then(function (img) { pr = ipr.then(function (img) {
this.consent = require('win-userconsent').create(this.consentTitle, this.consentMessage, this.username, { b64Image: img.split(',').pop(), timeout: 30000, translations: this.translations }); this.consent = require('win-userconsent').create(this.consentTitle, this.consentMessage, this.username, { b64Image: img.split(',').pop(), timeout: 30000, translations: this.translations, background: color_options.background, foreground: color_options.foreground });
this.__childPromise.close = this.consent.close.bind(this.consent); this.__childPromise.close = this.consent.close.bind(this.consent);
return (this.consent); return (this.consent);
}); });

View File

@ -3,7 +3,7 @@
"compression": "^1.7.4", "compression": "^1.7.4",
"cookie-session": "^1.4.0", "cookie-session": "^1.4.0",
"express": "^4.17.0", "express": "^4.17.0",
"express-handlebars": "^3.1.0", "express-handlebars": "^5.3.5",
"express-ws": "^4.0.0", "express-ws": "^4.0.0",
"ipcheck": "^0.1.0", "ipcheck": "^0.1.0",
"minimist": "^1.2.5", "minimist": "^1.2.5",

View File

@ -223,9 +223,10 @@ function CreateIPKVMManager(parent) {
if (obj.managedPorts[nodeid] != null) { if (obj.managedPorts[nodeid] != null) {
// This port is no longer connected // This port is no longer connected
parent.ClearConnectivityState(sender.meshid, nodeid, 1, null, null); parent.ClearConnectivityState(sender.meshid, nodeid, 1, null, null);
const mesh = parent.webserver.meshes[sender.meshid];
// If the device group policy is set to auto-remove devices, remove it now // If the device group policy is set to auto-remove devices, remove it now
if ((mesh.flags) && (mesh.flags & 1)) { // Auto-remove devices if ((mesh != null) && (mesh.flags) && (mesh.flags & 1)) { // Auto-remove devices
parent.db.Remove(nodeid); // Remove node with that id parent.db.Remove(nodeid); // Remove node with that id
parent.db.Remove('nt' + nodeid); // Remove notes parent.db.Remove('nt' + nodeid); // Remove notes
parent.db.Remove('lc' + nodeid); // Remove last connect time parent.db.Remove('lc' + nodeid); // Remove last connect time

View File

@ -1,6 +1,6 @@
{ {
"name": "meshcentral", "name": "meshcentral",
"version": "0.9.79", "version": "0.9.83",
"keywords": [ "keywords": [
"Remote Device Management", "Remote Device Management",
"Remote Device Monitoring", "Remote Device Monitoring",
@ -41,7 +41,7 @@
"compression": "^1.7.4", "compression": "^1.7.4",
"cookie-session": "^1.4.0", "cookie-session": "^1.4.0",
"express": "^4.17.0", "express": "^4.17.0",
"express-handlebars": "^3.1.0", "express-handlebars": "^5.3.5",
"express-ws": "^4.0.0", "express-ws": "^4.0.0",
"ipcheck": "^0.1.0", "ipcheck": "^0.1.0",
"minimist": "^1.2.5", "minimist": "^1.2.5",

View File

@ -3217,3 +3217,12 @@ a {
.night .thermalSensor { .night .thermalSensor {
color: #000; color: #000;
} }
.desktopButtons {
padding-top: 2px;
}
.night .desktopButtons {
filter: invert(60%);
-webkit-filter: invert(60%);
}

View File

@ -956,6 +956,7 @@
}, },
{ {
"en": ", 16 grays", "en": ", 16 grays",
"nl": ", 16 grijstinten",
"ru": ", 16 оттенков серого", "ru": ", 16 оттенков серого",
"xloc": [ "xloc": [
"player.handlebars->3->35" "player.handlebars->3->35"
@ -963,6 +964,7 @@
}, },
{ {
"en": ", 256 grays", "en": ", 256 grays",
"nl": ", 256 grijstinten",
"ru": ", 256 оттенков серого", "ru": ", 256 оттенков серого",
"xloc": [ "xloc": [
"player.handlebars->3->36" "player.handlebars->3->36"
@ -1776,6 +1778,7 @@
}, },
{ {
"en": "1 byte-per-pixel", "en": "1 byte-per-pixel",
"nl": "1 byte per pixel",
"ru": "1 байт на пиксель", "ru": "1 байт на пиксель",
"xloc": [ "xloc": [
"player.handlebars->3->34" "player.handlebars->3->34"
@ -2630,6 +2633,7 @@
}, },
{ {
"en": "2 byte-per-pixel", "en": "2 byte-per-pixel",
"nl": "2 byte per pixel",
"ru": "2 байта на пиксель", "ru": "2 байта на пиксель",
"xloc": [ "xloc": [
"player.handlebars->3->33" "player.handlebars->3->33"
@ -13711,6 +13715,7 @@
}, },
{ {
"en": "Closed desktop multiplex session \\\"{0}\\\", {1} second(s)", "en": "Closed desktop multiplex session \\\"{0}\\\", {1} second(s)",
"nl": "Gesloten desktop multiplexsessie \\\"{0}\\\", {1} seconde(n)",
"xloc": [ "xloc": [
"default.handlebars->39->2277" "default.handlebars->39->2277"
] ]
@ -23774,6 +23779,7 @@
}, },
{ {
"en": "Encoding Quality", "en": "Encoding Quality",
"nl": "Coderingskwaliteit",
"ru": "Качество кодирования", "ru": "Качество кодирования",
"xloc": [ "xloc": [
"player.handlebars->3->37" "player.handlebars->3->37"
@ -26115,6 +26121,7 @@
}, },
{ {
"en": "Finished recording session \\\"{0}\\\", {1} second(s)", "en": "Finished recording session \\\"{0}\\\", {1} second(s)",
"nl": "Beëindigde opnamesessie \\\"{0}\\\", {1} seconde(n)",
"xloc": [ "xloc": [
"default.handlebars->39->2276" "default.handlebars->39->2276"
] ]
@ -28212,6 +28219,13 @@
"default.handlebars->39->2469" "default.handlebars->39->2469"
] ]
}, },
{
"en": "Group Name",
"nl": "Groepsnaam",
"xloc": [
"agent-translations.json"
]
},
{ {
"cs": "Skupina vytvořená", "cs": "Skupina vytvořená",
"da": "Gruppér efter", "da": "Gruppér efter",
@ -33311,6 +33325,7 @@
}, },
{ {
"en": "Joined desktop multiplex session \\\"{0}\\\"", "en": "Joined desktop multiplex session \\\"{0}\\\"",
"nl": "Deelgenomen aan desktop multiplex-sessie \\\"{0}\\\"",
"xloc": [ "xloc": [
"default.handlebars->39->2273" "default.handlebars->39->2273"
] ]
@ -34971,6 +34986,7 @@
}, },
{ {
"en": "Left the desktop multiplex session \\\"{0}\\\" after {1} second(s).", "en": "Left the desktop multiplex session \\\"{0}\\\" after {1} second(s).",
"nl": "Verliet de desktop multiplexsessie \\\"{0}\\\" na {1} seconde(n).",
"xloc": [ "xloc": [
"default.handlebars->39->2274" "default.handlebars->39->2274"
] ]
@ -38128,6 +38144,7 @@
}, },
{ {
"en": "Maximum keys reached.", "en": "Maximum keys reached.",
"nl": "Maximum aantal sleutels bereikt.",
"xloc": [ "xloc": [
"default.handlebars->39->217" "default.handlebars->39->217"
] ]
@ -38347,10 +38364,7 @@
"sv": "Masknamn", "sv": "Masknamn",
"tr": "Mesh Adı", "tr": "Mesh Adı",
"zh-chs": "网格名称", "zh-chs": "网格名称",
"zh-cht": "網格名稱", "zh-cht": "網格名稱"
"xloc": [
"agent-translations.json"
]
}, },
{ {
"cs": "Mesh předávání (relay)", "cs": "Mesh předávání (relay)",
@ -55906,7 +55920,7 @@
"tr": "Karanlık modu ayarla", "tr": "Karanlık modu ayarla",
"zh-chs": "设置深色模式", "zh-chs": "设置深色模式",
"xloc": [ "xloc": [
"default-mobile.handlebars->container->page_content->column_l->p3->p3info->3->p3AccountActions->p2AccountActions->3->11->0" "default-mobile.handlebars->container->page_content->column_l->p3->p3info->3->p3AccountActions->p2AccountActions->3->setDarkModeLink->0"
] ]
}, },
{ {
@ -58774,6 +58788,7 @@
}, },
{ {
"en": "Started desktop multiplex session \\\"{0}\\\"", "en": "Started desktop multiplex session \\\"{0}\\\"",
"nl": "Startte een Desktop multiplexsessie \\\"{0}\\\"",
"xloc": [ "xloc": [
"default.handlebars->39->2275" "default.handlebars->39->2275"
] ]

View File

@ -668,19 +668,19 @@
<span id="DeskTimer" title="Session time"></span>&nbsp; <span id="DeskTimer" title="Session time"></span>&nbsp;
<select id=termdisplays style="display:none" onchange=deskSetDisplay(event) onkeypress="return false" onkeydown="return false"></select>&nbsp; <select id=termdisplays style="display:none" onchange=deskSetDisplay(event) onkeypress="return false" onkeydown="return false"></select>&nbsp;
<input id=DeskToolsButton type=button value=Tools title="Toggle tools view" onkeypress="return false" onkeydown="return false" onclick="toggleDeskTools()" />&nbsp; <input id=DeskToolsButton type=button value=Tools title="Toggle tools view" onkeypress="return false" onkeydown="return false" onclick="toggleDeskTools()" />&nbsp;
<span id=DeskChatButton class="deskarea" title="Open chat window to this computer"><img src='images/icon-chat.png' onclick=deviceChat(event) height=16 width=16 style=padding-top:2px /></span> <span id=DeskChatButton class="deskarea" title="Open chat window to this computer"><img class="desktopButtons" src='images/icon-chat.png' onclick=deviceChat(event) height=16 width=16 style=padding-top:2px /></span>
<span id=DeskNotifyButton title="Display a notification on the remote computer"><img src='images/icon-notify.png' onclick=deviceToastFunction() height=16 width=16 style=padding-top:2px /></span> <span id=DeskNotifyButton title="Display a notification on the remote computer"><img class="desktopButtons" src='images/icon-notify.png' onclick=deviceToastFunction() height=16 width=16 style=padding-top:2px /></span>
<span id=DeskLockButton title="Lock the remote computer"><img src='images/icon-lock.png' onclick=deviceLockFunction() height=16 width=16 style=padding-top:2px /></span> <span id=DeskLockButton title="Lock the remote computer"><img src='images/icon-lock.png' class="desktopButtons" onclick=deviceLockFunction() height=16 width=16 /></span>
<span id=DeskOpenWebButton title="Open a web address on the remote computer"><img src='images/icon-url2.png' onclick=deviceUrlFunction() height=16 width=16 style=padding-top:2px /></span> <span id=DeskOpenWebButton title="Open a web address on the remote computer"><img class="desktopButtons" src='images/icon-url2.png' onclick=deviceUrlFunction() height=16 width=16 /></span>
<span id=DeskBackgroundButton title="Toggle remote desktop background"><img src='images/icon-background.png' onclick=deviceToggleBackground(event) height=16 width=16 style=padding-top:2px /></span> <span id=DeskBackgroundButton title="Toggle remote desktop background"><img class="desktopButtons" src='images/icon-background.png' onclick=deviceToggleBackground(event) height=16 width=16 /></span>
<span id=DeskSaveImageButton title="Save a screenshot of the remote desktop"><img src='images/icon-camera.png' onclick=deskSaveImage() height=16 width=16 style=padding-top:2px /></span> <span id=DeskSaveImageButton title="Save a screenshot of the remote desktop"><img class="desktopButtons" src='images/icon-camera.png' onclick=deskSaveImage() height=16 width=16 /></span>
<span id=DeskRecordButton cmenu=deskPlayerContextMenu title="Record remote desktop session to file" style="display:none"><img id=DeskRecordButtonImage src='images/icon-film.png' onclick=deskRecordSession() height=16 width=16 style=padding-top:2px /></span> <span id=DeskRecordButton cmenu=deskPlayerContextMenu title="Record remote desktop session to file" style="display:none"><img class="desktopButtons" id=DeskRecordButtonImage src='images/icon-film.png' onclick=deskRecordSession() height=16 width=16 /></span>
<span id=DeskClipboardInButton title="Download remote clipboard to local clipboard" style="display:none"><img id=DeskClipboardInButtonImage src='images/icon-clipboard-in.png' onclick=deskClipboardInFunction() height=16 width=16 style=padding-top:2px /></span> <span id=DeskClipboardInButton title="Download remote clipboard to local clipboard" style="display:none"><img class="desktopButtons" id=DeskClipboardInButtonImage src='images/icon-clipboard-in.png' onclick=deskClipboardInFunction() height=16 width=16 /></span>
<span id=DeskClipboardOutButton title="Upload local clipboard to remote device"><img id=DeskClipboardOutButtonImage src='images/icon-clipboard-out.png' onclick=deskClipboardOutFunction() height=16 width=16 style=padding-top:2px /></span> <span id=DeskClipboardOutButton title="Upload local clipboard to remote device"><img class="desktopButtons" id=DeskClipboardOutButtonImage src='images/icon-clipboard-out.png' onclick=deskClipboardOutFunction() height=16 width=16 /></span>
<span id=DeskRefreshButton title="Refresh the desktop"><img id=DeskRefreshButtonImage src='images/icon-refresh.png' onclick=deskRefreshFunction() height=16 width=16 style=padding-top:2px /></span> <span id=DeskRefreshButton title="Refresh the desktop"><img class="desktopButtons" id=DeskRefreshButtonImage src='images/icon-refresh.png' onclick=deskRefreshFunction() height=16 width=16 /></span>
<span id=DeskInputLockedButton title="Remote input is locked"><img id=DeskInputLockedButtonImage src='images/icon-keylock-red.png' onclick=deskInputLockFunction(0) height=16 width=16 style=padding-top:2px /></span> <span id=DeskInputLockedButton title="Remote input is locked"><img class="desktopButtons" id=DeskInputLockedButtonImage src='images/icon-keylock-red.png' onclick=deskInputLockFunction(0) height=16 width=16 /></span>
<span id=DeskInputUnLockedButton title="Remote input is unlocked"><img id=DeskInputUnLockedButtonImage src='images/icon-keylock.png' onclick=deskInputLockFunction(1) height=16 width=16 style=padding-top:2px /></span> <span id=DeskInputUnLockedButton title="Remote input is unlocked"><img class="desktopButtons" id=DeskInputUnLockedButtonImage src='images/icon-keylock.png' onclick=deskInputLockFunction(1) height=16 width=16 /></span>
<span id=DeskGuestShareButton title="Share the device with a guest"><img id=DeskInputUnLockedButtonImage src='images/icon-share2.png' onclick=showShareDevice() height=16 width=16 style=padding-top:2px /></span> <span id=DeskGuestShareButton title="Share the device with a guest"><img class="desktopButtons" id=DeskInputUnLockedButtonImage src='images/icon-share2.png' onclick=showShareDevice() height=16 width=16 /></span>
</div> </div>
<div> <div>
<select id="deskkeys" cmenu=deskKeyShortcutContextMenu></select> <select id="deskkeys" cmenu=deskKeyShortcutContextMenu></select>
@ -2121,7 +2121,7 @@
if (userinfo.otphkeys > 0) { authFactorCount += userinfo.otphkeys; } // FIDO hardware factor if (userinfo.otphkeys > 0) { authFactorCount += userinfo.otphkeys; } // FIDO hardware factor
if ((features & 0x00800000) && (userinfo.otpekey == 1)) { authFactorCount++; } // EMail factor if ((features & 0x00800000) && (userinfo.otpekey == 1)) { authFactorCount++; } // EMail factor
if ((features & 0x02000000) && (features & 0x04000000) && (userinfo.phone != null)) { authFactorCount++; } // SMS factor if ((features & 0x02000000) && (features & 0x04000000) && (userinfo.phone != null)) { authFactorCount++; } // SMS factor
if ((authFactorCount > 0) && (userinfo.otpkeys > 0) && ((features & 0x40000) == 0)) { authFactorCount++; } // Backup keys if ((authFactorCount > 0) && (userinfo.otpkeys > 0) && ((features2 & 0x40000) == 0)) { authFactorCount++; } // Backup keys
return authFactorCount; return authFactorCount;
} }
@ -17216,6 +17216,11 @@
} }
} }
// Request Confirmation if closing while a desktop, terminal session is active
window.addEventListener('beforeunload', function (e) {
if (((desktop != null) && (xxcurrentView == 11)) || ((terminal != null) && (xxcurrentView == 12))) { e.preventDefault(); e.returnValue = ''; }
});
</script> </script>
</body> </body>
</html> </html>

View File

@ -5587,7 +5587,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
} }
// Setup middleware // Setup middleware
obj.app.engine('handlebars', obj.exphbs({ defaultLayout: null })); // defaultLayout: 'main' obj.app.engine('handlebars', obj.exphbs({ defaultLayout: false }));
obj.app.set('view engine', 'handlebars'); obj.app.set('view engine', 'handlebars');
if (obj.args.trustedproxy) { if (obj.args.trustedproxy) {
// Reverse proxy should add the "X-Forwarded-*" headers // Reverse proxy should add the "X-Forwarded-*" headers