diff --git a/agents/agent-translations.json b/agents/agent-translations.json index 2d7cb7de..b02312dc 100644 --- a/agents/agent-translations.json +++ b/agents/agent-translations.json @@ -90,7 +90,9 @@ "agentVersion": "Neue Version", "elevation": "Zum Installieren/Deinstallieren dieser Software sind erhöhte Berechtigungen erforderlich.", "graphicalerror": "Die grafische Version dieses Installationsprogramms kann auf diesem System nicht ausgeführt werden", - "description": "Klicken Sie auf die Schaltflächen unten, um diese Fernverwaltungssoftware zu installieren oder zu deinstallieren. Nach der Installation wird diese Software im Hintergrund ausgeführt, sodass dieser Computer von einem entfernten Administrator verwaltet und gesteuert werden kann." + "description": "Klicken Sie auf die Schaltflächen unten, um diese Fernverwaltungssoftware zu installieren oder zu deinstallieren. Nach der Installation wird diese Software im Hintergrund ausgeführt, sodass dieser Computer von einem entfernten Administrator verwaltet und gesteuert werden kann.", + "connectionDetailsButton": "Verbindungsinformationen...", + "connectionDetailsTitle": "Verbindungsinformationen" }, "es": { "agent": "Agente", diff --git a/agents/codesign-old1.cer b/agents/codesign-old1.cer deleted file mode 100644 index ea361548..00000000 Binary files a/agents/codesign-old1.cer and /dev/null differ diff --git a/agents/codesign-old2.cer b/agents/codesign-old2.cer deleted file mode 100644 index 6c89c2ed..00000000 Binary files a/agents/codesign-old2.cer and /dev/null differ diff --git a/agents/codesign-old3.cer b/agents/codesign-old3.cer deleted file mode 100644 index b608201b..00000000 Binary files a/agents/codesign-old3.cer and /dev/null differ diff --git a/agents/codesign.cer b/agents/codesign.cer index 0866293f..7f6724a8 100644 Binary files a/agents/codesign.cer and b/agents/codesign.cer differ diff --git a/agents/meshcore.js b/agents/meshcore.js index 52e0db72..055023a6 100644 --- a/agents/meshcore.js +++ b/agents/meshcore.js @@ -3177,30 +3177,43 @@ function openUserDesktopUrl(url) { var uid = require('user-sessions').consoleUid(); var user = require('user-sessions').getUsername(uid); var domain = require('user-sessions').getDomain(uid); - var taskoptions = { env: { _target: process.env['windir'] + '\\system32\\cmd.exe', _args: '/C START ' + url.split('&').join('^&'), _user: '"' + domain + '\\' + user + '"' } }; - for (var c1e in process.env) { - taskoptions.env[c1e] = process.env[c1e]; - } - var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-'], taskoptions); - child.stderr.on('data', function (c) { }); - child.stdout.on('data', function (c) { }); - child.stdin.write('SCHTASKS /CREATE /F /TN MeshChatTask /SC ONCE /ST 00:00 '); - if (user) { child.stdin.write('/RU $env:_user '); } - child.stdin.write('/TR "$env:_target $env:_args"\r\n'); - child.stdin.write('$ts = New-Object -ComObject Schedule.service\r\n'); - child.stdin.write('$ts.connect()\r\n'); - child.stdin.write('$tsfolder = $ts.getfolder("\\")\r\n'); - child.stdin.write('$task = $tsfolder.GetTask("MeshChatTask")\r\n'); - child.stdin.write('$taskdef = $task.Definition\r\n'); - child.stdin.write('$taskdef.Settings.StopIfGoingOnBatteries = $false\r\n'); - child.stdin.write('$taskdef.Settings.DisallowStartIfOnBatteries = $false\r\n'); - child.stdin.write('$taskdef.Actions.Item(1).Path = $env:_target\r\n'); - child.stdin.write('$taskdef.Actions.Item(1).Arguments = $env:_args\r\n'); - child.stdin.write('$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\r\n'); + var task = { name: 'MeshChatTask', user: user, domain: domain, execPath: process.env['windir'] + '\\system32\\cmd.exe', arguments: ['/C START ' + url.split('&').join('^&')] }; - child.stdin.write('SCHTASKS /RUN /TN MeshChatTask\r\n'); - child.stdin.write('SCHTASKS /DELETE /F /TN MeshChatTask\r\nexit\r\n'); - child.waitExit(); + try + { + require('win-tasks').addTask(task); + require('win-tasks').getTask({ name: 'MeshChatTask' }).run(); + require('win-tasks').deleteTask('MeshChatTask'); + return (true); + } + catch(zz) + { + var taskoptions = { env: { _target: process.env['windir'] + '\\system32\\cmd.exe', _args: '/C START ' + url.split('&').join('^&'), _user: '"' + domain + '\\' + user + '"' } }; + for (var c1e in process.env) + { + taskoptions.env[c1e] = process.env[c1e]; + } + var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-'], taskoptions); + child.stderr.on('data', function (c) { }); + child.stdout.on('data', function (c) { }); + child.stdin.write('SCHTASKS /CREATE /F /TN MeshChatTask /SC ONCE /ST 00:00 '); + if (user) { child.stdin.write('/RU $env:_user '); } + child.stdin.write('/TR "$env:_target $env:_args"\r\n'); + child.stdin.write('$ts = New-Object -ComObject Schedule.service\r\n'); + child.stdin.write('$ts.connect()\r\n'); + child.stdin.write('$tsfolder = $ts.getfolder("\\")\r\n'); + child.stdin.write('$task = $tsfolder.GetTask("MeshChatTask")\r\n'); + child.stdin.write('$taskdef = $task.Definition\r\n'); + child.stdin.write('$taskdef.Settings.StopIfGoingOnBatteries = $false\r\n'); + child.stdin.write('$taskdef.Settings.DisallowStartIfOnBatteries = $false\r\n'); + child.stdin.write('$taskdef.Actions.Item(1).Path = $env:_target\r\n'); + child.stdin.write('$taskdef.Actions.Item(1).Arguments = $env:_args\r\n'); + child.stdin.write('$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\r\n'); + + child.stdin.write('SCHTASKS /RUN /TN MeshChatTask\r\n'); + child.stdin.write('SCHTASKS /DELETE /F /TN MeshChatTask\r\nexit\r\n'); + child.waitExit(); + } break; case 'linux': child = require('child_process').execFile('/usr/bin/xdg-open', ['xdg-open', url], { uid: require('user-sessions').consoleUid() }); diff --git a/meshcentral-config-schema.json b/meshcentral-config-schema.json index d796b42a..532ee2c8 100644 --- a/meshcentral-config-schema.json +++ b/meshcentral-config-schema.json @@ -299,7 +299,9 @@ "titlePicture": { "type": "string", "default": null, "description": "Web site .png logo file that is 450x66 in size placed in meshcentral-data that is used on the top of many pages." }, "loginPicture": { "type": "string", "default": null, "description": "Web site .png logo file placed in meshcentral-data that used on the login page when sitestyle is 2." }, "rootRedirect": { "type": "string", "default": null, "description": "Redirects HTTP root requests to this URL. When in use, direct users to /login to see the normal login page." }, + "mobileSite": { "type": "boolean", "default": true, "description": "When set to false, this setting will disable the mobile site." }, "unknownUserRootRedirect": { "type": "string", "default": null, "description": "Redirects HTTP root requests to this URL only where user is not already logged in. When in use, direct users to /login to see the normal login page." }, + "nightMode": { "type": "integer", "default": 0, "description": "0 = User selects day/night mode, 1 = Always night mode, 2 = Always day mode" }, "userQuota": { "type": "integer" }, "meshQuota": { "type": "integer" }, "loginKey": { "type": [ "string", "array" ], "items": { "type": "string" }, "default": null, "description": "Requires that users add the value ?key=xxx in the URL in order to see the web site." }, @@ -442,6 +444,8 @@ "sms2factor": { "type": "boolean", "default": true, "description": "Set to false to disable SMS 2FA." }, "push2factor": { "type": "boolean", "default": true, "description": "Set to false to disable push notification 2FA." }, "otp2factor": { "type": "boolean", "default": true, "description": "Set to false to disable one-time-password 2FA." }, + "backupcode2factor": { "type": "boolean", "default": true, "description": "Set to false to disable 2FA backup codes." }, + "single2factorWarning": { "type": "boolean", "default": true, "description": "Set to false to disable single 2FA warning." }, "lock2factor": { "type": "boolean", "default": false, "description": "When set to true, prevents any changes to 2FA." }, "force2factor": { "type": "boolean", "default": false, "description": "Requires that all accounts setup 2FA." }, "skip2factor": { "type": "string", "description": "IP addresses where 2FA login is skipped, for example: 127.0.0.1,192.168.2.0/24" }, @@ -450,7 +454,8 @@ "loginTokens": { "type": "boolean", "default": true, "description": "Allows users to create alternative username/passwords for their account." }, "twoFactorTimeout": { "type": "integer", "default": 300, "description": "Maximum about of time the to wait for a 2FA token on the login page in seconds." }, "autofido2fa": { "type": "boolean", "default": false, "description": "If true and user account has FIDO key setup, 2FA login screen will automatically request FIDO 2FA." }, - "maxfidokeys": { "type": "integer", "default": null, "description": "Maximum number of FIDO/YubikeyOTP hardware 2FA keys that can be setup in a user account." } + "maxfidokeys": { "type": "integer", "default": null, "description": "Maximum number of FIDO/YubikeyOTP hardware 2FA keys that can be setup in a user account." }, + "allowaccountreset": { "type": "boolean", "default": true, "description": "If set to false, the account reset option on the login screen will not be available to users." } } }, "twoFactorCookieDurationDays": { "type": "integer", "default": 30, "description": "Number of days that a user is allowed to remember this device for when completing 2FA. Set this to 0 to remove this option." }, @@ -510,6 +515,7 @@ "description": { "type": "string", "default": "Mesh Agent background service", "description": "The description of the agent as displayed to the user." }, "companyName": { "type": "string", "default": "Mesh Agent", "description": "This will be used as the path to install the agent, by default this is 'Mesh Agent' in Windows and 'meshagent' in other OS's." }, "serviceName": { "type": "string", "default": "Mesh Agent", "description": "The name of the background service, by default this is 'Mesh Agent' in Windows and 'meshagent' in other OS's but should be set to an all lower case, no space string." }, + "installText": { "type": "string", "default": null, "description": "Text string to show in the agent installation dialog box." }, "image": { "type": "string", "default": null, "description": "The filename of a image file in .png format located in meshcentral-data to display in the MeshCentral Agent installation dialog, image should be square and from 64x64 to 200x200." }, "fileName": { "type": "string", "default": "meshagent", "description": "The agent filename." } } diff --git a/meshcentral.js b/meshcentral.js index d3350b51..3a4482bb 100644 --- a/meshcentral.js +++ b/meshcentral.js @@ -17,7 +17,7 @@ const common = require('./common.js'); // If app metrics is available -if (process.argv[2] == '--launch') { try { require('appmetrics-dash').monitor({ url: '/', title: 'MeshCentral', port: 88, host: '127.0.0.1' }); } catch (e) { } } +if (process.argv[2] == '--launch') { try { require('appmetrics-dash').monitor({ url: '/', title: 'MeshCentral', port: 88, host: '127.0.0.1' }); } catch (ex) { } } function CreateMeshCentralServer(config, args) { var obj = {}; @@ -76,7 +76,7 @@ function CreateMeshCentralServer(config, args) { // Server version obj.currentVer = null; - function getCurrentVersion() { try { obj.currentVer = JSON.parse(obj.fs.readFileSync(obj.path.join(__dirname, 'package.json'), 'utf8')).version; } catch (e) { } return obj.currentVer; } // Fetch server version + function getCurrentVersion() { try { obj.currentVer = JSON.parse(obj.fs.readFileSync(obj.path.join(__dirname, 'package.json'), 'utf8')).version; } catch (ex) { } return obj.currentVer; } // Fetch server version getCurrentVersion(); // Setup the default configuration and files paths @@ -118,8 +118,8 @@ function CreateMeshCentralServer(config, args) { if (obj.config.settings && (typeof obj.config.settings.filespath == 'string')) { obj.filespath = obj.config.settings.filespath; } // Create data and files folders if needed - try { obj.fs.mkdirSync(obj.datapath); } catch (e) { } - try { obj.fs.mkdirSync(obj.filespath); } catch (e) { } + try { obj.fs.mkdirSync(obj.datapath); } catch (ex) { } + try { obj.fs.mkdirSync(obj.filespath); } catch (ex) { } // Windows Specific Code, setup service and event log obj.service = null; @@ -134,10 +134,10 @@ function CreateMeshCentralServer(config, args) { // Start the Meshcentral server obj.Start = function () { var i; - try { require('./pass').hash('test', function () { }, 0); } catch (e) { console.log('Old version of node, must upgrade.'); return; } // TODO: Not sure if this test works or not. + try { require('./pass').hash('test', function () { }, 0); } catch (ex) { console.log('Old version of node, must upgrade.'); return; } // TODO: Not sure if this test works or not. // Check for invalid arguments - var validArguments = ['_', 'user', 'port', 'aliasport', 'mpsport', 'mpsaliasport', 'redirport', 'rediraliasport', 'cert', 'mpscert', 'deletedomain', 'deletedefaultdomain', 'showall', 'showusers', 'showitem', 'listuserids', 'showusergroups', 'shownodes', 'showallmeshes', 'showmeshes', 'showevents', 'showsmbios', 'showpower', 'clearpower', 'showiplocations', 'help', 'exactports', 'xinstall', 'xuninstall', 'install', 'uninstall', 'start', 'stop', 'restart', 'debug', 'filespath', 'datapath', 'noagentupdate', 'launch', 'noserverbackup', 'mongodb', 'mongodbcol', 'wanonly', 'lanonly', 'nousers', 'mpspass', 'ciralocalfqdn', 'dbexport', 'dbexportmin', 'dbimport', 'dbmerge', 'dbfix', 'dbencryptkey', 'selfupdate', 'tlsoffload', 'userallowedip', 'userblockedip', 'swarmallowedip', 'agentallowedip', 'agentblockedip', 'fastcert', 'swarmport', 'logintoken', 'logintokenkey', 'logintokengen', 'mailtokengen', 'admin', 'unadmin', 'sessionkey', 'sessiontime', 'minify', 'minifycore', 'dblistconfigfiles', 'dbshowconfigfile', 'dbpushconfigfiles', 'dbpullconfigfiles', 'dbdeleteconfigfiles', 'vaultpushconfigfiles', 'vaultpullconfigfiles', 'vaultdeleteconfigfiles', 'configkey', 'loadconfigfromdb', 'npmpath', 'serverid', 'recordencryptionrecode', 'vault', 'token', 'unsealkey', 'name', 'log', 'dbstats', 'translate', 'createaccount', 'resetaccount', 'pass', 'removesubdomain', 'adminaccount', 'domain', 'email', 'configfile', 'maintenancemode', 'nedbtodb', 'removetestagents', 'agentupdatetest', 'hashpassword', 'hashpass', 'indexmcrec', 'mpsdebug']; + var validArguments = ['_', 'user', 'port', 'aliasport', 'mpsport', 'mpsaliasport', 'redirport', 'rediraliasport', 'cert', 'mpscert', 'deletedomain', 'deletedefaultdomain', 'showall', 'showusers', 'showitem', 'listuserids', 'showusergroups', 'shownodes', 'showallmeshes', 'showmeshes', 'showevents', 'showsmbios', 'showpower', 'clearpower', 'showiplocations', 'help', 'exactports', 'xinstall', 'xuninstall', 'install', 'uninstall', 'start', 'stop', 'restart', 'debug', 'filespath', 'datapath', 'noagentupdate', 'launch', 'noserverbackup', 'mongodb', 'mongodbcol', 'wanonly', 'lanonly', 'nousers', 'mpspass', 'ciralocalfqdn', 'dbexport', 'dbexportmin', 'dbimport', 'dbmerge', 'dbfix', 'dbencryptkey', 'selfupdate', 'tlsoffload', 'userallowedip', 'userblockedip', 'swarmallowedip', 'agentallowedip', 'agentblockedip', 'fastcert', 'swarmport', 'logintoken', 'logintokenkey', 'logintokengen', 'mailtokengen', 'admin', 'unadmin', 'sessionkey', 'sessiontime', 'minify', 'minifycore', 'dblistconfigfiles', 'dbshowconfigfile', 'dbpushconfigfiles', 'dbpullconfigfiles', 'dbdeleteconfigfiles', 'vaultpushconfigfiles', 'vaultpullconfigfiles', 'vaultdeleteconfigfiles', 'configkey', 'loadconfigfromdb', 'npmpath', 'serverid', 'recordencryptionrecode', 'vault', 'token', 'unsealkey', 'name', 'log', 'dbstats', 'translate', 'createaccount', 'resetaccount', 'pass', 'removesubdomain', 'adminaccount', 'domain', 'email', 'configfile', 'maintenancemode', 'nedbtodb', 'removetestagents', 'agentupdatetest', 'hashpassword', 'hashpass', 'indexmcrec', 'mpsdebug', 'dumpcores']; for (var arg in obj.args) { obj.args[arg.toLocaleLowerCase()] = obj.args[arg]; if (validArguments.indexOf(arg.toLocaleLowerCase()) == -1) { console.log('Invalid argument "' + arg + '", use --help.'); return; } } if (obj.args.mongodb == true) { console.log('Must specify: --mongodb [connectionstring] \r\nSee https://docs.mongodb.com/manual/reference/connection-string/ for MongoDB connection string.'); return; } for (i in obj.config.settings) { obj.args[i] = obj.config.settings[i]; } // Place all settings into arguments, arguments have already been placed into settings so arguments take precedence. @@ -173,7 +173,7 @@ function CreateMeshCentralServer(config, args) { // Fix a NeDB database if (obj.args.dbfix) { var lines = null, badJsonCount = 0, feildNames = [], fixedDb = []; - try { lines = obj.fs.readFileSync(obj.getConfigFilePath(obj.args.dbfix), { encoding: 'utf8' }).split('\n'); } catch (e) { console.log('Invalid file: ' + obj.args.dbfix + ': ' + e); process.exit(); } + try { lines = obj.fs.readFileSync(obj.getConfigFilePath(obj.args.dbfix), { encoding: 'utf8' }).split('\n'); } catch (ex) { console.log('Invalid file: ' + obj.args.dbfix + ': ' + ex); process.exit(); } for (var i = 0; i < lines.length; i++) { var x = null; try { x = JSON.parse(lines[i]); } catch (ex) { badJsonCount++; } @@ -190,6 +190,9 @@ function CreateMeshCentralServer(config, args) { // Perform a password hash if (obj.args.hashpassword) { require('./pass').hash(obj.args.hashpassword, function (err, salt, hash, tag) { console.log(salt + ',' + hash); process.exit(); }); return; } + // Dump to mesh cores + if (obj.args.dumpcores) { obj.updateMeshCore(function () { console.log('Done.'); }, true); return; } + // Perform web site translations into different languages if (obj.args.translate) { // Check NodeJS version @@ -381,10 +384,10 @@ function CreateMeshCentralServer(config, args) { svc.on('alreadyinstalled', function () { console.log('MeshCentral service already installed.'); process.exit(); }); svc.on('invalidinstallation', function () { console.log('Invalid MeshCentral service installation.'); process.exit(); }); - if (obj.args.xinstall == true) { try { svc.install(); } catch (e) { logException(e); } } - if (obj.args.stop == true || obj.args.restart == true) { try { svc.stop(); } catch (e) { logException(e); } } - if (obj.args.start == true) { try { svc.start(); } catch (e) { logException(e); } } - if (obj.args.xuninstall == true) { try { svc.uninstall(); } catch (e) { logException(e); } } + if (obj.args.xinstall == true) { try { svc.install(); } catch (ex) { logException(ex); } } + if (obj.args.stop == true || obj.args.restart == true) { try { svc.stop(); } catch (ex) { logException(ex); } } + if (obj.args.start == true) { try { svc.start(); } catch (ex) { logException(ex); } } + if (obj.args.xuninstall == true) { try { svc.uninstall(); } catch (ex) { logException(ex); } } return; } @@ -534,7 +537,7 @@ function CreateMeshCentralServer(config, args) { xxprocess.stderr.on('data', function (data) { }); xxprocess.on('close', function (code) { var latestVer = null; - if (code == 0) { try { latestVer = xxprocess.data.split(' ').join('').split('\r').join('').split('\n').join(''); } catch (e) { } } + if (code == 0) { try { latestVer = xxprocess.data.split(' ').join('').split('\r').join('').split('\n').join(''); } catch (ex) { } } callback(getCurrentVersion(), latestVer); }); } catch (ex) { callback(getCurrentVersion(), null, ex); } // If the system is running out of memory, an exception here can easily happen. @@ -560,7 +563,7 @@ function CreateMeshCentralServer(config, args) { try { var lines = xxprocess.data.split('\r\n').join('\n').split('\n'); for (var i in lines) { var s = lines[i].split(': '); if ((s.length == 2) && (obj.args.npmtag == null) || (obj.args.npmtag == s[0])) { tags[s[0]] = s[1]; } } - } catch (e) { } + } catch (ex) { } } callback(tags); }); @@ -1045,10 +1048,10 @@ function CreateMeshCentralServer(config, args) { // Import the entire database from a JSON file if (obj.args.dbimport == true) { obj.args.dbimport = obj.getConfigFilePath('meshcentral.db.json'); } var json = null, json2 = '', badCharCount = 0; - try { json = obj.fs.readFileSync(obj.args.dbimport, { encoding: 'utf8' }); } catch (e) { console.log('Invalid JSON file: ' + obj.args.dbimport + ': ' + e); process.exit(); } + try { json = obj.fs.readFileSync(obj.args.dbimport, { encoding: 'utf8' }); } catch (ex) { console.log('Invalid JSON file: ' + obj.args.dbimport + ': ' + ex); process.exit(); } for (i = 0; i < json.length; i++) { if (json.charCodeAt(i) >= 32) { json2 += json[i]; } else { var tt = json.charCodeAt(i); if (tt != 10 && tt != 13) { badCharCount++; } } } // Remove all bad chars if (badCharCount > 0) { console.log(badCharCount + ' invalid character(s) where removed.'); } - try { json = JSON.parse(json2); } catch (e) { console.log('Invalid JSON format: ' + obj.args.dbimport + ': ' + e); process.exit(); } + try { json = JSON.parse(json2); } catch (ex) { console.log('Invalid JSON format: ' + obj.args.dbimport + ': ' + e); process.exit(); } if ((json == null) || (typeof json.length != 'number') || (json.length < 1)) { console.log('Invalid JSON format: ' + obj.args.dbimport + '.'); } // Escape MongoDB invalid field chars for (i in json) { @@ -1086,10 +1089,10 @@ function CreateMeshCentralServer(config, args) { // Import the entire database from a JSON file if (obj.args.dbmerge == true) { obj.args.dbmerge = obj.getConfigFilePath('meshcentral.db.json'); } var json = null, json2 = "", badCharCount = 0; - try { json = obj.fs.readFileSync(obj.args.dbmerge, { encoding: 'utf8' }); } catch (e) { console.log('Invalid JSON file: ' + obj.args.dbmerge + ': ' + e); process.exit(); } + try { json = obj.fs.readFileSync(obj.args.dbmerge, { encoding: 'utf8' }); } catch (ex) { console.log('Invalid JSON file: ' + obj.args.dbmerge + ': ' + ex); process.exit(); } for (i = 0; i < json.length; i++) { if (json.charCodeAt(i) >= 32) { json2 += json[i]; } else { var tt = json.charCodeAt(i); if (tt != 10 && tt != 13) { badCharCount++; } } } // Remove all bad chars if (badCharCount > 0) { console.log(badCharCount + ' invalid character(s) where removed.'); } - try { json = JSON.parse(json2); } catch (e) { console.log('Invalid JSON format: ' + obj.args.dbmerge + ': ' + e); process.exit(); } + try { json = JSON.parse(json2); } catch (ex) { console.log('Invalid JSON format: ' + obj.args.dbmerge + ': ' + ex); process.exit(); } if ((json == null) || (typeof json.length != 'number') || (json.length < 1)) { console.log('Invalid JSON format: ' + obj.args.dbimport + '.'); } // Get all users from current database @@ -1556,7 +1559,17 @@ function CreateMeshCentralServer(config, args) { var translations = JSON.parse(obj.fs.readFileSync(translationpath).toString()); if (translations['zh-chs']) { translations['zh-hans'] = translations['zh-chs']; delete translations['zh-chs']; } if (translations['zh-cht']) { translations['zh-hant'] = translations['zh-cht']; delete translations['zh-cht']; } - obj.agentTranslations = JSON.stringify(translations); + + // If there is domain customizations to the agent strings, do this here. + for (var i in obj.config.domains) { + var domainTranslations = translations; + if ((typeof obj.config.domains[i].agentcustomization == 'object') && (typeof obj.config.domains[i].agentcustomization.installtext == 'string')) { + domainTranslations = Object.assign({}, domainTranslations); // Shallow clone + for (var j in domainTranslations) { delete domainTranslations[j].description; } + domainTranslations.en.description = obj.config.domains[i].agentcustomization.installtext; + } + obj.config.domains[i].agentTranslations = JSON.stringify(domainTranslations); + } } catch (ex) { } // Load the list of mesh agents and install scripts @@ -2428,7 +2441,7 @@ function CreateMeshCentralServer(config, args) { } // Update the default mesh core - obj.updateMeshCore = function (func) { + obj.updateMeshCore = function (func, dumpToFile) { // Figure out where meshcore.js is var meshcorePath = obj.datapath; if (obj.fs.existsSync(obj.path.join(meshcorePath, 'meshcore.js')) == false) { @@ -2476,12 +2489,12 @@ function CreateMeshCentralServer(config, args) { } } - if (obj.args.minifycore !== false) { try { meshCore = obj.fs.readFileSync(obj.path.join(meshcorePath, 'meshcore.min.js')).toString(); } catch (e) { } } // Favor minified meshcore if present. - if (meshCore == null) { try { meshCore = obj.fs.readFileSync(obj.path.join(meshcorePath, 'meshcore.js')).toString(); } catch (e) { } } // Use non-minified meshcore. + if (obj.args.minifycore !== false) { try { meshCore = obj.fs.readFileSync(obj.path.join(meshcorePath, 'meshcore.min.js')).toString(); } catch (ex) { } } // Favor minified meshcore if present. + if (meshCore == null) { try { meshCore = obj.fs.readFileSync(obj.path.join(meshcorePath, 'meshcore.js')).toString(); } catch (ex) { } } // Use non-minified meshcore. if (meshCore != null) { var moduleDirPath = null; - if (obj.args.minifycore !== false) { try { moduleDirPath = obj.path.join(meshcorePath, 'modules_meshcore_min'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Favor minified modules if present. - if (modulesDir == null) { try { moduleDirPath = obj.path.join(meshcorePath, 'modules_meshcore'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Use non-minified mofules. + if (obj.args.minifycore !== false) { try { moduleDirPath = obj.path.join(meshcorePath, 'modules_meshcore_min'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (ex) { } } // Favor minified modules if present. + if (modulesDir == null) { try { moduleDirPath = obj.path.join(meshcorePath, 'modules_meshcore'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (ex) { } } // Use non-minified mofules. if (modulesDir != null) { for (var i in modulesDir) { if (modulesDir[i].toLowerCase().endsWith('.json')) { @@ -2500,7 +2513,7 @@ function CreateMeshCentralServer(config, args) { // We are adding a JS file to the meshcores var moduleName = modulesDir[i].substring(0, modulesDir[i].length - 3); if (moduleName.endsWith('.min')) { moduleName = moduleName.substring(0, moduleName.length - 4); } // Remove the ".min" for ".min.js" files. - const moduleData = [ 'try { addModule("', moduleName, '", "', obj.escapeCodeString(obj.fs.readFileSync(obj.path.join(moduleDirPath, modulesDir[i])).toString('binary')), '"); addedModules.push("', moduleName, '"); } catch (e) { }\r\n' ]; + const moduleData = [ 'try { addModule("', moduleName, '", "', obj.escapeCodeString(obj.fs.readFileSync(obj.path.join(moduleDirPath, modulesDir[i])).toString('binary')), '"); addedModules.push("', moduleName, '"); } catch (ex) { }\r\n' ]; // Merge this module // NOTE: "smbios" module makes some non-AI Linux segfault, only include for IA platforms. @@ -2542,6 +2555,9 @@ function CreateMeshCentralServer(config, args) { // Add plugins to cores if (obj.pluginHandler) { obj.pluginHandler.addMeshCoreModules(modulesAdd); } + // If we need to dump modules to file, create a meshcores folder + if (dumpToFile) { try { obj.fs.mkdirSync('meshcores'); } catch (ex) { } } + // Merge the cores and compute the hashes for (var i in modulesAdd) { if ((i == 'windows-recovery') || (i == 'linux-recovery')) { @@ -2557,9 +2573,11 @@ function CreateMeshCentralServer(config, args) { obj.defaultMeshCoresHash[i] = obj.crypto.createHash('sha384').update(obj.defaultMeshCores[i]).digest('binary'); obj.debug('main', 'Core module ' + i + ' is ' + obj.defaultMeshCores[i].length + ' bytes.'); - // These lines will write all modules to files. Great for debugging. - //console.log('Core module ' + i + ' is ' + obj.defaultMeshCores[i].length + ' bytes.'); // DEBUG, Print the core size - //obj.fs.writeFile("C:\\temp\\" + i + ".js", obj.defaultMeshCores[i].slice(4), function () { }); // DEBUG, Write the core to file + // Write all modules to files. Great for debugging. + if (dumpToFile) { + console.log('Core module ' + i + ' is ' + obj.defaultMeshCores[i].length + ' bytes, saving to meshcores/' + i + '.js.'); // Print the core size and filename + obj.fs.writeFile('meshcores/' + i + '.js', obj.defaultMeshCores[i].slice(4), function () { }); // Write the core to file + } // Compress the mesh cores with DEFLATE const callback = function MeshCoreDeflateCb(err, buffer) { if (err == null) { obj.defaultMeshCoresDeflate[MeshCoreDeflateCb.i] = buffer; } } @@ -2585,10 +2603,10 @@ function CreateMeshCentralServer(config, args) { meshCmd = meshCmd.replace("'***Mesh*Cmd*Version***'", '\'' + getCurrentVersion() + '\''); // Figure out where the modules_meshcmd folder is. - if (obj.args.minifycore !== false) { try { moduleDirPath = obj.path.join(meshcmdPath, 'modules_meshcmd_min'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Favor minified modules if present. - if (modulesDir == null) { try { moduleDirPath = obj.path.join(meshcmdPath, 'modules_meshcmd'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Use non-minified mofules. - if (obj.args.minifycore !== false) { if (modulesDir == null) { try { moduleDirPath = obj.path.join(__dirname, 'agents', 'modules_meshcmd_min'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } } // Favor minified modules if present. - if (modulesDir == null) { try { moduleDirPath = obj.path.join(__dirname, 'agents', 'modules_meshcmd'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Use non-minified mofules. + if (obj.args.minifycore !== false) { try { moduleDirPath = obj.path.join(meshcmdPath, 'modules_meshcmd_min'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (ex) { } } // Favor minified modules if present. + if (modulesDir == null) { try { moduleDirPath = obj.path.join(meshcmdPath, 'modules_meshcmd'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (ex) { } } // Use non-minified mofules. + if (obj.args.minifycore !== false) { if (modulesDir == null) { try { moduleDirPath = obj.path.join(__dirname, 'agents', 'modules_meshcmd_min'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (ex) { } } } // Favor minified modules if present. + if (modulesDir == null) { try { moduleDirPath = obj.path.join(__dirname, 'agents', 'modules_meshcmd'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (ex) { } } // Use non-minified mofules. // Read all .js files in the meshcmd modules folder. if (modulesDir != null) { @@ -2597,7 +2615,7 @@ function CreateMeshCentralServer(config, args) { // Merge this module var moduleName = modulesDir[i].substring(0, modulesDir[i].length - 3); if (moduleName.endsWith('.min')) { moduleName = moduleName.substring(0, moduleName.length - 4); } // Remove the ".min" for ".min.js" files. - moduleAdditions.push('try { addModule("', moduleName, '", "', obj.escapeCodeString(obj.fs.readFileSync(obj.path.join(moduleDirPath, modulesDir[i])).toString('binary')), '"); addedModules.push("', moduleName, '"); } catch (e) { }\r\n'); + moduleAdditions.push('try { addModule("', moduleName, '", "', obj.escapeCodeString(obj.fs.readFileSync(obj.path.join(moduleDirPath, modulesDir[i])).toString('binary')), '"); addedModules.push("', moduleName, '"); } catch (ex) { }\r\n'); } } } @@ -2643,7 +2661,7 @@ function CreateMeshCentralServer(config, args) { obj.meshToolsBinaries[this.toolname] = { hash: data.toString('hex'), hashx: this.hashx, path: this.toolpath, dlname: this.dlname, url: this.url }; obj.meshToolsBinaries[this.toolname].url = 'https://' + obj.certificates.CommonName + ':' + ((typeof obj.args.aliasport == 'number') ? obj.args.aliasport : obj.args.port) + '/meshagents?meshaction=' + this.dlname; var stats = null; - try { stats = obj.fs.statSync(this.toolpath); } catch (e) { } + try { stats = obj.fs.statSync(this.toolpath); } catch (ex) { } if (stats != null) { obj.meshToolsBinaries[this.toolname].size = stats.size; } }); var options = { sourcePath: toolpath, targetStream: hashStream }; @@ -2670,7 +2688,7 @@ function CreateMeshCentralServer(config, args) { obj.meshToolsBinaries[this.toolname].dlname = this.dlname; obj.meshToolsBinaries[this.toolname].url = 'https://' + obj.certificates.CommonName + ':' + ((typeof obj.args.aliasport == 'number') ? obj.args.aliasport : obj.args.port) + '/meshagents?meshaction=' + this.dlname; var stats = null; - try { stats = obj.fs.statSync(this.agentpath); } catch (e) { } + try { stats = obj.fs.statSync(this.agentpath); } catch (ex) { } if (stats != null) { obj.meshToolsBinaries[this.toolname].size = stats.size; } }); stream.toolname = toolname; @@ -2678,7 +2696,7 @@ function CreateMeshCentralServer(config, args) { stream.dlname = meshToolsList[toolname].dlname; stream.hash = obj.crypto.createHash('sha384', stream); stream.hashx = 0; - } catch (e) { } + } catch (ex) { } } } }; @@ -2712,7 +2730,7 @@ function CreateMeshCentralServer(config, args) { obj.meshAgentInstallScripts[this.info.id].data = this.xdata; obj.meshAgentInstallScripts[this.info.id].url = 'https://' + obj.certificates.CommonName + ':' + ((typeof obj.args.aliasport == 'number') ? obj.args.aliasport : obj.args.port) + '/meshagents?script=' + this.info.id; var stats = null; - try { stats = obj.fs.statSync(this.agentpath); } catch (e) { } + try { stats = obj.fs.statSync(this.agentpath); } catch (ex) { } if (stats != null) { obj.meshAgentInstallScripts[this.info.id].size = stats.size; } // Place Unit line breaks on Linux scripts if not already present. @@ -2721,7 +2739,7 @@ function CreateMeshCentralServer(config, args) { stream.info = meshAgentsInstallScriptList[scriptid]; stream.agentpath = scriptpath; stream.hash = obj.crypto.createHash('sha384', stream); - } catch (e) { } + } catch (ex) { } } }; @@ -2786,7 +2804,7 @@ function CreateMeshCentralServer(config, args) { // Fetch all the agent binary information var stats = null; - try { stats = obj.fs.statSync(agentpath); } catch (e) { } + try { stats = obj.fs.statSync(agentpath); } catch (ex) { } if ((stats != null)) { // If file exists archcount++; @@ -2798,7 +2816,7 @@ function CreateMeshCentralServer(config, args) { // If this is a windows binary, pull binary information if (obj.meshAgentsArchitectureNumbers[archid].platform == 'win32') { - try { obj.meshAgentBinaries[archid].pe = obj.exeHandler.parseWindowsExecutable(agentpath); } catch (e) { } + try { obj.meshAgentBinaries[archid].pe = obj.exeHandler.parseWindowsExecutable(agentpath); } catch (ex) { } } // If agents must be stored in RAM or if this is a Windows 32/64 agent, load the agent in RAM. @@ -3235,7 +3253,7 @@ function getConfig(createSampleConfig) { datapath = path.join(__dirname, '../meshcentral-data'); } if (args.datapath) { datapath = args.datapath; } - try { fs.mkdirSync(datapath); } catch (e) { } + try { fs.mkdirSync(datapath); } catch (ex) { } // Read configuration file if present and change arguments. var config = {}, configFilePath = path.join(datapath, 'config.json'); @@ -3244,7 +3262,7 @@ function getConfig(createSampleConfig) { } if (fs.existsSync(configFilePath)) { // Load and validate the configuration file - try { config = require(configFilePath); } catch (e) { console.log('ERROR: Unable to parse ' + configFilePath + '.'); return null; } + try { config = require(configFilePath); } catch (ex) { console.log('ERROR: Unable to parse ' + configFilePath + '.'); return null; } if (config.domains == null) { config.domains = {}; } for (i in config.domains) { if ((i.split('/').length > 1) || (i.split(' ').length > 1)) { console.log("ERROR: Error in config.json, domain names can't have spaces or /."); return null; } } } else { @@ -3292,7 +3310,7 @@ function InstallModules(modules, func) { if (typeof dependencies[moduleName] != undefined) { moduleVersion = dependencies[moduleName]; } require(moduleName); } - } catch (e) { + } catch (ex) { if (previouslyInstalledModules[modules[i]] !== true) { missingModules.push(moduleNameAndVersion); } } } diff --git a/meshdesktopmultiplex.js b/meshdesktopmultiplex.js index c497e8cf..daaba705 100644 --- a/meshdesktopmultiplex.js +++ b/meshdesktopmultiplex.js @@ -58,10 +58,11 @@ MNG_ENCAPSULATE_AGENT_COMMAND = 70, MNG_KVM_DISPLAY_INFO = 82 */ -function CreateDesktopMultiplexor(parent, domain, nodeid, func) { +function CreateDesktopMultiplexor(parent, domain, nodeid, id, func) { var obj = {}; - obj.nodeid = nodeid; - obj.parent = parent; + obj.id = id; // Unique identifier for this session + obj.nodeid = nodeid; // Remote device nodeid for this session + obj.parent = parent; // Parent web server instance obj.agent = null; // Reference to the connection object that is the agent. obj.viewers = []; // Array of references to all viewers. obj.viewersOverflowCount = 0; // Number of viewers currently in overflow state. @@ -180,7 +181,7 @@ function CreateDesktopMultiplexor(parent, domain, nodeid, func) { // Log joining the multiplex session if (obj.startTime != null) { - var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, userid: peer.user ? peer.user._id : null, username: peer.user.name, msgid: 4, msg: "Joined desktop multiplex session", protocol: 2 }; + var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, userid: peer.user ? peer.user._id : null, username: peer.user.name, msgid: 143, msgArgs: [obj.id], msg: "Joined desktop multiplex session \"" + obj.id + "\"", protocol: 2 }; parent.parent.DispatchEvent(['*', obj.nodeid, peer.user._id, obj.meshid], obj, event); } @@ -208,7 +209,7 @@ function CreateDesktopMultiplexor(parent, domain, nodeid, func) { // Log multiplex session start if ((obj.agent != null) && (obj.viewers.length > 0) && (obj.startTime == null)) { - var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, msgid: 6, msg: "Started desktop multiplex session", protocol: 2 }; + var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, msgid: 145, msgArgs: [obj.id], msg: "Started desktop multiplex session \"" + obj.id + "\"", protocol: 2 }; if (obj.viewers[0].user != null) { event.userid = obj.viewers[0].user._id; event.username = obj.viewers[0].user.name; } const targets = ['*', obj.nodeid, obj.meshid]; if (obj.viewers[0].user != null) { targets.push(obj.viewers[0].user._id); } @@ -288,7 +289,7 @@ function CreateDesktopMultiplexor(parent, domain, nodeid, func) { //var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, userid: peer.user._id, username: peer.user.name, msgid: 5, msg: "Left the desktop multiplex session", protocol: 2 }; const sessionSeconds = Math.floor((Date.now() - peer.startTime) / 1000); - var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, msgid: 122, msgArgs: [sessionSeconds], msg: "Left the desktop multiplex session after " + sessionSeconds + " second(s).", protocol: 2, bytesin: inTraffc, bytesout: outTraffc }; + var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, msgid: 144, msgArgs: [obj.id, sessionSeconds], msg: "Left the desktop multiplex session \"" + obj.id + "\" after " + sessionSeconds + " second(s).", protocol: 2, bytesin: inTraffc, bytesout: outTraffc }; if (peer.user != null) { event.userid = peer.user._id; event.username = peer.user.name; } if (peer.guestName) { event.guestname = peer.guestName; } const targets = ['*', obj.nodeid, obj.meshid]; @@ -342,7 +343,7 @@ function CreateDesktopMultiplexor(parent, domain, nodeid, func) { // Add a event entry about this recording var basefile = parent.parent.path.basename(filename); - var event = { etype: 'relay', action: 'recording', domain: domain.id, nodeid: obj.nodeid, msgid: 7, msgArgs: [obj.sessionLength], msg: "Finished recording session" + (obj.sessionLength ? (', ' + obj.sessionLength + ' second(s)') : ''), filename: basefile, size: obj.recordingFileSize, protocol: 2, icon: obj.icon, name: obj.name, meshid: obj.meshid, userids: obj.userIds, multiplex: true }; + var event = { etype: 'relay', action: 'recording', domain: domain.id, nodeid: obj.nodeid, msgid: 146, msgArgs: [obj.id, obj.sessionLength], msg: "Finished recording session \"" + obj.id + "\", " + obj.sessionLength + " second(s)", filename: basefile, size: obj.recordingFileSize, protocol: 2, icon: obj.icon, name: obj.name, meshid: obj.meshid, userids: obj.userIds, multiplex: true }; var mesh = parent.meshes[obj.meshid]; if (mesh != null) { event.meshname = mesh.name; } if (obj.sessionStart) { event.startTime = obj.sessionStart; event.lengthTime = obj.sessionLength; } @@ -354,7 +355,7 @@ function CreateDesktopMultiplexor(parent, domain, nodeid, func) { // Log end of multiplex session if (obj.startTime != null) { - var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, msgid: 8, msgArgs: [Math.floor((Date.now() - obj.startTime) / 1000)], msg: "Closed desktop multiplex session" + ', ' + Math.floor((Date.now() - obj.startTime) / 1000) + ' second(s)', protocol: 2 }; + var event = { etype: 'relay', action: 'relaylog', domain: domain.id, nodeid: obj.nodeid, msgid: 147, msgArgs: [obj.id, Math.floor((Date.now() - obj.startTime) / 1000)], msg: "Closed desktop multiplex session \"" + obj.id + "\", " + Math.floor((Date.now() - obj.startTime) / 1000) + ' second(s)', protocol: 2 }; parent.parent.DispatchEvent(['*', obj.nodeid, obj.meshid], obj, event); obj.startTime = null; } @@ -1203,7 +1204,7 @@ function CreateMeshRelayEx2(parent, ws, req, domain, user, cookie) { if (obj.deskMultiplexor == null) { parent.desktoprelays[obj.nodeid] = 1; // Indicate that the creating of the desktop multiplexor is pending. parent.parent.debug('relay', 'DesktopRelay: Creating new desktop multiplexor'); - CreateDesktopMultiplexor(parent, domain, obj.nodeid, function (deskMultiplexor) { + CreateDesktopMultiplexor(parent, domain, obj.nodeid, obj.id, function (deskMultiplexor) { if (deskMultiplexor != null) { // Desktop multiplexor was created, use it. obj.deskMultiplexor = deskMultiplexor; diff --git a/meshuser.js b/meshuser.js index 83e34875..5c76ee9b 100644 --- a/meshuser.js +++ b/meshuser.js @@ -3183,6 +3183,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Do not allow this command if 2FA's are locked if ((domain.passwordrequirements) && (domain.passwordrequirements.lock2factor == true)) return; + // Do not allow this command if backup codes are not allowed + if ((domain.passwordrequirements) && (domain.passwordrequirements.backupcode2factor == false)) return; + // Do not allow this command when logged in using a login token if (req.session.loginToken != null) break; @@ -3211,6 +3214,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Do not allow this command if 2FA's are locked if ((domain.passwordrequirements) && (domain.passwordrequirements.lock2factor == true)) return; + // Do not allow this command if backup codes are not allowed + if ((domain.passwordrequirements) && (domain.passwordrequirements.backupcode2factor == false)) return; + // Do not allow this command when logged in using a login token if (req.session.loginToken != null) break; @@ -3250,6 +3256,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Do not allow this command if 2FA's are locked if ((domain.passwordrequirements) && (domain.passwordrequirements.lock2factor == true)) return; + // Do not allow this command if backup codes are not allowed + if ((domain.passwordrequirements) && (domain.passwordrequirements.backupcode2factor == false)) return; + // Do not allow this command when logged in using a login token if (req.session.loginToken != null) break; @@ -3281,6 +3290,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Do not allow this command if 2FA's are locked if ((domain.passwordrequirements) && (domain.passwordrequirements.lock2factor == true)) return; + // Do not allow this command if backup codes are not allowed + if ((domain.passwordrequirements) && (domain.passwordrequirements.backupcode2factor == false)) return; + // Do not allow this command when logged in using a login token if (req.session.loginToken != null) break; @@ -4571,7 +4583,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use if (type == 'csv') { try { // Create the CSV file - output = 'id,name,rname,host,icon,ip,osdesc,groupname,av,update,firewall,avdetails,cpu,osbuild,biosDate,biosVendor,biosVersion,boardName,boardVendor,boardVersion,productUuid,agentOpenSSL,agentCommitDate,agentCommitHash,agentCompileTime,netIfCount,macs,addresses,lastConnectTime,lastConnectAddr\r\n'; + output = 'id,name,rname,host,icon,ip,osdesc,groupname,av,update,firewall,avdetails,cpu,osbuild,biosDate,biosVendor,biosVersion,boardName,boardVendor,boardVersion,productUuid,totalMemory,agentOpenSSL,agentCommitDate,agentCommitHash,agentCompileTime,netIfCount,macs,addresses,lastConnectTime,lastConnectAddr\r\n'; for (var i = 0; i < results.length; i++) { const nodeinfo = results[i]; @@ -4613,6 +4625,17 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.board_version)) { output += csvClean(nodeinfo.sys.hardware.identifiers.board_version); } output += ','; if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.product_uuid)) { output += csvClean(nodeinfo.sys.hardware.identifiers.product_uuid); } + output += ','; + if (nodeinfo.sys.hardware.windows.memory) { + var totalMemory = 0; + for (var j in nodeinfo.sys.hardware.windows.memory) { + if (nodeinfo.sys.hardware.windows.memory[j].Capacity) { + if (typeof nodeinfo.sys.hardware.windows.memory[j].Capacity == 'number') { totalMemory += nodeinfo.sys.hardware.windows.memory[j].Capacity; } + if (typeof nodeinfo.sys.hardware.windows.memory[j].Capacity == 'string') { totalMemory += parseInt(nodeinfo.sys.hardware.windows.memory[j].Capacity); } + } + } + output += csvClean('' + totalMemory); + } } else if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.mobile)) { // Mobile output += ','; @@ -4628,6 +4651,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use output += ','; output += ','; if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.id)) { output += csvClean(nodeinfo.sys.hardware.mobile.id); } + output += ','; } else if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.windows) && (nodeinfo.sys.hardware.linux)) { // Linux output += ','; @@ -4646,8 +4670,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.board_version)) { output += csvClean(nodeinfo.sys.hardware.linux.board_version); } output += ','; if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.product_uuid)) { output += csvClean(nodeinfo.sys.hardware.linux.product_uuid); } + output += ','; } else { - output += ',,,,,,,,,'; + output += ',,,,,,,,,,'; } // Agent information @@ -5265,7 +5290,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Perform email invitation if ((command.emailInvitation == true) && (command.emailVerified == true) && command.email && domain.mailserver) { - domain.mailserver.sendAccountInviteMail(newuserdomain, (user.realname ? user.realname : user.name), newusername, command.email.toLowerCase(), command.pass, parent.getLanguageCodes(req)); + domain.mailserver.sendAccountInviteMail(newuserdomain, (user.realname ? user.realname : user.name), newusername, command.email.toLowerCase(), command.pass, parent.getLanguageCodes(req), req.query.key); } // Log in the auth log @@ -5504,7 +5529,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use if (parent.parent.authlog) { parent.parent.authLog('https', 'User ' + user.name + ' changed email from ' + oldemail + ' to ' + user.email); } // Send the verification email - if (domain.mailserver != null) { domain.mailserver.sendAccountCheckMail(domain, user.name, user._id, user.email, parent.getLanguageCodes(req)); } + if (domain.mailserver != null) { domain.mailserver.sendAccountCheckMail(domain, user.name, user._id, user.email, parent.getLanguageCodes(req), req.query.key); } } }); } @@ -6100,7 +6125,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use if ((domain.mailserver != null) && (obj.user.email.toLowerCase() == command.email)) { // Send the verification email - domain.mailserver.sendAccountCheckMail(domain, user.name, user._id, user.email, parent.getLanguageCodes(req)); + domain.mailserver.sendAccountCheckMail(domain, user.name, user._id, user.email, parent.getLanguageCodes(req), req.query.key); } } diff --git a/package.json b/package.json index 7797bf4c..c8d8865a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "meshcentral", - "version": "0.9.77", + "version": "0.9.79", "keywords": [ "Remote Device Management", "Remote Device Monitoring", diff --git a/translate/translate.json b/translate/translate.json index 202462f0..c6a3be89 100644 --- a/translate/translate.json +++ b/translate/translate.json @@ -325,7 +325,7 @@ "zh-cht": " 用戶需要先登入到該伺服器一次,然後才能將其新增到裝置群。", "xloc": [ "default.handlebars->39->1959", - "default.handlebars->39->2496" + "default.handlebars->39->2501" ] }, { @@ -930,7 +930,7 @@ "xloc": [ "default-mobile.handlebars->11->687", "default.handlebars->39->2033", - "default.handlebars->39->2279" + "default.handlebars->39->2284" ] }, { @@ -1579,7 +1579,7 @@ "default-mobile.handlebars->11->470", "default.handlebars->39->1303", "default.handlebars->39->2088", - "default.handlebars->39->2694", + "default.handlebars->39->2699", "sharing.handlebars->11->50" ] }, @@ -1741,7 +1741,7 @@ "zh-chs": "1个活跃时段", "zh-cht": "1個活躍時段", "xloc": [ - "default.handlebars->39->2584" + "default.handlebars->39->2589" ] }, { @@ -1856,7 +1856,7 @@ "zh-chs": "1组", "zh-cht": "1群", "xloc": [ - "default.handlebars->39->2543" + "default.handlebars->39->2548" ] }, { @@ -1986,7 +1986,7 @@ "zh-chs": "有1个用户没有显示,请使用搜索框查找用户...", "zh-cht": "有1個用戶沒有顯示,請使用搜尋框搜尋用戶...", "xloc": [ - "default.handlebars->39->2311" + "default.handlebars->39->2316" ] }, { @@ -2183,7 +2183,7 @@ "default-mobile.handlebars->11->211", "default-mobile.handlebars->11->215", "default-mobile.handlebars->11->219", - "default.handlebars->39->2315", + "default.handlebars->39->2320", "default.handlebars->39->383", "default.handlebars->39->386", "default.handlebars->39->390", @@ -2962,8 +2962,8 @@ "zh-chs": "启用第二因素身份验证", "zh-cht": "啟用第二因素身份驗證", "xloc": [ - "default.handlebars->39->2329", - "default.handlebars->39->2567" + "default.handlebars->39->2334", + "default.handlebars->39->2572" ] }, { @@ -4303,7 +4303,7 @@ "tr": "AMT-OS", "zh-chs": "操作系统", "xloc": [ - "default.handlebars->39->2823" + "default.handlebars->39->2828" ] }, { @@ -4322,7 +4322,7 @@ "ru": "AMT-Redir", "tr": "AMT-Yönlendirme", "xloc": [ - "default.handlebars->39->2728" + "default.handlebars->39->2733" ] }, { @@ -4341,7 +4341,7 @@ "ru": "AMT-WSMAN", "tr": "AMT-WSMAN", "xloc": [ - "default.handlebars->39->2727" + "default.handlebars->39->2732" ] }, { @@ -4600,7 +4600,7 @@ "zh-chs": "访问服务器档案", "zh-cht": "存取伺服器檔案", "xloc": [ - "default.handlebars->39->2502" + "default.handlebars->39->2507" ] }, { @@ -4711,7 +4711,7 @@ "default-mobile.handlebars->container->page_content->column_l->p3->p3info->3->p3AccountActions->p2AccountSecurity->1->0", "default.handlebars->39->1741", "default.handlebars->39->1743", - "default.handlebars->39->2876", + "default.handlebars->39->2881", "default.handlebars->39->747", "default.handlebars->39->749" ] @@ -4738,7 +4738,7 @@ "zh-chs": "帐号设定", "xloc": [ "default-mobile.handlebars->11->698", - "default.handlebars->39->2753" + "default.handlebars->39->2758" ] }, { @@ -4908,8 +4908,8 @@ "zh-chs": "帐户已被锁定", "zh-cht": "帳戶已被鎖定", "xloc": [ - "default.handlebars->39->2331", - "default.handlebars->39->2499" + "default.handlebars->39->2336", + "default.handlebars->39->2504" ] }, { @@ -4935,7 +4935,7 @@ "zh-cht": "達到帳戶限制。", "xloc": [ "default-mobile.handlebars->11->710", - "default.handlebars->39->2765", + "default.handlebars->39->2770", "login-mobile.handlebars->5->6", "login.handlebars->5->6", "login2.handlebars->7->8" @@ -5634,8 +5634,8 @@ "zh-chs": "添加设备", "zh-cht": "新增裝置", "xloc": [ - "default.handlebars->39->2474", - "default.handlebars->39->2633", + "default.handlebars->39->2479", + "default.handlebars->39->2638", "default.handlebars->39->428" ] }, @@ -5687,8 +5687,8 @@ "zh-cht": "新增裝置群", "xloc": [ "default.handlebars->39->1995", - "default.handlebars->39->2468", - "default.handlebars->39->2621", + "default.handlebars->39->2473", + "default.handlebars->39->2626", "default.handlebars->39->344" ] }, @@ -5883,7 +5883,7 @@ "zh-chs": "添加成员身份", "zh-cht": "新增成員身份", "xloc": [ - "default.handlebars->39->2653" + "default.handlebars->39->2658" ] }, { @@ -6037,7 +6037,7 @@ "xloc": [ "default.handlebars->39->1853", "default.handlebars->39->1994", - "default.handlebars->39->2627", + "default.handlebars->39->2632", "default.handlebars->39->926" ] }, @@ -6136,7 +6136,7 @@ "zh-cht": "新增用戶", "xloc": [ "default.handlebars->39->1852", - "default.handlebars->39->2463" + "default.handlebars->39->2468" ] }, { @@ -6186,7 +6186,7 @@ "zh-chs": "将用户添加到用户组", "zh-cht": "將用戶新增到用戶群", "xloc": [ - "default.handlebars->39->2498" + "default.handlebars->39->2503" ] }, { @@ -6866,7 +6866,7 @@ "zh-chs": "管理领域", "zh-cht": "管理領域", "xloc": [ - "default.handlebars->39->2547" + "default.handlebars->39->2552" ] }, { @@ -6917,7 +6917,7 @@ "zh-chs": "管理领域", "zh-cht": "管理領域", "xloc": [ - "default.handlebars->39->2396" + "default.handlebars->39->2401" ] }, { @@ -6942,7 +6942,7 @@ "zh-chs": "管理员", "zh-cht": "管理員", "xloc": [ - "default.handlebars->39->2323" + "default.handlebars->39->2328" ] }, { @@ -6998,7 +6998,7 @@ "default-mobile.handlebars->container->page_content->column_l->p10->p10console->consoleTable->1->4->1->1->1->0->p15outputselecttd->p15outputselect->p15outputselect1", "default.handlebars->39->2063", "default.handlebars->39->2076", - "default.handlebars->39->2821", + "default.handlebars->39->2826", "default.handlebars->39->364", "default.handlebars->39->605", "default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->p15outputselecttd->p15outputselect->p15outputselect1" @@ -7104,7 +7104,7 @@ "zh-chs": "代理错误计数器", "zh-cht": "代理錯誤計數器", "xloc": [ - "default.handlebars->39->2790" + "default.handlebars->39->2795" ] }, { @@ -7297,7 +7297,7 @@ "zh-chs": "代理时段", "zh-cht": "代理時段", "xloc": [ - "default.handlebars->39->2806" + "default.handlebars->39->2811" ] }, { @@ -7847,7 +7847,7 @@ "zh-chs": "代理", "zh-cht": "代理", "xloc": [ - "default.handlebars->39->2834" + "default.handlebars->39->2839" ] }, { @@ -7900,7 +7900,7 @@ "default-mobile.handlebars->11->141", "default-mobile.handlebars->11->471", "default-mobile.handlebars->11->473", - "default.handlebars->39->2702", + "default.handlebars->39->2707", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->devListToolbar->DevFilterSelect->1" ] }, @@ -7926,7 +7926,7 @@ "zh-chs": "全部可用", "zh-cht": "全部可用", "xloc": [ - "default.handlebars->39->2285" + "default.handlebars->39->2290" ] }, { @@ -7976,7 +7976,7 @@ "zh-chs": "所有事件", "zh-cht": "所有事件", "xloc": [ - "default.handlebars->39->2283" + "default.handlebars->39->2288" ] }, { @@ -8053,7 +8053,7 @@ "zh-cht": "允許用戶管理此裝置群和該群中的裝置。", "xloc": [ "default.handlebars->39->1957", - "default.handlebars->39->2495" + "default.handlebars->39->2500" ] }, { @@ -8328,8 +8328,8 @@ "zh-cht": "一直通知", "xloc": [ "default.handlebars->39->1830", - "default.handlebars->39->2454", - "default.handlebars->39->2556", + "default.handlebars->39->2459", + "default.handlebars->39->2561", "default.handlebars->39->833" ] }, @@ -8356,8 +8356,8 @@ "zh-cht": "一直提示", "xloc": [ "default.handlebars->39->1831", - "default.handlebars->39->2455", - "default.handlebars->39->2557", + "default.handlebars->39->2460", + "default.handlebars->39->2562", "default.handlebars->39->834" ] }, @@ -9519,7 +9519,7 @@ "zh-chs": "您确定要{0}插件吗:{1}", "zh-cht": "你確定要{0}外掛嗎:{1}", "xloc": [ - "default.handlebars->39->2885" + "default.handlebars->39->2890" ] }, { @@ -9894,7 +9894,7 @@ "zh-chs": "认证软件", "zh-cht": "認證軟體", "xloc": [ - "default.handlebars->39->2560" + "default.handlebars->39->2565" ] }, { @@ -10099,7 +10099,7 @@ "zh-cht": "自動刪除", "xloc": [ "default.handlebars->39->1815", - "default.handlebars->39->2277" + "default.handlebars->39->2282" ] }, { @@ -10272,7 +10272,7 @@ "zh-chs": "可用內存", "zh-cht": "可用內存", "xloc": [ - "default.handlebars->39->2815" + "default.handlebars->39->2820" ] }, { @@ -10596,7 +10596,7 @@ "zh-chs": "备用码", "zh-cht": "備用碼", "xloc": [ - "default.handlebars->39->2563" + "default.handlebars->39->2568" ] }, { @@ -10640,7 +10640,7 @@ "zh-chs": "错误的签名", "zh-cht": "錯誤的簽名", "xloc": [ - "default.handlebars->39->2797" + "default.handlebars->39->2802" ] }, { @@ -10665,7 +10665,7 @@ "zh-chs": "错误的网络证书", "zh-cht": "錯誤的網絡憑證", "xloc": [ - "default.handlebars->39->2796" + "default.handlebars->39->2801" ] }, { @@ -10964,7 +10964,7 @@ "zh-chs": "广播", "zh-cht": "廣播", "xloc": [ - "default.handlebars->39->2461", + "default.handlebars->39->2466", "default.handlebars->container->column_l->p4->3->1->0->3->1" ] }, @@ -10990,7 +10990,7 @@ "zh-chs": "广播消息", "zh-cht": "廣播消息", "xloc": [ - "default.handlebars->39->2378" + "default.handlebars->39->2383" ] }, { @@ -11015,7 +11015,7 @@ "zh-chs": "向所有连接的用户广播消息。", "zh-cht": "向所有連接的用戶廣播消息。", "xloc": [ - "default.handlebars->39->2373" + "default.handlebars->39->2378" ] }, { @@ -11157,7 +11157,7 @@ "ru": "Входящих байт", "tr": "Bayt Girişi", "xloc": [ - "default.handlebars->39->2720" + "default.handlebars->39->2725" ] }, { @@ -11176,7 +11176,7 @@ "ru": "Исходящих байт", "tr": "Bayt Bitti", "xloc": [ - "default.handlebars->39->2721" + "default.handlebars->39->2726" ] }, { @@ -11253,7 +11253,7 @@ "zh-cht": "CIRA", "xloc": [ "default-mobile.handlebars->11->250", - "default.handlebars->39->2822", + "default.handlebars->39->2827", "default.handlebars->39->366", "default.handlebars->39->607" ] @@ -11280,7 +11280,7 @@ "zh-chs": "CIRA服务器", "zh-cht": "CIRA伺服器", "xloc": [ - "default.handlebars->39->2869" + "default.handlebars->39->2874" ] }, { @@ -11305,7 +11305,7 @@ "zh-chs": "CIRA服务器命令", "zh-cht": "CIRA伺服器指令", "xloc": [ - "default.handlebars->39->2870" + "default.handlebars->39->2875" ] }, { @@ -11376,7 +11376,7 @@ "xloc": [ "default-mobile.handlebars->11->582", "default.handlebars->39->1424", - "default.handlebars->39->2846", + "default.handlebars->39->2851", "default.handlebars->container->column_l->p40->3->1->p40type->5" ] }, @@ -11402,7 +11402,7 @@ "zh-chs": "CPU负载", "zh-cht": "CPU負載", "xloc": [ - "default.handlebars->39->2811" + "default.handlebars->39->2816" ] }, { @@ -11427,7 +11427,7 @@ "zh-chs": "最近15分钟的CPU负载", "zh-cht": "最近15分鐘的CPU負載", "xloc": [ - "default.handlebars->39->2814" + "default.handlebars->39->2819" ] }, { @@ -11452,7 +11452,7 @@ "zh-chs": "最近5分钟的CPU负载", "zh-cht": "最近5分鐘的CPU負載", "xloc": [ - "default.handlebars->39->2813" + "default.handlebars->39->2818" ] }, { @@ -11477,7 +11477,7 @@ "zh-chs": "最近一分钟的CPU负载", "zh-cht": "最近一分鐘的CPU負載", "xloc": [ - "default.handlebars->39->2812" + "default.handlebars->39->2817" ] }, { @@ -11532,7 +11532,7 @@ "zh-chs": "CSV", "zh-cht": "CSV", "xloc": [ - "default.handlebars->39->2293" + "default.handlebars->39->2298" ] }, { @@ -11557,8 +11557,8 @@ "zh-chs": "CSV格式", "zh-cht": "CSV格式", "xloc": [ - "default.handlebars->39->2297", - "default.handlebars->39->2365", + "default.handlebars->39->2302", + "default.handlebars->39->2370", "default.handlebars->39->678" ] }, @@ -11606,7 +11606,7 @@ "zh-chs": "呼叫错误", "zh-cht": "呼叫錯誤", "xloc": [ - "default.handlebars->39->2886" + "default.handlebars->39->2891" ] }, { @@ -11654,7 +11654,7 @@ "default-mobile.handlebars->11->106", "default-mobile.handlebars->dialog->idx_dlgButtonBar", "default.handlebars->39->1789", - "default.handlebars->39->2875", + "default.handlebars->39->2880", "default.handlebars->39->465", "default.handlebars->container->dialog->idx_dlgButtonBar", "login-mobile.handlebars->dialog->idx_dlgButtonBar", @@ -11935,7 +11935,7 @@ "zh-chs": "更改{0}的电邮", "zh-cht": "更改{0}的電郵", "xloc": [ - "default.handlebars->39->2608" + "default.handlebars->39->2613" ] }, { @@ -11989,7 +11989,7 @@ "xloc": [ "default-mobile.handlebars->11->114", "default.handlebars->39->1738", - "default.handlebars->39->2581" + "default.handlebars->39->2586" ] }, { @@ -12014,7 +12014,7 @@ "zh-chs": "更改{0}的密码", "zh-cht": "更改{0}的密碼", "xloc": [ - "default.handlebars->39->2617" + "default.handlebars->39->2622" ] }, { @@ -12039,7 +12039,7 @@ "zh-chs": "更改{0}的真实名称", "zh-cht": "更改{0}的真實名稱", "xloc": [ - "default.handlebars->39->2603" + "default.handlebars->39->2608" ] }, { @@ -12186,7 +12186,7 @@ "zh-chs": "更改该用户的密码", "zh-cht": "更改該用戶的密碼", "xloc": [ - "default.handlebars->39->2580" + "default.handlebars->39->2585" ] }, { @@ -12454,9 +12454,9 @@ "zh-cht": "聊天", "xloc": [ "default.handlebars->39->1001", - "default.handlebars->39->2314", - "default.handlebars->39->2576", - "default.handlebars->39->2577", + "default.handlebars->39->2319", + "default.handlebars->39->2581", + "default.handlebars->39->2582", "default.handlebars->39->873", "default.handlebars->39->979" ] @@ -12511,7 +12511,7 @@ "zh-chs": "聊天请求,点击这里接受。", "xloc": [ "default-mobile.handlebars->11->711", - "default.handlebars->39->2766" + "default.handlebars->39->2771" ] }, { @@ -12687,7 +12687,7 @@ "zh-cht": "檢查...", "xloc": [ "default.handlebars->39->1490", - "default.handlebars->39->2880" + "default.handlebars->39->2885" ] }, { @@ -13128,7 +13128,7 @@ "zh-cht": "全部清除", "xloc": [ "default-mobile.handlebars->11->694", - "default.handlebars->39->2749" + "default.handlebars->39->2754" ] }, { @@ -13231,7 +13231,7 @@ "zh-cht": "清除此通知", "xloc": [ "default-mobile.handlebars->11->693", - "default.handlebars->39->2748" + "default.handlebars->39->2753" ] }, { @@ -13357,7 +13357,7 @@ "zh-chs": "单击此处编辑用户组名称", "zh-cht": "單擊此處編輯用戶群名稱", "xloc": [ - "default.handlebars->39->2435" + "default.handlebars->39->2440" ] }, { @@ -13705,10 +13705,16 @@ "default.handlebars->39->1305", "default.handlebars->39->206", "default.handlebars->39->214", - "default.handlebars->39->2874", + "default.handlebars->39->2879", "sharing.handlebars->11->52" ] }, + { + "en": "Closed desktop multiplex session \\\"{0}\\\", {1} second(s)", + "xloc": [ + "default.handlebars->39->2277" + ] + }, { "cs": "Uzavřená relace multiplexu pro stolní počítače, {0} s", "da": "Lukkede desktop multiplex-session, {0} sekund(er)", @@ -13933,8 +13939,8 @@ "zh-chs": "通用设备组", "zh-cht": "通用裝置群", "xloc": [ - "default.handlebars->39->2469", - "default.handlebars->39->2622" + "default.handlebars->39->2474", + "default.handlebars->39->2627" ] }, { @@ -13959,8 +13965,8 @@ "zh-chs": "通用设备", "zh-cht": "通用裝置", "xloc": [ - "default.handlebars->39->2475", - "default.handlebars->39->2634" + "default.handlebars->39->2480", + "default.handlebars->39->2639" ] }, { @@ -14083,10 +14089,10 @@ "default.handlebars->39->1113", "default.handlebars->39->1122", "default.handlebars->39->1929", - "default.handlebars->39->2343", - "default.handlebars->39->2425", - "default.handlebars->39->2491", - "default.handlebars->39->2620", + "default.handlebars->39->2348", + "default.handlebars->39->2430", + "default.handlebars->39->2496", + "default.handlebars->39->2625", "default.handlebars->39->642" ] }, @@ -14211,7 +14217,7 @@ "zh-chs": "确认删除选定的帐户?", "zh-cht": "確認刪除所選帳戶?", "xloc": [ - "default.handlebars->39->2342" + "default.handlebars->39->2347" ] }, { @@ -14258,7 +14264,7 @@ "zh-chs": "确认删除选定的用户组?", "zh-cht": "確認刪除所選用戶群?", "xloc": [ - "default.handlebars->39->2424" + "default.handlebars->39->2429" ] }, { @@ -14283,7 +14289,7 @@ "zh-chs": "确认删除用户{0}?", "zh-cht": "確認刪除用戶{0}?", "xloc": [ - "default.handlebars->39->2619" + "default.handlebars->39->2624" ] }, { @@ -14308,7 +14314,7 @@ "zh-chs": "确认删除用户“ {0} ”的成员身份?", "zh-cht": "確認刪除用戶“ {0} ”的成員身份?", "xloc": [ - "default.handlebars->39->2494" + "default.handlebars->39->2499" ] }, { @@ -14333,7 +14339,7 @@ "zh-chs": "确认删除用户组“ {0} ”的成员身份?", "zh-cht": "確認刪除用戶群“ {0} ”的成員身份?", "xloc": [ - "default.handlebars->39->2651" + "default.handlebars->39->2656" ] }, { @@ -14461,8 +14467,8 @@ "zh-chs": "确认删除设备“ {0} ”的访问权限?", "zh-cht": "確認刪除裝置“ {0} ”的訪問權限?", "xloc": [ - "default.handlebars->39->2484", - "default.handlebars->39->2642" + "default.handlebars->39->2489", + "default.handlebars->39->2647" ] }, { @@ -14487,8 +14493,8 @@ "zh-chs": "确认删除设备组“ {0} ”的访问权限?", "zh-cht": "確認刪除裝置群“ {0} ”的訪問權限?", "xloc": [ - "default.handlebars->39->2486", - "default.handlebars->39->2655" + "default.handlebars->39->2491", + "default.handlebars->39->2660" ] }, { @@ -14513,7 +14519,7 @@ "zh-chs": "确认删除用户“ {0} ”的访问权限?", "zh-cht": "確認刪除用戶“ {0} ”的訪問權限?", "xloc": [ - "default.handlebars->39->2644" + "default.handlebars->39->2649" ] }, { @@ -14538,7 +14544,7 @@ "zh-chs": "确认删除用户组“ {0} ”的访问权限?", "zh-cht": "確認刪除用戶群“ {0} ”的訪問權限?", "xloc": [ - "default.handlebars->39->2647" + "default.handlebars->39->2652" ] }, { @@ -14563,8 +14569,8 @@ "zh-chs": "确认删除访问权限?", "zh-cht": "確認刪除訪問權限?", "xloc": [ - "default.handlebars->39->2645", - "default.handlebars->39->2648" + "default.handlebars->39->2650", + "default.handlebars->39->2653" ] }, { @@ -14637,7 +14643,7 @@ "zh-chs": "确认删除设备共享“{0}”?", "zh-cht": "確認刪除設備共享“{0}”?", "xloc": [ - "default.handlebars->39->2640" + "default.handlebars->39->2645" ] }, { @@ -15167,7 +15173,7 @@ "zh-chs": "已连接的英特尔®AMT", "zh-cht": "已連接的Intel® AMT", "xloc": [ - "default.handlebars->39->2802" + "default.handlebars->39->2807" ] }, { @@ -15192,7 +15198,7 @@ "zh-chs": "已连接的用户", "zh-cht": "已连接的用户", "xloc": [ - "default.handlebars->39->2807" + "default.handlebars->39->2812" ] }, { @@ -15406,7 +15412,7 @@ "zh-chs": "连接数量", "zh-cht": "連接數量", "xloc": [ - "default.handlebars->39->2833" + "default.handlebars->39->2838" ] }, { @@ -15458,7 +15464,7 @@ "zh-chs": "连接转发器", "zh-cht": "連接轉發器", "xloc": [ - "default.handlebars->39->2868" + "default.handlebars->39->2873" ] }, { @@ -15555,7 +15561,7 @@ "ru": "Согласие", "tr": "Onay", "xloc": [ - "default.handlebars->39->2276" + "default.handlebars->39->2281" ] }, { @@ -15687,7 +15693,7 @@ "zh-chs": "Cookie编码器", "zh-cht": "Cookie編碼器", "xloc": [ - "default.handlebars->39->2852" + "default.handlebars->39->2857" ] }, { @@ -16220,7 +16226,7 @@ "zh-chs": "核心服务器", "zh-cht": "核心伺服器", "xloc": [ - "default.handlebars->39->2851" + "default.handlebars->39->2856" ] }, { @@ -16291,7 +16297,7 @@ "zh-chs": "创建帐号", "zh-cht": "創建帳號", "xloc": [ - "default.handlebars->39->2392", + "default.handlebars->39->2397", "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->createpanel->1->1->9->1->12->1->1", "login.handlebars->container->column_l->centralTable->1->0->logincell->createpanel->1->9->1->12->1->1", "login2.handlebars->centralTable->1->0->logincell->createpanel->1->9->1->12->1->1" @@ -16390,7 +16396,7 @@ "zh-chs": "创建用户组", "zh-cht": "創建用戶群", "xloc": [ - "default.handlebars->39->2432" + "default.handlebars->39->2437" ] }, { @@ -16588,7 +16594,7 @@ "zh-chs": "通过导入以下格式的JSON档案一次创建多个帐户:", "zh-cht": "通過導入以下格式的JSON檔案一次創建多個帳戶:", "xloc": [ - "default.handlebars->39->2356" + "default.handlebars->39->2361" ] }, { @@ -16734,7 +16740,7 @@ "zh-chs": "创建", "zh-cht": "創建", "xloc": [ - "default.handlebars->39->2536" + "default.handlebars->39->2541" ] }, { @@ -17144,7 +17150,7 @@ "zh-chs": "当前密码不正确。", "xloc": [ "default-mobile.handlebars->11->721", - "default.handlebars->39->2776" + "default.handlebars->39->2781" ] }, { @@ -17419,7 +17425,7 @@ "xloc": [ "default-mobile.handlebars->11->375", "default.handlebars->39->1097", - "default.handlebars->39->2700" + "default.handlebars->39->2705" ] }, { @@ -17542,10 +17548,10 @@ "zh-chs": "默认", "zh-cht": "默認", "xloc": [ - "default.handlebars->39->2379", - "default.handlebars->39->2428", - "default.handlebars->39->2439", - "default.handlebars->39->2512" + "default.handlebars->39->2384", + "default.handlebars->39->2433", + "default.handlebars->39->2444", + "default.handlebars->39->2517" ] }, { @@ -17663,7 +17669,7 @@ "zh-chs": "删除帐户", "zh-cht": "刪除帳戶", "xloc": [ - "default.handlebars->39->2344" + "default.handlebars->39->2349" ] }, { @@ -17814,7 +17820,7 @@ "zh-chs": "删除用户", "zh-cht": "刪除用戶", "xloc": [ - "default.handlebars->39->2579" + "default.handlebars->39->2584" ] }, { @@ -17839,8 +17845,8 @@ "zh-chs": "删除用户群组", "zh-cht": "刪除用戶群組", "xloc": [ - "default.handlebars->39->2480", - "default.handlebars->39->2492" + "default.handlebars->39->2485", + "default.handlebars->39->2497" ] }, { @@ -17865,7 +17871,7 @@ "zh-chs": "删除用户群组", "zh-cht": "刪除用戶群組", "xloc": [ - "default.handlebars->39->2426" + "default.handlebars->39->2431" ] }, { @@ -17890,7 +17896,7 @@ "zh-chs": "删除用户{0}", "zh-cht": "刪除用戶{0}", "xloc": [ - "default.handlebars->39->2618" + "default.handlebars->39->2623" ] }, { @@ -17916,7 +17922,7 @@ "zh-cht": "刪除帳戶", "xloc": [ "default-mobile.handlebars->container->page_content->column_l->p3->p3info->3->p3AccountActions->p2AccountActions->3->9->0", - "default.handlebars->39->2340", + "default.handlebars->39->2345", "default.handlebars->container->column_l->p2->p2info->p2AccountActions->3->p2AccountPassActions->7" ] }, @@ -17967,7 +17973,7 @@ "zh-chs": "删除群组", "zh-cht": "刪除群組", "xloc": [ - "default.handlebars->39->2422" + "default.handlebars->39->2427" ] }, { @@ -18071,7 +18077,7 @@ "zh-chs": "删除用户群组{0}?", "zh-cht": "刪除用戶群組{0}?", "xloc": [ - "default.handlebars->39->2490" + "default.handlebars->39->2495" ] }, { @@ -18353,11 +18359,11 @@ "default.handlebars->39->1752", "default.handlebars->39->1807", "default.handlebars->39->1932", - "default.handlebars->39->2274", - "default.handlebars->39->2431", - "default.handlebars->39->2441", - "default.handlebars->39->2442", - "default.handlebars->39->2488", + "default.handlebars->39->2279", + "default.handlebars->39->2436", + "default.handlebars->39->2446", + "default.handlebars->39->2447", + "default.handlebars->39->2493", "default.handlebars->39->766", "default.handlebars->39->767", "default.handlebars->container->column_l->p42->p42tbl->1->0->3" @@ -18412,10 +18418,10 @@ "default.handlebars->39->1250", "default.handlebars->39->1869", "default.handlebars->39->1938", - "default.handlebars->39->2675", - "default.handlebars->39->2725", - "default.handlebars->39->2741", - "default.handlebars->39->2827", + "default.handlebars->39->2680", + "default.handlebars->39->2730", + "default.handlebars->39->2746", + "default.handlebars->39->2832", "default.handlebars->39->731", "default.handlebars->39->937", "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevDesktop", @@ -18547,7 +18553,7 @@ "tr": "Masaüstü Multiplex", "zh-chs": "桌面复用", "xloc": [ - "default.handlebars->39->2832" + "default.handlebars->39->2837" ] }, { @@ -18573,8 +18579,8 @@ "zh-cht": "桌面通知", "xloc": [ "default.handlebars->39->1825", - "default.handlebars->39->2449", - "default.handlebars->39->2551", + "default.handlebars->39->2454", + "default.handlebars->39->2556", "default.handlebars->39->828" ] }, @@ -18601,8 +18607,8 @@ "zh-cht": "桌面提示", "xloc": [ "default.handlebars->39->1824", - "default.handlebars->39->2448", - "default.handlebars->39->2550", + "default.handlebars->39->2453", + "default.handlebars->39->2555", "default.handlebars->39->827" ] }, @@ -18629,8 +18635,8 @@ "zh-cht": "桌面提示+工具欄", "xloc": [ "default.handlebars->39->1822", - "default.handlebars->39->2446", - "default.handlebars->39->2548", + "default.handlebars->39->2451", + "default.handlebars->39->2553", "default.handlebars->39->825" ] }, @@ -18655,7 +18661,7 @@ "tr": "Masaüstü Oturumu", "zh-chs": "桌面会话", "xloc": [ - "default.handlebars->39->2668" + "default.handlebars->39->2673" ] }, { @@ -18754,8 +18760,8 @@ "zh-cht": "桌面工具欄", "xloc": [ "default.handlebars->39->1823", - "default.handlebars->39->2447", - "default.handlebars->39->2549", + "default.handlebars->39->2452", + "default.handlebars->39->2554", "default.handlebars->39->826" ] }, @@ -18780,7 +18786,7 @@ "tr": "Yalnızca Masaüstü Görünümü", "zh-chs": "仅桌面视图", "xloc": [ - "default.handlebars->39->2524" + "default.handlebars->39->2529" ] }, { @@ -18963,9 +18969,9 @@ "default.handlebars->39->1479", "default.handlebars->39->1966", "default.handlebars->39->255", - "default.handlebars->39->2637", - "default.handlebars->39->2699", - "default.handlebars->39->2714", + "default.handlebars->39->2642", + "default.handlebars->39->2704", + "default.handlebars->39->2719", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSort->sortselect->5" ] }, @@ -19121,14 +19127,14 @@ "default.handlebars->39->1961", "default.handlebars->39->1964", "default.handlebars->39->1965", - "default.handlebars->39->2290", - "default.handlebars->39->2472", - "default.handlebars->39->2478", - "default.handlebars->39->2625", - "default.handlebars->39->2684", - "default.handlebars->39->2703", - "default.handlebars->39->2717", - "default.handlebars->39->2754" + "default.handlebars->39->2295", + "default.handlebars->39->2477", + "default.handlebars->39->2483", + "default.handlebars->39->2630", + "default.handlebars->39->2689", + "default.handlebars->39->2708", + "default.handlebars->39->2722", + "default.handlebars->39->2759" ] }, { @@ -19180,11 +19186,11 @@ "zh-cht": "裝置群", "xloc": [ "default-mobile.handlebars->container->page_content->column_l->p3->p3info->3->3", - "default.handlebars->39->2306", - "default.handlebars->39->2416", - "default.handlebars->39->2459", - "default.handlebars->39->2545", - "default.handlebars->39->2805", + "default.handlebars->39->2311", + "default.handlebars->39->2421", + "default.handlebars->39->2464", + "default.handlebars->39->2550", + "default.handlebars->39->2810", "default.handlebars->container->column_l->p2->p2info->9" ] }, @@ -19287,7 +19293,7 @@ "xloc": [ "default-mobile.handlebars->11->391", "default.handlebars->39->1163", - "default.handlebars->39->2683", + "default.handlebars->39->2688", "default.handlebars->39->430", "default.handlebars->39->439", "player.handlebars->3->25" @@ -19364,7 +19370,7 @@ "tr": "Cihaz İtme", "zh-chs": "设备推送", "xloc": [ - "default.handlebars->39->2564" + "default.handlebars->39->2569" ] }, { @@ -20358,8 +20364,8 @@ "zh-cht": "裝置", "xloc": [ "default.handlebars->39->1887", - "default.handlebars->39->2417", - "default.handlebars->39->2460" + "default.handlebars->39->2422", + "default.handlebars->39->2465" ] }, { @@ -20950,10 +20956,10 @@ "zh-cht": "域", "xloc": [ "default.handlebars->39->114", - "default.handlebars->39->2380", - "default.handlebars->39->2429", - "default.handlebars->39->2438", - "default.handlebars->39->2511", + "default.handlebars->39->2385", + "default.handlebars->39->2434", + "default.handlebars->39->2443", + "default.handlebars->39->2516", "mstsc.handlebars->main->1->3->1->rowdomain->1->0", "mstsc.handlebars->main->1->3->1->rowdomain->3" ] @@ -21394,7 +21400,7 @@ "zh-chs": "下载报告", "zh-cht": "下載報告", "xloc": [ - "default.handlebars->39->2295", + "default.handlebars->39->2300", "default.handlebars->container->column_l->p3->3->1->0->3", "default.handlebars->container->column_l->p60->3->1->0->3->1->p60downloadReportDiv" ] @@ -21694,7 +21700,7 @@ "zh-chs": "使用以下一种档案格式下载事件列表。", "zh-cht": "使用以下一種檔案格式下載事件列表。", "xloc": [ - "default.handlebars->39->2296" + "default.handlebars->39->2301" ] }, { @@ -21719,7 +21725,7 @@ "zh-chs": "使用以下一种档案格式下载用户列表。", "zh-cht": "使用以下一種檔案格式下載用戶列表。", "xloc": [ - "default.handlebars->39->2364" + "default.handlebars->39->2369" ] }, { @@ -21894,7 +21900,7 @@ "zh-chs": "代理重复", "zh-cht": "代理重複", "xloc": [ - "default.handlebars->39->2801" + "default.handlebars->39->2806" ] }, { @@ -21944,7 +21950,7 @@ "zh-chs": "复制用户组", "zh-cht": "複製用戶群", "xloc": [ - "default.handlebars->39->2433" + "default.handlebars->39->2438" ] }, { @@ -21994,8 +22000,8 @@ "default.handlebars->39->1055", "default.handlebars->39->261", "default.handlebars->39->263", - "default.handlebars->39->2663", - "default.handlebars->39->2689", + "default.handlebars->39->2668", + "default.handlebars->39->2694", "player.handlebars->3->18" ] }, @@ -22844,7 +22850,7 @@ "tr": "Kullanıcı Özelliklerini Düzenle", "zh-chs": "编辑用户特征", "xloc": [ - "default.handlebars->39->2601" + "default.handlebars->39->2606" ] }, { @@ -22869,7 +22875,7 @@ "zh-chs": "编辑用户组", "zh-cht": "編輯用戶群", "xloc": [ - "default.handlebars->39->2489" + "default.handlebars->39->2494" ] }, { @@ -22913,7 +22919,7 @@ "ru": "Редактировать функции групп пользователей", "tr": "Kullanıcı Grubu Özelliklerini Düzenle", "xloc": [ - "default.handlebars->39->2482" + "default.handlebars->39->2487" ] }, { @@ -23056,12 +23062,12 @@ "zh-cht": "電郵", "xloc": [ "default-mobile.handlebars->11->102", - "default.handlebars->39->2382", - "default.handlebars->39->2515", - "default.handlebars->39->2517", - "default.handlebars->39->2562", - "default.handlebars->39->2572", - "default.handlebars->39->2604", + "default.handlebars->39->2387", + "default.handlebars->39->2520", + "default.handlebars->39->2522", + "default.handlebars->39->2567", + "default.handlebars->39->2577", + "default.handlebars->39->2609", "default.handlebars->39->475", "login-mobile.handlebars->5->42", "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3", @@ -23310,7 +23316,7 @@ "zh-chs": "电邮未验证", "zh-cht": "電郵未驗證", "xloc": [ - "default.handlebars->39->2326" + "default.handlebars->39->2331" ] }, { @@ -23335,8 +23341,8 @@ "zh-chs": "电子邮件已验证", "zh-cht": "電子郵件已驗證", "xloc": [ - "default.handlebars->39->2327", - "default.handlebars->39->2509" + "default.handlebars->39->2332", + "default.handlebars->39->2514" ] }, { @@ -23361,7 +23367,7 @@ "zh-chs": "电邮已验证。", "zh-cht": "電郵已驗證。", "xloc": [ - "default.handlebars->39->2388" + "default.handlebars->39->2393" ] }, { @@ -23386,7 +23392,7 @@ "zh-chs": "电邮未验证", "zh-cht": "電郵未驗證", "xloc": [ - "default.handlebars->39->2510" + "default.handlebars->39->2515" ] }, { @@ -23433,7 +23439,7 @@ "zh-cht": "電郵已發送。", "xloc": [ "default-mobile.handlebars->11->714", - "default.handlebars->39->2769", + "default.handlebars->39->2774", "login-mobile.handlebars->5->2", "login.handlebars->5->2", "login2.handlebars->7->3" @@ -23509,7 +23515,7 @@ "zh-chs": "已通过电邮验证,并且需要重置密码。", "zh-cht": "已通過電郵驗證,並且需要重置密碼。", "xloc": [ - "default.handlebars->39->2389" + "default.handlebars->39->2394" ] }, { @@ -23555,7 +23561,7 @@ "tr": "E-posta/SMS/Push Trafiği", "zh-chs": "电子邮件/短信/推送流量", "xloc": [ - "default.handlebars->39->2860" + "default.handlebars->39->2865" ] }, { @@ -23713,7 +23719,7 @@ "zh-cht": "已啟用", "xloc": [ "default.handlebars->39->117", - "default.handlebars->39->2691" + "default.handlebars->39->2696" ] }, { @@ -23858,7 +23864,7 @@ "zh-chs": "时间结束", "zh-cht": "時間結束", "xloc": [ - "default.handlebars->39->2688" + "default.handlebars->39->2693" ] }, { @@ -24407,7 +24413,7 @@ "zh-chs": "输入管理领域名称的逗号分隔列表。", "zh-cht": "輸入管理領域名稱的逗號分隔列表。", "xloc": [ - "default.handlebars->39->2393" + "default.handlebars->39->2398" ] }, { @@ -24735,7 +24741,7 @@ "zh-chs": "错误,邀请码 \\\"{0}\\\" 已被使用。", "xloc": [ "default-mobile.handlebars->11->722", - "default.handlebars->39->2777" + "default.handlebars->39->2782" ] }, { @@ -24760,7 +24766,7 @@ "zh-chs": "错误,密码未更改。", "xloc": [ "default-mobile.handlebars->11->719", - "default.handlebars->39->2774" + "default.handlebars->39->2779" ] }, { @@ -24785,7 +24791,7 @@ "zh-chs": "错误,无法更改为常用密码。", "xloc": [ "default-mobile.handlebars->11->718", - "default.handlebars->39->2773" + "default.handlebars->39->2778" ] }, { @@ -24810,7 +24816,7 @@ "zh-chs": "错误,无法更改为以前使用的密码。", "xloc": [ "default-mobile.handlebars->11->717", - "default.handlebars->39->2772" + "default.handlebars->39->2777" ] }, { @@ -25002,7 +25008,7 @@ "zh-chs": "事件列表输出", "zh-cht": "事件列表輸出", "xloc": [ - "default.handlebars->39->2301" + "default.handlebars->39->2306" ] }, { @@ -25335,7 +25341,7 @@ "zh-chs": "外部", "zh-cht": "外部", "xloc": [ - "default.handlebars->39->2840" + "default.handlebars->39->2845" ] }, { @@ -25460,7 +25466,7 @@ "zh-chs": "无法更改电子邮件地址,另一个帐户已在使用:{0}。", "xloc": [ "default-mobile.handlebars->11->713", - "default.handlebars->39->2768" + "default.handlebars->39->2773" ] }, { @@ -25682,8 +25688,8 @@ "zh-cht": "功能", "xloc": [ "default.handlebars->39->1821", - "default.handlebars->39->2445", - "default.handlebars->39->2533" + "default.handlebars->39->2450", + "default.handlebars->39->2538" ] }, { @@ -25860,7 +25866,7 @@ "tr": "Dosya transferi", "zh-chs": "文件传输", "xloc": [ - "default.handlebars->39->2669" + "default.handlebars->39->2674" ] }, { @@ -25915,10 +25921,10 @@ "default.handlebars->39->1023", "default.handlebars->39->1871", "default.handlebars->39->1945", - "default.handlebars->39->2676", - "default.handlebars->39->2726", - "default.handlebars->39->2742", - "default.handlebars->39->2828", + "default.handlebars->39->2681", + "default.handlebars->39->2731", + "default.handlebars->39->2747", + "default.handlebars->39->2833", "default.handlebars->39->396", "default.handlebars->39->939", "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevFiles", @@ -25974,8 +25980,8 @@ "zh-cht": "檔案通知", "xloc": [ "default.handlebars->39->1829", - "default.handlebars->39->2453", - "default.handlebars->39->2555", + "default.handlebars->39->2458", + "default.handlebars->39->2560", "default.handlebars->39->832" ] }, @@ -26002,8 +26008,8 @@ "zh-cht": "檔案提示", "xloc": [ "default.handlebars->39->1828", - "default.handlebars->39->2452", - "default.handlebars->39->2554", + "default.handlebars->39->2457", + "default.handlebars->39->2559", "default.handlebars->39->831" ] }, @@ -26107,6 +26113,12 @@ "sharing.handlebars->11->54" ] }, + { + "en": "Finished recording session \\\"{0}\\\", {1} second(s)", + "xloc": [ + "default.handlebars->39->2276" + ] + }, { "cs": "Dokončení relace nahrávání, {0} s", "da": "Afsluttede optagelsessession, {0} sekund(er)", @@ -26254,7 +26266,7 @@ "ru": "Флаги", "tr": "Bayraklar", "xloc": [ - "default.handlebars->39->2275" + "default.handlebars->39->2280" ] }, { @@ -26528,8 +26540,8 @@ "zh-chs": "下次登录时强制重置密码。", "zh-cht": "下次登入時強制重置密碼。", "xloc": [ - "default.handlebars->39->2387", - "default.handlebars->39->2615" + "default.handlebars->39->2392", + "default.handlebars->39->2620" ] }, { @@ -26708,7 +26720,7 @@ "zh-chs": "格式化", "zh-cht": "格式化", "xloc": [ - "default.handlebars->39->2292" + "default.handlebars->39->2297" ] }, { @@ -26781,8 +26793,8 @@ "zh-chs": "自由", "zh-cht": "自由", "xloc": [ - "default.handlebars->39->2786", - "default.handlebars->39->2788" + "default.handlebars->39->2791", + "default.handlebars->39->2793" ] }, { @@ -27064,7 +27076,7 @@ "default-mobile.handlebars->11->664", "default.handlebars->39->1767", "default.handlebars->39->1969", - "default.handlebars->39->2399" + "default.handlebars->39->2404" ] }, { @@ -27239,7 +27251,7 @@ "zh-chs": "完整管理员", "zh-cht": "完整管理員", "xloc": [ - "default.handlebars->39->2503" + "default.handlebars->39->2508" ] }, { @@ -27516,7 +27528,7 @@ "ru": "Создать отчет", "tr": "Rapor oluştur", "xloc": [ - "default.handlebars->39->2712" + "default.handlebars->39->2717" ] }, { @@ -28089,7 +28101,7 @@ "zh-cht": "群", "xloc": [ "default-mobile.handlebars->11->264", - "default.handlebars->39->2723", + "default.handlebars->39->2728", "default.handlebars->39->758", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSort->sortselect->1" ] @@ -28116,8 +28128,8 @@ "zh-chs": "集体指令", "zh-cht": "集體指令", "xloc": [ - "default.handlebars->39->2341", - "default.handlebars->39->2423", + "default.handlebars->39->2346", + "default.handlebars->39->2428", "default.handlebars->39->635", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->devListToolbar", "default.handlebars->container->column_l->p4->3->1->0->3->3", @@ -28146,7 +28158,7 @@ "zh-chs": "通过...分组", "zh-cht": "通過...分群", "xloc": [ - "default.handlebars->39->2288" + "default.handlebars->39->2293" ] }, { @@ -28172,7 +28184,7 @@ "zh-cht": "群標識符", "xloc": [ "agent-translations.json", - "default.handlebars->39->2440" + "default.handlebars->39->2445" ] }, { @@ -28197,7 +28209,7 @@ "zh-chs": "群组成员", "zh-cht": "群組成員", "xloc": [ - "default.handlebars->39->2464" + "default.handlebars->39->2469" ] }, { @@ -28222,7 +28234,7 @@ "zh-chs": "通过...分组", "zh-cht": "通過...分群", "xloc": [ - "default.handlebars->39->2701" + "default.handlebars->39->2706" ] }, { @@ -28240,7 +28252,7 @@ "ru": "Название группы", "tr": "Grup ismi", "xloc": [ - "default.handlebars->39->2273" + "default.handlebars->39->2278" ] }, { @@ -28384,7 +28396,7 @@ "ru": "Гость", "tr": "Misafir", "xloc": [ - "default.handlebars->39->2718" + "default.handlebars->39->2723" ] }, { @@ -28508,7 +28520,7 @@ "tr": "HTTP", "zh-chs": "HTTP", "xloc": [ - "default.handlebars->39->2824" + "default.handlebars->39->2829" ] }, { @@ -28682,7 +28694,7 @@ "zh-chs": "堆总数", "zh-cht": "堆總數", "xloc": [ - "default.handlebars->39->2842" + "default.handlebars->39->2847" ] }, { @@ -28707,7 +28719,7 @@ "zh-chs": "堆使用", "zh-cht": "堆使用", "xloc": [ - "default.handlebars->39->2841" + "default.handlebars->39->2846" ] }, { @@ -30712,7 +30724,7 @@ "zh-chs": "英特尔AMT", "zh-cht": "英特爾AMT", "xloc": [ - "default.handlebars->39->2838" + "default.handlebars->39->2843" ] }, { @@ -30793,7 +30805,7 @@ "tr": "Intel AMT yöneticisi", "zh-chs": "英特尔 AMT 经理", "xloc": [ - "default.handlebars->39->2867" + "default.handlebars->39->2872" ] }, { @@ -30870,7 +30882,7 @@ "default.handlebars->39->1849", "default.handlebars->39->2064", "default.handlebars->39->2077", - "default.handlebars->39->2866", + "default.handlebars->39->2871", "default.handlebars->39->733", "default.handlebars->39->800", "default.handlebars->39->839", @@ -31227,8 +31239,8 @@ "zh-chs": "英特尔®AMT重定向", "zh-cht": "Intel® AMT重定向", "xloc": [ - "default.handlebars->39->2671", - "default.handlebars->39->2678", + "default.handlebars->39->2676", + "default.handlebars->39->2683", "player.handlebars->3->30" ] }, @@ -31304,8 +31316,8 @@ "zh-chs": "英特尔®AMT WSMAN", "zh-cht": "Intle® AMT WSMAN", "xloc": [ - "default.handlebars->39->2670", - "default.handlebars->39->2677", + "default.handlebars->39->2675", + "default.handlebars->39->2682", "player.handlebars->3->29" ] }, @@ -32224,7 +32236,7 @@ "zh-chs": "无效的设备组类型", "zh-cht": "無效的裝置群類型", "xloc": [ - "default.handlebars->39->2800" + "default.handlebars->39->2805" ] }, { @@ -32249,7 +32261,7 @@ "zh-chs": "无效的JSON", "zh-cht": "無效的JSON", "xloc": [ - "default.handlebars->39->2794" + "default.handlebars->39->2799" ] }, { @@ -32275,8 +32287,8 @@ "zh-cht": "無效的JSON檔案格式。", "xloc": [ "default.handlebars->39->1897", - "default.handlebars->39->2361", - "default.handlebars->39->2363" + "default.handlebars->39->2366", + "default.handlebars->39->2368" ] }, { @@ -32302,7 +32314,7 @@ "zh-cht": "無效的JSON檔案:{0}。", "xloc": [ "default.handlebars->39->1893", - "default.handlebars->39->2359" + "default.handlebars->39->2364" ] }, { @@ -32403,7 +32415,7 @@ "zh-chs": "无效的PKCS签名", "zh-cht": "無效的PKCS簽名", "xloc": [ - "default.handlebars->39->2792" + "default.handlebars->39->2797" ] }, { @@ -32428,7 +32440,7 @@ "zh-chs": "無效的RSA密碼", "zh-cht": "無效的RSA密碼", "xloc": [ - "default.handlebars->39->2793" + "default.handlebars->39->2798" ] }, { @@ -32453,7 +32465,7 @@ "zh-chs": "无效的短信", "xloc": [ "default-mobile.handlebars->11->725", - "default.handlebars->39->2780" + "default.handlebars->39->2785" ] }, { @@ -32524,7 +32536,7 @@ "zh-chs": "无效域", "xloc": [ "default-mobile.handlebars->11->705", - "default.handlebars->39->2760" + "default.handlebars->39->2765" ] }, { @@ -32570,7 +32582,7 @@ "zh-chs": "不合规电邮", "xloc": [ "default-mobile.handlebars->11->704", - "default.handlebars->39->2759" + "default.handlebars->39->2764" ] }, { @@ -32674,7 +32686,7 @@ "xloc": [ "default-mobile.handlebars->11->703", "default-mobile.handlebars->11->78", - "default.handlebars->39->2758", + "default.handlebars->39->2763", "default.handlebars->39->298" ] }, @@ -32700,7 +32712,7 @@ "zh-chs": "网站权限无效", "xloc": [ "default-mobile.handlebars->11->706", - "default.handlebars->39->2761" + "default.handlebars->39->2766" ] }, { @@ -32776,7 +32788,7 @@ "zh-chs": "无效的用户名", "xloc": [ "default-mobile.handlebars->11->702", - "default.handlebars->39->2757" + "default.handlebars->39->2762" ] }, { @@ -32822,7 +32834,7 @@ "zh-chs": "使电邮无效", "zh-cht": "使電郵無效", "xloc": [ - "default.handlebars->39->2335" + "default.handlebars->39->2340" ] }, { @@ -33002,7 +33014,7 @@ "default.handlebars->39->2046", "default.handlebars->39->2048", "default.handlebars->39->2053", - "default.handlebars->39->2755" + "default.handlebars->39->2760" ] }, { @@ -33020,7 +33032,7 @@ "ru": "Код приглашения", "tr": "Davet kodu", "xloc": [ - "default.handlebars->39->2278" + "default.handlebars->39->2283" ] }, { @@ -33217,7 +33229,7 @@ "zh-chs": "JSON", "zh-cht": "JSON", "xloc": [ - "default.handlebars->39->2294" + "default.handlebars->39->2299" ] }, { @@ -33242,8 +33254,8 @@ "zh-chs": "JSON格式", "zh-cht": "JSON格式", "xloc": [ - "default.handlebars->39->2299", - "default.handlebars->39->2367", + "default.handlebars->39->2304", + "default.handlebars->39->2372", "default.handlebars->39->680" ] }, @@ -33297,6 +33309,12 @@ "default.handlebars->39->2134" ] }, + { + "en": "Joined desktop multiplex session \\\"{0}\\\"", + "xloc": [ + "default.handlebars->39->2273" + ] + }, { "cs": "kannadština", "da": "Canada", @@ -34099,7 +34117,7 @@ "zh-chs": "过去30天", "zh-cht": "過去30天", "xloc": [ - "default.handlebars->39->2706", + "default.handlebars->39->2711", "default.handlebars->container->column_l->p40->3->1->p40time->9" ] }, @@ -34174,7 +34192,7 @@ "ru": "Последние 7 дней", "tr": "Son 7 gün", "xloc": [ - "default.handlebars->39->2705" + "default.handlebars->39->2710" ] }, { @@ -34224,7 +34242,7 @@ "zh-chs": "最后访问", "zh-cht": "最後訪問", "xloc": [ - "default.handlebars->39->2307" + "default.handlebars->39->2312" ] }, { @@ -34243,7 +34261,7 @@ "ru": "Последний день", "tr": "Son gun", "xloc": [ - "default.handlebars->39->2704" + "default.handlebars->39->2709" ] }, { @@ -34268,7 +34286,7 @@ "zh-chs": "上次登录", "zh-cht": "上次登入", "xloc": [ - "default.handlebars->39->2537" + "default.handlebars->39->2542" ] }, { @@ -34313,7 +34331,7 @@ "ru": "Последний доступ: {0}", "tr": "Son erişim: {0}", "xloc": [ - "default.handlebars->39->2317" + "default.handlebars->39->2322" ] }, { @@ -34400,7 +34418,7 @@ "zh-chs": "上次更改:{0}", "zh-cht": "上次更改:{0}", "xloc": [ - "default.handlebars->39->2541" + "default.handlebars->39->2546" ] }, { @@ -34475,7 +34493,7 @@ "zh-chs": "上次登录:{0}", "zh-cht": "上次登入:{0}", "xloc": [ - "default.handlebars->39->2318" + "default.handlebars->39->2323" ] }, { @@ -34792,7 +34810,7 @@ "zh-chs": "如没有请留空。", "zh-cht": "如沒有請留空。", "xloc": [ - "default.handlebars->39->2587" + "default.handlebars->39->2592" ] }, { @@ -34951,6 +34969,12 @@ "default.handlebars->39->2135" ] }, + { + "en": "Left the desktop multiplex session \\\"{0}\\\" after {1} second(s).", + "xloc": [ + "default.handlebars->39->2274" + ] + }, { "cs": "Po {0} sekundách jste opustili relaci multiplexu na ploše.", "da": "Forlod desktop-multiplekssessionen efter {0} sekund(er).", @@ -34986,7 +35010,7 @@ "ru": "Продолжительность", "tr": "Uzunluk", "xloc": [ - "default.handlebars->39->2719" + "default.handlebars->39->2724" ] }, { @@ -35011,7 +35035,7 @@ "zh-chs": "减", "zh-cht": "減", "xloc": [ - "default.handlebars->39->2888" + "default.handlebars->39->2893" ] }, { @@ -35905,8 +35929,8 @@ "default.handlebars->39->1471", "default.handlebars->39->1793", "default.handlebars->39->1797", - "default.handlebars->39->2610", - "default.handlebars->39->2659" + "default.handlebars->39->2615", + "default.handlebars->39->2664" ] }, { @@ -36202,7 +36226,7 @@ "zh-chs": "锁定账户", "zh-cht": "鎖定賬戶", "xloc": [ - "default.handlebars->39->2407" + "default.handlebars->39->2412" ] }, { @@ -36227,7 +36251,7 @@ "zh-chs": "锁定帐户设置", "zh-cht": "鎖定帳戶設置", "xloc": [ - "default.handlebars->39->2411" + "default.handlebars->39->2416" ] }, { @@ -36276,7 +36300,7 @@ "zh-chs": "锁定账户", "zh-cht": "鎖定賬戶", "xloc": [ - "default.handlebars->39->2338" + "default.handlebars->39->2343" ] }, { @@ -36393,7 +36417,7 @@ "zh-chs": "已锁定", "zh-cht": "已鎖定", "xloc": [ - "default.handlebars->39->2319" + "default.handlebars->39->2324" ] }, { @@ -36419,7 +36443,7 @@ "zh-cht": "被鎖定賬戶", "xloc": [ "default-mobile.handlebars->11->77", - "default.handlebars->39->2500", + "default.handlebars->39->2505", "default.handlebars->39->297" ] }, @@ -37373,7 +37397,7 @@ "zh-chs": "主服务器信息", "zh-cht": "主伺服器訊息", "xloc": [ - "default.handlebars->39->2854" + "default.handlebars->39->2859" ] }, { @@ -37605,7 +37629,7 @@ "zh-chs": "管理录音", "zh-cht": "管理錄音", "xloc": [ - "default.handlebars->39->2405" + "default.handlebars->39->2410" ] }, { @@ -37655,7 +37679,7 @@ "zh-chs": "管理用户组", "zh-cht": "管理用戶群", "xloc": [ - "default.handlebars->39->2404" + "default.handlebars->39->2409" ] }, { @@ -37680,7 +37704,7 @@ "zh-chs": "管理用户", "zh-cht": "管理用戶", "xloc": [ - "default.handlebars->39->2403", + "default.handlebars->39->2408", "default.handlebars->39->986" ] }, @@ -37912,7 +37936,7 @@ "zh-chs": "经理", "zh-cht": "經理", "xloc": [ - "default.handlebars->39->2324" + "default.handlebars->39->2329" ] }, { @@ -38099,7 +38123,7 @@ "zh-chs": "达到连接数量上限", "zh-cht": "達到連接數量上限", "xloc": [ - "default.handlebars->39->2798" + "default.handlebars->39->2803" ] }, { @@ -38185,8 +38209,8 @@ "zh-chs": "Megabyte", "zh-cht": "Megabyte", "xloc": [ - "default.handlebars->39->2839", - "default.handlebars->39->2844" + "default.handlebars->39->2844", + "default.handlebars->39->2849" ] }, { @@ -38213,7 +38237,7 @@ "xloc": [ "default-mobile.handlebars->11->590", "default.handlebars->39->1432", - "default.handlebars->39->2818", + "default.handlebars->39->2823", "default.handlebars->container->column_l->p40->3->1->p40type->3" ] }, @@ -38455,7 +38479,7 @@ "zh-chs": "MeshAgent流量", "zh-cht": "MeshAgent流量", "xloc": [ - "default.handlebars->39->2856" + "default.handlebars->39->2861" ] }, { @@ -38480,7 +38504,7 @@ "zh-chs": "MeshAgent更新", "zh-cht": "MeshAgent更新", "xloc": [ - "default.handlebars->39->2857" + "default.handlebars->39->2862" ] }, { @@ -38900,7 +38924,7 @@ "zh-chs": "MeshCentral服务器同级化", "zh-cht": "MeshCentral伺服器同級化", "xloc": [ - "default.handlebars->39->2855" + "default.handlebars->39->2860" ] }, { @@ -39372,7 +39396,7 @@ "zh-chs": "消息调度器", "zh-cht": "電郵調度器", "xloc": [ - "default.handlebars->39->2853" + "default.handlebars->39->2858" ] }, { @@ -39446,8 +39470,8 @@ "tr": "haberci", "zh-chs": "信使", "xloc": [ - "default.handlebars->39->2672", - "default.handlebars->39->2729" + "default.handlebars->39->2677", + "default.handlebars->39->2734" ] }, { @@ -39715,7 +39739,7 @@ "zh-chs": "更多", "zh-cht": "更多", "xloc": [ - "default.handlebars->39->2887" + "default.handlebars->39->2892" ] }, { @@ -39937,7 +39961,7 @@ "zh-chs": "多路复用器", "zh-cht": "多工器", "xloc": [ - "default.handlebars->39->2690" + "default.handlebars->39->2695" ] }, { @@ -40465,12 +40489,12 @@ "default.handlebars->39->1776", "default.handlebars->39->1806", "default.handlebars->39->1931", - "default.handlebars->39->2305", - "default.handlebars->39->2414", - "default.handlebars->39->2430", - "default.handlebars->39->2437", - "default.handlebars->39->2487", - "default.handlebars->39->2506", + "default.handlebars->39->2310", + "default.handlebars->39->2419", + "default.handlebars->39->2435", + "default.handlebars->39->2442", + "default.handlebars->39->2492", + "default.handlebars->39->2511", "default.handlebars->39->302", "default.handlebars->39->756", "default.handlebars->container->column_l->p11->deskarea0->deskarea3x->DeskTools->deskToolsArea->DeskToolsProcessTab->deskToolsHeader->3", @@ -40525,7 +40549,7 @@ "zh-chs": "名称1,名称2,名称3", "zh-cht": "名稱1,名稱2,名稱3", "xloc": [ - "default.handlebars->39->2395" + "default.handlebars->39->2400" ] }, { @@ -40751,7 +40775,7 @@ "zh-chs": "新账户", "xloc": [ "default-mobile.handlebars->11->695", - "default.handlebars->39->2750" + "default.handlebars->39->2755" ] }, { @@ -41151,7 +41175,7 @@ "tr": "Aracı Konsolu Yok", "zh-chs": "无座席控制台", "xloc": [ - "default.handlebars->39->2596" + "default.handlebars->39->2601" ] }, { @@ -41175,7 +41199,7 @@ "tr": "Konsol Yok", "zh-chs": "没有控制台", "xloc": [ - "default.handlebars->39->2527" + "default.handlebars->39->2532" ] }, { @@ -41229,7 +41253,7 @@ "zh-cht": "沒有桌面", "xloc": [ "default.handlebars->39->2017", - "default.handlebars->39->2523", + "default.handlebars->39->2528", "default.handlebars->39->971", "default.handlebars->39->993" ] @@ -41257,7 +41281,7 @@ "zh-cht": "不能訪問桌面", "xloc": [ "default.handlebars->39->1977", - "default.handlebars->39->2592" + "default.handlebars->39->2597" ] }, { @@ -41304,8 +41328,8 @@ "zh-cht": "找不到事件", "xloc": [ "default.handlebars->39->1351", - "default.handlebars->39->2281", - "default.handlebars->39->2658" + "default.handlebars->39->2286", + "default.handlebars->39->2663" ] }, { @@ -41332,7 +41356,7 @@ "xloc": [ "default-mobile.handlebars->11->652", "default.handlebars->39->1979", - "default.handlebars->39->2595" + "default.handlebars->39->2600" ] }, { @@ -41359,7 +41383,7 @@ "xloc": [ "default-mobile.handlebars->11->675", "default.handlebars->39->2019", - "default.handlebars->39->2526", + "default.handlebars->39->2531", "default.handlebars->39->968", "default.handlebars->39->990" ] @@ -41536,7 +41560,7 @@ "zh-chs": "没有成员", "zh-cht": "沒有成員", "xloc": [ - "default.handlebars->39->2467" + "default.handlebars->39->2472" ] }, { @@ -41561,7 +41585,7 @@ "zh-chs": "没有新的设备组", "zh-cht": "沒有新的裝置群", "xloc": [ - "default.handlebars->39->2408" + "default.handlebars->39->2413" ] }, { @@ -41580,7 +41604,7 @@ "ru": "Запретить добавление новых устройств", "tr": "Yeni Cihaz Yok", "xloc": [ - "default.handlebars->39->2409" + "default.handlebars->39->2414" ] }, { @@ -41647,8 +41671,8 @@ "ru": "Нет доступа к выполнению команд", "tr": "Uzaktan Komut Yok", "xloc": [ - "default.handlebars->39->2529", - "default.handlebars->39->2598" + "default.handlebars->39->2534", + "default.handlebars->39->2603" ] }, { @@ -41668,8 +41692,8 @@ "ru": "Нет доступа к удаленному управлению", "tr": "Uzaktan Kumanda Yok", "xloc": [ - "default.handlebars->39->2522", - "default.handlebars->39->2591" + "default.handlebars->39->2527", + "default.handlebars->39->2596" ] }, { @@ -41689,8 +41713,8 @@ "ru": "Нет доступа к перезагрузке/выключению", "tr": "Sıfırlama/Kapatma Yok", "xloc": [ - "default.handlebars->39->2531", - "default.handlebars->39->2600" + "default.handlebars->39->2536", + "default.handlebars->39->2605" ] }, { @@ -41796,7 +41820,7 @@ "xloc": [ "default-mobile.handlebars->11->674", "default.handlebars->39->2018", - "default.handlebars->39->2525", + "default.handlebars->39->2530", "default.handlebars->39->967", "default.handlebars->39->989" ] @@ -41825,7 +41849,7 @@ "xloc": [ "default-mobile.handlebars->11->651", "default.handlebars->39->1978", - "default.handlebars->39->2594" + "default.handlebars->39->2599" ] }, { @@ -41850,7 +41874,7 @@ "zh-chs": "没有工具(MeshCmd /路由器)", "zh-cht": "沒有工具(MeshCmd /路由器)", "xloc": [ - "default.handlebars->39->2410" + "default.handlebars->39->2415" ] }, { @@ -41870,8 +41894,8 @@ "ru": "Нет доступа к удалению", "tr": "Kaldırma Yok", "xloc": [ - "default.handlebars->39->2528", - "default.handlebars->39->2597" + "default.handlebars->39->2533", + "default.handlebars->39->2602" ] }, { @@ -41891,8 +41915,8 @@ "ru": "Нет доступа к пробуждению", "tr": "Uyanmak yok", "xloc": [ - "default.handlebars->39->2530", - "default.handlebars->39->2599" + "default.handlebars->39->2535", + "default.handlebars->39->2604" ] }, { @@ -41989,8 +42013,8 @@ "zh-chs": "没有共同的设备组", "zh-cht": "沒有共同的裝置群", "xloc": [ - "default.handlebars->39->2473", - "default.handlebars->39->2626" + "default.handlebars->39->2478", + "default.handlebars->39->2631" ] }, { @@ -42140,8 +42164,8 @@ "zh-chs": "没有共同的设备", "zh-cht": "沒有共同的裝置", "xloc": [ - "default.handlebars->39->2479", - "default.handlebars->39->2638" + "default.handlebars->39->2484", + "default.handlebars->39->2643" ] }, { @@ -42319,7 +42343,7 @@ "zh-chs": "找不到群组。", "zh-cht": "找不到群組。", "xloc": [ - "default.handlebars->39->2413" + "default.handlebars->39->2418" ] }, { @@ -42562,7 +42586,7 @@ "zh-chs": "此用户没有电话号码", "xloc": [ "default-mobile.handlebars->11->726", - "default.handlebars->39->2781" + "default.handlebars->39->2786" ] }, { @@ -42612,7 +42636,7 @@ "zh-chs": "没有录音。", "zh-cht": "沒有錄音。", "xloc": [ - "default.handlebars->39->2660" + "default.handlebars->39->2665" ] }, { @@ -42658,7 +42682,7 @@ "zh-chs": "没有服务器权限", "zh-cht": "沒有伺服器權限", "xloc": [ - "default.handlebars->39->2501" + "default.handlebars->39->2506" ] }, { @@ -42704,7 +42728,7 @@ "zh-chs": "没有用户组成员身份", "zh-cht": "沒有用戶群成員身份", "xloc": [ - "default.handlebars->39->2632" + "default.handlebars->39->2637" ] }, { @@ -42729,7 +42753,7 @@ "zh-chs": "无用户管理权限", "xloc": [ "default-mobile.handlebars->11->724", - "default.handlebars->39->2779" + "default.handlebars->39->2784" ] }, { @@ -42754,7 +42778,7 @@ "zh-chs": "未找到相应的用户。", "zh-cht": "未找到相應的用戶。", "xloc": [ - "default.handlebars->39->2313" + "default.handlebars->39->2318" ] }, { @@ -42900,17 +42924,17 @@ "default.handlebars->39->2071", "default.handlebars->39->2096", "default.handlebars->39->2101", - "default.handlebars->39->2289", - "default.handlebars->39->2434", - "default.handlebars->39->2436", - "default.handlebars->39->2444", - "default.handlebars->39->2456", + "default.handlebars->39->2294", + "default.handlebars->39->2439", + "default.handlebars->39->2441", + "default.handlebars->39->2449", "default.handlebars->39->246", - "default.handlebars->39->2520", - "default.handlebars->39->2532", - "default.handlebars->39->2542", - "default.handlebars->39->2546", - "default.handlebars->39->2558", + "default.handlebars->39->2461", + "default.handlebars->39->2525", + "default.handlebars->39->2537", + "default.handlebars->39->2547", + "default.handlebars->39->2551", + "default.handlebars->39->2563", "default.handlebars->39->274", "default.handlebars->39->355", "default.handlebars->39->356", @@ -43222,7 +43246,7 @@ "zh-chs": "不在服务器上", "zh-cht": "不在伺服器上", "xloc": [ - "default.handlebars->39->2682" + "default.handlebars->39->2687" ] }, { @@ -43247,8 +43271,8 @@ "zh-chs": "没有设置", "zh-cht": "沒有設置", "xloc": [ - "default.handlebars->39->2507", - "default.handlebars->39->2508" + "default.handlebars->39->2512", + "default.handlebars->39->2513" ] }, { @@ -43273,7 +43297,7 @@ "zh-chs": "未经审核的", "zh-cht": "未經審核的", "xloc": [ - "default.handlebars->39->2606" + "default.handlebars->39->2611" ] }, { @@ -43303,7 +43327,7 @@ "default-mobile.handlebars->11->626", "default.handlebars->39->1009", "default.handlebars->39->1850", - "default.handlebars->39->2568", + "default.handlebars->39->2573", "default.handlebars->39->867", "default.handlebars->39->977", "default.handlebars->39->999" @@ -43478,7 +43502,7 @@ "zh-chs": "通知", "zh-cht": "通知", "xloc": [ - "default.handlebars->39->2574", + "default.handlebars->39->2579", "default.handlebars->39->271" ] }, @@ -43556,7 +43580,7 @@ "zh-chs": "通知{0}", "zh-cht": "通知{0}", "xloc": [ - "default.handlebars->39->2353" + "default.handlebars->39->2358" ] }, { @@ -43580,7 +43604,7 @@ "tr": "Boş", "zh-chs": "空值", "xloc": [ - "default.handlebars->39->2847" + "default.handlebars->39->2852" ] }, { @@ -43749,7 +43773,7 @@ "zh-cht": "發生在{0}", "xloc": [ "default-mobile.handlebars->11->692", - "default.handlebars->39->2747" + "default.handlebars->39->2752" ] }, { @@ -43820,7 +43844,7 @@ "zh-chs": "离线用户", "zh-cht": "離線用戶", "xloc": [ - "default.handlebars->39->2310" + "default.handlebars->39->2315" ] }, { @@ -43896,7 +43920,7 @@ "zh-chs": "一天", "zh-cht": "一天", "xloc": [ - "default.handlebars->39->2286" + "default.handlebars->39->2291" ] }, { @@ -43974,7 +43998,7 @@ "zh-chs": "在线用户", "zh-cht": "在線用戶", "xloc": [ - "default.handlebars->39->2309" + "default.handlebars->39->2314" ] }, { @@ -43998,7 +44022,7 @@ "tr": "Yalnızca ilk 100 kullanıcıyı göster", "zh-chs": "只显示前 100 个用户", "xloc": [ - "default.handlebars->39->2354" + "default.handlebars->39->2359" ] }, { @@ -44413,8 +44437,8 @@ "xloc": [ "default-mobile.handlebars->11->362", "default.handlebars->39->1078", - "default.handlebars->39->2337", - "default.handlebars->39->2421", + "default.handlebars->39->2342", + "default.handlebars->39->2426", "default.handlebars->39->634", "default.handlebars->39->653" ] @@ -44898,7 +44922,7 @@ "zh-chs": "部分的", "zh-cht": "部分的", "xloc": [ - "default.handlebars->39->2325" + "default.handlebars->39->2330" ] }, { @@ -44994,7 +45018,7 @@ "zh-chs": "部分权限", "zh-cht": "部分權限", "xloc": [ - "default.handlebars->39->2504" + "default.handlebars->39->2509" ] }, { @@ -45052,12 +45076,12 @@ "default.handlebars->39->1290", "default.handlebars->39->1758", "default.handlebars->39->1906", - "default.handlebars->39->2383", - "default.handlebars->39->2384", - "default.handlebars->39->2538", - "default.handlebars->39->2540", - "default.handlebars->39->2611", - "default.handlebars->39->2612", + "default.handlebars->39->2388", + "default.handlebars->39->2389", + "default.handlebars->39->2543", + "default.handlebars->39->2545", + "default.handlebars->39->2616", + "default.handlebars->39->2617", "default.handlebars->39->306", "default.handlebars->39->444", "login2.handlebars->centralTable->1->0->logincell->loginpanel->1->loginuserpassdiv->1->1->2->1", @@ -45205,7 +45229,7 @@ "zh-chs": "密码已更改。", "xloc": [ "default-mobile.handlebars->11->720", - "default.handlebars->39->2775" + "default.handlebars->39->2780" ] }, { @@ -45256,7 +45280,7 @@ "zh-chs": "密码提示", "zh-cht": "密碼提示", "xloc": [ - "default.handlebars->39->2613" + "default.handlebars->39->2618" ] }, { @@ -46006,7 +46030,7 @@ "zh-chs": "没有权限", "xloc": [ "default-mobile.handlebars->11->701", - "default.handlebars->39->2756" + "default.handlebars->39->2761" ] }, { @@ -46033,7 +46057,7 @@ "xloc": [ "default-mobile.handlebars->11->686", "default.handlebars->39->2032", - "default.handlebars->39->2308" + "default.handlebars->39->2313" ] }, { @@ -46137,7 +46161,7 @@ "default.handlebars->39->1463", "default.handlebars->39->1466", "default.handlebars->39->229", - "default.handlebars->39->2589" + "default.handlebars->39->2594" ] }, { @@ -46162,7 +46186,7 @@ "zh-chs": "电话号码", "zh-cht": "電話號碼", "xloc": [ - "default.handlebars->39->2519" + "default.handlebars->39->2524" ] }, { @@ -46189,7 +46213,7 @@ "xloc": [ "default-mobile.handlebars->11->90", "default.handlebars->39->1465", - "default.handlebars->39->2588" + "default.handlebars->39->2593" ] }, { @@ -46414,7 +46438,7 @@ "zh-cht": "外掛指令", "xloc": [ "default.handlebars->39->287", - "default.handlebars->39->2884" + "default.handlebars->39->2889" ] }, { @@ -47113,7 +47137,7 @@ "zh-chs": "存在于服务器上", "zh-cht": "存在於伺服器上", "xloc": [ - "default.handlebars->39->2681" + "default.handlebars->39->2686" ] }, { @@ -47243,8 +47267,8 @@ "default-mobile.handlebars->11->79", "default-mobile.handlebars->11->80", "default.handlebars->39->1458", - "default.handlebars->39->2583", - "default.handlebars->39->2609", + "default.handlebars->39->2588", + "default.handlebars->39->2614", "default.handlebars->39->299" ] }, @@ -47638,7 +47662,7 @@ "zh-chs": "协议", "zh-cht": "協議", "xloc": [ - "default.handlebars->39->2679", + "default.handlebars->39->2684", "player.handlebars->3->32" ] }, @@ -48252,7 +48276,7 @@ "zh-chs": "RSS", "zh-cht": "RSS", "xloc": [ - "default.handlebars->39->2843" + "default.handlebars->39->2848" ] }, { @@ -48327,7 +48351,7 @@ "zh-chs": "随机密码。", "zh-cht": "隨機密碼。", "xloc": [ - "default.handlebars->39->2385" + "default.handlebars->39->2390" ] }, { @@ -48437,9 +48461,9 @@ "zh-chs": "真正的名字", "zh-cht": "真正的名字", "xloc": [ - "default.handlebars->39->2516", - "default.handlebars->39->2518", - "default.handlebars->39->2602" + "default.handlebars->39->2521", + "default.handlebars->39->2523", + "default.handlebars->39->2607" ] }, { @@ -48464,7 +48488,7 @@ "zh-chs": "境界", "zh-cht": "境界", "xloc": [ - "default.handlebars->39->2394" + "default.handlebars->39->2399" ] }, { @@ -48518,8 +48542,8 @@ "zh-cht": "記錄會議", "xloc": [ "default.handlebars->39->1818", - "default.handlebars->39->2443", - "default.handlebars->39->2521" + "default.handlebars->39->2448", + "default.handlebars->39->2526" ] }, { @@ -48570,8 +48594,8 @@ "zh-cht": "記錄會議", "xloc": [ "default.handlebars->39->1948", - "default.handlebars->39->2481", - "default.handlebars->39->2590" + "default.handlebars->39->2486", + "default.handlebars->39->2595" ] }, { @@ -48596,7 +48620,7 @@ "zh-chs": "记录细节", "zh-cht": "記錄細節", "xloc": [ - "default.handlebars->39->2693" + "default.handlebars->39->2698" ] }, { @@ -48865,7 +48889,7 @@ "zh-cht": "中繼", "xloc": [ "default-mobile.handlebars->11->252", - "default.handlebars->39->2825", + "default.handlebars->39->2830", "default.handlebars->39->370", "default.handlebars->39->611" ] @@ -48892,7 +48916,7 @@ "zh-chs": "中继数量", "zh-cht": "中繼數量", "xloc": [ - "default.handlebars->39->2810" + "default.handlebars->39->2815" ] }, { @@ -48938,7 +48962,7 @@ "zh-chs": "中继错误", "zh-cht": "中繼錯誤", "xloc": [ - "default.handlebars->39->2803" + "default.handlebars->39->2808" ] }, { @@ -48984,8 +49008,8 @@ "zh-chs": "中继连接", "zh-cht": "中繼連接", "xloc": [ - "default.handlebars->39->2809", - "default.handlebars->39->2837" + "default.handlebars->39->2814", + "default.handlebars->39->2842" ] }, { @@ -49834,7 +49858,7 @@ "tr": "Uzak Oturumlar", "zh-chs": "远程会话", "xloc": [ - "default.handlebars->39->2695" + "default.handlebars->39->2700" ] }, { @@ -49976,7 +50000,7 @@ "default-mobile.handlebars->11->673", "default.handlebars->39->1974", "default.handlebars->39->2016", - "default.handlebars->39->2593" + "default.handlebars->39->2598" ] }, { @@ -50237,8 +50261,8 @@ "zh-chs": "删除设备组权限", "zh-cht": "刪除裝置群權限", "xloc": [ - "default.handlebars->39->2485", - "default.handlebars->39->2654" + "default.handlebars->39->2490", + "default.handlebars->39->2659" ] }, { @@ -50263,8 +50287,8 @@ "zh-chs": "删除设备权限", "zh-cht": "刪除裝置權限", "xloc": [ - "default.handlebars->39->2483", - "default.handlebars->39->2641" + "default.handlebars->39->2488", + "default.handlebars->39->2646" ] }, { @@ -50289,7 +50313,7 @@ "zh-chs": "删除设备共享", "zh-cht": "刪除設備共享", "xloc": [ - "default.handlebars->39->2639" + "default.handlebars->39->2644" ] }, { @@ -50360,7 +50384,7 @@ "zh-chs": "删除用户组成员身份", "zh-cht": "刪除用戶群成員身份", "xloc": [ - "default.handlebars->39->2650" + "default.handlebars->39->2655" ] }, { @@ -50386,7 +50410,7 @@ "zh-cht": "刪除用戶群權限", "xloc": [ "default.handlebars->39->2037", - "default.handlebars->39->2646" + "default.handlebars->39->2651" ] }, { @@ -50411,7 +50435,7 @@ "zh-chs": "删除用户成员资格", "zh-cht": "刪除用戶成員資格", "xloc": [ - "default.handlebars->39->2493" + "default.handlebars->39->2498" ] }, { @@ -50437,7 +50461,7 @@ "zh-cht": "刪除用戶權限", "xloc": [ "default.handlebars->39->2035", - "default.handlebars->39->2643" + "default.handlebars->39->2648" ] }, { @@ -50462,7 +50486,7 @@ "zh-chs": "删除所有两因素认证。", "zh-cht": "刪除所有二因子鑑別。", "xloc": [ - "default.handlebars->39->2616" + "default.handlebars->39->2621" ] }, { @@ -50487,7 +50511,7 @@ "zh-chs": "删除此用户标识的所有先前事件。", "zh-cht": "刪除此用戶標識的所有先前事件。", "xloc": [ - "default.handlebars->39->2386" + "default.handlebars->39->2391" ] }, { @@ -50712,7 +50736,7 @@ "zh-chs": "删除此用户", "zh-cht": "刪除此用戶", "xloc": [ - "default.handlebars->39->2578" + "default.handlebars->39->2583" ] }, { @@ -50737,7 +50761,7 @@ "zh-chs": "删除用户组成员身份", "zh-cht": "刪除用戶群成員身份", "xloc": [ - "default.handlebars->39->2630" + "default.handlebars->39->2635" ] }, { @@ -50762,7 +50786,7 @@ "zh-chs": "删除此设备的用户组权限", "zh-cht": "刪除此裝置的用戶群權限", "xloc": [ - "default.handlebars->39->2477" + "default.handlebars->39->2482" ] }, { @@ -50787,7 +50811,7 @@ "zh-chs": "删除此设备组的用户组权限", "zh-cht": "刪除此裝置群的用戶群權限", "xloc": [ - "default.handlebars->39->2471", + "default.handlebars->39->2476", "default.handlebars->39->928" ] }, @@ -50814,9 +50838,9 @@ "zh-cht": "刪除此裝置群的用戶權限", "xloc": [ "default.handlebars->39->1863", - "default.handlebars->39->2465", - "default.handlebars->39->2624", - "default.handlebars->39->2636", + "default.handlebars->39->2470", + "default.handlebars->39->2629", + "default.handlebars->39->2641", "default.handlebars->39->929" ] }, @@ -51240,7 +51264,7 @@ "zh-chs": "报告日", "zh-cht": "報告日", "xloc": [ - "default.handlebars->39->2287" + "default.handlebars->39->2292" ] }, { @@ -51265,7 +51289,7 @@ "zh-chs": "报告类型", "zh-cht": "報告類型", "xloc": [ - "default.handlebars->39->2282" + "default.handlebars->39->2287" ] }, { @@ -51284,7 +51308,7 @@ "ru": "Отчет не вернул данных", "tr": "Rapor hiçbir bütün döndürmedi.", "xloc": [ - "default.handlebars->39->2722" + "default.handlebars->39->2727" ] }, { @@ -51306,7 +51330,7 @@ "sv": "Report.csv", "tr": "Report.csv", "xloc": [ - "default.handlebars->39->2745" + "default.handlebars->39->2750" ] }, { @@ -51490,8 +51514,8 @@ "zh-cht": "要求:{0}。", "xloc": [ "default-mobile.handlebars->11->113", - "default.handlebars->39->2391", - "default.handlebars->39->2614" + "default.handlebars->39->2396", + "default.handlebars->39->2619" ] }, { @@ -51935,7 +51959,7 @@ "zh-chs": "限制条件", "zh-cht": "限制條件", "xloc": [ - "default.handlebars->39->2505" + "default.handlebars->39->2510" ] }, { @@ -52667,8 +52691,8 @@ "zh-chs": "短信", "zh-cht": "短信", "xloc": [ - "default.handlebars->39->2565", "default.handlebars->39->2570", + "default.handlebars->39->2575", "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3", "login.handlebars->container->column_l->centralTable->1->0->logincell->resettokenpanel->1->5->1->2->1->3", "login.handlebars->container->column_l->centralTable->1->0->logincell->tokenpanel->1->7->1->4->1->3", @@ -52698,7 +52722,7 @@ "zh-chs": "此用户的短信功能电话号码。", "zh-cht": "此用戶的短信功能電話號碼。", "xloc": [ - "default.handlebars->39->2586" + "default.handlebars->39->2591" ] }, { @@ -52723,7 +52747,7 @@ "zh-chs": "短信错误", "xloc": [ "default-mobile.handlebars->11->728", - "default.handlebars->39->2783" + "default.handlebars->39->2788" ] }, { @@ -52748,7 +52772,7 @@ "zh-chs": "短信错误:{0}", "xloc": [ "default-mobile.handlebars->11->729", - "default.handlebars->39->2784" + "default.handlebars->39->2789" ] }, { @@ -52792,7 +52816,7 @@ "zh-chs": "短信网关未启用", "xloc": [ "default-mobile.handlebars->11->723", - "default.handlebars->39->2778" + "default.handlebars->39->2783" ] }, { @@ -52865,7 +52889,7 @@ "zh-chs": "短信发送成功。", "xloc": [ "default-mobile.handlebars->11->727", - "default.handlebars->39->2782" + "default.handlebars->39->2787" ] }, { @@ -53722,7 +53746,7 @@ "default.handlebars->39->1102", "default.handlebars->39->1409", "default.handlebars->39->2085", - "default.handlebars->39->2566", + "default.handlebars->39->2571", "default.handlebars->39->445", "default.handlebars->container->column_l->p21->p21main->1->1->meshSecurityChartDiv->1" ] @@ -53749,7 +53773,7 @@ "zh-chs": "安全密钥", "zh-cht": "安全密鑰", "xloc": [ - "default.handlebars->39->2561" + "default.handlebars->39->2566" ] }, { @@ -53774,7 +53798,7 @@ "zh-chs": "安全警告", "xloc": [ "default-mobile.handlebars->11->697", - "default.handlebars->39->2752" + "default.handlebars->39->2757" ] }, { @@ -53848,8 +53872,8 @@ "default.handlebars->39->1309", "default.handlebars->39->1311", "default.handlebars->39->2111", - "default.handlebars->39->2333", - "default.handlebars->39->2419", + "default.handlebars->39->2338", + "default.handlebars->39->2424", "default.handlebars->39->466", "default.handlebars->39->616", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->devListToolbar", @@ -53881,7 +53905,7 @@ "xloc": [ "default.handlebars->39->1052", "default.handlebars->39->1054", - "default.handlebars->39->2710" + "default.handlebars->39->2715" ] }, { @@ -53908,8 +53932,8 @@ "xloc": [ "default.handlebars->39->1310", "default.handlebars->39->2110", - "default.handlebars->39->2332", - "default.handlebars->39->2418", + "default.handlebars->39->2337", + "default.handlebars->39->2423", "default.handlebars->39->615", "default.handlebars->meshContextMenu->cxselectnone", "sharing.handlebars->11->57" @@ -54061,8 +54085,8 @@ "zh-chs": "选择要对所有选定用户执行的操作。", "zh-cht": "選擇要對所有選定用戶執行的操作。", "xloc": [ - "default.handlebars->39->2336", - "default.handlebars->39->2420" + "default.handlebars->39->2341", + "default.handlebars->39->2425" ] }, { @@ -54240,7 +54264,7 @@ "zh-chs": "发电邮", "zh-cht": "發電郵", "xloc": [ - "default.handlebars->39->2347" + "default.handlebars->39->2352" ] }, { @@ -54316,7 +54340,7 @@ "zh-chs": "发送短信", "zh-cht": "發送簡訊", "xloc": [ - "default.handlebars->39->2345" + "default.handlebars->39->2350" ] }, { @@ -54341,7 +54365,7 @@ "zh-chs": "发送短信给该用户", "zh-cht": "發送短信給該用戶", "xloc": [ - "default.handlebars->39->2571" + "default.handlebars->39->2576" ] }, { @@ -54366,7 +54390,7 @@ "zh-chs": "发送电邮给该用户", "zh-cht": "發送電郵給該用戶", "xloc": [ - "default.handlebars->39->2573" + "default.handlebars->39->2578" ] }, { @@ -54391,7 +54415,7 @@ "zh-chs": "向该组中的所有用户发送通知。", "zh-cht": "向該群中的所有用戶發送通知。", "xloc": [ - "default.handlebars->39->2462" + "default.handlebars->39->2467" ] }, { @@ -54416,7 +54440,7 @@ "zh-chs": "向该用户发送文本通知。", "zh-cht": "向該用戶發送文本通知。", "xloc": [ - "default.handlebars->39->2348" + "default.handlebars->39->2353" ] }, { @@ -54441,7 +54465,7 @@ "zh-chs": "发送电邮给用户", "zh-cht": "發送電郵給用戶", "xloc": [ - "default.handlebars->39->2328" + "default.handlebars->39->2333" ] }, { @@ -54491,7 +54515,7 @@ "zh-chs": "发送邀请电邮。", "zh-cht": "發送邀請電郵。", "xloc": [ - "default.handlebars->39->2390" + "default.handlebars->39->2395" ] }, { @@ -54644,7 +54668,7 @@ "zh-chs": "发送用户通知", "zh-cht": "發送用戶通知", "xloc": [ - "default.handlebars->39->2575" + "default.handlebars->39->2580" ] }, { @@ -54808,7 +54832,7 @@ "zh-chs": "服务器备份", "zh-cht": "伺服器備份", "xloc": [ - "default.handlebars->39->2400" + "default.handlebars->39->2405" ] }, { @@ -54833,7 +54857,7 @@ "zh-chs": "服务器证书", "zh-cht": "伺服器憑證", "xloc": [ - "default.handlebars->39->2858" + "default.handlebars->39->2863" ] }, { @@ -54882,7 +54906,7 @@ "zh-chs": "服务器数据库", "zh-cht": "伺服器數據庫", "xloc": [ - "default.handlebars->39->2859" + "default.handlebars->39->2864" ] }, { @@ -54911,7 +54935,7 @@ "default-mobile.handlebars->11->670", "default.handlebars->39->1982", "default.handlebars->39->2013", - "default.handlebars->39->2397", + "default.handlebars->39->2402", "default.handlebars->39->975", "default.handlebars->39->997" ] @@ -54963,7 +54987,7 @@ "zh-chs": "服务器限制", "xloc": [ "default-mobile.handlebars->11->696", - "default.handlebars->39->2751" + "default.handlebars->39->2756" ] }, { @@ -55012,8 +55036,8 @@ "zh-chs": "服务器权限", "zh-cht": "伺服器權限", "xloc": [ - "default.handlebars->39->2320", - "default.handlebars->39->2412" + "default.handlebars->39->2325", + "default.handlebars->39->2417" ] }, { @@ -55038,7 +55062,7 @@ "zh-chs": "服务器配额", "zh-cht": "伺服器配額", "xloc": [ - "default.handlebars->39->2535" + "default.handlebars->39->2540" ] }, { @@ -55063,7 +55087,7 @@ "zh-chs": "服务器还原", "zh-cht": "伺服器還原", "xloc": [ - "default.handlebars->39->2401" + "default.handlebars->39->2406" ] }, { @@ -55088,7 +55112,7 @@ "zh-chs": "服务器权限", "zh-cht": "伺服器權限", "xloc": [ - "default.handlebars->39->2534" + "default.handlebars->39->2539" ] }, { @@ -55113,7 +55137,7 @@ "zh-chs": "服务器状态", "zh-cht": "伺服器狀態", "xloc": [ - "default.handlebars->39->2789" + "default.handlebars->39->2794" ] }, { @@ -55163,7 +55187,7 @@ "zh-chs": "服务器跟踪", "zh-cht": "伺服器追蹤", "xloc": [ - "default.handlebars->39->2871" + "default.handlebars->39->2876" ] }, { @@ -55187,7 +55211,7 @@ "tr": "Sunucu İzleme Etkinliği", "zh-chs": "服务器跟踪事件", "xloc": [ - "default.handlebars->39->2850" + "default.handlebars->39->2855" ] }, { @@ -55263,7 +55287,7 @@ "zh-chs": "服务器更新", "zh-cht": "伺服器更新", "xloc": [ - "default.handlebars->39->2402" + "default.handlebars->39->2407" ] }, { @@ -55513,7 +55537,7 @@ "zh-chs": "ServerStats.csv", "zh-cht": "ServerStats.csv", "xloc": [ - "default.handlebars->39->2849" + "default.handlebars->39->2854" ] }, { @@ -55588,8 +55612,8 @@ "zh-chs": "会话", "zh-cht": "節", "xloc": [ - "default.handlebars->39->2661", - "default.handlebars->39->2715", + "default.handlebars->39->2666", + "default.handlebars->39->2720", "ssh.handlebars->3->17", "ssh.handlebars->3->19" ] @@ -56726,7 +56750,7 @@ "ru": "Показать трафик", "tr": "Trafiği Göster", "xloc": [ - "default.handlebars->39->2711" + "default.handlebars->39->2716" ] }, { @@ -56876,8 +56900,8 @@ "zh-chs": "显示1分钟", "zh-cht": "顯示1分鐘", "xloc": [ - "default.handlebars->39->2351", - "default.handlebars->39->2376" + "default.handlebars->39->2356", + "default.handlebars->39->2381" ] }, { @@ -56902,8 +56926,8 @@ "zh-chs": "显示10秒", "zh-cht": "顯示10秒", "xloc": [ - "default.handlebars->39->2350", - "default.handlebars->39->2375" + "default.handlebars->39->2355", + "default.handlebars->39->2380" ] }, { @@ -56928,8 +56952,8 @@ "zh-chs": "显示5分钟", "zh-cht": "顯示5分鐘", "xloc": [ - "default.handlebars->39->2352", - "default.handlebars->39->2377" + "default.handlebars->39->2357", + "default.handlebars->39->2382" ] }, { @@ -56954,8 +56978,8 @@ "zh-chs": "显示消息,直到被用户拒绝", "zh-cht": "顯示消息,直到被用戶拒絕", "xloc": [ - "default.handlebars->39->2349", - "default.handlebars->39->2374" + "default.handlebars->39->2354", + "default.handlebars->39->2379" ] }, { @@ -57365,8 +57389,8 @@ "zh-chs": "尺寸", "zh-cht": "尺寸", "xloc": [ - "default.handlebars->39->2664", - "default.handlebars->39->2685", + "default.handlebars->39->2669", + "default.handlebars->39->2690", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSize" ] }, @@ -58669,8 +58693,8 @@ "default.handlebars->39->1178", "default.handlebars->39->260", "default.handlebars->39->265", - "default.handlebars->39->2662", - "default.handlebars->39->2687", + "default.handlebars->39->2667", + "default.handlebars->39->2692", "sharing.handlebars->11->14" ] }, @@ -58748,6 +58772,12 @@ "default.handlebars->39->2136" ] }, + { + "en": "Started desktop multiplex session \\\"{0}\\\"", + "xloc": [ + "default.handlebars->39->2275" + ] + }, { "cs": "Zahájena relace na ploše \\\"{0}\\\" od {1} do {2}", "da": "Startede skrivebordssession \\\"{0}\\\" fra {1} til {2}", @@ -59162,8 +59192,8 @@ "zh-chs": "状况", "zh-cht": "狀態", "xloc": [ - "default.handlebars->39->2605", - "default.handlebars->39->2680", + "default.handlebars->39->2610", + "default.handlebars->39->2685", "default.handlebars->container->column_l->p42->p42tbl->1->0->7" ] }, @@ -59462,7 +59492,7 @@ "zh-chs": "主题", "zh-cht": "主題", "xloc": [ - "default.handlebars->39->2346" + "default.handlebars->39->2351" ] }, { @@ -60431,10 +60461,10 @@ "default.handlebars->39->1022", "default.handlebars->39->1868", "default.handlebars->39->1942", - "default.handlebars->39->2674", - "default.handlebars->39->2724", - "default.handlebars->39->2740", - "default.handlebars->39->2826", + "default.handlebars->39->2679", + "default.handlebars->39->2729", + "default.handlebars->39->2745", + "default.handlebars->39->2831", "default.handlebars->39->392", "default.handlebars->39->732", "default.handlebars->39->936", @@ -60517,8 +60547,8 @@ "zh-cht": "終端機通知", "xloc": [ "default.handlebars->39->1827", - "default.handlebars->39->2451", - "default.handlebars->39->2553", + "default.handlebars->39->2456", + "default.handlebars->39->2558", "default.handlebars->39->830" ] }, @@ -60545,8 +60575,8 @@ "zh-cht": "終端機提示", "xloc": [ "default.handlebars->39->1826", - "default.handlebars->39->2450", - "default.handlebars->39->2552", + "default.handlebars->39->2455", + "default.handlebars->39->2557", "default.handlebars->39->829" ] }, @@ -60571,7 +60601,7 @@ "tr": "Terminal Oturumu", "zh-chs": "终端会话", "xloc": [ - "default.handlebars->39->2667" + "default.handlebars->39->2672" ] }, { @@ -60936,7 +60966,7 @@ "zh-cht": "目前沒有任何通知", "xloc": [ "default-mobile.handlebars->11->691", - "default.handlebars->39->2746" + "default.handlebars->39->2751" ] }, { @@ -60961,7 +60991,7 @@ "zh-chs": "自上次登录以来,此帐户已有 {0} 次登录尝试失败。", "xloc": [ "default-mobile.handlebars->11->712", - "default.handlebars->39->2767" + "default.handlebars->39->2772" ] }, { @@ -61178,9 +61208,9 @@ "zh-chs": "这是嘉宾分享环节", "xloc": [ "default.handlebars->39->1350", - "default.handlebars->39->2280", - "default.handlebars->39->2656", - "default.handlebars->39->2657" + "default.handlebars->39->2285", + "default.handlebars->39->2661", + "default.handlebars->39->2662" ] }, { @@ -61575,8 +61605,8 @@ "xloc": [ "default-mobile.handlebars->11->351", "default.handlebars->39->1063", - "default.handlebars->39->2708", "default.handlebars->39->2713", + "default.handlebars->39->2718", "player.handlebars->3->17" ] }, @@ -61603,7 +61633,7 @@ "zh-cht": "時間範圍", "xloc": [ "default.handlebars->39->1051", - "default.handlebars->39->2709" + "default.handlebars->39->2714" ] }, { @@ -61628,7 +61658,7 @@ "zh-chs": "时间跨度", "zh-cht": "時間跨度", "xloc": [ - "default.handlebars->39->2284" + "default.handlebars->39->2289" ] }, { @@ -61654,7 +61684,7 @@ "zh-cht": "時間範圍", "xloc": [ "default.handlebars->39->1047", - "default.handlebars->39->2707" + "default.handlebars->39->2712" ] }, { @@ -63116,7 +63146,7 @@ "default.handlebars->39->1749", "default.handlebars->39->1809", "default.handlebars->39->1899", - "default.handlebars->39->2697", + "default.handlebars->39->2702", "default.handlebars->39->433", "default.handlebars->container->column_l->p11->deskarea0->deskarea4->3", "sharing.handlebars->p11->deskarea0->deskarea4->3" @@ -63436,7 +63466,7 @@ "zh-cht": "在啟用兩因素身份驗證之前,無法訪問此功能。這是額外的安全性所必需的。轉到“我的帳戶”標籤,然後查看“帳戶安全性”部分。", "xloc": [ "default.handlebars->39->1744", - "default.handlebars->39->2877", + "default.handlebars->39->2882", "default.handlebars->39->750" ] }, @@ -63462,7 +63492,7 @@ "zh-chs": "无法在此模式下添加用户", "xloc": [ "default-mobile.handlebars->11->708", - "default.handlebars->39->2763" + "default.handlebars->39->2768" ] }, { @@ -63997,15 +64027,15 @@ "default.handlebars->39->1794", "default.handlebars->39->1795", "default.handlebars->39->181", - "default.handlebars->39->2649", - "default.handlebars->39->2666", - "default.handlebars->39->2673", - "default.handlebars->39->2734", - "default.handlebars->39->2735", - "default.handlebars->39->2736", - "default.handlebars->39->2737", - "default.handlebars->39->2738", + "default.handlebars->39->2654", + "default.handlebars->39->2671", + "default.handlebars->39->2678", + "default.handlebars->39->2739", + "default.handlebars->39->2740", + "default.handlebars->39->2741", + "default.handlebars->39->2742", "default.handlebars->39->2743", + "default.handlebars->39->2748", "default.handlebars->39->44", "default.handlebars->39->51", "default.handlebars->39->52", @@ -64060,7 +64090,7 @@ "zh-chs": "未知动作", "zh-cht": "未知動作", "xloc": [ - "default.handlebars->39->2795" + "default.handlebars->39->2800" ] }, { @@ -64085,8 +64115,8 @@ "zh-chs": "未知设备", "zh-cht": "未知裝置", "xloc": [ - "default.handlebars->39->2476", - "default.handlebars->39->2635" + "default.handlebars->39->2481", + "default.handlebars->39->2640" ] }, { @@ -64111,9 +64141,9 @@ "zh-chs": "未知设备组", "zh-cht": "未知裝置群", "xloc": [ - "default.handlebars->39->2470", - "default.handlebars->39->2623", - "default.handlebars->39->2799" + "default.handlebars->39->2475", + "default.handlebars->39->2628", + "default.handlebars->39->2804" ] }, { @@ -64138,7 +64168,7 @@ "zh-chs": "未知群组", "zh-cht": "未知群組", "xloc": [ - "default.handlebars->39->2791" + "default.handlebars->39->2796" ] }, { @@ -64183,8 +64213,8 @@ "ru": "Неизвестный пользователь", "tr": "Bilinmeyen kullanıcı", "xloc": [ - "default.handlebars->39->2739", - "default.handlebars->39->2744" + "default.handlebars->39->2744", + "default.handlebars->39->2749" ] }, { @@ -64209,7 +64239,7 @@ "zh-chs": "未知用户组", "zh-cht": "未知用戶群", "xloc": [ - "default.handlebars->39->2629" + "default.handlebars->39->2634" ] }, { @@ -64314,7 +64344,7 @@ "zh-chs": "解锁帐户", "zh-cht": "解鎖帳戶", "xloc": [ - "default.handlebars->39->2339" + "default.handlebars->39->2344" ] }, { @@ -64439,7 +64469,7 @@ "zh-chs": "最新", "zh-cht": "最新", "xloc": [ - "default.handlebars->39->2882" + "default.handlebars->39->2887" ] }, { @@ -64987,7 +65017,7 @@ "tr": "kullanım", "zh-chs": "用法", "xloc": [ - "default.handlebars->39->2845" + "default.handlebars->39->2850" ] }, { @@ -65185,8 +65215,8 @@ "zh-chs": "用过的", "zh-cht": "用過的", "xloc": [ - "default.handlebars->39->2785", - "default.handlebars->39->2787" + "default.handlebars->39->2790", + "default.handlebars->39->2792" ] }, { @@ -65213,12 +65243,12 @@ "xloc": [ "default.handlebars->39->113", "default.handlebars->39->1864", - "default.handlebars->39->2291", - "default.handlebars->39->2321", - "default.handlebars->39->2466", - "default.handlebars->39->2692", - "default.handlebars->39->2698", - "default.handlebars->39->2716", + "default.handlebars->39->2296", + "default.handlebars->39->2326", + "default.handlebars->39->2471", + "default.handlebars->39->2697", + "default.handlebars->39->2703", + "default.handlebars->39->2721", "default.handlebars->39->338", "default.handlebars->39->931" ] @@ -65245,7 +65275,7 @@ "zh-chs": "用户+档案", "zh-cht": "用戶+檔案", "xloc": [ - "default.handlebars->39->2322" + "default.handlebars->39->2327" ] }, { @@ -65271,10 +65301,10 @@ "zh-cht": "用戶帳戶導入", "xloc": [ "default.handlebars->39->1894", - "default.handlebars->39->2357", - "default.handlebars->39->2358", - "default.handlebars->39->2360", - "default.handlebars->39->2362" + "default.handlebars->39->2362", + "default.handlebars->39->2363", + "default.handlebars->39->2365", + "default.handlebars->39->2367" ] }, { @@ -65299,7 +65329,7 @@ "zh-chs": "用户帐户", "zh-cht": "用戶帳戶", "xloc": [ - "default.handlebars->39->2804" + "default.handlebars->39->2809" ] }, { @@ -65353,8 +65383,8 @@ "xloc": [ "default.handlebars->39->1056", "default.handlebars->39->1833", - "default.handlebars->39->2457", - "default.handlebars->39->2559", + "default.handlebars->39->2462", + "default.handlebars->39->2564", "default.handlebars->39->275", "default.handlebars->39->836" ] @@ -65383,9 +65413,9 @@ "xloc": [ "default.handlebars->39->1962", "default.handlebars->39->1963", - "default.handlebars->39->2427", - "default.handlebars->39->2631", - "default.handlebars->39->2652", + "default.handlebars->39->2432", + "default.handlebars->39->2636", + "default.handlebars->39->2657", "default.handlebars->39->930" ] }, @@ -65436,7 +65466,7 @@ "zh-chs": "用户组成员", "zh-cht": "用戶群成員", "xloc": [ - "default.handlebars->39->2628" + "default.handlebars->39->2633" ] }, { @@ -65487,8 +65517,8 @@ "zh-cht": "用戶識別碼", "xloc": [ "default.handlebars->39->2031", - "default.handlebars->39->2513", - "default.handlebars->39->2514" + "default.handlebars->39->2518", + "default.handlebars->39->2519" ] }, { @@ -65514,7 +65544,7 @@ "zh-cht": "用戶標識符", "xloc": [ "default.handlebars->39->1960", - "default.handlebars->39->2497" + "default.handlebars->39->2502" ] }, { @@ -65563,7 +65593,7 @@ "zh-chs": "用户列表输出", "zh-cht": "用戶列表輸出", "xloc": [ - "default.handlebars->39->2369" + "default.handlebars->39->2374" ] }, { @@ -65709,7 +65739,7 @@ "zh-chs": "用户节", "zh-cht": "用戶節", "xloc": [ - "default.handlebars->39->2836" + "default.handlebars->39->2841" ] }, { @@ -65757,7 +65787,7 @@ "ru": "Расход трафика пользователями", "tr": "Kullanıcı Trafiği Kullanımı", "xloc": [ - "default.handlebars->39->2696" + "default.handlebars->39->2701" ] }, { @@ -65857,7 +65887,7 @@ "zh-chs": "用户已存在", "xloc": [ "default-mobile.handlebars->11->707", - "default.handlebars->39->2762" + "default.handlebars->39->2767" ] }, { @@ -66080,7 +66110,7 @@ "zh-chs": "未找到用户 {0}。", "xloc": [ "default-mobile.handlebars->11->715", - "default.handlebars->39->2770" + "default.handlebars->39->2775" ] }, { @@ -66141,7 +66171,7 @@ "default.handlebars->39->1772", "default.handlebars->39->1777", "default.handlebars->39->1811", - "default.handlebars->39->2381", + "default.handlebars->39->2386", "default.handlebars->39->304", "default.handlebars->39->442", "login2.handlebars->centralTable->1->0->logincell->loginpanel->1->loginuserpassdiv->1->1->0->1", @@ -66287,9 +66317,9 @@ "zh-chs": "用户", "zh-cht": "用戶", "xloc": [ - "default.handlebars->39->2415", - "default.handlebars->39->2458", - "default.handlebars->39->2835", + "default.handlebars->39->2420", + "default.handlebars->39->2463", + "default.handlebars->39->2840", "default.handlebars->container->topbar->1->1->UsersSubMenuSpan->UsersSubMenu->1->0->UsersGeneral" ] }, @@ -66315,7 +66345,7 @@ "zh-chs": "用户会话", "zh-cht": "用戶節", "xloc": [ - "default.handlebars->39->2808" + "default.handlebars->39->2813" ] }, { @@ -66339,7 +66369,7 @@ "tr": "Kullanıcılar Görünümü", "zh-chs": "用户视图", "xloc": [ - "default.handlebars->39->2355" + "default.handlebars->39->2360" ] }, { @@ -66364,7 +66394,7 @@ "zh-chs": "未找到用户 {0}。", "xloc": [ "default-mobile.handlebars->11->716", - "default.handlebars->39->2771" + "default.handlebars->39->2776" ] }, { @@ -66488,7 +66518,7 @@ "zh-chs": "验证电邮", "zh-cht": "驗證電郵", "xloc": [ - "default.handlebars->39->2334" + "default.handlebars->39->2339" ] }, { @@ -66513,7 +66543,7 @@ "zh-chs": "验证异常", "xloc": [ "default-mobile.handlebars->11->709", - "default.handlebars->39->2764" + "default.handlebars->39->2769" ] }, { @@ -66666,7 +66696,7 @@ "zh-chs": "已验证", "zh-cht": "已驗證", "xloc": [ - "default.handlebars->39->2607" + "default.handlebars->39->2612" ] }, { @@ -66719,7 +66749,7 @@ "xloc": [ "default-mobile.handlebars->11->87", "default.handlebars->39->1461", - "default.handlebars->39->2330" + "default.handlebars->39->2335" ] }, { @@ -66853,7 +66883,7 @@ "zh-chs": "版本不兼容,请先升级您的MeshCentral", "zh-cht": "版本不兼容,請先升級你的MeshCentral", "xloc": [ - "default.handlebars->39->2878" + "default.handlebars->39->2883" ] }, { @@ -67001,7 +67031,7 @@ "zh-chs": "查看所有事件", "zh-cht": "查看所有事件", "xloc": [ - "default.handlebars->39->2406" + "default.handlebars->39->2411" ] }, { @@ -67047,8 +67077,8 @@ "zh-chs": "查看变更日志", "zh-cht": "查看變更日誌", "xloc": [ - "default.handlebars->39->2881", - "default.handlebars->39->2883" + "default.handlebars->39->2886", + "default.handlebars->39->2888" ] }, { @@ -67123,7 +67153,7 @@ "zh-chs": "查看有关此用户的注释", "zh-cht": "查看有關此用戶的註釋", "xloc": [ - "default.handlebars->39->2569" + "default.handlebars->39->2574" ] }, { @@ -67172,7 +67202,7 @@ "tr": "Bu kullanıcı için önceki girişleri görüntüle", "zh-chs": "查看此用户以前的登录", "xloc": [ - "default.handlebars->39->2582" + "default.handlebars->39->2587" ] }, { @@ -67681,8 +67711,8 @@ "zh-chs": "网络服务器", "zh-cht": "網絡伺服器", "xloc": [ - "default.handlebars->39->2861", - "default.handlebars->39->2862" + "default.handlebars->39->2866", + "default.handlebars->39->2867" ] }, { @@ -67706,7 +67736,7 @@ "tr": "Web Sunucusu HTTP Başlıkları", "zh-chs": "Web 服务器 HTTP 标头", "xloc": [ - "default.handlebars->39->2865" + "default.handlebars->39->2870" ] }, { @@ -67731,7 +67761,7 @@ "zh-chs": "Web服务器请求", "zh-cht": "Web伺服器請求", "xloc": [ - "default.handlebars->39->2863" + "default.handlebars->39->2868" ] }, { @@ -67756,7 +67786,7 @@ "zh-chs": "Web套接字中继", "zh-cht": "Web插座中繼", "xloc": [ - "default.handlebars->39->2864" + "default.handlebars->39->2869" ] }, { @@ -67781,7 +67811,7 @@ "zh-chs": "网络RDP", "zh-cht": "網絡RDP", "xloc": [ - "default.handlebars->39->2730", + "default.handlebars->39->2735", "default.handlebars->39->905", "default.handlebars->contextMenu->cxwebrdp" ] @@ -67802,7 +67832,7 @@ "ru": "Web-SFTP", "tr": "Web-SFTP", "xloc": [ - "default.handlebars->39->2732" + "default.handlebars->39->2737" ] }, { @@ -67826,7 +67856,7 @@ "tr": "Web-SSH", "zh-chs": "网络SSH", "xloc": [ - "default.handlebars->39->2731", + "default.handlebars->39->2736", "default.handlebars->39->907", "default.handlebars->contextMenu->cxwebssh" ] @@ -67852,7 +67882,7 @@ "tr": "Web-VNC", "zh-chs": "网络VNC", "xloc": [ - "default.handlebars->39->2733", + "default.handlebars->39->2738", "default.handlebars->39->903", "default.handlebars->contextMenu->cxwebvnc" ] @@ -67878,7 +67908,7 @@ "tr": "WebRDP", "zh-chs": "网络RDP", "xloc": [ - "default.handlebars->39->2829" + "default.handlebars->39->2834" ] }, { @@ -67902,7 +67932,7 @@ "tr": "WebSSH", "zh-chs": "网络SSH", "xloc": [ - "default.handlebars->39->2830" + "default.handlebars->39->2835" ] }, { @@ -67945,7 +67975,7 @@ "tr": "WebVNC", "zh-chs": "网络VNC", "xloc": [ - "default.handlebars->39->2831" + "default.handlebars->39->2836" ] }, { @@ -68188,7 +68218,7 @@ "zh-chs": "下次登录时将更改。", "zh-cht": "下次登入時將更改。", "xloc": [ - "default.handlebars->39->2539" + "default.handlebars->39->2544" ] }, { @@ -69996,7 +70026,7 @@ "zh-chs": "\\\\'", "zh-cht": "\\\\'", "xloc": [ - "default.handlebars->39->2879" + "default.handlebars->39->2884" ] }, { @@ -70658,8 +70688,8 @@ "zh-chs": "eventslist.csv", "zh-cht": "eventslist.csv", "xloc": [ - "default.handlebars->39->2298", - "default.handlebars->39->2303" + "default.handlebars->39->2303", + "default.handlebars->39->2308" ] }, { @@ -70684,8 +70714,8 @@ "zh-chs": "eventslist.json", "zh-cht": "eventslist.json", "xloc": [ - "default.handlebars->39->2300", - "default.handlebars->39->2304" + "default.handlebars->39->2305", + "default.handlebars->39->2309" ] }, { @@ -70760,8 +70790,8 @@ "zh-chs": "免费", "zh-cht": "免費", "xloc": [ - "default.handlebars->39->2816", - "default.handlebars->39->2819" + "default.handlebars->39->2821", + "default.handlebars->39->2824" ] }, { @@ -71026,7 +71056,7 @@ "zh-chs": "id, name, email, creation, lastlogin, groups, authfactors", "zh-cht": "id, name, email, creation, lastlogin, groups, authfactors", "xloc": [ - "default.handlebars->39->2370" + "default.handlebars->39->2375" ] }, { @@ -71242,7 +71272,7 @@ "zh-chs": "k max,默认为空白", "zh-cht": "k max,默認為空白", "xloc": [ - "default.handlebars->39->2398" + "default.handlebars->39->2403" ] }, { @@ -71869,7 +71899,7 @@ "zh-chs": "servertrace.csv", "zh-cht": "servertrace.csv", "xloc": [ - "default.handlebars->39->2873" + "default.handlebars->39->2878" ] }, { @@ -71971,7 +72001,7 @@ "zh-chs": "time, conn.agent, conn.users, conn.usersessions, conn.relaysession, conn.intelamt, mem.external, mem.heapused, mem.heaptotal, mem.rss", "zh-cht": "time, conn.agent, conn.users, conn.usersessions, conn.relaysession, conn.intelamt, mem.external, mem.heapused, mem.heaptotal, mem.rss", "xloc": [ - "default.handlebars->39->2848" + "default.handlebars->39->2853" ] }, { @@ -71996,7 +72026,7 @@ "zh-chs": "时间,来源,信息", "zh-cht": "時間,來源,訊息", "xloc": [ - "default.handlebars->39->2872" + "default.handlebars->39->2877" ] }, { @@ -72043,8 +72073,8 @@ "zh-chs": "总计", "zh-cht": "總", "xloc": [ - "default.handlebars->39->2817", - "default.handlebars->39->2820" + "default.handlebars->39->2822", + "default.handlebars->39->2825" ] }, { @@ -72171,8 +72201,8 @@ "zh-chs": "userlist.csv", "zh-cht": "userlist.csv", "xloc": [ - "default.handlebars->39->2366", - "default.handlebars->39->2371" + "default.handlebars->39->2371", + "default.handlebars->39->2376" ] }, { @@ -72197,8 +72227,8 @@ "zh-chs": "userlist.json", "zh-cht": "userlist.json", "xloc": [ - "default.handlebars->39->2368", - "default.handlebars->39->2372" + "default.handlebars->39->2373", + "default.handlebars->39->2377" ] }, { @@ -72223,7 +72253,7 @@ "zh-chs": "utc,时间,类型,指令,用户,设备,消息", "zh-cht": "utc,時間,類型,指令,用戶,裝置,消息", "xloc": [ - "default.handlebars->39->2302" + "default.handlebars->39->2307" ] }, { @@ -72488,7 +72518,7 @@ "xloc": [ "default.handlebars->39->2098", "default.handlebars->39->2103", - "default.handlebars->39->2665" + "default.handlebars->39->2670" ] }, { @@ -72611,7 +72641,7 @@ "zh-chs": "{0}个活跃会话", "zh-cht": "{0}個活躍節", "xloc": [ - "default.handlebars->39->2585" + "default.handlebars->39->2590" ] }, { @@ -72664,7 +72694,7 @@ "xloc": [ "default-mobile.handlebars->11->143", "default.handlebars->39->2113", - "default.handlebars->39->2686", + "default.handlebars->39->2691", "download.handlebars->3->2", "download2.handlebars->5->2", "sharing.handlebars->11->97" @@ -72813,7 +72843,7 @@ "zh-chs": "{0}个群组", "zh-cht": "{0}個群組", "xloc": [ - "default.handlebars->39->2544" + "default.handlebars->39->2549" ] }, { @@ -73046,7 +73076,7 @@ "zh-chs": "{0}未显示更多用户,请使用搜索框查找用户...", "zh-cht": "{0}未顯示更多用戶,請使用搜索框查找用戶...", "xloc": [ - "default.handlebars->39->2312" + "default.handlebars->39->2317" ] }, { @@ -73445,7 +73475,7 @@ "default-mobile.handlebars->11->212", "default-mobile.handlebars->11->216", "default-mobile.handlebars->11->220", - "default.handlebars->39->2316", + "default.handlebars->39->2321", "default.handlebars->39->384", "default.handlebars->39->387", "default.handlebars->39->391", diff --git a/views/default-mobile.handlebars b/views/default-mobile.handlebars index 8e56f2b1..897149fa 100644 --- a/views/default-mobile.handlebars +++ b/views/default-mobile.handlebars @@ -727,7 +727,7 @@
Change password
Delete account
-
Set dark mode
+
Personal notes

