From f1b4d399d263680911ac2b0e68c218591c745ec6 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Wed, 27 May 2020 03:35:43 -0700 Subject: [PATCH] Initial work on cross-domain administrator. --- meshuser.js | 189 ++++++----- sample-config-advanced.json | 3 +- translate/translate.json | 647 ++++++++++++++++++------------------ views/default.handlebars | 37 ++- 4 files changed, 468 insertions(+), 408 deletions(-) diff --git a/meshuser.js b/meshuser.js index eab3f4bf..9679959a 100644 --- a/meshuser.js +++ b/meshuser.js @@ -64,6 +64,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use obj.domain = domain; obj.ws = ws; + // Check if we are a cross-domain administrator + if (parent.parent.config.settings.managecrossdomain && (parent.parent.config.settings.managecrossdomain.indexOf(user._id) >= 0)) { obj.crossDomain = true; } + // Server side Intel AMT stack const WsmanComm = require('./amt/amt-wsman-comm.js'); const Wsman = require('./amt/amt-wsman.js'); @@ -281,7 +284,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Handle events ws.HandleEvent = function (source, event, ids, id) { - if ((event.domain == null) || (event.domain == domain.id)) { + if ((event.domain == null) || (event.domain == domain.id) || (obj.crossDomain === true)) { try { if (event == 'close') { try { delete req.session; } catch (ex) { } obj.close(); } else if (event == 'resubscribe') { user.subscriptions = parent.subscribe(user._id, ws); } @@ -400,7 +403,10 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Send user information to web socket, this is the first thing we send try { var xuserinfo = parent.CloneSafeUser(parent.users[user._id]); - if ((user.siteadmin == 0xFFFFFFFF) && (parent.parent.config.settings.managealldevicegroups.indexOf(user._id) >= 0)) { xuserinfo.manageAllDeviceGroups = true; } + if (user.siteadmin == 0xFFFFFFFF) { + if (parent.parent.config.settings.managealldevicegroups.indexOf(user._id) >= 0) { xuserinfo.manageAllDeviceGroups = true; } + if (obj.crossDomain === true) { xuserinfo.crossDomain = []; for (var i in parent.parent.config.domains) { xuserinfo.crossDomain.push(i); } } + } ws.send(JSON.stringify({ action: 'userinfo', userinfo: xuserinfo })); } catch (ex) { } @@ -1291,9 +1297,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use if ((user.siteadmin & 2) == 0) break; var docs = []; for (i in parent.users) { - if ((parent.users[i].domain == domain.id) && (parent.users[i].name != '~')) { + if (((obj.crossDomain === true) || (parent.users[i].domain == domain.id)) && (parent.users[i].name != '~')) { // If we are part of a user group, we can only see other members of our own group - if ((user.groups == null) || (user.groups.length == 0) || ((parent.users[i].groups != null) && (findOne(parent.users[i].groups, user.groups)))) { + if ((obj.crossDomain === true) || (user.groups == null) || (user.groups.length == 0) || ((parent.users[i].groups != null) && (findOne(parent.users[i].groups, user.groups)))) { docs.push(parent.CloneSafeUser(parent.users[i])); } } @@ -1430,8 +1436,10 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use } case 'deleteuser': { + console.log(command); + // Delete a user account - var err = null, delusersplit, deluserid, deluser; + var err = null, delusersplit, deluserid, deluser, deluserdomain; try { if ((user.siteadmin & 2) == 0) { err = 'Permission denied'; } else if (common.validateString(command.userid, 1, 2048) == false) { err = 'Invalid userid'; } @@ -1440,12 +1448,17 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use deluserid = command.userid; deluser = parent.users[deluserid]; if (deluser == null) { err = 'User does not exists'; } - else if ((delusersplit.length != 3) || (delusersplit[1] != domain.id)) { err = 'Invalid domain'; } // Invalid domain, operation only valid for current domain + else if ((obj.crossDomain !== true) && ((delusersplit.length != 3) || (delusersplit[1] != domain.id))) { err = 'Invalid domain'; } // Invalid domain, operation only valid for current domain else if ((deluser.siteadmin == 0xFFFFFFFF) && (user.siteadmin != 0xFFFFFFFF)) { err = 'Permission denied'; } // Need full admin to remote another administrator - else if ((user.groups != null) && (user.groups.length > 0) && ((deluser.groups == null) || (findOne(deluser.groups, user.groups) == false))) { err = 'Invalid user group'; } // Can only perform this operation on other users of our group. + else if ((obj.crossDomain !== true) && (user.groups != null) && (user.groups.length > 0) && ((deluser.groups == null) || (findOne(deluser.groups, user.groups) == false))) { err = 'Invalid user group'; } // Can only perform this operation on other users of our group. } } catch (ex) { err = 'Validation exception: ' + ex; } + // Get domain + deluserdomain = domain; + if (obj.crossDomain === true) { deluserdomain = parent.parent.config.domains[delusersplit[1]]; } + if (deluserdomain == null) { err = 'Invalid domain'; } + // Handle any errors if (err != null) { if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'deleteuser', responseid: command.responseid, result: err })); } catch (ex) { } } @@ -1464,13 +1477,13 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Notify mesh change change = 'Removed user ' + deluser.name + ' from group ' + mesh.name; - var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id, invite: mesh.invite }; + var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: deluserdomain.id, invite: mesh.invite }; if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the mesh. Another event will come. parent.parent.DispatchEvent(parent.CreateMeshDispatchTargets(mesh, [deluser._id, user._id]), obj, event); } } else if (i.startsWith('node/')) { // Get the node and the rights for this node - parent.GetNodeWithRights(domain, deluser, i, function (node, rights, visible) { + parent.GetNodeWithRights(deluserdomain, deluser, i, function (node, rights, visible) { if ((node == null) || (node.links == null) || (node.links[deluser._id] == null)) return; // Remove the link and save the node to the database @@ -1479,7 +1492,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use db.Set(parent.cleanDevice(node)); // Event the node change - var event = { etype: 'node', userid: user._id, username: user.name, action: 'changenode', nodeid: node._id, domain: domain.id, msg: (command.rights == 0) ? ('Removed user device rights for ' + node.name) : ('Changed user device rights for ' + node.name), node: parent.CloneSafeNode(node) } + var event = { etype: 'node', userid: user._id, username: user.name, action: 'changenode', nodeid: node._id, domain: deluserdomain.id, msg: (command.rights == 0) ? ('Removed user device rights for ' + node.name) : ('Changed user device rights for ' + node.name), node: parent.CloneSafeNode(node) } if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the mesh. Another event will come. parent.parent.DispatchEvent(parent.CreateNodeDispatchTargets(node.meshid, node._id), obj, event); }); @@ -1503,7 +1516,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use var targets = ['*', 'server-users']; if (deluser.groups) { for (var i in deluser.groups) { targets.push('server-users:' + i); } } - parent.parent.DispatchEvent(targets, obj, { etype: 'user', userid: deluserid, username: deluser.name, action: 'accountremove', msg: 'Account removed', domain: domain.id }); + parent.parent.DispatchEvent(targets, obj, { etype: 'user', userid: deluserid, username: deluser.name, action: 'accountremove', msg: 'Account removed', domain: deluserdomain.id }); parent.parent.DispatchEvent([deluserid], obj, 'close'); if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'deleteuser', responseid: command.responseid, result: 'ok' })); } catch (ex) { } } @@ -1634,23 +1647,26 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use if (command.randomPassword === true) { command.pass = getRandomPassword(); } // Add a new user account - var err = null, newusername, newuserid; + var err = null, newusername, newuserid, newuserdomain; try { if ((user.siteadmin & 2) == 0) { err = 'Permission denied'; } - else if ((domain.auth == 'sspi') || (domain.auth == 'ldap')) { err = 'Unable to add user in this mode'; } else if (common.validateUsername(command.username, 1, 256) == false) { err = 'Invalid username'; } // Username is between 1 and 64 characters, no spaces else if ((command.username[0] == '~') || (command.username.indexOf('/') >= 0)) { err = 'Invalid username'; } // Usernames cant' start with ~ and can't have '/' else if (common.validateString(command.pass, 1, 256) == false) { err = 'Invalid password'; } // Password is between 1 and 256 characters else if ((command.randomPassword !== true) && (common.checkPasswordRequirements(command.pass, domain.passwordrequirements) == false)) { err = 'Invalid password'; } // Password does not meet requirements else if ((command.email != null) && (common.validateEmail(command.email, 1, 1024) == false)) { err = 'Invalid email'; } // Check if this is a valid email address + else if ((obj.crossDomain === true) && (command.domain != null) && ((typeof command.domain != 'string') || (parent.parent.config.domains[command.domain] == null))) { err = 'Invalid domain'; } // Check if this is a valid domain else { + newuserdomain = domain; + if ((obj.crossDomain === true) && (command.domain != null)) { newuserdomain = parent.parent.config.domains[command.domain]; } newusername = command.username; - newuserid = 'user/' + domain.id + '/' + command.username.toLowerCase(); + newuserid = 'user/' + newuserdomain.id + '/' + command.username.toLowerCase(); if (command.siteadmin != null) { if ((typeof command.siteadmin != 'number') || (Number.isInteger(command.siteadmin) == false)) { err = 'Invalid site permissions'; } // Check permissions else if ((user.siteadmin != 0xFFFFFFFF) && ((command.siteadmin & (0xFFFFFFFF - 224)) != 0)) { err = 'Invalid site permissions'; } } if (parent.users[newuserid]) { err = 'User already exists'; } // Account already exists + else if ((newuserdomain.auth == 'sspi') || (newuserdomain.auth == 'ldap')) { err = 'Unable to add user in this mode'; } } } catch (ex) { err = 'Validation exception'; } @@ -1666,7 +1682,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use } // Check if we exceed the maximum number of user accounts - db.isMaxType(domain.limits.maxuseraccounts, 'user', domain.id, function (maxExceed) { + db.isMaxType(newuserdomain.limits.maxuseraccounts, 'user', newuserdomain.id, function (maxExceed) { if (maxExceed) { // Account count exceed, do notification if (command.responseid != null) { @@ -1674,21 +1690,21 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use try { ws.send(JSON.stringify({ action: 'adduser', responseid: command.responseid, result: 'maxUsersExceed' })); } catch (ex) { } } else { // Create the notification message - var notification = { action: 'msg', type: 'notify', id: Math.random(), value: "Account limit reached.", title: "Server Limit", userid: user._id, username: user.name, domain: domain.id }; + var notification = { action: 'msg', type: 'notify', id: Math.random(), value: "Account limit reached.", title: "Server Limit", userid: user._id, username: user.name, domain: newuserdomain.id }; // Get the list of sessions for this user var sessions = parent.wssessions[user._id]; - if (sessions != null) { for (i in sessions) { try { if (sessions[i].domainid == domain.id) { sessions[i].send(JSON.stringify(notification)); } } catch (ex) { } } } + if (sessions != null) { for (i in sessions) { try { if (sessions[i].domainid == newuserdomain.id) { sessions[i].send(JSON.stringify(notification)); } } catch (ex) { } } } // TODO: Notify all sessions on other peers. } } else { // Remove any events for this userid - if (command.removeEvents === true) { db.RemoveAllUserEvents(domain.id, newuserid); } + if (command.removeEvents === true) { db.RemoveAllUserEvents(newuserdomain.id, newuserid); } // Create a new user - var newuser = { type: 'user', _id: newuserid, name: newusername, creation: Math.floor(Date.now() / 1000), domain: domain.id }; + var newuser = { type: 'user', _id: newuserid, name: newusername, creation: Math.floor(Date.now() / 1000), domain: newuserdomain.id }; if (command.siteadmin != null) { newuser.siteadmin = command.siteadmin; } - else if (domain.newaccountsrights) { newuser.siteadmin = domain.newaccountsrights; } + else if (newuserdomain.newaccountsrights) { newuser.siteadmin = newuserdomain.newaccountsrights; } if (command.email != null) { newuser.email = command.email.toLowerCase(); if (command.emailVerified === true) { newuser.emailVerified = true; } } // Email if (command.resetNextLogin === true) { newuser.passchange = -1; } else { newuser.passchange = Math.floor(Date.now() / 1000); } if (user.groups) { newuser.groups = user.groups; } // New accounts are automatically part of our groups (Realms). @@ -1705,16 +1721,16 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use var event, targets = ['*', 'server-users']; if (newuser.groups) { for (var i in newuser.groups) { targets.push('server-users:' + i); } } if (command.email == null) { - event = { etype: 'user', userid: newuser._id, username: newusername, account: parent.CloneSafeUser(newuser), action: 'accountcreate', msg: 'Account created, username is ' + command.username, domain: domain.id }; + event = { etype: 'user', userid: newuser._id, username: newusername, account: parent.CloneSafeUser(newuser), action: 'accountcreate', msg: 'Account created, username is ' + command.username, domain: newuserdomain.id }; } else { - event = { etype: 'user', userid: newuser._id, username: newusername, account: parent.CloneSafeUser(newuser), action: 'accountcreate', msg: 'Account created, email is ' + command.email.toLowerCase(), domain: domain.id }; + event = { etype: 'user', userid: newuser._id, username: newusername, account: parent.CloneSafeUser(newuser), action: 'accountcreate', msg: 'Account created, email is ' + command.email.toLowerCase(), domain: newuserdomain.id }; } if (parent.db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to create the user. Another event will come. parent.parent.DispatchEvent(targets, obj, event); // Perform email invitation if ((command.emailInvitation == true) && (command.emailVerified == true) && command.email && parent.parent.mailserver) { - parent.parent.mailserver.sendAccountInviteMail(domain, user.name, newusername, command.email.toLowerCase(), command.pass, parent.getLanguageCodes(req)); + parent.parent.mailserver.sendAccountInviteMail(newuserdomain, user.name, newusername, command.email.toLowerCase(), command.pass, parent.getLanguageCodes(req)); } // Log in the auth log @@ -1732,78 +1748,85 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use } case 'edituser': { + // Must be user administrator or edit self. + if (((user.siteadmin & 2) == 0) && (user._id != command.id)) break; + // Edit a user account, may involve changing email or administrator permissions - if (((user.siteadmin & 2) != 0) || (user._id == command.id)) { - var chguser = parent.users[command.id]; - change = 0; - if (chguser) { - // If the target user is admin and we are not admin, no changes can be made. - if ((chguser.siteadmin == 0xFFFFFFFF) && (user.siteadmin != 0xFFFFFFFF)) return; + var chguser = parent.users[command.id]; + change = 0; + if (chguser) { + // If the target user is admin and we are not admin, no changes can be made. + if ((chguser.siteadmin == 0xFFFFFFFF) && (user.siteadmin != 0xFFFFFFFF)) return; - // Can only perform this operation on other users of our group. - if (user.siteadmin != 0xFFFFFFFF) { - if ((user.groups != null) && (user.groups.length > 0) && ((chguser.groups == null) || (findOne(chguser.groups, user.groups) == false))) return; - } + // Can only perform this operation on other users of our group. + if (user.siteadmin != 0xFFFFFFFF) { + if ((user.groups != null) && (user.groups.length > 0) && ((chguser.groups == null) || (findOne(chguser.groups, user.groups) == false))) return; + } - // Validate and change email - if (domain.usernameisemail !== true) { - if (common.validateString(command.email, 1, 1024) && (chguser.email != command.email)) { chguser.email = command.email.toLowerCase(); change = 1; } - } + // Fetch and validate the user domain + var edituserdomainid = command.id.split('/')[1]; + if ((obj.crossDomain !== true) && (edituserdomainid != domain.id)) break; + var edituserdomain = parent.parent.config.domains[edituserdomainid]; + if (edituserdomain == null) break; - // Make changes - if ((command.emailVerified === true || command.emailVerified === false) && (chguser.emailVerified != command.emailVerified)) { chguser.emailVerified = command.emailVerified; change = 1; } - if ((common.validateInt(command.quota, 0) || command.quota == null) && (command.quota != chguser.quota)) { chguser.quota = command.quota; if (chguser.quota == null) { delete chguser.quota; } change = 1; } - if ((command.consent != null) && (typeof command.consent == 'number')) { if (command.consent == 0) { delete chguser.consent; } else { chguser.consent = command.consent; } change = 1; } - if ((command.phone != null) && (typeof command.phone == 'string') && ((command.phone == '') || isPhoneNumber(command.phone))) { if (command.phone == '') { delete chguser.phone; } else { chguser.phone = command.phone; } change = 1; } + // Validate and change email + if (edituserdomain.usernameisemail !== true) { + if (common.validateString(command.email, 1, 1024) && (chguser.email != command.email)) { chguser.email = command.email.toLowerCase(); change = 1; } + } - // Site admins can change any server rights, user managers can only change AccountLock, NoMeshCmd and NoNewGroups - if (chguser._id !== user._id) { // We can't change our own siteadmin permissions. - var chgusersiteadmin = chguser.siteadmin ? chguser.siteadmin : 0; - if (((user.siteadmin == 0xFFFFFFFF) || ((user.siteadmin & 2) && (((chgusersiteadmin ^ command.siteadmin) & 0xFFFFFF1F) == 0))) && common.validateInt(command.siteadmin) && (chguser.siteadmin != command.siteadmin)) { chguser.siteadmin = command.siteadmin; change = 1; } - } + // Make changes + if ((command.emailVerified === true || command.emailVerified === false) && (chguser.emailVerified != command.emailVerified)) { chguser.emailVerified = command.emailVerified; change = 1; } + if ((common.validateInt(command.quota, 0) || command.quota == null) && (command.quota != chguser.quota)) { chguser.quota = command.quota; if (chguser.quota == null) { delete chguser.quota; } change = 1; } + if ((command.consent != null) && (typeof command.consent == 'number')) { if (command.consent == 0) { delete chguser.consent; } else { chguser.consent = command.consent; } change = 1; } + if ((command.phone != null) && (typeof command.phone == 'string') && ((command.phone == '') || isPhoneNumber(command.phone))) { if (command.phone == '') { delete chguser.phone; } else { chguser.phone = command.phone; } change = 1; } - // When sending a notification about a group change, we need to send to all the previous and new groups. - var allTargetGroups = chguser.groups; - if ((Array.isArray(command.groups)) && ((user._id != command.id) || (user.siteadmin == 0xFFFFFFFF))) { - if (command.groups.length == 0) { - // Remove the user groups - if (chguser.groups != null) { delete chguser.groups; change = 1; } - } else { - // Arrange the user groups - var groups2 = []; - for (var i in command.groups) { - if (typeof command.groups[i] == 'string') { - var gname = command.groups[i].trim().toLowerCase(); - if ((gname.length > 0) && (gname.length <= 64) && (groups2.indexOf(gname) == -1)) { groups2.push(gname); } - } + // Site admins can change any server rights, user managers can only change AccountLock, NoMeshCmd and NoNewGroups + if (chguser._id !== user._id) { // We can't change our own siteadmin permissions. + var chgusersiteadmin = chguser.siteadmin ? chguser.siteadmin : 0; + if (((user.siteadmin == 0xFFFFFFFF) || ((user.siteadmin & 2) && (((chgusersiteadmin ^ command.siteadmin) & 0xFFFFFF1F) == 0))) && common.validateInt(command.siteadmin) && (chguser.siteadmin != command.siteadmin)) { chguser.siteadmin = command.siteadmin; change = 1; } + } + + // When sending a notification about a group change, we need to send to all the previous and new groups. + var allTargetGroups = chguser.groups; + if ((Array.isArray(command.groups)) && ((user._id != command.id) || (user.siteadmin == 0xFFFFFFFF))) { + if (command.groups.length == 0) { + // Remove the user groups + if (chguser.groups != null) { delete chguser.groups; change = 1; } + } else { + // Arrange the user groups + var groups2 = []; + for (var i in command.groups) { + if (typeof command.groups[i] == 'string') { + var gname = command.groups[i].trim().toLowerCase(); + if ((gname.length > 0) && (gname.length <= 64) && (groups2.indexOf(gname) == -1)) { groups2.push(gname); } } - groups2.sort(); - - // Set the user groups (Realms) - if (chguser.groups != groups2) { chguser.groups = groups2; change = 1; } - - // Add any missing groups in the target list - if (allTargetGroups == null) { allTargetGroups = []; } - for (var i in groups2) { if (allTargetGroups.indexOf(i) == -1) { allTargetGroups.push(i); } } } - } + groups2.sort(); - if (change == 1) { - // Update the user - db.SetUser(chguser); - parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe'); + // Set the user groups (Realms) + if (chguser.groups != groups2) { chguser.groups = groups2; change = 1; } - var targets = ['*', 'server-users', user._id, chguser._id]; - if (allTargetGroups) { for (var i in allTargetGroups) { targets.push('server-users:' + i); } } - var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(chguser), action: 'accountchange', msg: 'Account changed: ' + chguser.name, domain: domain.id }; - if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come. - parent.parent.DispatchEvent(targets, obj, event); - } - if ((chguser.siteadmin) && (chguser.siteadmin != 0xFFFFFFFF) && (chguser.siteadmin & 32)) { - // If the user is locked out of this account, disconnect now - parent.parent.DispatchEvent([chguser._id], obj, 'close'); // Disconnect all this user's sessions + // Add any missing groups in the target list + if (allTargetGroups == null) { allTargetGroups = []; } + for (var i in groups2) { if (allTargetGroups.indexOf(i) == -1) { allTargetGroups.push(i); } } } } + + if (change == 1) { + // Update the user + db.SetUser(chguser); + parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe'); + + var targets = ['*', 'server-users', user._id, chguser._id]; + if (allTargetGroups) { for (var i in allTargetGroups) { targets.push('server-users:' + i); } } + var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(chguser), action: 'accountchange', msg: 'Account changed: ' + chguser.name, domain: edituserdomain.id }; + if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come. + parent.parent.DispatchEvent(targets, obj, event); + } + if ((chguser.siteadmin) && (chguser.siteadmin != 0xFFFFFFFF) && (chguser.siteadmin & 32)) { + // If the user is locked out of this account, disconnect now + parent.parent.DispatchEvent([chguser._id], obj, 'close'); // Disconnect all this user's sessions + } } break; } diff --git a/sample-config-advanced.json b/sample-config-advanced.json index a00d2b51..91fdc59d 100644 --- a/sample-config-advanced.json +++ b/sample-config-advanced.json @@ -52,6 +52,8 @@ "_AgentAllowedIP": "192.168.0.100/24", "_AgentBlockedIP": "127.0.0.1,::1", "_AuthLog": "c:\\temp\\auth.log", + "_ManageAllDeviceGroups": [ "user//admin" ], + "_ManageCrossDomain": [ "user//admin" ], "_LocalDiscovery": { "name": "Local server name", "info": "Information about this server" @@ -104,7 +106,6 @@ "_UserNameIsEmail": true, "_NewAccountEmailDomains": [ "sample.com" ], "_NewAccountsRights": [ "nonewgroups", "notools" ], - "_ManageAllDeviceGroups": [ "admin" ], "_WelcomeText": "Sample Text on Login Page.", "_WelcomePicture": "mainwelcome.jpg", "___Hide__": "Sum of: 1 = Hide header, 2 = Hide tab, 4 = Hide footer, 8 = Hide title, 16 = Hide left bar", diff --git a/translate/translate.json b/translate/translate.json index ac829298..38d93762 100644 --- a/translate/translate.json +++ b/translate/translate.json @@ -192,7 +192,7 @@ "zh-chs": " 用戶需要先登錄到該服務器一次,然後才能將其添加到設備組。", "xloc": [ "default.handlebars->25->1258", - "default.handlebars->25->1564" + "default.handlebars->25->1566" ] }, { @@ -619,7 +619,7 @@ "default-mobile.handlebars->9->108", "default-mobile.handlebars->9->284", "default.handlebars->25->1365", - "default.handlebars->25->1709", + "default.handlebars->25->1712", "default.handlebars->25->750" ] }, @@ -669,7 +669,7 @@ "ru": "1 активная сессия", "zh-chs": "1個活動會話", "xloc": [ - "default.handlebars->25->1627" + "default.handlebars->25->1630" ] }, { @@ -731,7 +731,7 @@ "ru": "1 группа", "zh-chs": "1組", "xloc": [ - "default.handlebars->25->1592" + "default.handlebars->25->1595" ] }, { @@ -1131,7 +1131,7 @@ "zh-chs": "啟用第二因素身份驗證", "xloc": [ "default.handlebars->25->1436", - "default.handlebars->25->1614" + "default.handlebars->25->1617" ] }, { @@ -1878,7 +1878,7 @@ "ru": "Доступ к файлам сервера", "zh-chs": "訪問服務器文件", "xloc": [ - "default.handlebars->25->1570" + "default.handlebars->25->1572" ] }, { @@ -2003,7 +2003,7 @@ "zh-chs": "帐户已被锁定", "xloc": [ "default.handlebars->25->1438", - "default.handlebars->25->1567" + "default.handlebars->25->1569" ] }, { @@ -2278,8 +2278,8 @@ "ru": "Добавить устройство", "zh-chs": "添加設備", "xloc": [ - "default.handlebars->25->1544", - "default.handlebars->25->1660" + "default.handlebars->25->1546", + "default.handlebars->25->1663" ] }, { @@ -2314,8 +2314,8 @@ "zh-chs": "添加設備組", "xloc": [ "default.handlebars->25->1290", - "default.handlebars->25->1538", - "default.handlebars->25->1648", + "default.handlebars->25->1540", + "default.handlebars->25->1651", "default.handlebars->25->198" ] }, @@ -2432,7 +2432,7 @@ "ru": "Добавить участие", "zh-chs": "添加會員", "xloc": [ - "default.handlebars->25->1678" + "default.handlebars->25->1681" ] }, { @@ -2524,7 +2524,7 @@ "xloc": [ "default.handlebars->25->1190", "default.handlebars->25->1289", - "default.handlebars->25->1654", + "default.handlebars->25->1657", "default.handlebars->25->572" ] }, @@ -2585,7 +2585,7 @@ "zh-chs": "添加用戶", "xloc": [ "default.handlebars->25->1189", - "default.handlebars->25->1533" + "default.handlebars->25->1535" ] }, { @@ -2619,7 +2619,7 @@ "ru": "Добавить пользователей в группу", "zh-chs": "將用戶添加到用戶組", "xloc": [ - "default.handlebars->25->1566" + "default.handlebars->25->1568" ] }, { @@ -2826,7 +2826,7 @@ "ru": "Области администратора", "zh-chs": "管理領域", "xloc": [ - "default.handlebars->25->1596" + "default.handlebars->25->1599" ] }, { @@ -2861,7 +2861,7 @@ "ru": "Административные области", "zh-chs": "行政領域", "xloc": [ - "default.handlebars->25->1489" + "default.handlebars->25->1491" ] }, { @@ -2989,7 +2989,7 @@ "ru": "Счетчик ошибок агента", "zh-chs": "座席錯誤計數器", "xloc": [ - "default.handlebars->25->1719" + "default.handlebars->25->1722" ] }, { @@ -3058,7 +3058,7 @@ "ru": "Сессии агентов", "zh-chs": "座席會議", "xloc": [ - "default.handlebars->25->1735" + "default.handlebars->25->1738" ] }, { @@ -3181,7 +3181,7 @@ "ru": "Агенты", "zh-chs": "代理商", "xloc": [ - "default.handlebars->25->1748" + "default.handlebars->25->1751" ] }, { @@ -3268,7 +3268,7 @@ "zh-chs": "允許用戶管理此設備組和該組中的設備。", "xloc": [ "default.handlebars->25->1256", - "default.handlebars->25->1563" + "default.handlebars->25->1565" ] }, { @@ -3372,7 +3372,7 @@ "zh-chs": "始終通知", "xloc": [ "default.handlebars->25->1170", - "default.handlebars->25->1605", + "default.handlebars->25->1608", "default.handlebars->25->518" ] }, @@ -3391,7 +3391,7 @@ "zh-chs": "總是提示", "xloc": [ "default.handlebars->25->1171", - "default.handlebars->25->1606", + "default.handlebars->25->1609", "default.handlebars->25->519" ] }, @@ -4001,7 +4001,7 @@ "ru": "Вы уверенны, что {0} плагин: {1}", "zh-chs": "您確定要{0}插件嗎:{1}", "xloc": [ - "default.handlebars->25->1788" + "default.handlebars->25->1791" ] }, { @@ -4097,7 +4097,7 @@ "ru": "Приложение аутентификации", "zh-chs": "身份驗證應用", "xloc": [ - "default.handlebars->25->1609" + "default.handlebars->25->1612" ] }, { @@ -4414,7 +4414,7 @@ "ru": "Резервные коды", "zh-chs": "備用碼", "xloc": [ - "default.handlebars->25->1611" + "default.handlebars->25->1614" ] }, { @@ -4431,7 +4431,7 @@ "ru": "Плохой ключ", "zh-chs": "錯誤的簽名", "xloc": [ - "default.handlebars->25->1726" + "default.handlebars->25->1729" ] }, { @@ -4448,7 +4448,7 @@ "ru": "Плохой веб-сертификат", "zh-chs": "錯誤的網絡證書", "xloc": [ - "default.handlebars->25->1725" + "default.handlebars->25->1728" ] }, { @@ -4586,7 +4586,7 @@ "ru": "Отправить сообщение", "zh-chs": "廣播", "xloc": [ - "default.handlebars->25->1531", + "default.handlebars->25->1533", "default.handlebars->container->column_l->p4->3->1->0->3->1" ] }, @@ -4711,7 +4711,7 @@ "ru": "CIRA Сервер", "zh-chs": "CIRA服務器", "xloc": [ - "default.handlebars->25->1776" + "default.handlebars->25->1779" ] }, { @@ -4728,7 +4728,7 @@ "ru": "CIRA Сервер команды", "zh-chs": "CIRA服務器命令", "xloc": [ - "default.handlebars->25->1777" + "default.handlebars->25->1780" ] }, { @@ -4762,7 +4762,7 @@ "ru": "Загрузка CPU", "zh-chs": "CPU負載", "xloc": [ - "default.handlebars->25->1740" + "default.handlebars->25->1743" ] }, { @@ -4779,7 +4779,7 @@ "ru": "Загрузка CPU за последние 15 минут", "zh-chs": "最近15分鐘的CPU負載", "xloc": [ - "default.handlebars->25->1743" + "default.handlebars->25->1746" ] }, { @@ -4796,7 +4796,7 @@ "ru": "Загрузка CPU за последние 5 минут", "zh-chs": "最近5分鐘的CPU負載", "xloc": [ - "default.handlebars->25->1742" + "default.handlebars->25->1745" ] }, { @@ -4813,7 +4813,7 @@ "ru": "Загрузка CPU за последнюю минуту", "zh-chs": "最後一分鐘的CPU負載", "xloc": [ - "default.handlebars->25->1741" + "default.handlebars->25->1744" ] }, { @@ -4868,7 +4868,7 @@ "ru": "Ошибка вызова", "zh-chs": "通話錯誤", "xloc": [ - "default.handlebars->25->1789" + "default.handlebars->25->1792" ] }, { @@ -5008,7 +5008,7 @@ "ru": "Смена email для {0}", "zh-chs": "更改{0}的電子郵件", "xloc": [ - "default.handlebars->25->1637" + "default.handlebars->25->1640" ] }, { @@ -5046,7 +5046,7 @@ "xloc": [ "default-mobile.handlebars->9->90", "default.handlebars->25->1115", - "default.handlebars->25->1626" + "default.handlebars->25->1629" ] }, { @@ -5063,7 +5063,7 @@ "ru": "Смена пароля для {0}", "zh-chs": "更改{0}的密碼", "xloc": [ - "default.handlebars->25->1644" + "default.handlebars->25->1647" ] }, { @@ -5133,7 +5133,7 @@ "ru": "Изменить пароль для этого пользователя", "zh-chs": "更改該用戶的密碼", "xloc": [ - "default.handlebars->25->1625" + "default.handlebars->25->1628" ] }, { @@ -5338,7 +5338,7 @@ "ru": "Проверка...", "zh-chs": "檢查...", "xloc": [ - "default.handlebars->25->1783", + "default.handlebars->25->1786", "default.handlebars->25->888" ] }, @@ -5554,7 +5554,7 @@ "nl": "Wis alle meldingen", "zh-chs": "全部清除", "xloc": [ - "default.handlebars->25->1713" + "default.handlebars->25->1716" ] }, { @@ -5604,7 +5604,7 @@ "ru": "Очистить это уведомление", "zh-chs": "清除此通知", "xloc": [ - "default.handlebars->25->1712" + "default.handlebars->25->1715" ] }, { @@ -5680,7 +5680,7 @@ "nl": "Klik hier om de gebruikersgroepsnaam te bewerken", "zh-chs": "单击此处编辑用户组名称", "xloc": [ - "default.handlebars->25->1523" + "default.handlebars->25->1525" ] }, { @@ -5855,8 +5855,8 @@ "ru": "Общие группы устройств", "zh-chs": "通用設備組", "xloc": [ - "default.handlebars->25->1539", - "default.handlebars->25->1649" + "default.handlebars->25->1541", + "default.handlebars->25->1652" ] }, { @@ -5873,8 +5873,8 @@ "ru": "Общие устройства", "zh-chs": "通用設備", "xloc": [ - "default.handlebars->25->1545", - "default.handlebars->25->1661" + "default.handlebars->25->1547", + "default.handlebars->25->1664" ] }, { @@ -5913,9 +5913,9 @@ "default-mobile.handlebars->9->387", "default.handlebars->25->1235", "default.handlebars->25->1448", - "default.handlebars->25->1515", - "default.handlebars->25->1559", - "default.handlebars->25->1647", + "default.handlebars->25->1517", + "default.handlebars->25->1561", + "default.handlebars->25->1650", "default.handlebars->25->408", "default.handlebars->25->647", "default.handlebars->25->656" @@ -5999,7 +5999,7 @@ "nl": "Bevestig verwijdering geselecteerde gebruikersgroep(en)?", "zh-chs": "确认删除选定的用户组?", "xloc": [ - "default.handlebars->25->1514" + "default.handlebars->25->1516" ] }, { @@ -6016,7 +6016,7 @@ "ru": "Подтвердить удаление пользователя {0}?", "zh-chs": "確認刪除用戶{0}?", "xloc": [ - "default.handlebars->25->1646" + "default.handlebars->25->1649" ] }, { @@ -6030,7 +6030,7 @@ "nl": "Bevestig lidmaatschap verwijderen van gebruiker \\\"{0}\\\"?", "zh-chs": "确认删除用户\\“ {0} \\”的成员身份?", "xloc": [ - "default.handlebars->25->1562" + "default.handlebars->25->1564" ] }, { @@ -6044,7 +6044,7 @@ "nl": "Bevestig lidmaatschap verwijdering van gebruikergroep \\\"{0}\\\"?", "zh-chs": "确认删除用户组 “{0}” 的成员身份?", "xloc": [ - "default.handlebars->25->1676" + "default.handlebars->25->1679" ] }, { @@ -6111,8 +6111,8 @@ "nl": "Bevestig verwijdering van toegangsrechten voor apparaat \\\"{0}\\\"?", "zh-chs": "确认删除设备“ {0} ”的访问权限?", "xloc": [ - "default.handlebars->25->1552", - "default.handlebars->25->1667" + "default.handlebars->25->1554", + "default.handlebars->25->1670" ] }, { @@ -6126,8 +6126,8 @@ "nl": "Bevestig verwijdering van toegangsrechten voor apparaatgroep \\\"{0}\\\"?", "zh-chs": "是否确认删除设备组“ {0}”的访问权限?", "xloc": [ - "default.handlebars->25->1554", - "default.handlebars->25->1680" + "default.handlebars->25->1556", + "default.handlebars->25->1683" ] }, { @@ -6141,7 +6141,7 @@ "nl": "Bevestig verwijdering van toegangsrechten voor gebruiker \\\"{0}\\\"?", "zh-chs": "确认删除用户\\“ {0} \\”的访问权限?", "xloc": [ - "default.handlebars->25->1669" + "default.handlebars->25->1672" ] }, { @@ -6155,7 +6155,7 @@ "nl": "Bevestig verwijdering van toegangsrechten voor gebruikergroep \\\"{0}\\\"?", "zh-chs": "确认删除用户组“ {0}”的访问权限?", "xloc": [ - "default.handlebars->25->1672" + "default.handlebars->25->1675" ] }, { @@ -6169,8 +6169,8 @@ "nl": "Verwijdering van toegangsrechten bevestigen?", "zh-chs": "确认删除访问权限?", "xloc": [ - "default.handlebars->25->1670", - "default.handlebars->25->1673" + "default.handlebars->25->1673", + "default.handlebars->25->1676" ] }, { @@ -6417,7 +6417,7 @@ "ru": "Подключено Intel® AMT", "zh-chs": "連接的英特爾®AMT", "xloc": [ - "default.handlebars->25->1731" + "default.handlebars->25->1734" ] }, { @@ -6434,7 +6434,7 @@ "ru": "Подключенные пользователи", "zh-chs": "關聯用戶", "xloc": [ - "default.handlebars->25->1736" + "default.handlebars->25->1739" ] }, { @@ -6511,7 +6511,7 @@ "ru": "Подключений ", "zh-chs": "連接數", "xloc": [ - "default.handlebars->25->1747" + "default.handlebars->25->1750" ] }, { @@ -6528,7 +6528,7 @@ "ru": "Ретранслятор подключения", "zh-chs": "連接繼電器", "xloc": [ - "default.handlebars->25->1775" + "default.handlebars->25->1778" ] }, { @@ -6655,7 +6655,7 @@ "ru": "Cookie-кодировщик", "zh-chs": "Cookie編碼器", "xloc": [ - "default.handlebars->25->1761" + "default.handlebars->25->1764" ] }, { @@ -6960,7 +6960,7 @@ "ru": "Основной сервер", "zh-chs": "核心服務器", "xloc": [ - "default.handlebars->25->1760" + "default.handlebars->25->1763" ] }, { @@ -6994,7 +6994,7 @@ "ru": "Создать учетную запись", "zh-chs": "創建帳號", "xloc": [ - "default.handlebars->25->1485", + "default.handlebars->25->1487", "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" ] @@ -7030,7 +7030,7 @@ "ru": "Создать группу пользователей", "zh-chs": "創建用戶組", "xloc": [ - "default.handlebars->25->1520" + "default.handlebars->25->1522" ] }, { @@ -7116,7 +7116,7 @@ "ru": "Создано", "zh-chs": "創建", "xloc": [ - "default.handlebars->25->1585" + "default.handlebars->25->1588" ] }, { @@ -7433,6 +7433,12 @@ "default.handlebars->25->368" ] }, + { + "en": "Default", + "xloc": [ + "default.handlebars->25->1474" + ] + }, { "cs": "Smazat", "de": "Löschen", @@ -7581,7 +7587,7 @@ "ru": "Удалить пользователя", "zh-chs": "刪除用戶", "xloc": [ - "default.handlebars->25->1624" + "default.handlebars->25->1627" ] }, { @@ -7598,8 +7604,8 @@ "ru": "Удалить группу пользователей", "zh-chs": "刪除用戶組", "xloc": [ - "default.handlebars->25->1550", - "default.handlebars->25->1560" + "default.handlebars->25->1552", + "default.handlebars->25->1562" ] }, { @@ -7613,7 +7619,7 @@ "nl": "Gebruikersgroepen verwijderen", "zh-chs": "删除用户组", "xloc": [ - "default.handlebars->25->1516" + "default.handlebars->25->1518" ] }, { @@ -7630,7 +7636,7 @@ "ru": "Удалить пользователя {0}", "zh-chs": "刪除用戶{0}", "xloc": [ - "default.handlebars->25->1645" + "default.handlebars->25->1648" ] }, { @@ -7680,7 +7686,7 @@ "nl": "Verwijder groep", "zh-chs": "删除群组", "xloc": [ - "default.handlebars->25->1512" + "default.handlebars->25->1514" ] }, { @@ -7734,7 +7740,7 @@ "ru": "Удалить группу пользователей {0}?", "zh-chs": "刪除用戶組{0}?", "xloc": [ - "default.handlebars->25->1558" + "default.handlebars->25->1560" ] }, { @@ -7871,10 +7877,10 @@ "default.handlebars->25->1127", "default.handlebars->25->1155", "default.handlebars->25->1238", - "default.handlebars->25->1519", - "default.handlebars->25->1526", - "default.handlebars->25->1527", - "default.handlebars->25->1556", + "default.handlebars->25->1521", + "default.handlebars->25->1528", + "default.handlebars->25->1529", + "default.handlebars->25->1558", "default.handlebars->25->477", "default.handlebars->25->478", "default.handlebars->25->688", @@ -7913,7 +7919,7 @@ "xloc": [ "default-mobile.handlebars->9->245", "default.handlebars->25->1243", - "default.handlebars->25->1690", + "default.handlebars->25->1693", "default.handlebars->25->444", "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevDesktop", "default.handlebars->contextMenu->cxdesktop" @@ -7951,7 +7957,7 @@ "zh-chs": "桌面通知", "xloc": [ "default.handlebars->25->1165", - "default.handlebars->25->1600", + "default.handlebars->25->1603", "default.handlebars->25->513" ] }, @@ -7970,7 +7976,7 @@ "zh-chs": "桌面提示", "xloc": [ "default.handlebars->25->1164", - "default.handlebars->25->1599", + "default.handlebars->25->1602", "default.handlebars->25->512" ] }, @@ -7989,7 +7995,7 @@ "zh-chs": "桌面提示+工具欄", "xloc": [ "default.handlebars->25->1162", - "default.handlebars->25->1597", + "default.handlebars->25->1600", "default.handlebars->25->510" ] }, @@ -8022,7 +8028,7 @@ "zh-chs": "桌面工具欄", "xloc": [ "default.handlebars->25->1163", - "default.handlebars->25->1598", + "default.handlebars->25->1601", "default.handlebars->25->511" ] }, @@ -8095,7 +8101,7 @@ "zh-chs": "設備", "xloc": [ "default.handlebars->25->1265", - "default.handlebars->25->1664", + "default.handlebars->25->1667", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSort->sortselect->5" ] }, @@ -8134,10 +8140,10 @@ "default.handlebars->25->1260", "default.handlebars->25->1263", "default.handlebars->25->1264", - "default.handlebars->25->1542", - "default.handlebars->25->1548", - "default.handlebars->25->1652", - "default.handlebars->25->1699" + "default.handlebars->25->1544", + "default.handlebars->25->1550", + "default.handlebars->25->1655", + "default.handlebars->25->1702" ] }, { @@ -8174,10 +8180,10 @@ "xloc": [ "default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->3", "default.handlebars->25->1414", - "default.handlebars->25->1506", - "default.handlebars->25->1529", - "default.handlebars->25->1594", - "default.handlebars->25->1734", + "default.handlebars->25->1508", + "default.handlebars->25->1531", + "default.handlebars->25->1597", + "default.handlebars->25->1737", "default.handlebars->container->column_l->p2->p2info->7" ] }, @@ -8237,7 +8243,7 @@ "zh-chs": "設備名稱", "xloc": [ "default-mobile.handlebars->9->267", - "default.handlebars->25->1698", + "default.handlebars->25->1701", "default.handlebars->25->244", "default.handlebars->25->686", "player.handlebars->3->9" @@ -8617,8 +8623,8 @@ "nl": "Apparaten", "zh-chs": "设备", "xloc": [ - "default.handlebars->25->1507", - "default.handlebars->25->1530" + "default.handlebars->25->1509", + "default.handlebars->25->1532" ] }, { @@ -8804,6 +8810,12 @@ "default.handlebars->25->1219" ] }, + { + "en": "Domain", + "xloc": [ + "default.handlebars->25->1475" + ] + }, { "en": "Don't configure", "es": "No configurar", @@ -9249,7 +9261,7 @@ "nl": "Dubbele agent", "zh-chs": "代理重复", "xloc": [ - "default.handlebars->25->1730" + "default.handlebars->25->1733" ] }, { @@ -9283,7 +9295,7 @@ "ru": "Скопировать группу пользователей", "zh-chs": "重複的用戶組", "xloc": [ - "default.handlebars->25->1521" + "default.handlebars->25->1523" ] }, { @@ -9314,8 +9326,8 @@ "ru": "Длительность", "zh-chs": "持續時間", "xloc": [ - "default.handlebars->25->1684", - "default.handlebars->25->1704", + "default.handlebars->25->1687", + "default.handlebars->25->1707", "player.handlebars->3->2" ] }, @@ -9800,7 +9812,7 @@ "ru": "Редактировать группу пользователей", "zh-chs": "編輯用戶組", "xloc": [ - "default.handlebars->25->1557" + "default.handlebars->25->1559" ] }, { @@ -9849,11 +9861,11 @@ "zh-chs": "電子郵件", "xloc": [ "default-mobile.handlebars->9->78", - "default.handlebars->25->1475", - "default.handlebars->25->1579", - "default.handlebars->25->1580", - "default.handlebars->25->1619", - "default.handlebars->25->1633", + "default.handlebars->25->1477", + "default.handlebars->25->1582", + "default.handlebars->25->1583", + "default.handlebars->25->1622", + "default.handlebars->25->1636", "default.handlebars->25->292", "login-mobile.handlebars->5->42", "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3", @@ -9987,7 +9999,7 @@ "zh-chs": "電子郵件已驗證", "xloc": [ "default.handlebars->25->1434", - "default.handlebars->25->1576" + "default.handlebars->25->1578" ] }, { @@ -10004,7 +10016,7 @@ "ru": "Email подтвержден.", "zh-chs": "電子郵件已驗證。", "xloc": [ - "default.handlebars->25->1481" + "default.handlebars->25->1483" ] }, { @@ -10021,7 +10033,7 @@ "ru": "Email не подтвержден", "zh-chs": "電子郵件未驗證", "xloc": [ - "default.handlebars->25->1577" + "default.handlebars->25->1579" ] }, { @@ -10060,7 +10072,7 @@ "en": "Email verified and forced password reset required.", "nl": "E-mail geverifieerd en geforceerd opnieuw instellen van wachtwoord vereist.", "xloc": [ - "default.handlebars->25->1482" + "default.handlebars->25->1484" ] }, { @@ -10073,7 +10085,7 @@ "nl": "Email/SMS verkeer", "zh-chs": "电子邮件/短信流量", "xloc": [ - "default.handlebars->25->1769" + "default.handlebars->25->1772" ] }, { @@ -10171,7 +10183,7 @@ "en": "Enabled", "nl": "Ingeschakeld", "xloc": [ - "default.handlebars->25->1706" + "default.handlebars->25->1709" ] }, { @@ -10195,7 +10207,7 @@ "en": "End Time", "nl": "Eindtijd", "xloc": [ - "default.handlebars->25->1703" + "default.handlebars->25->1706" ] }, { @@ -10451,7 +10463,7 @@ "ru": "Введите разделенный запятыми список имен административных областей.", "zh-chs": "輸入管理領域名稱的逗號分隔列表。", "xloc": [ - "default.handlebars->25->1486" + "default.handlebars->25->1488" ] }, { @@ -10758,7 +10770,7 @@ "ru": "Внешний", "zh-chs": "外部", "xloc": [ - "default.handlebars->25->1754" + "default.handlebars->25->1757" ] }, { @@ -10964,7 +10976,7 @@ "default-mobile.handlebars->9->165", "default-mobile.handlebars->9->246", "default.handlebars->25->1250", - "default.handlebars->25->1691", + "default.handlebars->25->1694", "default.handlebars->25->218", "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevFiles", "default.handlebars->contextMenu->cxfiles" @@ -11002,7 +11014,7 @@ "zh-chs": "文件通知", "xloc": [ "default.handlebars->25->1169", - "default.handlebars->25->1604", + "default.handlebars->25->1607", "default.handlebars->25->517" ] }, @@ -11021,7 +11033,7 @@ "zh-chs": "文件提示", "xloc": [ "default.handlebars->25->1168", - "default.handlebars->25->1603", + "default.handlebars->25->1606", "default.handlebars->25->516" ] }, @@ -11182,8 +11194,8 @@ "ru": "Принудительно сбросить пароль при следующем входе в систему.", "zh-chs": "下次登錄時強制重置密碼。", "xloc": [ - "default.handlebars->25->1480", - "default.handlebars->25->1642" + "default.handlebars->25->1482", + "default.handlebars->25->1645" ] }, { @@ -11269,8 +11281,8 @@ "ru": "Свободно", "zh-chs": "自由", "xloc": [ - "default.handlebars->25->1715", - "default.handlebars->25->1717" + "default.handlebars->25->1718", + "default.handlebars->25->1720" ] }, { @@ -11464,7 +11476,7 @@ "default-mobile.handlebars->9->410", "default.handlebars->25->1136", "default.handlebars->25->1268", - "default.handlebars->25->1492" + "default.handlebars->25->1494" ] }, { @@ -11564,7 +11576,7 @@ "ru": "Администратор с полным доступом", "zh-chs": "正式管理員", "xloc": [ - "default.handlebars->25->1571" + "default.handlebars->25->1573" ] }, { @@ -11996,7 +12008,7 @@ "zh-chs": "集體行動", "xloc": [ "default.handlebars->25->1446", - "default.handlebars->25->1513", + "default.handlebars->25->1515", "default.handlebars->25->406", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->devListToolbar", "default.handlebars->container->column_l->p4->3->1->0->3->3", @@ -12017,7 +12029,7 @@ "ru": "Члены группы", "zh-chs": "小組成員", "xloc": [ - "default.handlebars->25->1534" + "default.handlebars->25->1536" ] }, { @@ -12189,7 +12201,7 @@ "ru": "Всего кучи", "zh-chs": "堆總數", "xloc": [ - "default.handlebars->25->1756" + "default.handlebars->25->1759" ] }, { @@ -12206,7 +12218,7 @@ "ru": "Куча используется", "zh-chs": "堆使用", "xloc": [ - "default.handlebars->25->1755" + "default.handlebars->25->1758" ] }, { @@ -12997,8 +13009,8 @@ "xloc": [ "default.handlebars->25->1352", "default.handlebars->25->1360", - "default.handlebars->25->1752", - "default.handlebars->25->1774" + "default.handlebars->25->1755", + "default.handlebars->25->1777" ] }, { @@ -13039,14 +13051,14 @@ "en": "Intel AMT Redirection", "nl": "Intel AMT omleiding", "xloc": [ - "default.handlebars->25->1693" + "default.handlebars->25->1696" ] }, { "en": "Intel AMT WSMAN", "nl": "Intel AMT WSMAN", "xloc": [ - "default.handlebars->25->1692" + "default.handlebars->25->1695" ] }, { @@ -13731,7 +13743,7 @@ "ru": "Некорректный тип группы устройств", "zh-chs": "無效的設備組類型", "xloc": [ - "default.handlebars->25->1729" + "default.handlebars->25->1732" ] }, { @@ -13748,7 +13760,7 @@ "ru": "Некорректный JSON", "zh-chs": "無效的JSON", "xloc": [ - "default.handlebars->25->1723" + "default.handlebars->25->1726" ] }, { @@ -13800,7 +13812,7 @@ "ru": "Некорректная сигнатура PKCS", "zh-chs": "無效的PKCS簽名", "xloc": [ - "default.handlebars->25->1721" + "default.handlebars->25->1724" ] }, { @@ -13817,7 +13829,7 @@ "ru": "Некорректная сигнатура RSA", "zh-chs": "無效的RSA密碼", "xloc": [ - "default.handlebars->25->1722" + "default.handlebars->25->1725" ] }, { @@ -14644,7 +14656,7 @@ "ru": "Последний вход в систему", "zh-chs": "上次登錄", "xloc": [ - "default.handlebars->25->1586" + "default.handlebars->25->1589" ] }, { @@ -14707,7 +14719,7 @@ "ru": "Последнее изменение: {0}", "zh-chs": "上次更改:{0}", "xloc": [ - "default.handlebars->25->1590" + "default.handlebars->25->1593" ] }, { @@ -14874,7 +14886,7 @@ "nl": "Leeg laten voor geen.", "zh-chs": "一无所有。", "xloc": [ - "default.handlebars->25->1630" + "default.handlebars->25->1633" ] }, { @@ -14913,7 +14925,7 @@ "ru": "Меньше", "zh-chs": "減", "xloc": [ - "default.handlebars->25->1791" + "default.handlebars->25->1794" ] }, { @@ -15458,7 +15470,7 @@ "ru": "Заблокировать учетную запись", "zh-chs": "鎖定賬戶", "xloc": [ - "default.handlebars->25->1499" + "default.handlebars->25->1501" ] }, { @@ -15509,7 +15521,7 @@ "ru": "Заблокированная учетная запись", "zh-chs": "賬戶鎖定", "xloc": [ - "default.handlebars->25->1568" + "default.handlebars->25->1570" ] }, { @@ -16022,7 +16034,7 @@ "ru": "Сообщения главного сервера", "zh-chs": "主服務器消息", "xloc": [ - "default.handlebars->25->1763" + "default.handlebars->25->1766" ] }, { @@ -16154,7 +16166,7 @@ "en": "Manage Recordings", "nl": "Beheeer opnames", "xloc": [ - "default.handlebars->25->1498" + "default.handlebars->25->1500" ] }, { @@ -16188,7 +16200,7 @@ "ru": "Управление группами пользователя", "zh-chs": "管理用戶組", "xloc": [ - "default.handlebars->25->1497" + "default.handlebars->25->1499" ] }, { @@ -16205,7 +16217,7 @@ "ru": "Управление пользователями", "zh-chs": "管理用戶", "xloc": [ - "default.handlebars->25->1496", + "default.handlebars->25->1498", "default.handlebars->25->597" ] }, @@ -16448,7 +16460,7 @@ "ru": "Достигнуто максимальное число сессий", "zh-chs": "達到的會話數上限", "xloc": [ - "default.handlebars->25->1727" + "default.handlebars->25->1730" ] }, { @@ -16502,7 +16514,7 @@ "ru": "Мегабайт", "zh-chs": "兆字節", "xloc": [ - "default.handlebars->25->1753" + "default.handlebars->25->1756" ] }, { @@ -16520,7 +16532,7 @@ "zh-chs": "記憶", "xloc": [ "default-mobile.handlebars->9->366", - "default.handlebars->25->1744", + "default.handlebars->25->1747", "default.handlebars->25->842", "default.handlebars->container->column_l->p40->3->1->p40type->3" ] @@ -16658,7 +16670,7 @@ "ru": "Трафик MeshAgent", "zh-chs": "MeshAgent流量", "xloc": [ - "default.handlebars->25->1765" + "default.handlebars->25->1768" ] }, { @@ -16675,7 +16687,7 @@ "ru": "Обновление MeshAgent", "zh-chs": "MeshAgent更新", "xloc": [ - "default.handlebars->25->1766" + "default.handlebars->25->1769" ] }, { @@ -16778,7 +16790,7 @@ "ru": "Соединения сервера MeshCentral", "zh-chs": "MeshCentral服務器對等", "xloc": [ - "default.handlebars->25->1764" + "default.handlebars->25->1767" ] }, { @@ -17042,7 +17054,7 @@ "ru": "Диспетчер сообщения", "zh-chs": "郵件調度程序", "xloc": [ - "default.handlebars->25->1762" + "default.handlebars->25->1765" ] }, { @@ -17191,7 +17203,7 @@ "ru": "Еще", "zh-chs": "更多", "xloc": [ - "default.handlebars->25->1790" + "default.handlebars->25->1793" ] }, { @@ -17267,7 +17279,7 @@ "en": "Multiplexor", "nl": "Multiplexor", "xloc": [ - "default.handlebars->25->1705" + "default.handlebars->25->1708" ] }, { @@ -17539,11 +17551,11 @@ "default.handlebars->25->1154", "default.handlebars->25->1237", "default.handlebars->25->1413", - "default.handlebars->25->1504", - "default.handlebars->25->1518", - "default.handlebars->25->1525", - "default.handlebars->25->1555", - "default.handlebars->25->1574", + "default.handlebars->25->1506", + "default.handlebars->25->1520", + "default.handlebars->25->1527", + "default.handlebars->25->1557", + "default.handlebars->25->1576", "default.handlebars->25->467", "default.handlebars->25->717", "default.handlebars->25->77", @@ -17585,7 +17597,7 @@ "ru": "Имя1, Имя2, Имя3", "zh-chs": "名稱1,名稱2,名稱3", "xloc": [ - "default.handlebars->25->1488" + "default.handlebars->25->1490" ] }, { @@ -17939,7 +17951,7 @@ "zh-chs": "找不到活動", "xloc": [ "default.handlebars->25->1403", - "default.handlebars->25->1681", + "default.handlebars->25->1684", "default.handlebars->25->788" ] }, @@ -18083,7 +18095,7 @@ "ru": "Нет членов", "zh-chs": "沒有會員", "xloc": [ - "default.handlebars->25->1537" + "default.handlebars->25->1539" ] }, { @@ -18100,7 +18112,7 @@ "ru": "Запретить создание групп устройств", "zh-chs": "沒有新的設備組", "xloc": [ - "default.handlebars->25->1500" + "default.handlebars->25->1502" ] }, { @@ -18216,7 +18228,7 @@ "ru": "Нет инструментов (MeshCmd/Router)", "zh-chs": "沒有工具(MeshCmd /路由器)", "xloc": [ - "default.handlebars->25->1501" + "default.handlebars->25->1503" ] }, { @@ -18233,8 +18245,8 @@ "ru": "Нет общих групп устройств", "zh-chs": "沒有共同的設備組", "xloc": [ - "default.handlebars->25->1543", - "default.handlebars->25->1653" + "default.handlebars->25->1545", + "default.handlebars->25->1656" ] }, { @@ -18330,8 +18342,8 @@ "ru": "Нет общих устройств", "zh-chs": "沒有共同的設備", "xloc": [ - "default.handlebars->25->1549", - "default.handlebars->25->1665" + "default.handlebars->25->1551", + "default.handlebars->25->1668" ] }, { @@ -18418,7 +18430,7 @@ "ru": "Группы не найдены.", "zh-chs": "找不到群組。", "xloc": [ - "default.handlebars->25->1503" + "default.handlebars->25->1505" ] }, { @@ -18521,7 +18533,7 @@ "ru": "Нет серверных прав", "zh-chs": "沒有服務器權限", "xloc": [ - "default.handlebars->25->1569" + "default.handlebars->25->1571" ] }, { @@ -18538,7 +18550,7 @@ "ru": "Нет членства в группах пользователей", "zh-chs": "沒有用戶組成員身份", "xloc": [ - "default.handlebars->25->1659" + "default.handlebars->25->1662" ] }, { @@ -18640,13 +18652,13 @@ "default.handlebars->25->1179", "default.handlebars->25->1354", "default.handlebars->25->1373", - "default.handlebars->25->1522", "default.handlebars->25->1524", + "default.handlebars->25->1526", "default.handlebars->25->158", - "default.handlebars->25->1582", - "default.handlebars->25->1591", - "default.handlebars->25->1595", - "default.handlebars->25->1607", + "default.handlebars->25->1585", + "default.handlebars->25->1594", + "default.handlebars->25->1598", + "default.handlebars->25->1610", "default.handlebars->25->174", "default.handlebars->25->175", "default.handlebars->25->464", @@ -18806,7 +18818,7 @@ "en": "Not on server", "nl": "Niet op de server", "xloc": [ - "default.handlebars->25->1697" + "default.handlebars->25->1700" ] }, { @@ -18823,7 +18835,7 @@ "ru": "Не задано", "zh-chs": "沒有設置", "xloc": [ - "default.handlebars->25->1575" + "default.handlebars->25->1577" ] }, { @@ -18840,7 +18852,7 @@ "ru": "не подтверждено", "zh-chs": "未經審核的", "xloc": [ - "default.handlebars->25->1635" + "default.handlebars->25->1638" ] }, { @@ -18858,7 +18870,7 @@ "zh-chs": "筆記", "xloc": [ "default.handlebars->25->1187", - "default.handlebars->25->1615", + "default.handlebars->25->1618", "default.handlebars->25->536", "default.handlebars->25->590", "default.handlebars->25->609", @@ -18966,7 +18978,7 @@ "ru": "Уведомить", "zh-chs": "通知", "xloc": [ - "default.handlebars->25->1621" + "default.handlebars->25->1624" ] }, { @@ -19080,7 +19092,7 @@ "ru": "Произошло в {0}", "zh-chs": "發生在{0}", "xloc": [ - "default.handlebars->25->1711" + "default.handlebars->25->1714" ] }, { @@ -19325,7 +19337,7 @@ "xloc": [ "default-mobile.handlebars->9->253", "default.handlebars->25->1442", - "default.handlebars->25->1511", + "default.handlebars->25->1513", "default.handlebars->25->398", "default.handlebars->25->629" ] @@ -19564,7 +19576,7 @@ "ru": "Частичные права", "zh-chs": "部分權利", "xloc": [ - "default.handlebars->25->1572" + "default.handlebars->25->1574" ] }, { @@ -19599,12 +19611,12 @@ "zh-chs": "密碼", "xloc": [ "default-mobile.handlebars->9->258", - "default.handlebars->25->1476", - "default.handlebars->25->1477", - "default.handlebars->25->1587", - "default.handlebars->25->1589", - "default.handlebars->25->1638", - "default.handlebars->25->1639", + "default.handlebars->25->1478", + "default.handlebars->25->1479", + "default.handlebars->25->1590", + "default.handlebars->25->1592", + "default.handlebars->25->1641", + "default.handlebars->25->1642", "default.handlebars->25->249", "default.handlebars->25->278", "default.handlebars->25->635" @@ -19713,7 +19725,7 @@ "ru": "Подсказка пароля", "zh-chs": "密碼提示", "xloc": [ - "default.handlebars->25->1640" + "default.handlebars->25->1643" ] }, { @@ -20035,7 +20047,7 @@ "default-mobile.handlebars->9->65", "default-mobile.handlebars->9->67", "default.handlebars->25->143", - "default.handlebars->25->1632", + "default.handlebars->25->1635", "default.handlebars->25->868", "default.handlebars->25->871" ] @@ -20050,7 +20062,7 @@ "nl": "Telefoonnummer", "zh-chs": "电话号码", "xloc": [ - "default.handlebars->25->1581" + "default.handlebars->25->1584" ] }, { @@ -20064,7 +20076,7 @@ "zh-chs": "电话号码:", "xloc": [ "default-mobile.handlebars->9->66", - "default.handlebars->25->1631", + "default.handlebars->25->1634", "default.handlebars->25->870" ] }, @@ -20201,7 +20213,7 @@ "zh-chs": "插件動作", "xloc": [ "default.handlebars->25->169", - "default.handlebars->25->1787" + "default.handlebars->25->1790" ] }, { @@ -20519,7 +20531,7 @@ "en": "Present on server", "nl": "Aanwezig op de server", "xloc": [ - "default.handlebars->25->1696" + "default.handlebars->25->1699" ] }, { @@ -20633,7 +20645,7 @@ "ru": "Протокол", "zh-chs": "協議", "xloc": [ - "default.handlebars->25->1694", + "default.handlebars->25->1697", "player.handlebars->3->15" ] }, @@ -20941,7 +20953,7 @@ "ru": "RSS", "zh-chs": "的RSS", "xloc": [ - "default.handlebars->25->1757" + "default.handlebars->25->1760" ] }, { @@ -20958,7 +20970,7 @@ "ru": "Случайный пароль.", "zh-chs": "隨機化密碼。", "xloc": [ - "default.handlebars->25->1478" + "default.handlebars->25->1480" ] }, { @@ -21009,7 +21021,7 @@ "ru": "Области", "zh-chs": "境界", "xloc": [ - "default.handlebars->25->1487" + "default.handlebars->25->1489" ] }, { @@ -21036,7 +21048,7 @@ "en": "Recording Details", "nl": "Opname details", "xloc": [ - "default.handlebars->25->1708" + "default.handlebars->25->1711" ] }, { @@ -21160,7 +21172,7 @@ "ru": "Число ретрансляций", "zh-chs": "中繼計數", "xloc": [ - "default.handlebars->25->1739" + "default.handlebars->25->1742" ] }, { @@ -21177,7 +21189,7 @@ "ru": "Ошибки ретранслятора", "zh-chs": "中繼錯誤", "xloc": [ - "default.handlebars->25->1732" + "default.handlebars->25->1735" ] }, { @@ -21194,8 +21206,8 @@ "ru": "Сессии ретранслятора", "zh-chs": "接力會議", "xloc": [ - "default.handlebars->25->1738", - "default.handlebars->25->1751" + "default.handlebars->25->1741", + "default.handlebars->25->1754" ] }, { @@ -21515,8 +21527,8 @@ "nl": "Apparaatgroepmachtigingen verwijderen", "zh-chs": "删除设备组权限", "xloc": [ - "default.handlebars->25->1553", - "default.handlebars->25->1679" + "default.handlebars->25->1555", + "default.handlebars->25->1682" ] }, { @@ -21530,8 +21542,8 @@ "nl": "Apparaatmachtigingen verwijderen", "zh-chs": "删除设备权限", "xloc": [ - "default.handlebars->25->1551", - "default.handlebars->25->1666" + "default.handlebars->25->1553", + "default.handlebars->25->1669" ] }, { @@ -21559,7 +21571,7 @@ "nl": "Lidmaatschap van gebruikersgroep verwijderen", "zh-chs": "删除用户组成员身份", "xloc": [ - "default.handlebars->25->1675" + "default.handlebars->25->1678" ] }, { @@ -21574,7 +21586,7 @@ "zh-chs": "删除用户组权限", "xloc": [ "default.handlebars->25->1328", - "default.handlebars->25->1671" + "default.handlebars->25->1674" ] }, { @@ -21588,7 +21600,7 @@ "nl": "Gebruikerslidmaatschap verwijderen", "zh-chs": "删除用户成员资格", "xloc": [ - "default.handlebars->25->1561" + "default.handlebars->25->1563" ] }, { @@ -21603,7 +21615,7 @@ "zh-chs": "删除用户权限", "xloc": [ "default.handlebars->25->1326", - "default.handlebars->25->1668" + "default.handlebars->25->1671" ] }, { @@ -21620,7 +21632,7 @@ "ru": "Удалить все двухфакторные аутентификации.", "zh-chs": "刪除所有第二因素驗證。", "xloc": [ - "default.handlebars->25->1643" + "default.handlebars->25->1646" ] }, { @@ -21637,7 +21649,7 @@ "ru": "Удалить все прошлые события для этого userid.", "zh-chs": "刪除此用戶標識的所有先前事件。", "xloc": [ - "default.handlebars->25->1479" + "default.handlebars->25->1481" ] }, { @@ -21718,7 +21730,7 @@ "ru": "Удалить этого пользователя", "zh-chs": "删除该用户", "xloc": [ - "default.handlebars->25->1623" + "default.handlebars->25->1626" ] }, { @@ -21735,7 +21747,7 @@ "ru": "Удалить членство пользователя в группе", "zh-chs": "刪除用戶組成員身份", "xloc": [ - "default.handlebars->25->1657" + "default.handlebars->25->1660" ] }, { @@ -21749,7 +21761,7 @@ "nl": "Gebruikersrechten voor dit apparaat verwijderen", "zh-chs": "删除此设备的用户组权限", "xloc": [ - "default.handlebars->25->1547" + "default.handlebars->25->1549" ] }, { @@ -21766,7 +21778,7 @@ "ru": "Удалить права группы пользователей для этой группы устройств", "zh-chs": "刪除該設備組的用戶組權限", "xloc": [ - "default.handlebars->25->1541", + "default.handlebars->25->1543", "default.handlebars->25->574" ] }, @@ -21785,9 +21797,9 @@ "zh-chs": "刪除此設備組的用戶權限", "xloc": [ "default.handlebars->25->1204", - "default.handlebars->25->1535", - "default.handlebars->25->1651", - "default.handlebars->25->1663", + "default.handlebars->25->1537", + "default.handlebars->25->1654", + "default.handlebars->25->1666", "default.handlebars->25->575" ] }, @@ -21849,8 +21861,8 @@ "zh-chs": "要求:{0}。", "xloc": [ "default-mobile.handlebars->9->89", - "default.handlebars->25->1484", - "default.handlebars->25->1641" + "default.handlebars->25->1486", + "default.handlebars->25->1644" ] }, { @@ -22092,7 +22104,7 @@ "ru": "Ограничения", "zh-chs": "限制條件", "xloc": [ - "default.handlebars->25->1573" + "default.handlebars->25->1575" ] }, { @@ -22315,8 +22327,8 @@ "nl": "SMS", "zh-chs": "短信", "xloc": [ - "default.handlebars->25->1612", - "default.handlebars->25->1617", + "default.handlebars->25->1615", + "default.handlebars->25->1620", "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->tokenpanel->1->7->1->4->1->3" ] @@ -22331,7 +22343,7 @@ "nl": "SMS geschikt telefoonnummer voor deze gebruiker.", "zh-chs": "此用户的短信功能电话号码。", "xloc": [ - "default.handlebars->25->1629" + "default.handlebars->25->1632" ] }, { @@ -22735,7 +22747,7 @@ "xloc": [ "default-mobile.handlebars->9->259", "default-mobile.handlebars->9->345", - "default.handlebars->25->1613", + "default.handlebars->25->1616", "default.handlebars->25->250", "default.handlebars->25->636", "default.handlebars->25->821" @@ -22755,7 +22767,7 @@ "ru": "Ключ безопасности", "zh-chs": "安全密鑰", "xloc": [ - "default.handlebars->25->1610" + "default.handlebars->25->1613" ] }, { @@ -22791,7 +22803,7 @@ "xloc": [ "default.handlebars->25->1383", "default.handlebars->25->1440", - "default.handlebars->25->1509", + "default.handlebars->25->1511", "default.handlebars->25->394", "default.handlebars->25->751", "default.handlebars->25->753", @@ -22819,7 +22831,7 @@ "xloc": [ "default.handlebars->25->1382", "default.handlebars->25->1439", - "default.handlebars->25->1508", + "default.handlebars->25->1510", "default.handlebars->25->393", "default.handlebars->25->752", "default.handlebars->meshContextMenu->cxselectnone" @@ -22905,7 +22917,7 @@ "zh-chs": "选择要对所有选定用户执行的操作。", "xloc": [ "default.handlebars->25->1441", - "default.handlebars->25->1510" + "default.handlebars->25->1512" ] }, { @@ -23046,14 +23058,14 @@ "nl": "Stuur een SMS bericht naar deze gebruiker", "zh-chs": "发送短信给该用户", "xloc": [ - "default.handlebars->25->1618" + "default.handlebars->25->1621" ] }, { "en": "Send a email message to this user", "nl": "Stuur een e-mailbericht naar deze gebruiker", "xloc": [ - "default.handlebars->25->1620" + "default.handlebars->25->1623" ] }, { @@ -23070,7 +23082,7 @@ "ru": "Отправить уведомление всем пользователям этой группы.", "zh-chs": "向該組中的所有用戶發送通知。", "xloc": [ - "default.handlebars->25->1532" + "default.handlebars->25->1534" ] }, { @@ -23137,7 +23149,7 @@ "ru": "Отправить приглашение по email.", "zh-chs": "發送邀請電子郵件。", "xloc": [ - "default.handlebars->25->1483" + "default.handlebars->25->1485" ] }, { @@ -23203,7 +23215,7 @@ "ru": "Отправить уведомление пользователю", "zh-chs": "發送用戶通知", "xloc": [ - "default.handlebars->25->1622" + "default.handlebars->25->1625" ] }, { @@ -23255,7 +23267,7 @@ "ru": "Резервное копирование сервера", "zh-chs": "服務器備份", "xloc": [ - "default.handlebars->25->1493" + "default.handlebars->25->1495" ] }, { @@ -23272,7 +23284,7 @@ "ru": "Сертификат сервера", "zh-chs": "服務器證書", "xloc": [ - "default.handlebars->25->1767" + "default.handlebars->25->1770" ] }, { @@ -23289,7 +23301,7 @@ "ru": "База данных сервера", "zh-chs": "服務器數據庫", "xloc": [ - "default.handlebars->25->1768" + "default.handlebars->25->1771" ] }, { @@ -23310,7 +23322,7 @@ "default-mobile.handlebars->9->416", "default.handlebars->25->1280", "default.handlebars->25->1308", - "default.handlebars->25->1490", + "default.handlebars->25->1492", "default.handlebars->25->588", "default.handlebars->25->607" ] @@ -23330,7 +23342,7 @@ "zh-chs": "服務器權限", "xloc": [ "default.handlebars->25->1427", - "default.handlebars->25->1502" + "default.handlebars->25->1504" ] }, { @@ -23347,7 +23359,7 @@ "ru": "Квота сервера", "zh-chs": "服務器配額", "xloc": [ - "default.handlebars->25->1584" + "default.handlebars->25->1587" ] }, { @@ -23364,7 +23376,7 @@ "ru": "Восстановление сервера", "zh-chs": "服務器還原", "xloc": [ - "default.handlebars->25->1494" + "default.handlebars->25->1496" ] }, { @@ -23381,7 +23393,7 @@ "ru": "Права", "zh-chs": "服務器權限", "xloc": [ - "default.handlebars->25->1583" + "default.handlebars->25->1586" ] }, { @@ -23398,7 +23410,7 @@ "ru": "Состояние сервера", "zh-chs": "服務器狀態", "xloc": [ - "default.handlebars->25->1718" + "default.handlebars->25->1721" ] }, { @@ -23432,7 +23444,7 @@ "ru": "Трассировка сервера", "zh-chs": "服務器跟踪", "xloc": [ - "default.handlebars->25->1778" + "default.handlebars->25->1781" ] }, { @@ -23449,7 +23461,7 @@ "ru": "Обновление сервера", "zh-chs": "服務器更新", "xloc": [ - "default.handlebars->25->1495" + "default.handlebars->25->1497" ] }, { @@ -23571,7 +23583,7 @@ "ru": "ServerStats.csv", "zh-chs": "ServerStats.csv", "xloc": [ - "default.handlebars->25->1759" + "default.handlebars->25->1762" ] }, { @@ -23612,7 +23624,7 @@ "en": "Session", "nl": "Sessie", "xloc": [ - "default.handlebars->25->1682" + "default.handlebars->25->1685" ] }, { @@ -24151,8 +24163,8 @@ "ru": "Размер", "zh-chs": "尺寸", "xloc": [ - "default.handlebars->25->1685", - "default.handlebars->25->1700", + "default.handlebars->25->1688", + "default.handlebars->25->1703", "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSize" ] }, @@ -24963,8 +24975,8 @@ "en": "Start Time", "nl": "Start tijd", "xloc": [ - "default.handlebars->25->1683", - "default.handlebars->25->1702", + "default.handlebars->25->1686", + "default.handlebars->25->1705", "default.handlebars->25->700" ] }, @@ -25017,8 +25029,8 @@ "ru": "Статус", "zh-chs": "狀態", "xloc": [ - "default.handlebars->25->1634", - "default.handlebars->25->1695", + "default.handlebars->25->1637", + "default.handlebars->25->1698", "default.handlebars->container->column_l->p42->p42tbl->1->0->7" ] }, @@ -25570,7 +25582,7 @@ "xloc": [ "default-mobile.handlebars->9->162", "default.handlebars->25->1247", - "default.handlebars->25->1689", + "default.handlebars->25->1692", "default.handlebars->25->215", "default.handlebars->25->445", "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevTerminal", @@ -25609,7 +25621,7 @@ "zh-chs": "終端通知", "xloc": [ "default.handlebars->25->1167", - "default.handlebars->25->1602", + "default.handlebars->25->1605", "default.handlebars->25->515" ] }, @@ -25628,7 +25640,7 @@ "zh-chs": "終端提示", "xloc": [ "default.handlebars->25->1166", - "default.handlebars->25->1601", + "default.handlebars->25->1604", "default.handlebars->25->514" ] }, @@ -25772,7 +25784,7 @@ "ru": "На данный момент уведомлений нет", "zh-chs": "目前沒有任何通知", "xloc": [ - "default.handlebars->25->1710" + "default.handlebars->25->1713" ] }, { @@ -27005,9 +27017,9 @@ "default.handlebars->25->1144", "default.handlebars->25->1145", "default.handlebars->25->13", - "default.handlebars->25->1674", - "default.handlebars->25->1687", - "default.handlebars->25->1688", + "default.handlebars->25->1677", + "default.handlebars->25->1690", + "default.handlebars->25->1691", "default.handlebars->25->392", "default.handlebars->25->41", "default.handlebars->25->42", @@ -27052,7 +27064,7 @@ "ru": "Неизвестное действие", "zh-chs": "未知動作", "xloc": [ - "default.handlebars->25->1724" + "default.handlebars->25->1727" ] }, { @@ -27069,8 +27081,8 @@ "ru": "Неизвестное устройство", "zh-chs": "未知設備", "xloc": [ - "default.handlebars->25->1546", - "default.handlebars->25->1662" + "default.handlebars->25->1548", + "default.handlebars->25->1665" ] }, { @@ -27087,9 +27099,9 @@ "ru": "Неизвестная группа устройств", "zh-chs": "未知設備組", "xloc": [ - "default.handlebars->25->1540", - "default.handlebars->25->1650", - "default.handlebars->25->1728" + "default.handlebars->25->1542", + "default.handlebars->25->1653", + "default.handlebars->25->1731" ] }, { @@ -27106,7 +27118,7 @@ "ru": "Неизвестная группа", "zh-chs": "未知群組", "xloc": [ - "default.handlebars->25->1720" + "default.handlebars->25->1723" ] }, { @@ -27141,7 +27153,7 @@ "ru": "Неизвестная группа пользователей", "zh-chs": "未知用戶組", "xloc": [ - "default.handlebars->25->1656" + "default.handlebars->25->1659" ] }, { @@ -27230,7 +27242,7 @@ "ru": "Актуально", "zh-chs": "最新", "xloc": [ - "default.handlebars->25->1785" + "default.handlebars->25->1788" ] }, { @@ -27479,8 +27491,8 @@ "ru": "Использовано", "zh-chs": "用過的", "xloc": [ - "default.handlebars->25->1714", - "default.handlebars->25->1716" + "default.handlebars->25->1717", + "default.handlebars->25->1719" ] }, { @@ -27499,8 +27511,8 @@ "xloc": [ "default.handlebars->25->1205", "default.handlebars->25->1428", - "default.handlebars->25->1536", - "default.handlebars->25->1707", + "default.handlebars->25->1538", + "default.handlebars->25->1710", "default.handlebars->25->193", "default.handlebars->25->577" ] @@ -27556,7 +27568,7 @@ "ru": "Учетные записи пользователей", "zh-chs": "用戶帳號", "xloc": [ - "default.handlebars->25->1733" + "default.handlebars->25->1736" ] }, { @@ -27593,7 +27605,7 @@ "zh-chs": "用戶同意", "xloc": [ "default.handlebars->25->1173", - "default.handlebars->25->1608", + "default.handlebars->25->1611", "default.handlebars->25->521" ] }, @@ -27613,9 +27625,9 @@ "xloc": [ "default.handlebars->25->1261", "default.handlebars->25->1262", - "default.handlebars->25->1517", - "default.handlebars->25->1658", - "default.handlebars->25->1677", + "default.handlebars->25->1519", + "default.handlebars->25->1661", + "default.handlebars->25->1680", "default.handlebars->25->576" ] }, @@ -27650,7 +27662,7 @@ "ru": "Членство в группах пользователей", "zh-chs": "用戶組成員資格", "xloc": [ - "default.handlebars->25->1655" + "default.handlebars->25->1658" ] }, { @@ -27674,14 +27686,15 @@ "zh-chs": "用戶標識", "xloc": [ "default.handlebars->25->1322", - "default.handlebars->25->1578" + "default.handlebars->25->1580", + "default.handlebars->25->1581" ] }, { "en": "User Identifiers", "xloc": [ "default.handlebars->25->1259", - "default.handlebars->25->1565" + "default.handlebars->25->1567" ] }, { @@ -27778,7 +27791,7 @@ "ru": "Сессии пользователя", "zh-chs": "用戶會話", "xloc": [ - "default.handlebars->25->1750" + "default.handlebars->25->1753" ] }, { @@ -27912,7 +27925,7 @@ "zh-chs": "用戶名", "xloc": [ "default-mobile.handlebars->9->257", - "default.handlebars->25->1474", + "default.handlebars->25->1476", "default.handlebars->25->247", "default.handlebars->25->277", "default.handlebars->25->634", @@ -27972,9 +27985,9 @@ "ru": "Пользователи", "zh-chs": "用戶數", "xloc": [ - "default.handlebars->25->1505", - "default.handlebars->25->1528", - "default.handlebars->25->1749", + "default.handlebars->25->1507", + "default.handlebars->25->1530", + "default.handlebars->25->1752", "default.handlebars->container->topbar->1->1->UsersSubMenuSpan->UsersSubMenu->1->0->UsersGeneral" ] }, @@ -27992,7 +28005,7 @@ "ru": "Сессии пользователей", "zh-chs": "用戶會話", "xloc": [ - "default.handlebars->25->1737" + "default.handlebars->25->1740" ] }, { @@ -28077,7 +28090,7 @@ "ru": "Проверенный", "zh-chs": "已驗證", "xloc": [ - "default.handlebars->25->1636" + "default.handlebars->25->1639" ] }, { @@ -28181,7 +28194,7 @@ "ru": "Версия несовместима, пожалуйста, сначала обновите установку MeshCentral", "zh-chs": "版本不兼容,请先升级您的MeshCentral安装", "xloc": [ - "default.handlebars->25->1781" + "default.handlebars->25->1784" ] }, { @@ -28249,8 +28262,8 @@ "ru": "Просмотр журнала изменений", "zh-chs": "查看变更日志", "xloc": [ - "default.handlebars->25->1784", - "default.handlebars->25->1786" + "default.handlebars->25->1787", + "default.handlebars->25->1789" ] }, { @@ -28301,7 +28314,7 @@ "ru": "Посмотреть примечания об этом пользователе", "zh-chs": "查看有關此用戶的註釋", "xloc": [ - "default.handlebars->25->1616" + "default.handlebars->25->1619" ] }, { @@ -28508,8 +28521,8 @@ "ru": "Веб-сервер", "zh-chs": "網絡服務器", "xloc": [ - "default.handlebars->25->1770", - "default.handlebars->25->1771" + "default.handlebars->25->1773", + "default.handlebars->25->1774" ] }, { @@ -28526,7 +28539,7 @@ "ru": "Запросы веб-сервера", "zh-chs": "Web服務器請求", "xloc": [ - "default.handlebars->25->1772" + "default.handlebars->25->1775" ] }, { @@ -28543,7 +28556,7 @@ "ru": "Ретранслятор Web Socket", "zh-chs": "Web套接字中繼", "xloc": [ - "default.handlebars->25->1773" + "default.handlebars->25->1776" ] }, { @@ -28648,7 +28661,7 @@ "ru": "Будет изменено при следующем входе в систему.", "zh-chs": "下次登錄時將更改。", "xloc": [ - "default.handlebars->25->1588" + "default.handlebars->25->1591" ] }, { @@ -29601,7 +29614,7 @@ "ru": "\\\\'", "zh-chs": "\\\\'", "xloc": [ - "default.handlebars->25->1782" + "default.handlebars->25->1785" ] }, { @@ -29876,7 +29889,7 @@ "ru": "свободно", "zh-chs": "自由", "xloc": [ - "default.handlebars->25->1745" + "default.handlebars->25->1748" ] }, { @@ -30162,7 +30175,7 @@ "ru": "k max, пусто по умолчанию", "zh-chs": "k max,默认为空白", "xloc": [ - "default.handlebars->25->1491" + "default.handlebars->25->1493" ] }, { @@ -30246,7 +30259,7 @@ "ru": "servertrace.csv", "zh-chs": "servertrace.csv", "xloc": [ - "default.handlebars->25->1780" + "default.handlebars->25->1783" ] }, { @@ -30303,7 +30316,7 @@ "ru": "time, conn.agent, conn.users, conn.usersessions, conn.relaysession, conn.intelamt, mem.external, mem.heapused, mem.heaptotal, mem.rss", "zh-chs": "時間,conn.agent,conn.users,conn.usersessions,conn.relaysession,conn.intelamt,mem.external,mem.heapused,mem.heaptotal,mem.rss", "xloc": [ - "default.handlebars->25->1758" + "default.handlebars->25->1761" ] }, { @@ -30320,7 +30333,7 @@ "ru": "time, source, message", "zh-chs": "時間,來源,訊息", "xloc": [ - "default.handlebars->25->1779" + "default.handlebars->25->1782" ] }, { @@ -30351,7 +30364,7 @@ "ru": "всего", "zh-chs": "總", "xloc": [ - "default.handlebars->25->1746" + "default.handlebars->25->1749" ] }, { @@ -30510,7 +30523,7 @@ "zh-chs": "{0} Kb", "xloc": [ "default.handlebars->25->1375", - "default.handlebars->25->1686" + "default.handlebars->25->1689" ] }, { @@ -30564,7 +30577,7 @@ "ru": "{0} активных сессий", "zh-chs": "{0}個活動會話", "xloc": [ - "default.handlebars->25->1628" + "default.handlebars->25->1631" ] }, { @@ -30600,7 +30613,7 @@ "xloc": [ "default-mobile.handlebars->9->119", "default.handlebars->25->1385", - "default.handlebars->25->1701" + "default.handlebars->25->1704" ] }, { @@ -30658,7 +30671,7 @@ "ru": "{0} групп", "zh-chs": "{0}個群組", "xloc": [ - "default.handlebars->25->1593" + "default.handlebars->25->1596" ] }, { diff --git a/views/default.handlebars b/views/default.handlebars index f034dfad..2289965a 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -2866,8 +2866,10 @@ go(xviewmode); goBackStack.push(2); } else if (args.gotouser != null) { - if ((users == null) || (users['user/' + domain + '/' + args.gotouser] == null)) return; // This user is not loaded yet - gotoUser('user/' + domain + '/' + args.gotouser); + var xuserid = args.gotouser; + if (args.gotouser.indexOf('/') < 0) { xuserid = 'user/' + domain + '/' + args.gotouser; } + if ((users == null) || (users[xuserid] == null)) return; // This user is not loaded yet + gotoUser(xuserid); go(xviewmode); goBackStack.push(4); } else if (args.gotougrp != null) { @@ -10025,7 +10027,7 @@ } function addUserHtml(user, sessions) { - var x = '', gray = ' gray', icon = 'm2', msg = '', self = (user.name != userinfo.name), lastAccess = '', permissions = ''; + var x = '', gray = ' gray', icon = 'm2', msg = '', self = (user._id != userinfo._id), lastAccess = '', permissions = ''; if (sessions != null) { gray = ''; if (self) { @@ -10072,6 +10074,12 @@ } } + // If we are a cross-domain administrator, add the domain. + if ((userinfo.crossDomain != null)) { + var userdomain = user._id.split('/')[1]; + if (userdomain != '') { username += ', ' + userdomain + ''; } + } + if ((user.otpsecret > 0) || (user.otphkeys > 0) || ((user.otpekey == 1) && (features & 0x00800000)) || ((user.phone != null) && (features & 0x04000000))) { username += ' '; } if (user.phone != null) { username += ' '; } if ((user.siteadmin != null) && ((user.siteadmin & 32) != 0) && (user.siteadmin != 0xFFFFFFFF)) { username += ' '; } @@ -10288,6 +10296,14 @@ function showCreateNewAccountDialog() { if (xxdialogMode) return; var x = ''; + + if (userinfo.crossDomain) { + var y = ''; + x += addHtmlValue("Domain", y); + } + if ((features & 0x200000) == 0) { x += addHtmlValue('' + "Username" + '', ''); } x += addHtmlValue('' + "Email" + '', ''); x += addHtmlValue('' + "Password" + '', ''); @@ -10345,6 +10361,7 @@ x.emailVerified = Q('p4verifiedEmail').checked; x.emailInvitation = Q('p4invitationEmail').checked; } + if (userinfo.crossDomain) { x.domain = userinfo.crossDomain[parseInt(Q('p4domain').value)]; } meshserver.send(x); } @@ -10916,7 +10933,13 @@ if ((args.hide & 8) != 0) { x += '
' + addDeviceAttribute("Name", user.name); } // If title bar is hidden, display the user name here var email = user.email?EscapeHtml(user.email):'' + "Not set" + '', everify = ''; if (serverinfo.emailcheck) { everify = ((user.emailVerified == true) ? ' ' : ' '); } - if (user.name.toLowerCase() != user._id.split('/')[2]) { x += addDeviceAttribute("User Identifier", user._id.split('/')[2]); } + + if (userinfo.crossDomain) { + x += addDeviceAttribute("User Identifier", EscapeHtml(user._id)); + } else { + if (user.name.toLowerCase() != user._id.split('/')[2]) { x += addDeviceAttribute("User Identifier", EscapeHtml(user._id.split('/')[2])); } + } + if (((user.siteadmin != 0xFFFFFFFF) || (userinfo.siteadmin == 0xFFFFFFFF))) { // If we are not site admin, we can't change a admin email. x += addDeviceAttribute("Email", everify + email + ' ' + ' '); } else { @@ -11016,7 +11039,7 @@ // Change the URL var urlviewmode = ''; if (((features & 0x10000000) == 0) && (xxcurrentView >= 30) && (xxcurrentView <= 39) && (currentUser != null)) { - urlviewmode = '?viewmode=' + xxcurrentView + '&gotouser=' + currentUser._id.split('/')[2]; + urlviewmode = '?viewmode=' + xxcurrentView + '&gotouser=' + ((userinfo.crossDomain)?currentUser._id:currentUser._id.split('/')[2]); for (var i in urlargs) { urlviewmode += ('&' + i + '=' + urlargs[i]); } try { window.history.replaceState({}, document.title, window.location.pathname + urlviewmode); } catch (ex) { } } @@ -12004,7 +12027,7 @@ } else if ((x >= 20) && (x <= 29)) { if (currentMesh) { window.open(window.location.origin + '{{{domainurl}}}' + '?gotomesh=' + currentMesh._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentMesh._id); } } else if ((x >= 30) && (x <= 39)) { - if (currentUser) { window.open(window.location.origin + '{{{domainurl}}}' + '?gotouser=' + currentUser._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentUser._id); } + if (currentUser) { window.open(window.location.origin + '{{{domainurl}}}' + '?gotouser=' + ((userinfo.crossDomain)?currentUser._id:currentUser._id.split('/')[2]) + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentUser._id); } } else if ((x >= 50) && (x <= 59)) { if (currentUserGroup) { window.open(window.location.origin + '{{{domainurl}}}' + '?gotougrp=' + currentUserGroup._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentUserGroup._id); } } else { // if (x < 10)) @@ -12043,7 +12066,7 @@ } else if ((xxcurrentView >= 20) && (xxcurrentView <= 29)) { // Device Group Link if (currentMesh != null) { urlviewmode = '?viewmode=' + xxcurrentView + '&gotomesh=' + currentMesh._id.split('/')[2]; } } else if ((xxcurrentView >= 30) && (xxcurrentView <= 39)) { // User Link - if (currentUser != null) { urlviewmode = '?viewmode=' + xxcurrentView + '&gotouser=' + currentUser._id.split('/')[2]; } + if (currentUser != null) { urlviewmode = '?viewmode=' + xxcurrentView + '&gotouser=' + ((userinfo.crossDomain)?currentUser._id:currentUser._id.split('/')[2]); } } else if ((xxcurrentView >= 51) && (xxcurrentView <= 51)) { // User Group Link if ((currentUserGroup != null) && (currentUserGroup._id != null)) { urlviewmode = '?viewmode=' + xxcurrentView + '&gotougrp=' + currentUserGroup._id.split('/')[2]; } } else if (xxcurrentView > 1) { urlviewmode = '?viewmode=' + xxcurrentView; }