@@ -1309,6 +1309,9 @@ // Session Refresh Timer if (sessionTime >= 10) { sessionRefreshTimer = setTimeout(refreshCookieSession, Math.round((sessionTime * 60000) * 0.8)); } + // Hide night mode button if needed + QV('setDarkModeLink', (features2 & 0x00300000) == 0); + // Set the user's desktop shortcut keys deskKeyboardShortcuts = []; var deskKeyboardShortcutsStr = getstore('deskKeyShortcuts', '0x0A002E,0x100000,0x100028,0x100026,0x10004C,0x10004D,0x11004D,0x100052,0x020073,0x080057,0x020009,0x100025,0x100027').split(','); @@ -1372,7 +1375,7 @@ QV('p2AccountImage', !accountSettingsLocked); QV('verifyEmailId', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true)); QV('manageAuthApp', (serverinfo.lock2factor != true) && (features & 4096) && ((userinfo.otpsecret == 1) || ((features2 & 0x00020000) == 0))); - QV('manageOtp', (serverinfo.lock2factor != true) && (features & 4096) && ((userinfo.otpsecret == 1) || (userinfo.otphkeys > 0))); + QV('manageOtp', (serverinfo.lock2factor != true) && ((features2 & 0x40000) == 0) && (features & 4096) && ((userinfo.otpsecret == 1) || (userinfo.otphkeys > 0))); QV('authPhoneNumberCheck', (userinfo.phone != null)); QV('authEmailSetupCheck', (userinfo.otpekey == 1) && (userinfo.email != null) && (userinfo.emailVerified == true)); QV('authAppSetupCheck', userinfo.otpsecret == 1); @@ -2209,6 +2212,8 @@ // Set night mode var nNightMode = getstore('nightMode', '0') nightMode = false; + if ((features2 & 0x00100000) != 0) { nNightMode = '1'; } + if ((features2 & 0x00200000) != 0) { nNightMode = '2'; } if (nNightMode == '1') { nightMode = true; } else if ((nNightMode == '0') && (window.matchMedia)) { nightMode = window.matchMedia('(prefers-color-scheme: dark)').matches } if (nightMode) { QC('body').add('night'); QS('body')['background-color'] = '#000'; QS('body')['color'] = 'lightgray'; } else { QC('body').remove('night'); QS('body')['background-color'] = '#FFF'; QS('body')['color'] = 'black'; } diff --git a/views/default.handlebars b/views/default.handlebars index bdb315af..df3fcbdf 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -1645,6 +1645,9 @@ // Fix links if (urlargs.key) { Q('p6backuplink').href += '?key=' + urlargs.key; } + // Hide night mode button if needed + QV('uiViewButton4', (features2 & 0x00300000) == 0); + // Fix HTML words that in english have two or more meanings Q('DeskType').value = multiTranslate("[KeyboardTyping]|Type"); } @@ -1923,6 +1926,8 @@ // Set night mode var nNightMode = getstore('nightMode', '0') nightMode = false; + if ((features2 & 0x00100000) != 0) { nNightMode = '1'; } + if ((features2 & 0x00200000) != 0) { nNightMode = '2'; } if (nNightMode == '1') { nightMode = true; } else if ((nNightMode == '0') && (window.matchMedia)) { nightMode = window.matchMedia('(prefers-color-scheme: dark)').matches } if (nightMode) { QC('body').add('night'); QS('body')['background-color'] = '#000'; } else { QC('body').remove('night'); QS('body')['background-color'] = '#d3d9d6'; } @@ -2116,7 +2121,7 @@ if (userinfo.otphkeys > 0) { authFactorCount += userinfo.otphkeys; } // FIDO hardware factor if ((features & 0x00800000) && (userinfo.otpekey == 1)) { authFactorCount++; } // EMail factor if ((features & 0x02000000) && (features & 0x04000000) && (userinfo.phone != null)) { authFactorCount++; } // SMS factor - if ((authFactorCount > 0) && (userinfo.otpkeys > 0)) { authFactorCount++; } // Backup keys + if ((authFactorCount > 0) && (userinfo.otpkeys > 0) && ((features & 0x40000) == 0)) { authFactorCount++; } // Backup keys return authFactorCount; } @@ -2126,7 +2131,7 @@ var accountSettingsLocked = ((userinfo.siteadmin != 0xFFFFFFFF) && ((userinfo.siteadmin & 1024) != 0)); QV('verifyEmailId', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true)); QV('verifyEmailId2', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true) && (accountSettingsLocked == false)); - QV('manageOtp', (serverinfo.lock2factor != true) && (authFactorCount > 0)); + QV('manageOtp', (serverinfo.lock2factor != true) && (authFactorCount > 0) && ((features2 & 0x40000) == 0)); QV('authPhoneNumberCheck', (userinfo.phone != null)); QV('authEmailSetupCheck', (userinfo.otpekey == 1) && (userinfo.email != null) && (userinfo.emailVerified == true)); QV('authAppSetupCheck', userinfo.otpsecret == 1); @@ -2139,7 +2144,7 @@ mainUpdate(4 + 128 + 4096); // Check if none or at least 2 factors are enabled. - if ((backupCodesWarningDone == false) && (authFactorCount == 1)) { + if ((backupCodesWarningDone == false) && (authFactorCount == 1) && ((features2 & 0x80000) == 0)) { addNotification({ text: "Please add two-factor backup codes. If the current factor is lost, there is no way to recover this account.", title: "Two factor authentication", tag: 'backupcodes' }); backupCodesWarningDone = true; } @@ -7411,8 +7416,8 @@ var url = serverinfo.altmessenging[i].url.split('{0}').join(currentNode._id.split('/').join('-')); var localurl = url; if (typeof serverinfo.altmessenging[i].localurl == 'string') { localurl = serverinfo.altmessenging[i].localurl.split('{0}').join(currentNode._id.split('/').join('-')); } - meshserver.send({ action: 'msg', type: 'openUrl', nodeid: currentNode._id, url: url }); - safeNewWindow(localurl, 'altmessenger:' + currentNode._id, 'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=400,height=560'); + if (url != '') { meshserver.send({ action: 'msg', type: 'openUrl', nodeid: currentNode._id, url: url }); } + if (localurl != '') { safeNewWindow(localurl, 'altmessenger:' + currentNode._id, 'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=400,height=560'); } } function deviceToggleBackground() { @@ -13341,11 +13346,11 @@ 1: "Account login", 2: "Account logout", 3: "Changed language from {1} to {2}", - 4: "Joined desktop multiplex session", - 5: "Left the desktop multiplex session", - 6: "Started desktop multiplex session", - 7: "Finished recording session, {0} second(s)", - 8: "Closed desktop multiplex session, {0} second(s)", + 4: "Joined desktop multiplex session", // No longer in use, replaced with 143 + 5: "Left the desktop multiplex session", // No longer in use, replaced with 144 + 6: "Started desktop multiplex session", // No longer in use, replaced with 145 + 7: "Finished recording session, {0} second(s)", // No longer in use, replaced with 146 + 8: "Closed desktop multiplex session, {0} second(s)", // No longer in use, replaced with 147 9: "Ended relay session \"{0}\" from {1} to {2}, {3} second(s)", 10: "Ended terminal session \"{0}\" from {1} to {2}, {3} second(s)", 11: "Ended desktop session \"{0}\" from {1} to {2}, {3} second(s)", @@ -13459,7 +13464,7 @@ 119: "This agent is using insecure tunnels, consider updating.", 120: "Started local relay session \"{0}\", protocol {1} to {2}", 121: "Ended local relay session \"{0}\", protocol {1} to {2}, {3} second(s)", - 122: "Left the desktop multiplex session after {0} second(s).", + 122: "Left the desktop multiplex session after {0} second(s).", // No longer in use, replaced with 144 123: "Left Web-SSH session after {0} second(s).", 124: "Left Web-SFTP session after {0} second(s).", 125: "Left Web-RDP session after {0} second(s).", @@ -13479,7 +13484,12 @@ 139: "Added device share {0} recurring weekly.", 140: "Changed device {0} from group {1}: {2}", 141: "Intel(r) AMT policy change", - 142: "Device group {0} was changed: {1}" + 142: "Device group {0} was changed: {1}", + 143: "Joined desktop multiplex session \"{0}\"", + 144: "Left the desktop multiplex session \"{0}\" after {1} second(s).", + 145: "Started desktop multiplex session \"{0}\"", + 146: "Finished recording session \"{0}\", {1} second(s)", + 147: "Closed desktop multiplex session \"{0}\", {1} second(s)" }; var eventsShortMessageId = { diff --git a/webserver.js b/webserver.js index 441065ff..d281de51 100644 --- a/webserver.js +++ b/webserver.js @@ -1144,7 +1144,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF } // Check if email address needs to be confirmed - var emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) + const emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) if (emailcheck && (user.emailVerified !== true)) { parent.debug('web', 'Redirecting using ' + user.name + ' to email check login page'); req.session.messageid = 3; // "Email verification required" message @@ -1165,7 +1165,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF } // Check if email address needs to be confirmed - var emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) + const emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) if (emailcheck && (user.emailVerified !== true)) { parent.debug('web', 'Redirecting using ' + user.name + ' to email check login page'); req.session.messageid = 3; // "Email verification required" message @@ -1459,7 +1459,8 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF if (req.session.loginToken != null) { res.sendStatus(404); return; } // Do not allow this command when logged in using a login token // Check everything is ok - if ((domain == null) || (domain.auth == 'sspi') || (domain.auth == 'ldap') || (typeof req.body.rpassword1 != 'string') || (typeof req.body.rpassword2 != 'string') || (req.body.rpassword1 != req.body.rpassword2) || (typeof req.body.rpasswordhint != 'string') || (req.session == null) || (typeof req.session.resettokenusername != 'string') || (typeof req.session.resettokenpassword != 'string')) { + const allowAccountReset = ((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.allowaccountreset !== false)); + if ((allowAccountReset === false) || (domain == null) || (domain.auth == 'sspi') || (domain.auth == 'ldap') || (typeof req.body.rpassword1 != 'string') || (typeof req.body.rpassword2 != 'string') || (req.body.rpassword1 != req.body.rpassword2) || (typeof req.body.rpasswordhint != 'string') || (req.session == null) || (typeof req.session.resettokenusername != 'string') || (typeof req.session.resettokenpassword != 'string')) { parent.debug('web', 'handleResetPasswordRequest: checks failed'); delete req.session.u2f; delete req.session.loginmode; @@ -1568,7 +1569,8 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF function handleResetAccountRequest(req, res, direct) { const domain = checkUserIpAddress(req, res); if (domain == null) { return; } - if ((domain.auth == 'sspi') || (domain.auth == 'ldap') || (obj.args.lanonly == true) || (obj.parent.certificates.CommonName == null) || (obj.parent.certificates.CommonName.indexOf('.') == -1)) { parent.debug('web', 'handleResetAccountRequest: check failed'); res.sendStatus(404); return; } + const allowAccountReset = ((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.allowaccountreset !== false)); + if ((allowAccountReset === false) || (domain.auth == 'sspi') || (domain.auth == 'ldap') || (obj.args.lanonly == true) || (obj.parent.certificates.CommonName == null) || (obj.parent.certificates.CommonName.indexOf('.') == -1)) { parent.debug('web', 'handleResetAccountRequest: check failed'); res.sendStatus(404); return; } if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL key if (req.session.loginToken != null) { res.sendStatus(404); return; } // Do not allow this command when logged in using a login token @@ -2883,6 +2885,10 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF if (domain.devicesearchbarserverandclientname) { features2 += 0x00008000; } // Search bar will find both server name and client name if (domain.ipkvm) { features2 += 0x00010000; } // Indicates support for IP KVM device groups if ((domain.passwordrequirements) && (domain.passwordrequirements.otp2factor == false)) { features2 += 0x00020000; } // Indicates support for OTP 2FA is disabled + if ((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.backupcode2factor === false)) { features2 += 0x00040000; } // Indicates 2FA backup codes are disabled + if ((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.single2factorwarning === false)) { features2 += 0x00080000; } // Indicates no warning if a single 2FA is in use + if (domain.nightmode === 1) { features2 += 0x00100000; } // Always night mode + if (domain.nightmode === 2) { features2 += 0x00200000; } // Always day mode return { features: features, features2: features2 }; } @@ -2903,7 +2909,8 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF delete req.session.messageid; delete req.session.passhint; } - var emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) + const allowAccountReset = ((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.allowaccountreset !== false)); + const emailcheck = (allowAccountReset && (domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) // Check if we are allowed to create new users using the login screen var newAccountsAllowed = true; @@ -4946,7 +4953,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; } if (domain.agentcustomization.image != null) { meshsettings += 'image=' + domain.agentcustomization.image + '\r\n'; } } - if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; } // Translation strings, not for MeshCentral Assistant + if (domain.agentTranslations != null) { meshsettings += 'translation=' + domain.agentTranslations + '\r\n'; } // Translation strings, not for MeshCentral Assistant } setContentDispositionHeader(res, 'application/octet-stream', meshfilename, null, argentInfo.rname); if (argentInfo.mtime != null) { res.setHeader('Last-Modified', argentInfo.mtime.toUTCString()); } @@ -5318,7 +5325,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; } if (domain.agentcustomization.image != null) { meshsettings += 'image=' + domain.agentcustomization.image + '\r\n'; } } - if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; } + if (domain.agentTranslations != null) { meshsettings += 'translation=' + domain.agentTranslations + '\r\n'; } // Setup the response output var archive = require('archiver')('zip', { level: 5 }); // Sets the compression method. @@ -5419,7 +5426,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF if (domain.agentcustomization.filename != null) { meshsettings += 'fileName=' + domain.agentcustomization.filename + '\r\n'; } if (domain.agentcustomization.image != null) { meshsettings += 'image=' + domain.agentcustomization.image + '\r\n'; } } - if (parent.agentTranslations != null) { meshsettings += 'translation=' + parent.agentTranslations + '\r\n'; } + if (domain.agentTranslations != null) { meshsettings += 'translation=' + domain.agentTranslations + '\r\n'; } return meshsettings; } @@ -6456,7 +6463,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF var user = obj.users[userid]; if ((err == null) && (user)) { // Check if a 2nd factor is needed - var emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) + const emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) // See if we support two-factor trusted cookies var twoFactorCookieDays = 30; @@ -6586,7 +6593,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF // Check if inner authentication is requested if (req.headers['x-meshauth'] === '*') { func(ws, req, domain, null); return; } - var emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) + const emailcheck = ((domain.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName.indexOf('.') != -1) && (obj.args.lanonly != true) && (domain.auth != 'sspi') && (domain.auth != 'ldap')) // A web socket session can be authenticated in many ways (Default user, session, user/pass and cookie). Check authentication here. if ((req.query.user != null) && (req.query.pass != null)) { @@ -7440,6 +7447,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF var mobile = isMobileBrowser(req), minify = (domain.minify == true), p; if (req.query.mobile == '1') { mobile = true; } else if (req.query.mobile == '0') { mobile = false; } if (req.query.minify == '1') { minify = true; } else if (req.query.minify == '0') { minify = false; } + if ((domain != null) && (domain.mobilesite === false)) { mobile = false; } if (mobile) { if ((domain != null) && (domain.webviewspath != null)) { // If the domain has a web views path, use that first if (minify) {