Initial work on cross-domain administrator.

Ylian Saint-Hilaire committed May 27, 2020 at 03:35 UTC 288813ccda3d0c38ad053cc9157dc6ea8320e9fa
4 files changed +467 -407
meshuser.js
+105 -82
@@ -64,6 +64,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
64 obj.domain = domain;
65 obj.ws = ws;
66
67 + // Check if we are a cross-domain administrator
68 + if (parent.parent.config.settings.managecrossdomain && (parent.parent.config.settings.managecrossdomain.indexOf(user._id) >= 0)) { obj.crossDomain = true; }
69 +
70 // Server side Intel AMT stack
71 const WsmanComm = require('./amt/amt-wsman-comm.js');
72 const Wsman = require('./amt/amt-wsman.js');
@@ -281,7 +284,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
284
285 // Handle events
286 ws.HandleEvent = function (source, event, ids, id) {
284 - if ((event.domain == null) || (event.domain == domain.id)) {
287 + if ((event.domain == null) || (event.domain == domain.id) || (obj.crossDomain === true)) {
288 try {
289 if (event == 'close') { try { delete req.session; } catch (ex) { } obj.close(); }
290 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
403 // Send user information to web socket, this is the first thing we send
404 try {
405 var xuserinfo = parent.CloneSafeUser(parent.users[user._id]);
403 - if ((user.siteadmin == 0xFFFFFFFF) && (parent.parent.config.settings.managealldevicegroups.indexOf(user._id) >= 0)) { xuserinfo.manageAllDeviceGroups = true; }
406 + if (user.siteadmin == 0xFFFFFFFF) {
407 + if (parent.parent.config.settings.managealldevicegroups.indexOf(user._id) >= 0) { xuserinfo.manageAllDeviceGroups = true; }
408 + if (obj.crossDomain === true) { xuserinfo.crossDomain = []; for (var i in parent.parent.config.domains) { xuserinfo.crossDomain.push(i); } }
409 + }
410 ws.send(JSON.stringify({ action: 'userinfo', userinfo: xuserinfo }));
411 } catch (ex) { }
412
@@ -1291,9 +1297,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1297 if ((user.siteadmin & 2) == 0) break;
1298 var docs = [];
1299 for (i in parent.users) {
1294 - if ((parent.users[i].domain == domain.id) && (parent.users[i].name != '~')) {
1300 + if (((obj.crossDomain === true) || (parent.users[i].domain == domain.id)) && (parent.users[i].name != '~')) {
1301 // If we are part of a user group, we can only see other members of our own group
1296 - if ((user.groups == null) || (user.groups.length == 0) || ((parent.users[i].groups != null) && (findOne(parent.users[i].groups, user.groups)))) {
1302 + if ((obj.crossDomain === true) || (user.groups == null) || (user.groups.length == 0) || ((parent.users[i].groups != null) && (findOne(parent.users[i].groups, user.groups)))) {
1303 docs.push(parent.CloneSafeUser(parent.users[i]));
1304 }
1305 }
@@ -1430,8 +1436,10 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1436 }
1437 case 'deleteuser':
1438 {
1439 + console.log(command);
1440 +
1441 // Delete a user account
1434 - var err = null, delusersplit, deluserid, deluser;
1442 + var err = null, delusersplit, deluserid, deluser, deluserdomain;
1443 try {
1444 if ((user.siteadmin & 2) == 0) { err = 'Permission denied'; }
1445 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
1448 deluserid = command.userid;
1449 deluser = parent.users[deluserid];
1450 if (deluser == null) { err = 'User does not exists'; }
1443 - else if ((delusersplit.length != 3) || (delusersplit[1] != domain.id)) { err = 'Invalid domain'; } // Invalid domain, operation only valid for current domain
1451 + else if ((obj.crossDomain !== true) && ((delusersplit.length != 3) || (delusersplit[1] != domain.id))) { err = 'Invalid domain'; } // Invalid domain, operation only valid for current domain
1452 else if ((deluser.siteadmin == 0xFFFFFFFF) && (user.siteadmin != 0xFFFFFFFF)) { err = 'Permission denied'; } // Need full admin to remote another administrator
1445 - 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.
1453 + 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.
1454 }
1455 } catch (ex) { err = 'Validation exception: ' + ex; }
1456
1457 + // Get domain
1458 + deluserdomain = domain;
1459 + if (obj.crossDomain === true) { deluserdomain = parent.parent.config.domains[delusersplit[1]]; }
1460 + if (deluserdomain == null) { err = 'Invalid domain'; }
1461 +
1462 // Handle any errors
1463 if (err != null) {
1464 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
1477
1478 // Notify mesh change
1479 change = 'Removed user ' + deluser.name + ' from group ' + mesh.name;
1467 - 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 };
1480 + 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 };
1481 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.
1482 parent.parent.DispatchEvent(parent.CreateMeshDispatchTargets(mesh, [deluser._id, user._id]), obj, event);
1483 }
1484 } else if (i.startsWith('node/')) {
1485 // Get the node and the rights for this node
1473 - parent.GetNodeWithRights(domain, deluser, i, function (node, rights, visible) {
1486 + parent.GetNodeWithRights(deluserdomain, deluser, i, function (node, rights, visible) {
1487 if ((node == null) || (node.links == null) || (node.links[deluser._id] == null)) return;
1488
1489 // 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
1492 db.Set(parent.cleanDevice(node));
1493
1494 // Event the node change
1482 - 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) }
1495 + 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) }
1496 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.
1497 parent.parent.DispatchEvent(parent.CreateNodeDispatchTargets(node.meshid, node._id), obj, event);
1498 });
@@ -1503,7 +1516,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1516
1517 var targets = ['*', 'server-users'];
1518 if (deluser.groups) { for (var i in deluser.groups) { targets.push('server-users:' + i); } }
1506 - parent.parent.DispatchEvent(targets, obj, { etype: 'user', userid: deluserid, username: deluser.name, action: 'accountremove', msg: 'Account removed', domain: domain.id });
1519 + parent.parent.DispatchEvent(targets, obj, { etype: 'user', userid: deluserid, username: deluser.name, action: 'accountremove', msg: 'Account removed', domain: deluserdomain.id });
1520 parent.parent.DispatchEvent([deluserid], obj, 'close');
1521
1522 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
1647 if (command.randomPassword === true) { command.pass = getRandomPassword(); }
1648
1649 // Add a new user account
1637 - var err = null, newusername, newuserid;
1650 + var err = null, newusername, newuserid, newuserdomain;
1651 try {
1652 if ((user.siteadmin & 2) == 0) { err = 'Permission denied'; }
1640 - else if ((domain.auth == 'sspi') || (domain.auth == 'ldap')) { err = 'Unable to add user in this mode'; }
1653 else if (common.validateUsername(command.username, 1, 256) == false) { err = 'Invalid username'; } // Username is between 1 and 64 characters, no spaces
1654 else if ((command.username[0] == '~') || (command.username.indexOf('/') >= 0)) { err = 'Invalid username'; } // Usernames cant' start with ~ and can't have '/'
1655 else if (common.validateString(command.pass, 1, 256) == false) { err = 'Invalid password'; } // Password is between 1 and 256 characters
1656 else if ((command.randomPassword !== true) && (common.checkPasswordRequirements(command.pass, domain.passwordrequirements) == false)) { err = 'Invalid password'; } // Password does not meet requirements
1657 else if ((command.email != null) && (common.validateEmail(command.email, 1, 1024) == false)) { err = 'Invalid email'; } // Check if this is a valid email address
1658 + 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
1659 else {
1660 + newuserdomain = domain;
1661 + if ((obj.crossDomain === true) && (command.domain != null)) { newuserdomain = parent.parent.config.domains[command.domain]; }
1662 newusername = command.username;
1648 - newuserid = 'user/' + domain.id + '/' + command.username.toLowerCase();
1663 + newuserid = 'user/' + newuserdomain.id + '/' + command.username.toLowerCase();
1664 if (command.siteadmin != null) {
1665 if ((typeof command.siteadmin != 'number') || (Number.isInteger(command.siteadmin) == false)) { err = 'Invalid site permissions'; } // Check permissions
1666 else if ((user.siteadmin != 0xFFFFFFFF) && ((command.siteadmin & (0xFFFFFFFF - 224)) != 0)) { err = 'Invalid site permissions'; }
1667 }
1668 if (parent.users[newuserid]) { err = 'User already exists'; } // Account already exists
1669 + else if ((newuserdomain.auth == 'sspi') || (newuserdomain.auth == 'ldap')) { err = 'Unable to add user in this mode'; }
1670 }
1671 } catch (ex) { err = 'Validation exception'; }
1672
@@ -1666,7 +1682,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1682 }
1683
1684 // Check if we exceed the maximum number of user accounts
1669 - db.isMaxType(domain.limits.maxuseraccounts, 'user', domain.id, function (maxExceed) {
1685 + db.isMaxType(newuserdomain.limits.maxuseraccounts, 'user', newuserdomain.id, function (maxExceed) {
1686 if (maxExceed) {
1687 // Account count exceed, do notification
1688 if (command.responseid != null) {
@@ -1674,21 +1690,21 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1690 try { ws.send(JSON.stringify({ action: 'adduser', responseid: command.responseid, result: 'maxUsersExceed' })); } catch (ex) { }
1691 } else {
1692 // Create the notification message
1677 - 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 };
1693 + 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 };
1694
1695 // Get the list of sessions for this user
1696 var sessions = parent.wssessions[user._id];
1681 - if (sessions != null) { for (i in sessions) { try { if (sessions[i].domainid == domain.id) { sessions[i].send(JSON.stringify(notification)); } } catch (ex) { } } }
1697 + if (sessions != null) { for (i in sessions) { try { if (sessions[i].domainid == newuserdomain.id) { sessions[i].send(JSON.stringify(notification)); } } catch (ex) { } } }
1698 // TODO: Notify all sessions on other peers.
1699 }
1700 } else {
1701 // Remove any events for this userid
1686 - if (command.removeEvents === true) { db.RemoveAllUserEvents(domain.id, newuserid); }
1702 + if (command.removeEvents === true) { db.RemoveAllUserEvents(newuserdomain.id, newuserid); }
1703
1704 // Create a new user
1689 - var newuser = { type: 'user', _id: newuserid, name: newusername, creation: Math.floor(Date.now() / 1000), domain: domain.id };
1705 + var newuser = { type: 'user', _id: newuserid, name: newusername, creation: Math.floor(Date.now() / 1000), domain: newuserdomain.id };
1706 if (command.siteadmin != null) { newuser.siteadmin = command.siteadmin; }
1691 - else if (domain.newaccountsrights) { newuser.siteadmin = domain.newaccountsrights; }
1707 + else if (newuserdomain.newaccountsrights) { newuser.siteadmin = newuserdomain.newaccountsrights; }
1708 if (command.email != null) { newuser.email = command.email.toLowerCase(); if (command.emailVerified === true) { newuser.emailVerified = true; } } // Email
1709 if (command.resetNextLogin === true) { newuser.passchange = -1; } else { newuser.passchange = Math.floor(Date.now() / 1000); }
1710 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
1721 var event, targets = ['*', 'server-users'];
1722 if (newuser.groups) { for (var i in newuser.groups) { targets.push('server-users:' + i); } }
1723 if (command.email == null) {
1708 - event = { etype: 'user', userid: newuser._id, username: newusername, account: parent.CloneSafeUser(newuser), action: 'accountcreate', msg: 'Account created, username is ' + command.username, domain: domain.id };
1724 + event = { etype: 'user', userid: newuser._id, username: newusername, account: parent.CloneSafeUser(newuser), action: 'accountcreate', msg: 'Account created, username is ' + command.username, domain: newuserdomain.id };
1725 } else {
1710 - 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 };
1726 + 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 };
1727 }
1728 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.
1729 parent.parent.DispatchEvent(targets, obj, event);
1730
1731 // Perform email invitation
1732 if ((command.emailInvitation == true) && (command.emailVerified == true) && command.email && parent.parent.mailserver) {
1717 - parent.parent.mailserver.sendAccountInviteMail(domain, user.name, newusername, command.email.toLowerCase(), command.pass, parent.getLanguageCodes(req));
1733 + parent.parent.mailserver.sendAccountInviteMail(newuserdomain, user.name, newusername, command.email.toLowerCase(), command.pass, parent.getLanguageCodes(req));
1734 }
1735
1736 // Log in the auth log
@@ -1732,77 +1748,84 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1748 }
1749 case 'edituser':
1750 {
1751 + // Must be user administrator or edit self.
1752 + if (((user.siteadmin & 2) == 0) && (user._id != command.id)) break;
1753 +
1754 // Edit a user account, may involve changing email or administrator permissions
1736 - if (((user.siteadmin & 2) != 0) || (user._id == command.id)) {
1737 - var chguser = parent.users[command.id];
1738 - change = 0;
1739 - if (chguser) {
1740 - // If the target user is admin and we are not admin, no changes can be made.
1741 - if ((chguser.siteadmin == 0xFFFFFFFF) && (user.siteadmin != 0xFFFFFFFF)) return;
1755 + var chguser = parent.users[command.id];
1756 + change = 0;
1757 + if (chguser) {
1758 + // If the target user is admin and we are not admin, no changes can be made.
1759 + if ((chguser.siteadmin == 0xFFFFFFFF) && (user.siteadmin != 0xFFFFFFFF)) return;
1760
1743 - // Can only perform this operation on other users of our group.
1744 - if (user.siteadmin != 0xFFFFFFFF) {
1745 - if ((user.groups != null) && (user.groups.length > 0) && ((chguser.groups == null) || (findOne(chguser.groups, user.groups) == false))) return;
1746 - }
1761 + // Can only perform this operation on other users of our group.
1762 + if (user.siteadmin != 0xFFFFFFFF) {
1763 + if ((user.groups != null) && (user.groups.length > 0) && ((chguser.groups == null) || (findOne(chguser.groups, user.groups) == false))) return;
1764 + }
1765
1748 - // Validate and change email
1749 - if (domain.usernameisemail !== true) {
1750 - if (common.validateString(command.email, 1, 1024) && (chguser.email != command.email)) { chguser.email = command.email.toLowerCase(); change = 1; }
1751 - }
1766 + // Fetch and validate the user domain
1767 + var edituserdomainid = command.id.split('/')[1];
1768 + if ((obj.crossDomain !== true) && (edituserdomainid != domain.id)) break;
1769 + var edituserdomain = parent.parent.config.domains[edituserdomainid];
1770 + if (edituserdomain == null) break;
1771
1753 - // Make changes
1754 - if ((command.emailVerified === true || command.emailVerified === false) && (chguser.emailVerified != command.emailVerified)) { chguser.emailVerified = command.emailVerified; change = 1; }
1755 - 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; }
1756 - if ((command.consent != null) && (typeof command.consent == 'number')) { if (command.consent == 0) { delete chguser.consent; } else { chguser.consent = command.consent; } change = 1; }
1757 - 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; }
1772 + // Validate and change email
1773 + if (edituserdomain.usernameisemail !== true) {
1774 + if (common.validateString(command.email, 1, 1024) && (chguser.email != command.email)) { chguser.email = command.email.toLowerCase(); change = 1; }
1775 + }
1776
1759 - // Site admins can change any server rights, user managers can only change AccountLock, NoMeshCmd and NoNewGroups
1760 - if (chguser._id !== user._id) { // We can't change our own siteadmin permissions.
1761 - var chgusersiteadmin = chguser.siteadmin ? chguser.siteadmin : 0;
1762 - 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; }
1763 - }
1777 + // Make changes
1778 + if ((command.emailVerified === true || command.emailVerified === false) && (chguser.emailVerified != command.emailVerified)) { chguser.emailVerified = command.emailVerified; change = 1; }
1779 + 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; }
1780 + if ((command.consent != null) && (typeof command.consent == 'number')) { if (command.consent == 0) { delete chguser.consent; } else { chguser.consent = command.consent; } change = 1; }
1781 + 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; }
1782
1765 - // When sending a notification about a group change, we need to send to all the previous and new groups.
1766 - var allTargetGroups = chguser.groups;
1767 - if ((Array.isArray(command.groups)) && ((user._id != command.id) || (user.siteadmin == 0xFFFFFFFF))) {
1768 - if (command.groups.length == 0) {
1769 - // Remove the user groups
1770 - if (chguser.groups != null) { delete chguser.groups; change = 1; }
1771 - } else {
1772 - // Arrange the user groups
1773 - var groups2 = [];
1774 - for (var i in command.groups) {
1775 - if (typeof command.groups[i] == 'string') {
1776 - var gname = command.groups[i].trim().toLowerCase();
1777 - if ((gname.length > 0) && (gname.length <= 64) && (groups2.indexOf(gname) == -1)) { groups2.push(gname); }
1778 - }
1783 + // Site admins can change any server rights, user managers can only change AccountLock, NoMeshCmd and NoNewGroups
1784 + if (chguser._id !== user._id) { // We can't change our own siteadmin permissions.
1785 + var chgusersiteadmin = chguser.siteadmin ? chguser.siteadmin : 0;
1786 + 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; }
1787 + }
1788 +
1789 + // When sending a notification about a group change, we need to send to all the previous and new groups.
1790 + var allTargetGroups = chguser.groups;
1791 + if ((Array.isArray(command.groups)) && ((user._id != command.id) || (user.siteadmin == 0xFFFFFFFF))) {
1792 + if (command.groups.length == 0) {
1793 + // Remove the user groups
1794 + if (chguser.groups != null) { delete chguser.groups; change = 1; }
1795 + } else {
1796 + // Arrange the user groups
1797 + var groups2 = [];
1798 + for (var i in command.groups) {
1799 + if (typeof command.groups[i] == 'string') {
1800 + var gname = command.groups[i].trim().toLowerCase();
1801 + if ((gname.length > 0) && (gname.length <= 64) && (groups2.indexOf(gname) == -1)) { groups2.push(gname); }
1802 }
1780 - groups2.sort();
1803 + }
1804 + groups2.sort();
1805
1782 - // Set the user groups (Realms)
1783 - if (chguser.groups != groups2) { chguser.groups = groups2; change = 1; }
1806 + // Set the user groups (Realms)
1807 + if (chguser.groups != groups2) { chguser.groups = groups2; change = 1; }
1808
1785 - // Add any missing groups in the target list
1786 - if (allTargetGroups == null) { allTargetGroups = []; }
1787 - for (var i in groups2) { if (allTargetGroups.indexOf(i) == -1) { allTargetGroups.push(i); } }
1788 - }
1809 + // Add any missing groups in the target list
1810 + if (allTargetGroups == null) { allTargetGroups = []; }
1811 + for (var i in groups2) { if (allTargetGroups.indexOf(i) == -1) { allTargetGroups.push(i); } }
1812 }
1813 + }
1814
1791 - if (change == 1) {
1792 - // Update the user
1793 - db.SetUser(chguser);
1794 - parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
1815 + if (change == 1) {
1816 + // Update the user
1817 + db.SetUser(chguser);
1818 + parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
1819
1796 - var targets = ['*', 'server-users', user._id, chguser._id];
1797 - if (allTargetGroups) { for (var i in allTargetGroups) { targets.push('server-users:' + i); } }
1798 - var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(chguser), action: 'accountchange', msg: 'Account changed: ' + chguser.name, domain: domain.id };
1799 - 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.
1800 - parent.parent.DispatchEvent(targets, obj, event);
1801 - }
1802 - if ((chguser.siteadmin) && (chguser.siteadmin != 0xFFFFFFFF) && (chguser.siteadmin & 32)) {
1803 - // If the user is locked out of this account, disconnect now
1804 - parent.parent.DispatchEvent([chguser._id], obj, 'close'); // Disconnect all this user's sessions
1805 - }
1820 + var targets = ['*', 'server-users', user._id, chguser._id];
1821 + if (allTargetGroups) { for (var i in allTargetGroups) { targets.push('server-users:' + i); } }
1822 + var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(chguser), action: 'accountchange', msg: 'Account changed: ' + chguser.name, domain: edituserdomain.id };
1823 + 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.
1824 + parent.parent.DispatchEvent(targets, obj, event);
1825 + }
1826 + if ((chguser.siteadmin) && (chguser.siteadmin != 0xFFFFFFFF) && (chguser.siteadmin & 32)) {
1827 + // If the user is locked out of this account, disconnect now
1828 + parent.parent.DispatchEvent([chguser._id], obj, 'close'); // Disconnect all this user's sessions
1829 }
1830 }
1831 break;
sample-config-advanced.json
+2 -1
@@ -52,6 +52,8 @@
52 "_AgentAllowedIP": "192.168.0.100/24",
53 "_AgentBlockedIP": "127.0.0.1,::1",
54 "_AuthLog": "c:\\temp\\auth.log",
55 + "_ManageAllDeviceGroups": [ "user//admin" ],
56 + "_ManageCrossDomain": [ "user//admin" ],
57 "_LocalDiscovery": {
58 "name": "Local server name",
59 "info": "Information about this server"
@@ -104,7 +106,6 @@
106 "_UserNameIsEmail": true,
107 "_NewAccountEmailDomains": [ "sample.com" ],
108 "_NewAccountsRights": [ "nonewgroups", "notools" ],
107 - "_ManageAllDeviceGroups": [ "admin" ],
109 "_WelcomeText": "Sample Text on Login Page.",
110 "_WelcomePicture": "mainwelcome.jpg",
111 "___Hide__": "Sum of: 1 = Hide header, 2 = Hide tab, 4 = Hide footer, 8 = Hide title, 16 = Hide left bar",
translate/translate.json
+330 -317
@@ -192,7 +192,7 @@
192 "zh-chs": " 用戶需要先登錄到該服務器一次,然後才能將其添加到設備組。",
193 "xloc": [
194 "default.handlebars->25->1258",
195 - "default.handlebars->25->1564"
195 + "default.handlebars->25->1566"
196 ]
197 },
198 {
@@ -619,7 +619,7 @@
619 "default-mobile.handlebars->9->108",
620 "default-mobile.handlebars->9->284",
621 "default.handlebars->25->1365",
622 - "default.handlebars->25->1709",
622 + "default.handlebars->25->1712",
623 "default.handlebars->25->750"
624 ]
625 },
@@ -669,7 +669,7 @@
669 "ru": "1 активная сессия",
670 "zh-chs": "1個活動會話",
671 "xloc": [
672 - "default.handlebars->25->1627"
672 + "default.handlebars->25->1630"
673 ]
674 },
675 {
@@ -731,7 +731,7 @@
731 "ru": "1 группа",
732 "zh-chs": "1組",
733 "xloc": [
734 - "default.handlebars->25->1592"
734 + "default.handlebars->25->1595"
735 ]
736 },
737 {
@@ -1131,7 +1131,7 @@
1131 "zh-chs": "啟用第二因素身份驗證",
1132 "xloc": [
1133 "default.handlebars->25->1436",
1134 - "default.handlebars->25->1614"
1134 + "default.handlebars->25->1617"
1135 ]
1136 },
1137 {
@@ -1878,7 +1878,7 @@
1878 "ru": "Доступ к файлам сервера",
1879 "zh-chs": "訪問服務器文件",
1880 "xloc": [
1881 - "default.handlebars->25->1570"
1881 + "default.handlebars->25->1572"
1882 ]
1883 },
1884 {
@@ -2003,7 +2003,7 @@
2003 "zh-chs": "帐户已被锁定",
2004 "xloc": [
2005 "default.handlebars->25->1438",
2006 - "default.handlebars->25->1567"
2006 + "default.handlebars->25->1569"
2007 ]
2008 },
2009 {
@@ -2278,8 +2278,8 @@
2278 "ru": "Добавить устройство",
2279 "zh-chs": "添加設備",
2280 "xloc": [
2281 - "default.handlebars->25->1544",
2282 - "default.handlebars->25->1660"
2281 + "default.handlebars->25->1546",
2282 + "default.handlebars->25->1663"
2283 ]
2284 },
2285 {
@@ -2314,8 +2314,8 @@
2314 "zh-chs": "添加設備組",
2315 "xloc": [
2316 "default.handlebars->25->1290",
2317 - "default.handlebars->25->1538",
2318 - "default.handlebars->25->1648",
2317 + "default.handlebars->25->1540",
2318 + "default.handlebars->25->1651",
2319 "default.handlebars->25->198"
2320 ]
2321 },
@@ -2432,7 +2432,7 @@
2432 "ru": "Добавить участие",
2433 "zh-chs": "添加會員",
2434 "xloc": [
2435 - "default.handlebars->25->1678"
2435 + "default.handlebars->25->1681"
2436 ]
2437 },
2438 {
@@ -2524,7 +2524,7 @@
2524 "xloc": [
2525 "default.handlebars->25->1190",
2526 "default.handlebars->25->1289",
2527 - "default.handlebars->25->1654",
2527 + "default.handlebars->25->1657",
2528 "default.handlebars->25->572"
2529 ]
2530 },
@@ -2585,7 +2585,7 @@
2585 "zh-chs": "添加用戶",
2586 "xloc": [
2587 "default.handlebars->25->1189",
2588 - "default.handlebars->25->1533"
2588 + "default.handlebars->25->1535"
2589 ]
2590 },
2591 {
@@ -2619,7 +2619,7 @@
2619 "ru": "Добавить пользователей в группу",
2620 "zh-chs": "將用戶添加到用戶組",
2621 "xloc": [
2622 - "default.handlebars->25->1566"
2622 + "default.handlebars->25->1568"
2623 ]
2624 },
2625 {
@@ -2826,7 +2826,7 @@
2826 "ru": "Области администратора",
2827 "zh-chs": "管理領域",
2828 "xloc": [
2829 - "default.handlebars->25->1596"
2829 + "default.handlebars->25->1599"
2830 ]
2831 },
2832 {
@@ -2861,7 +2861,7 @@
2861 "ru": "Административные области",
2862 "zh-chs": "行政領域",
2863 "xloc": [
2864 - "default.handlebars->25->1489"
2864 + "default.handlebars->25->1491"
2865 ]
2866 },
2867 {
@@ -2989,7 +2989,7 @@
2989 "ru": "Счетчик ошибок агента",
2990 "zh-chs": "座席錯誤計數器",
2991 "xloc": [
2992 - "default.handlebars->25->1719"
2992 + "default.handlebars->25->1722"
2993 ]
2994 },
2995 {
@@ -3058,7 +3058,7 @@
3058 "ru": "Сессии агентов",
3059 "zh-chs": "座席會議",
3060 "xloc": [
3061 - "default.handlebars->25->1735"
3061 + "default.handlebars->25->1738"
3062 ]
3063 },
3064 {
@@ -3181,7 +3181,7 @@
3181 "ru": "Агенты",
3182 "zh-chs": "代理商",
3183 "xloc": [
3184 - "default.handlebars->25->1748"
3184 + "default.handlebars->25->1751"
3185 ]
3186 },
3187 {
@@ -3268,7 +3268,7 @@
3268 "zh-chs": "允許用戶管理此設備組和該組中的設備。",
3269 "xloc": [
3270 "default.handlebars->25->1256",
3271 - "default.handlebars->25->1563"
3271 + "default.handlebars->25->1565"
3272 ]
3273 },
3274 {
@@ -3372,7 +3372,7 @@
3372 "zh-chs": "始終通知",
3373 "xloc": [
3374 "default.handlebars->25->1170",
3375 - "default.handlebars->25->1605",
3375 + "default.handlebars->25->1608",
3376 "default.handlebars->25->518"
3377 ]
3378 },
@@ -3391,7 +3391,7 @@
3391 "zh-chs": "總是提示",
3392 "xloc": [
3393 "default.handlebars->25->1171",
3394 - "default.handlebars->25->1606",
3394 + "default.handlebars->25->1609",
3395 "default.handlebars->25->519"
3396 ]
3397 },
@@ -4001,7 +4001,7 @@
4001 "ru": "Вы уверенны, что {0} плагин: {1}",
4002 "zh-chs": "您確定要{0}插件嗎:{1}",
4003 "xloc": [
4004 - "default.handlebars->25->1788"
4004 + "default.handlebars->25->1791"
4005 ]
4006 },
4007 {
@@ -4097,7 +4097,7 @@
4097 "ru": "Приложение аутентификации",
4098 "zh-chs": "身份驗證應用",
4099 "xloc": [
4100 - "default.handlebars->25->1609"
4100 + "default.handlebars->25->1612"
4101 ]
4102 },
4103 {
@@ -4414,7 +4414,7 @@
4414 "ru": "Резервные коды",
4415 "zh-chs": "備用碼",
4416 "xloc": [
4417 - "default.handlebars->25->1611"
4417 + "default.handlebars->25->1614"
4418 ]
4419 },
4420 {
@@ -4431,7 +4431,7 @@
4431 "ru": "Плохой ключ",
4432 "zh-chs": "錯誤的簽名",
4433 "xloc": [
4434 - "default.handlebars->25->1726"
4434 + "default.handlebars->25->1729"
4435 ]
4436 },
4437 {
@@ -4448,7 +4448,7 @@
4448 "ru": "Плохой веб-сертификат",
4449 "zh-chs": "錯誤的網絡證書",
4450 "xloc": [
4451 - "default.handlebars->25->1725"
4451 + "default.handlebars->25->1728"
4452 ]
4453 },
4454 {
@@ -4586,7 +4586,7 @@
4586 "ru": "Отправить сообщение",
4587 "zh-chs": "廣播",
4588 "xloc": [
4589 - "default.handlebars->25->1531",
4589 + "default.handlebars->25->1533",
4590 "default.handlebars->container->column_l->p4->3->1->0->3->1"
4591 ]
4592 },
@@ -4711,7 +4711,7 @@
4711 "ru": "CIRA Сервер",
4712 "zh-chs": "CIRA服務器",
4713 "xloc": [
4714 - "default.handlebars->25->1776"
4714 + "default.handlebars->25->1779"
4715 ]
4716 },
4717 {
@@ -4728,7 +4728,7 @@
4728 "ru": "CIRA Сервер команды",
4729 "zh-chs": "CIRA服務器命令",
4730 "xloc": [
4731 - "default.handlebars->25->1777"
4731 + "default.handlebars->25->1780"
4732 ]
4733 },
4734 {
@@ -4762,7 +4762,7 @@
4762 "ru": "Загрузка CPU",
4763 "zh-chs": "CPU負載",
4764 "xloc": [
4765 - "default.handlebars->25->1740"
4765 + "default.handlebars->25->1743"
4766 ]
4767 },
4768 {
@@ -4779,7 +4779,7 @@
4779 "ru": "Загрузка CPU за последние 15 минут",
4780 "zh-chs": "最近15分鐘的CPU負載",
4781 "xloc": [
4782 - "default.handlebars->25->1743"
4782 + "default.handlebars->25->1746"
4783 ]
4784 },
4785 {
@@ -4796,7 +4796,7 @@
4796 "ru": "Загрузка CPU за последние 5 минут",
4797 "zh-chs": "最近5分鐘的CPU負載",
4798 "xloc": [
4799 - "default.handlebars->25->1742"
4799 + "default.handlebars->25->1745"
4800 ]
4801 },
4802 {
@@ -4813,7 +4813,7 @@
4813 "ru": "Загрузка CPU за последнюю минуту",
4814 "zh-chs": "最後一分鐘的CPU負載",
4815 "xloc": [
4816 - "default.handlebars->25->1741"
4816 + "default.handlebars->25->1744"
4817 ]
4818 },
4819 {
@@ -4868,7 +4868,7 @@
4868 "ru": "Ошибка вызова",
4869 "zh-chs": "通話錯誤",
4870 "xloc": [
4871 - "default.handlebars->25->1789"
4871 + "default.handlebars->25->1792"
4872 ]
4873 },
4874 {
@@ -5008,7 +5008,7 @@
5008 "ru": "Смена email для {0}",
5009 "zh-chs": "更改{0}的電子郵件",
5010 "xloc": [
5011 - "default.handlebars->25->1637"
5011 + "default.handlebars->25->1640"
5012 ]
5013 },
5014 {
@@ -5046,7 +5046,7 @@
5046 "xloc": [
5047 "default-mobile.handlebars->9->90",
5048 "default.handlebars->25->1115",
5049 - "default.handlebars->25->1626"
5049 + "default.handlebars->25->1629"
5050 ]
5051 },
5052 {
@@ -5063,7 +5063,7 @@
5063 "ru": "Смена пароля для {0}",
5064 "zh-chs": "更改{0}的密碼",
5065 "xloc": [
5066 - "default.handlebars->25->1644"
5066 + "default.handlebars->25->1647"
5067 ]
5068 },
5069 {
@@ -5133,7 +5133,7 @@
5133 "ru": "Изменить пароль для этого пользователя",
5134 "zh-chs": "更改該用戶的密碼",
5135 "xloc": [
5136 - "default.handlebars->25->1625"
5136 + "default.handlebars->25->1628"
5137 ]
5138 },
5139 {
@@ -5338,7 +5338,7 @@
5338 "ru": "Проверка...",
5339 "zh-chs": "檢查...",
5340 "xloc": [
5341 - "default.handlebars->25->1783",
5341 + "default.handlebars->25->1786",
5342 "default.handlebars->25->888"
5343 ]
5344 },
@@ -5554,7 +5554,7 @@
5554 "nl": "Wis alle meldingen",
5555 "zh-chs": "全部清除",
5556 "xloc": [
5557 - "default.handlebars->25->1713"
5557 + "default.handlebars->25->1716"
5558 ]
5559 },
5560 {
@@ -5604,7 +5604,7 @@
5604 "ru": "Очистить это уведомление",
5605 "zh-chs": "清除此通知",
5606 "xloc": [
5607 - "default.handlebars->25->1712"
5607 + "default.handlebars->25->1715"
5608 ]
5609 },
5610 {
@@ -5680,7 +5680,7 @@
5680 "nl": "Klik hier om de gebruikersgroepsnaam te bewerken",
5681 "zh-chs": "单击此处编辑用户组名称",
5682 "xloc": [
5683 - "default.handlebars->25->1523"
5683 + "default.handlebars->25->1525"
5684 ]
5685 },
5686 {
@@ -5855,8 +5855,8 @@
5855 "ru": "Общие группы устройств",
5856 "zh-chs": "通用設備組",
5857 "xloc": [
5858 - "default.handlebars->25->1539",
5859 - "default.handlebars->25->1649"
5858 + "default.handlebars->25->1541",
5859 + "default.handlebars->25->1652"
5860 ]
5861 },
5862 {
@@ -5873,8 +5873,8 @@
5873 "ru": "Общие устройства",
5874 "zh-chs": "通用設備",
5875 "xloc": [
5876 - "default.handlebars->25->1545",
5877 - "default.handlebars->25->1661"
5876 + "default.handlebars->25->1547",
5877 + "default.handlebars->25->1664"
5878 ]
5879 },
5880 {
@@ -5913,9 +5913,9 @@
5913 "default-mobile.handlebars->9->387",
5914 "default.handlebars->25->1235",
5915 "default.handlebars->25->1448",
5916 - "default.handlebars->25->1515",
5917 - "default.handlebars->25->1559",
5918 - "default.handlebars->25->1647",
5916 + "default.handlebars->25->1517",
5917 + "default.handlebars->25->1561",
5918 + "default.handlebars->25->1650",
5919 "default.handlebars->25->408",
5920 "default.handlebars->25->647",
5921 "default.handlebars->25->656"
@@ -5999,7 +5999,7 @@
5999 "nl": "Bevestig verwijdering geselecteerde gebruikersgroep(en)?",
6000 "zh-chs": "确认删除选定的用户组?",
6001 "xloc": [
6002 - "default.handlebars->25->1514"
6002 + "default.handlebars->25->1516"
6003 ]
6004 },
6005 {
@@ -6016,7 +6016,7 @@
6016 "ru": "Подтвердить удаление пользователя {0}?",
6017 "zh-chs": "確認刪除用戶{0}?",
6018 "xloc": [
6019 - "default.handlebars->25->1646"
6019 + "default.handlebars->25->1649"
6020 ]
6021 },
6022 {
@@ -6030,7 +6030,7 @@
6030 "nl": "Bevestig lidmaatschap verwijderen van gebruiker \\\"{0}\\\"?",
6031 "zh-chs": "确认删除用户\\“ {0} \\”的成员身份?",
6032 "xloc": [
6033 - "default.handlebars->25->1562"
6033 + "default.handlebars->25->1564"
6034 ]
6035 },
6036 {
@@ -6044,7 +6044,7 @@
6044 "nl": "Bevestig lidmaatschap verwijdering van gebruikergroep \\\"{0}\\\"?",
6045 "zh-chs": "确认删除用户组 “{0}” 的成员身份?",
6046 "xloc": [
6047 - "default.handlebars->25->1676"
6047 + "default.handlebars->25->1679"
6048 ]
6049 },
6050 {
@@ -6111,8 +6111,8 @@
6111 "nl": "Bevestig verwijdering van toegangsrechten voor apparaat \\\"{0}\\\"?",
6112 "zh-chs": "确认删除设备“ {0} ”的访问权限?",
6113 "xloc": [
6114 - "default.handlebars->25->1552",
6115 - "default.handlebars->25->1667"
6114 + "default.handlebars->25->1554",
6115 + "default.handlebars->25->1670"
6116 ]
6117 },
6118 {
@@ -6126,8 +6126,8 @@
6126 "nl": "Bevestig verwijdering van toegangsrechten voor apparaatgroep \\\"{0}\\\"?",
6127 "zh-chs": "是否确认删除设备组“ {0}”的访问权限?",
6128 "xloc": [
6129 - "default.handlebars->25->1554",
6130 - "default.handlebars->25->1680"
6129 + "default.handlebars->25->1556",
6130 + "default.handlebars->25->1683"
6131 ]
6132 },
6133 {
@@ -6141,7 +6141,7 @@
6141 "nl": "Bevestig verwijdering van toegangsrechten voor gebruiker \\\"{0}\\\"?",
6142 "zh-chs": "确认删除用户\\“ {0} \\”的访问权限?",
6143 "xloc": [
6144 - "default.handlebars->25->1669"
6144 + "default.handlebars->25->1672"
6145 ]
6146 },
6147 {
@@ -6155,7 +6155,7 @@
6155 "nl": "Bevestig verwijdering van toegangsrechten voor gebruikergroep \\\"{0}\\\"?",
6156 "zh-chs": "确认删除用户组“ {0}”的访问权限?",
6157 "xloc": [
6158 - "default.handlebars->25->1672"
6158 + "default.handlebars->25->1675"
6159 ]
6160 },
6161 {
@@ -6169,8 +6169,8 @@
6169 "nl": "Verwijdering van toegangsrechten bevestigen?",
6170 "zh-chs": "确认删除访问权限?",
6171 "xloc": [
6172 - "default.handlebars->25->1670",
6173 - "default.handlebars->25->1673"
6172 + "default.handlebars->25->1673",
6173 + "default.handlebars->25->1676"
6174 ]
6175 },
6176 {
@@ -6417,7 +6417,7 @@
6417 "ru": "Подключено Intel&reg; AMT",
6418 "zh-chs": "連接的英特爾&reg;AMT",
6419 "xloc": [
6420 - "default.handlebars->25->1731"
6420 + "default.handlebars->25->1734"
6421 ]
6422 },
6423 {
@@ -6434,7 +6434,7 @@
6434 "ru": "Подключенные пользователи",
6435 "zh-chs": "關聯用戶",
6436 "xloc": [
6437 - "default.handlebars->25->1736"
6437 + "default.handlebars->25->1739"
6438 ]
6439 },
6440 {
@@ -6511,7 +6511,7 @@
6511 "ru": "Подключений ",
6512 "zh-chs": "連接數",
6513 "xloc": [
6514 - "default.handlebars->25->1747"
6514 + "default.handlebars->25->1750"
6515 ]
6516 },
6517 {
@@ -6528,7 +6528,7 @@
6528 "ru": "Ретранслятор подключения",
6529 "zh-chs": "連接繼電器",
6530 "xloc": [
6531 - "default.handlebars->25->1775"
6531 + "default.handlebars->25->1778"
6532 ]
6533 },
6534 {
@@ -6655,7 +6655,7 @@
6655 "ru": "Cookie-кодировщик",
6656 "zh-chs": "Cookie編碼器",
6657 "xloc": [
6658 - "default.handlebars->25->1761"
6658 + "default.handlebars->25->1764"
6659 ]
6660 },
6661 {
@@ -6960,7 +6960,7 @@
6960 "ru": "Основной сервер",
6961 "zh-chs": "核心服務器",
6962 "xloc": [
6963 - "default.handlebars->25->1760"
6963 + "default.handlebars->25->1763"
6964 ]
6965 },
6966 {
@@ -6994,7 +6994,7 @@
6994 "ru": "Создать учетную запись",
6995 "zh-chs": "創建帳號",
6996 "xloc": [
6997 - "default.handlebars->25->1485",
6997 + "default.handlebars->25->1487",
6998 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->createpanel->1->1->9->1->12->1->1",
6999 "login.handlebars->container->column_l->centralTable->1->0->logincell->createpanel->1->9->1->12->1->1"
7000 ]
@@ -7030,7 +7030,7 @@
7030 "ru": "Создать группу пользователей",
7031 "zh-chs": "創建用戶組",
7032 "xloc": [
7033 - "default.handlebars->25->1520"
7033 + "default.handlebars->25->1522"
7034 ]
7035 },
7036 {
@@ -7116,7 +7116,7 @@
7116 "ru": "Создано",
7117 "zh-chs": "創建",
7118 "xloc": [
7119 - "default.handlebars->25->1585"
7119 + "default.handlebars->25->1588"
7120 ]
7121 },
7122 {
@@ -7433,6 +7433,12 @@
7433 "default.handlebars->25->368"
7434 ]
7435 },
7436 + {
7437 + "en": "Default",
7438 + "xloc": [
7439 + "default.handlebars->25->1474"
7440 + ]
7441 + },
7442 {
7443 "cs": "Smazat",
7444 "de": "Löschen",
@@ -7581,7 +7587,7 @@
7587 "ru": "Удалить пользователя",
7588 "zh-chs": "刪除用戶",
7589 "xloc": [
7584 - "default.handlebars->25->1624"
7590 + "default.handlebars->25->1627"
7591 ]
7592 },
7593 {
@@ -7598,8 +7604,8 @@
7604 "ru": "Удалить группу пользователей",
7605 "zh-chs": "刪除用戶組",
7606 "xloc": [
7601 - "default.handlebars->25->1550",
7602 - "default.handlebars->25->1560"
7607 + "default.handlebars->25->1552",
7608 + "default.handlebars->25->1562"
7609 ]
7610 },
7611 {
@@ -7613,7 +7619,7 @@
7619 "nl": "Gebruikersgroepen verwijderen",
7620 "zh-chs": "删除用户组",
7621 "xloc": [
7616 - "default.handlebars->25->1516"
7622 + "default.handlebars->25->1518"
7623 ]
7624 },
7625 {
@@ -7630,7 +7636,7 @@
7636 "ru": "Удалить пользователя {0}",
7637 "zh-chs": "刪除用戶{0}",
7638 "xloc": [
7633 - "default.handlebars->25->1645"
7639 + "default.handlebars->25->1648"
7640 ]
7641 },
7642 {
@@ -7680,7 +7686,7 @@
7686 "nl": "Verwijder groep",
7687 "zh-chs": "删除群组",
7688 "xloc": [
7683 - "default.handlebars->25->1512"
7689 + "default.handlebars->25->1514"
7690 ]
7691 },
7692 {
@@ -7734,7 +7740,7 @@
7740 "ru": "Удалить группу пользователей {0}?",
7741 "zh-chs": "刪除用戶組{0}?",
7742 "xloc": [
7737 - "default.handlebars->25->1558"
7743 + "default.handlebars->25->1560"
7744 ]
7745 },
7746 {
@@ -7871,10 +7877,10 @@
7877 "default.handlebars->25->1127",
7878 "default.handlebars->25->1155",
7879 "default.handlebars->25->1238",
7874 - "default.handlebars->25->1519",
7875 - "default.handlebars->25->1526",
7876 - "default.handlebars->25->1527",
7877 - "default.handlebars->25->1556",
7880 + "default.handlebars->25->1521",
7881 + "default.handlebars->25->1528",
7882 + "default.handlebars->25->1529",
7883 + "default.handlebars->25->1558",
7884 "default.handlebars->25->477",
7885 "default.handlebars->25->478",
7886 "default.handlebars->25->688",
@@ -7913,7 +7919,7 @@
7919 "xloc": [
7920 "default-mobile.handlebars->9->245",
7921 "default.handlebars->25->1243",
7916 - "default.handlebars->25->1690",
7922 + "default.handlebars->25->1693",
7923 "default.handlebars->25->444",
7924 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevDesktop",
7925 "default.handlebars->contextMenu->cxdesktop"
@@ -7951,7 +7957,7 @@
7957 "zh-chs": "桌面通知",
7958 "xloc": [
7959 "default.handlebars->25->1165",
7954 - "default.handlebars->25->1600",
7960 + "default.handlebars->25->1603",
7961 "default.handlebars->25->513"
7962 ]
7963 },
@@ -7970,7 +7976,7 @@
7976 "zh-chs": "桌面提示",
7977 "xloc": [
7978 "default.handlebars->25->1164",
7973 - "default.handlebars->25->1599",
7979 + "default.handlebars->25->1602",
7980 "default.handlebars->25->512"
7981 ]
7982 },
@@ -7989,7 +7995,7 @@
7995 "zh-chs": "桌面提示+工具欄",
7996 "xloc": [
7997 "default.handlebars->25->1162",
7992 - "default.handlebars->25->1597",
7998 + "default.handlebars->25->1600",
7999 "default.handlebars->25->510"
8000 ]
8001 },
@@ -8022,7 +8028,7 @@
8028 "zh-chs": "桌面工具欄",
8029 "xloc": [
8030 "default.handlebars->25->1163",
8025 - "default.handlebars->25->1598",
8031 + "default.handlebars->25->1601",
8032 "default.handlebars->25->511"
8033 ]
8034 },
@@ -8095,7 +8101,7 @@
8101 "zh-chs": "設備",
8102 "xloc": [
8103 "default.handlebars->25->1265",
8098 - "default.handlebars->25->1664",
8104 + "default.handlebars->25->1667",
8105 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSort->sortselect->5"
8106 ]
8107 },
@@ -8134,10 +8140,10 @@
8140 "default.handlebars->25->1260",
8141 "default.handlebars->25->1263",
8142 "default.handlebars->25->1264",
8137 - "default.handlebars->25->1542",
8138 - "default.handlebars->25->1548",
8139 - "default.handlebars->25->1652",
8140 - "default.handlebars->25->1699"
8143 + "default.handlebars->25->1544",
8144 + "default.handlebars->25->1550",
8145 + "default.handlebars->25->1655",
8146 + "default.handlebars->25->1702"
8147 ]
8148 },
8149 {
@@ -8174,10 +8180,10 @@
8180 "xloc": [
8181 "default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->3",
8182 "default.handlebars->25->1414",
8177 - "default.handlebars->25->1506",
8178 - "default.handlebars->25->1529",
8179 - "default.handlebars->25->1594",
8180 - "default.handlebars->25->1734",
8183 + "default.handlebars->25->1508",
8184 + "default.handlebars->25->1531",
8185 + "default.handlebars->25->1597",
8186 + "default.handlebars->25->1737",
8187 "default.handlebars->container->column_l->p2->p2info->7"
8188 ]
8189 },
@@ -8237,7 +8243,7 @@
8243 "zh-chs": "設備名稱",
8244 "xloc": [
8245 "default-mobile.handlebars->9->267",
8240 - "default.handlebars->25->1698",
8246 + "default.handlebars->25->1701",
8247 "default.handlebars->25->244",
8248 "default.handlebars->25->686",
8249 "player.handlebars->3->9"
@@ -8617,8 +8623,8 @@
8623 "nl": "Apparaten",
8624 "zh-chs": "设备",
8625 "xloc": [
8620 - "default.handlebars->25->1507",
8621 - "default.handlebars->25->1530"
8626 + "default.handlebars->25->1509",
8627 + "default.handlebars->25->1532"
8628 ]
8629 },
8630 {
@@ -8804,6 +8810,12 @@
8810 "default.handlebars->25->1219"
8811 ]
8812 },
8813 + {
8814 + "en": "Domain",
8815 + "xloc": [
8816 + "default.handlebars->25->1475"
8817 + ]
8818 + },
8819 {
8820 "en": "Don't configure",
8821 "es": "No configurar",
@@ -9249,7 +9261,7 @@
9261 "nl": "Dubbele agent",
9262 "zh-chs": "代理重复",
9263 "xloc": [
9252 - "default.handlebars->25->1730"
9264 + "default.handlebars->25->1733"
9265 ]
9266 },
9267 {
@@ -9283,7 +9295,7 @@
9295 "ru": "Скопировать группу пользователей",
9296 "zh-chs": "重複的用戶組",
9297 "xloc": [
9286 - "default.handlebars->25->1521"
9298 + "default.handlebars->25->1523"
9299 ]
9300 },
9301 {
@@ -9314,8 +9326,8 @@
9326 "ru": "Длительность",
9327 "zh-chs": "持續時間",
9328 "xloc": [
9317 - "default.handlebars->25->1684",
9318 - "default.handlebars->25->1704",
9329 + "default.handlebars->25->1687",
9330 + "default.handlebars->25->1707",
9331 "player.handlebars->3->2"
9332 ]
9333 },
@@ -9800,7 +9812,7 @@
9812 "ru": "Редактировать группу пользователей",
9813 "zh-chs": "編輯用戶組",
9814 "xloc": [
9803 - "default.handlebars->25->1557"
9815 + "default.handlebars->25->1559"
9816 ]
9817 },
9818 {
@@ -9849,11 +9861,11 @@
9861 "zh-chs": "電子郵件",
9862 "xloc": [
9863 "default-mobile.handlebars->9->78",
9852 - "default.handlebars->25->1475",
9853 - "default.handlebars->25->1579",
9854 - "default.handlebars->25->1580",
9855 - "default.handlebars->25->1619",
9856 - "default.handlebars->25->1633",
9864 + "default.handlebars->25->1477",
9865 + "default.handlebars->25->1582",
9866 + "default.handlebars->25->1583",
9867 + "default.handlebars->25->1622",
9868 + "default.handlebars->25->1636",
9869 "default.handlebars->25->292",
9870 "login-mobile.handlebars->5->42",
9871 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3",
@@ -9987,7 +9999,7 @@
9999 "zh-chs": "電子郵件已驗證",
10000 "xloc": [
10001 "default.handlebars->25->1434",
9990 - "default.handlebars->25->1576"
10002 + "default.handlebars->25->1578"
10003 ]
10004 },
10005 {
@@ -10004,7 +10016,7 @@
10016 "ru": "Email подтвержден.",
10017 "zh-chs": "電子郵件已驗證。",
10018 "xloc": [
10007 - "default.handlebars->25->1481"
10019 + "default.handlebars->25->1483"
10020 ]
10021 },
10022 {
@@ -10021,7 +10033,7 @@
10033 "ru": "Email не подтвержден",
10034 "zh-chs": "電子郵件未驗證",
10035 "xloc": [
10024 - "default.handlebars->25->1577"
10036 + "default.handlebars->25->1579"
10037 ]
10038 },
10039 {
@@ -10060,7 +10072,7 @@
10072 "en": "Email verified and forced password reset required.",
10073 "nl": "E-mail geverifieerd en geforceerd opnieuw instellen van wachtwoord vereist.",
10074 "xloc": [
10063 - "default.handlebars->25->1482"
10075 + "default.handlebars->25->1484"
10076 ]
10077 },
10078 {
@@ -10073,7 +10085,7 @@
10085 "nl": "Email/SMS verkeer",
10086 "zh-chs": "电子邮件/短信流量",
10087 "xloc": [
10076 - "default.handlebars->25->1769"
10088 + "default.handlebars->25->1772"
10089 ]
10090 },
10091 {
@@ -10171,7 +10183,7 @@
10183 "en": "Enabled",
10184 "nl": "Ingeschakeld",
10185 "xloc": [
10174 - "default.handlebars->25->1706"
10186 + "default.handlebars->25->1709"
10187 ]
10188 },
10189 {
@@ -10195,7 +10207,7 @@
10207 "en": "End Time",
10208 "nl": "Eindtijd",
10209 "xloc": [
10198 - "default.handlebars->25->1703"
10210 + "default.handlebars->25->1706"
10211 ]
10212 },
10213 {
@@ -10451,7 +10463,7 @@
10463 "ru": "Введите разделенный запятыми список имен административных областей.",
10464 "zh-chs": "輸入管理領域名稱的逗號分隔列表。",
10465 "xloc": [
10454 - "default.handlebars->25->1486"
10466 + "default.handlebars->25->1488"
10467 ]
10468 },
10469 {
@@ -10758,7 +10770,7 @@
10770 "ru": "Внешний",
10771 "zh-chs": "外部",
10772 "xloc": [
10761 - "default.handlebars->25->1754"
10773 + "default.handlebars->25->1757"
10774 ]
10775 },
10776 {
@@ -10964,7 +10976,7 @@
10976 "default-mobile.handlebars->9->165",
10977 "default-mobile.handlebars->9->246",
10978 "default.handlebars->25->1250",
10967 - "default.handlebars->25->1691",
10979 + "default.handlebars->25->1694",
10980 "default.handlebars->25->218",
10981 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevFiles",
10982 "default.handlebars->contextMenu->cxfiles"
@@ -11002,7 +11014,7 @@
11014 "zh-chs": "文件通知",
11015 "xloc": [
11016 "default.handlebars->25->1169",
11005 - "default.handlebars->25->1604",
11017 + "default.handlebars->25->1607",
11018 "default.handlebars->25->517"
11019 ]
11020 },
@@ -11021,7 +11033,7 @@
11033 "zh-chs": "文件提示",
11034 "xloc": [
11035 "default.handlebars->25->1168",
11024 - "default.handlebars->25->1603",
11036 + "default.handlebars->25->1606",
11037 "default.handlebars->25->516"
11038 ]
11039 },
@@ -11182,8 +11194,8 @@
11194 "ru": "Принудительно сбросить пароль при следующем входе в систему.",
11195 "zh-chs": "下次登錄時強制重置密碼。",
11196 "xloc": [
11185 - "default.handlebars->25->1480",
11186 - "default.handlebars->25->1642"
11197 + "default.handlebars->25->1482",
11198 + "default.handlebars->25->1645"
11199 ]
11200 },
11201 {
@@ -11269,8 +11281,8 @@
11281 "ru": "Свободно",
11282 "zh-chs": "自由",
11283 "xloc": [
11272 - "default.handlebars->25->1715",
11273 - "default.handlebars->25->1717"
11284 + "default.handlebars->25->1718",
11285 + "default.handlebars->25->1720"
11286 ]
11287 },
11288 {
@@ -11464,7 +11476,7 @@
11476 "default-mobile.handlebars->9->410",
11477 "default.handlebars->25->1136",
11478 "default.handlebars->25->1268",
11467 - "default.handlebars->25->1492"
11479 + "default.handlebars->25->1494"
11480 ]
11481 },
11482 {
@@ -11564,7 +11576,7 @@
11576 "ru": "Администратор с полным доступом",
11577 "zh-chs": "正式管理員",
11578 "xloc": [
11567 - "default.handlebars->25->1571"
11579 + "default.handlebars->25->1573"
11580 ]
11581 },
11582 {
@@ -11996,7 +12008,7 @@
12008 "zh-chs": "集體行動",
12009 "xloc": [
12010 "default.handlebars->25->1446",
11999 - "default.handlebars->25->1513",
12011 + "default.handlebars->25->1515",
12012 "default.handlebars->25->406",
12013 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->devListToolbar",
12014 "default.handlebars->container->column_l->p4->3->1->0->3->3",
@@ -12017,7 +12029,7 @@
12029 "ru": "Члены группы",
12030 "zh-chs": "小組成員",
12031 "xloc": [
12020 - "default.handlebars->25->1534"
12032 + "default.handlebars->25->1536"
12033 ]
12034 },
12035 {
@@ -12189,7 +12201,7 @@
12201 "ru": "Всего кучи",
12202 "zh-chs": "堆總數",
12203 "xloc": [
12192 - "default.handlebars->25->1756"
12204 + "default.handlebars->25->1759"
12205 ]
12206 },
12207 {
@@ -12206,7 +12218,7 @@
12218 "ru": "Куча используется",
12219 "zh-chs": "堆使用",
12220 "xloc": [
12209 - "default.handlebars->25->1755"
12221 + "default.handlebars->25->1758"
12222 ]
12223 },
12224 {
@@ -12997,8 +13009,8 @@
13009 "xloc": [
13010 "default.handlebars->25->1352",
13011 "default.handlebars->25->1360",
13000 - "default.handlebars->25->1752",
13001 - "default.handlebars->25->1774"
13012 + "default.handlebars->25->1755",
13013 + "default.handlebars->25->1777"
13014 ]
13015 },
13016 {
@@ -13039,14 +13051,14 @@
13051 "en": "Intel AMT Redirection",
13052 "nl": "Intel AMT omleiding",
13053 "xloc": [
13042 - "default.handlebars->25->1693"
13054 + "default.handlebars->25->1696"
13055 ]
13056 },
13057 {
13058 "en": "Intel AMT WSMAN",
13059 "nl": "Intel AMT WSMAN",
13060 "xloc": [
13049 - "default.handlebars->25->1692"
13061 + "default.handlebars->25->1695"
13062 ]
13063 },
13064 {
@@ -13731,7 +13743,7 @@
13743 "ru": "Некорректный тип группы устройств",
13744 "zh-chs": "無效的設備組類型",
13745 "xloc": [
13734 - "default.handlebars->25->1729"
13746 + "default.handlebars->25->1732"
13747 ]
13748 },
13749 {
@@ -13748,7 +13760,7 @@
13760 "ru": "Некорректный JSON",
13761 "zh-chs": "無效的JSON",
13762 "xloc": [
13751 - "default.handlebars->25->1723"
13763 + "default.handlebars->25->1726"
13764 ]
13765 },
13766 {
@@ -13800,7 +13812,7 @@
13812 "ru": "Некорректная сигнатура PKCS",
13813 "zh-chs": "無效的PKCS簽名",
13814 "xloc": [
13803 - "default.handlebars->25->1721"
13815 + "default.handlebars->25->1724"
13816 ]
13817 },
13818 {
@@ -13817,7 +13829,7 @@
13829 "ru": "Некорректная сигнатура RSA",
13830 "zh-chs": "無效的RSA密碼",
13831 "xloc": [
13820 - "default.handlebars->25->1722"
13832 + "default.handlebars->25->1725"
13833 ]
13834 },
13835 {
@@ -14644,7 +14656,7 @@
14656 "ru": "Последний вход в систему",
14657 "zh-chs": "上次登錄",
14658 "xloc": [
14647 - "default.handlebars->25->1586"
14659 + "default.handlebars->25->1589"
14660 ]
14661 },
14662 {
@@ -14707,7 +14719,7 @@
14719 "ru": "Последнее изменение: {0}",
14720 "zh-chs": "上次更改:{0}",
14721 "xloc": [
14710 - "default.handlebars->25->1590"
14722 + "default.handlebars->25->1593"
14723 ]
14724 },
14725 {
@@ -14874,7 +14886,7 @@
14886 "nl": "Leeg laten voor geen.",
14887 "zh-chs": "一无所有。",
14888 "xloc": [
14877 - "default.handlebars->25->1630"
14889 + "default.handlebars->25->1633"
14890 ]
14891 },
14892 {
@@ -14913,7 +14925,7 @@
14925 "ru": "Меньше",
14926 "zh-chs": "減",
14927 "xloc": [
14916 - "default.handlebars->25->1791"
14928 + "default.handlebars->25->1794"
14929 ]
14930 },
14931 {
@@ -15458,7 +15470,7 @@
15470 "ru": "Заблокировать учетную запись",
15471 "zh-chs": "鎖定賬戶",
15472 "xloc": [
15461 - "default.handlebars->25->1499"
15473 + "default.handlebars->25->1501"
15474 ]
15475 },
15476 {
@@ -15509,7 +15521,7 @@
15521 "ru": "Заблокированная учетная запись",
15522 "zh-chs": "賬戶鎖定",
15523 "xloc": [
15512 - "default.handlebars->25->1568"
15524 + "default.handlebars->25->1570"
15525 ]
15526 },
15527 {
@@ -16022,7 +16034,7 @@
16034 "ru": "Сообщения главного сервера",
16035 "zh-chs": "主服務器消息",
16036 "xloc": [
16025 - "default.handlebars->25->1763"
16037 + "default.handlebars->25->1766"
16038 ]
16039 },
16040 {
@@ -16154,7 +16166,7 @@
16166 "en": "Manage Recordings",
16167 "nl": "Beheeer opnames",
16168 "xloc": [
16157 - "default.handlebars->25->1498"
16169 + "default.handlebars->25->1500"
16170 ]
16171 },
16172 {
@@ -16188,7 +16200,7 @@
16200 "ru": "Управление группами пользователя",
16201 "zh-chs": "管理用戶組",
16202 "xloc": [
16191 - "default.handlebars->25->1497"
16203 + "default.handlebars->25->1499"
16204 ]
16205 },
16206 {
@@ -16205,7 +16217,7 @@
16217 "ru": "Управление пользователями",
16218 "zh-chs": "管理用戶",
16219 "xloc": [
16208 - "default.handlebars->25->1496",
16220 + "default.handlebars->25->1498",
16221 "default.handlebars->25->597"
16222 ]
16223 },
@@ -16448,7 +16460,7 @@
16460 "ru": "Достигнуто максимальное число сессий",
16461 "zh-chs": "達到的會話數上限",
16462 "xloc": [
16451 - "default.handlebars->25->1727"
16463 + "default.handlebars->25->1730"
16464 ]
16465 },
16466 {
@@ -16502,7 +16514,7 @@
16514 "ru": "Мегабайт",
16515 "zh-chs": "兆字節",
16516 "xloc": [
16505 - "default.handlebars->25->1753"
16517 + "default.handlebars->25->1756"
16518 ]
16519 },
16520 {
@@ -16520,7 +16532,7 @@
16532 "zh-chs": "記憶",
16533 "xloc": [
16534 "default-mobile.handlebars->9->366",
16523 - "default.handlebars->25->1744",
16535 + "default.handlebars->25->1747",
16536 "default.handlebars->25->842",
16537 "default.handlebars->container->column_l->p40->3->1->p40type->3"
16538 ]
@@ -16658,7 +16670,7 @@
16670 "ru": "Трафик MeshAgent",
16671 "zh-chs": "MeshAgent流量",
16672 "xloc": [
16661 - "default.handlebars->25->1765"
16673 + "default.handlebars->25->1768"
16674 ]
16675 },
16676 {
@@ -16675,7 +16687,7 @@
16687 "ru": "Обновление MeshAgent",
16688 "zh-chs": "MeshAgent更新",
16689 "xloc": [
16678 - "default.handlebars->25->1766"
16690 + "default.handlebars->25->1769"
16691 ]
16692 },
16693 {
@@ -16778,7 +16790,7 @@
16790 "ru": "Соединения сервера MeshCentral",
16791 "zh-chs": "MeshCentral服務器對等",
16792 "xloc": [
16781 - "default.handlebars->25->1764"
16793 + "default.handlebars->25->1767"
16794 ]
16795 },
16796 {
@@ -17042,7 +17054,7 @@
17054 "ru": "Диспетчер сообщения",
17055 "zh-chs": "郵件調度程序",
17056 "xloc": [
17045 - "default.handlebars->25->1762"
17057 + "default.handlebars->25->1765"
17058 ]
17059 },
17060 {
@@ -17191,7 +17203,7 @@
17203 "ru": "Еще",
17204 "zh-chs": "更多",
17205 "xloc": [
17194 - "default.handlebars->25->1790"
17206 + "default.handlebars->25->1793"
17207 ]
17208 },
17209 {
@@ -17267,7 +17279,7 @@
17279 "en": "Multiplexor",
17280 "nl": "Multiplexor",
17281 "xloc": [
17270 - "default.handlebars->25->1705"
17282 + "default.handlebars->25->1708"
17283 ]
17284 },
17285 {
@@ -17539,11 +17551,11 @@
17551 "default.handlebars->25->1154",
17552 "default.handlebars->25->1237",
17553 "default.handlebars->25->1413",
17542 - "default.handlebars->25->1504",
17543 - "default.handlebars->25->1518",
17544 - "default.handlebars->25->1525",
17545 - "default.handlebars->25->1555",
17546 - "default.handlebars->25->1574",
17554 + "default.handlebars->25->1506",
17555 + "default.handlebars->25->1520",
17556 + "default.handlebars->25->1527",
17557 + "default.handlebars->25->1557",
17558 + "default.handlebars->25->1576",
17559 "default.handlebars->25->467",
17560 "default.handlebars->25->717",
17561 "default.handlebars->25->77",
@@ -17585,7 +17597,7 @@
17597 "ru": "Имя1, Имя2, Имя3",
17598 "zh-chs": "名稱1,名稱2,名稱3",
17599 "xloc": [
17588 - "default.handlebars->25->1488"
17600 + "default.handlebars->25->1490"
17601 ]
17602 },
17603 {
@@ -17939,7 +17951,7 @@
17951 "zh-chs": "找不到活動",
17952 "xloc": [
17953 "default.handlebars->25->1403",
17942 - "default.handlebars->25->1681",
17954 + "default.handlebars->25->1684",
17955 "default.handlebars->25->788"
17956 ]
17957 },
@@ -18083,7 +18095,7 @@
18095 "ru": "Нет членов",
18096 "zh-chs": "沒有會員",
18097 "xloc": [
18086 - "default.handlebars->25->1537"
18098 + "default.handlebars->25->1539"
18099 ]
18100 },
18101 {
@@ -18100,7 +18112,7 @@
18112 "ru": "Запретить создание групп устройств",
18113 "zh-chs": "沒有新的設備組",
18114 "xloc": [
18103 - "default.handlebars->25->1500"
18115 + "default.handlebars->25->1502"
18116 ]
18117 },
18118 {
@@ -18216,7 +18228,7 @@
18228 "ru": "Нет инструментов (MeshCmd/Router)",
18229 "zh-chs": "沒有工具(MeshCmd /路由器)",
18230 "xloc": [
18219 - "default.handlebars->25->1501"
18231 + "default.handlebars->25->1503"
18232 ]
18233 },
18234 {
@@ -18233,8 +18245,8 @@
18245 "ru": "Нет общих групп устройств",
18246 "zh-chs": "沒有共同的設備組",
18247 "xloc": [
18236 - "default.handlebars->25->1543",
18237 - "default.handlebars->25->1653"
18248 + "default.handlebars->25->1545",
18249 + "default.handlebars->25->1656"
18250 ]
18251 },
18252 {
@@ -18330,8 +18342,8 @@
18342 "ru": "Нет общих устройств",
18343 "zh-chs": "沒有共同的設備",
18344 "xloc": [
18333 - "default.handlebars->25->1549",
18334 - "default.handlebars->25->1665"
18345 + "default.handlebars->25->1551",
18346 + "default.handlebars->25->1668"
18347 ]
18348 },
18349 {
@@ -18418,7 +18430,7 @@
18430 "ru": "Группы не найдены.",
18431 "zh-chs": "找不到群組。",
18432 "xloc": [
18421 - "default.handlebars->25->1503"
18433 + "default.handlebars->25->1505"
18434 ]
18435 },
18436 {
@@ -18521,7 +18533,7 @@
18533 "ru": "Нет серверных прав",
18534 "zh-chs": "沒有服務器權限",
18535 "xloc": [
18524 - "default.handlebars->25->1569"
18536 + "default.handlebars->25->1571"
18537 ]
18538 },
18539 {
@@ -18538,7 +18550,7 @@
18550 "ru": "Нет членства в группах пользователей",
18551 "zh-chs": "沒有用戶組成員身份",
18552 "xloc": [
18541 - "default.handlebars->25->1659"
18553 + "default.handlebars->25->1662"
18554 ]
18555 },
18556 {
@@ -18640,13 +18652,13 @@
18652 "default.handlebars->25->1179",
18653 "default.handlebars->25->1354",
18654 "default.handlebars->25->1373",
18643 - "default.handlebars->25->1522",
18655 "default.handlebars->25->1524",
18656 + "default.handlebars->25->1526",
18657 "default.handlebars->25->158",
18646 - "default.handlebars->25->1582",
18647 - "default.handlebars->25->1591",
18648 - "default.handlebars->25->1595",
18649 - "default.handlebars->25->1607",
18658 + "default.handlebars->25->1585",
18659 + "default.handlebars->25->1594",
18660 + "default.handlebars->25->1598",
18661 + "default.handlebars->25->1610",
18662 "default.handlebars->25->174",
18663 "default.handlebars->25->175",
18664 "default.handlebars->25->464",
@@ -18806,7 +18818,7 @@
18818 "en": "Not on server",
18819 "nl": "Niet op de server",
18820 "xloc": [
18809 - "default.handlebars->25->1697"
18821 + "default.handlebars->25->1700"
18822 ]
18823 },
18824 {
@@ -18823,7 +18835,7 @@
18835 "ru": "Не задано",
18836 "zh-chs": "沒有設置",
18837 "xloc": [
18826 - "default.handlebars->25->1575"
18838 + "default.handlebars->25->1577"
18839 ]
18840 },
18841 {
@@ -18840,7 +18852,7 @@
18852 "ru": "не подтверждено",
18853 "zh-chs": "未經審核的",
18854 "xloc": [
18843 - "default.handlebars->25->1635"
18855 + "default.handlebars->25->1638"
18856 ]
18857 },
18858 {
@@ -18858,7 +18870,7 @@
18870 "zh-chs": "筆記",
18871 "xloc": [
18872 "default.handlebars->25->1187",
18861 - "default.handlebars->25->1615",
18873 + "default.handlebars->25->1618",
18874 "default.handlebars->25->536",
18875 "default.handlebars->25->590",
18876 "default.handlebars->25->609",
@@ -18966,7 +18978,7 @@
18978 "ru": "Уведомить",
18979 "zh-chs": "通知",
18980 "xloc": [
18969 - "default.handlebars->25->1621"
18981 + "default.handlebars->25->1624"
18982 ]
18983 },
18984 {
@@ -19080,7 +19092,7 @@
19092 "ru": "Произошло в {0}",
19093 "zh-chs": "發生在{0}",
19094 "xloc": [
19083 - "default.handlebars->25->1711"
19095 + "default.handlebars->25->1714"
19096 ]
19097 },
19098 {
@@ -19325,7 +19337,7 @@
19337 "xloc": [
19338 "default-mobile.handlebars->9->253",
19339 "default.handlebars->25->1442",
19328 - "default.handlebars->25->1511",
19340 + "default.handlebars->25->1513",
19341 "default.handlebars->25->398",
19342 "default.handlebars->25->629"
19343 ]
@@ -19564,7 +19576,7 @@
19576 "ru": "Частичные права",
19577 "zh-chs": "部分權利",
19578 "xloc": [
19567 - "default.handlebars->25->1572"
19579 + "default.handlebars->25->1574"
19580 ]
19581 },
19582 {
@@ -19599,12 +19611,12 @@
19611 "zh-chs": "密碼",
19612 "xloc": [
19613 "default-mobile.handlebars->9->258",
19602 - "default.handlebars->25->1476",
19603 - "default.handlebars->25->1477",
19604 - "default.handlebars->25->1587",
19605 - "default.handlebars->25->1589",
19606 - "default.handlebars->25->1638",
19607 - "default.handlebars->25->1639",
19614 + "default.handlebars->25->1478",
19615 + "default.handlebars->25->1479",
19616 + "default.handlebars->25->1590",
19617 + "default.handlebars->25->1592",
19618 + "default.handlebars->25->1641",
19619 + "default.handlebars->25->1642",
19620 "default.handlebars->25->249",
19621 "default.handlebars->25->278",
19622 "default.handlebars->25->635"
@@ -19713,7 +19725,7 @@
19725 "ru": "Подсказка пароля",
19726 "zh-chs": "密碼提示",
19727 "xloc": [
19716 - "default.handlebars->25->1640"
19728 + "default.handlebars->25->1643"
19729 ]
19730 },
19731 {
@@ -20035,7 +20047,7 @@
20047 "default-mobile.handlebars->9->65",
20048 "default-mobile.handlebars->9->67",
20049 "default.handlebars->25->143",
20038 - "default.handlebars->25->1632",
20050 + "default.handlebars->25->1635",
20051 "default.handlebars->25->868",
20052 "default.handlebars->25->871"
20053 ]
@@ -20050,7 +20062,7 @@
20062 "nl": "Telefoonnummer",
20063 "zh-chs": "电话号码",
20064 "xloc": [
20053 - "default.handlebars->25->1581"
20065 + "default.handlebars->25->1584"
20066 ]
20067 },
20068 {
@@ -20064,7 +20076,7 @@
20076 "zh-chs": "电话号码:",
20077 "xloc": [
20078 "default-mobile.handlebars->9->66",
20067 - "default.handlebars->25->1631",
20079 + "default.handlebars->25->1634",
20080 "default.handlebars->25->870"
20081 ]
20082 },
@@ -20201,7 +20213,7 @@
20213 "zh-chs": "插件動作",
20214 "xloc": [
20215 "default.handlebars->25->169",
20204 - "default.handlebars->25->1787"
20216 + "default.handlebars->25->1790"
20217 ]
20218 },
20219 {
@@ -20519,7 +20531,7 @@
20531 "en": "Present on server",
20532 "nl": "Aanwezig op de server",
20533 "xloc": [
20522 - "default.handlebars->25->1696"
20534 + "default.handlebars->25->1699"
20535 ]
20536 },
20537 {
@@ -20633,7 +20645,7 @@
20645 "ru": "Протокол",
20646 "zh-chs": "協議",
20647 "xloc": [
20636 - "default.handlebars->25->1694",
20648 + "default.handlebars->25->1697",
20649 "player.handlebars->3->15"
20650 ]
20651 },
@@ -20941,7 +20953,7 @@
20953 "ru": "RSS",
20954 "zh-chs": "的RSS",
20955 "xloc": [
20944 - "default.handlebars->25->1757"
20956 + "default.handlebars->25->1760"
20957 ]
20958 },
20959 {
@@ -20958,7 +20970,7 @@
20970 "ru": "Случайный пароль.",
20971 "zh-chs": "隨機化密碼。",
20972 "xloc": [
20961 - "default.handlebars->25->1478"
20973 + "default.handlebars->25->1480"
20974 ]
20975 },
20976 {
@@ -21009,7 +21021,7 @@
21021 "ru": "Области",
21022 "zh-chs": "境界",
21023 "xloc": [
21012 - "default.handlebars->25->1487"
21024 + "default.handlebars->25->1489"
21025 ]
21026 },
21027 {
@@ -21036,7 +21048,7 @@
21048 "en": "Recording Details",
21049 "nl": "Opname details",
21050 "xloc": [
21039 - "default.handlebars->25->1708"
21051 + "default.handlebars->25->1711"
21052 ]
21053 },
21054 {
@@ -21160,7 +21172,7 @@
21172 "ru": "Число ретрансляций",
21173 "zh-chs": "中繼計數",
21174 "xloc": [
21163 - "default.handlebars->25->1739"
21175 + "default.handlebars->25->1742"
21176 ]
21177 },
21178 {
@@ -21177,7 +21189,7 @@
21189 "ru": "Ошибки ретранслятора",
21190 "zh-chs": "中繼錯誤",
21191 "xloc": [
21180 - "default.handlebars->25->1732"
21192 + "default.handlebars->25->1735"
21193 ]
21194 },
21195 {
@@ -21194,8 +21206,8 @@
21206 "ru": "Сессии ретранслятора",
21207 "zh-chs": "接力會議",
21208 "xloc": [
21197 - "default.handlebars->25->1738",
21198 - "default.handlebars->25->1751"
21209 + "default.handlebars->25->1741",
21210 + "default.handlebars->25->1754"
21211 ]
21212 },
21213 {
@@ -21515,8 +21527,8 @@
21527 "nl": "Apparaatgroepmachtigingen verwijderen",
21528 "zh-chs": "删除设备组权限",
21529 "xloc": [
21518 - "default.handlebars->25->1553",
21519 - "default.handlebars->25->1679"
21530 + "default.handlebars->25->1555",
21531 + "default.handlebars->25->1682"
21532 ]
21533 },
21534 {
@@ -21530,8 +21542,8 @@
21542 "nl": "Apparaatmachtigingen verwijderen",
21543 "zh-chs": "删除设备权限",
21544 "xloc": [
21533 - "default.handlebars->25->1551",
21534 - "default.handlebars->25->1666"
21545 + "default.handlebars->25->1553",
21546 + "default.handlebars->25->1669"
21547 ]
21548 },
21549 {
@@ -21559,7 +21571,7 @@
21571 "nl": "Lidmaatschap van gebruikersgroep verwijderen",
21572 "zh-chs": "删除用户组成员身份",
21573 "xloc": [
21562 - "default.handlebars->25->1675"
21574 + "default.handlebars->25->1678"
21575 ]
21576 },
21577 {
@@ -21574,7 +21586,7 @@
21586 "zh-chs": "删除用户组权限",
21587 "xloc": [
21588 "default.handlebars->25->1328",
21577 - "default.handlebars->25->1671"
21589 + "default.handlebars->25->1674"
21590 ]
21591 },
21592 {
@@ -21588,7 +21600,7 @@
21600 "nl": "Gebruikerslidmaatschap verwijderen",
21601 "zh-chs": "删除用户成员资格",
21602 "xloc": [
21591 - "default.handlebars->25->1561"
21603 + "default.handlebars->25->1563"
21604 ]
21605 },
21606 {
@@ -21603,7 +21615,7 @@
21615 "zh-chs": "删除用户权限",
21616 "xloc": [
21617 "default.handlebars->25->1326",
21606 - "default.handlebars->25->1668"
21618 + "default.handlebars->25->1671"
21619 ]
21620 },
21621 {
@@ -21620,7 +21632,7 @@
21632 "ru": "Удалить все двухфакторные аутентификации.",
21633 "zh-chs": "刪除所有第二因素驗證。",
21634 "xloc": [
21623 - "default.handlebars->25->1643"
21635 + "default.handlebars->25->1646"
21636 ]
21637 },
21638 {
@@ -21637,7 +21649,7 @@
21649 "ru": "Удалить все прошлые события для этого userid.",
21650 "zh-chs": "刪除此用戶標識的所有先前事件。",
21651 "xloc": [
21640 - "default.handlebars->25->1479"
21652 + "default.handlebars->25->1481"
21653 ]
21654 },
21655 {
@@ -21718,7 +21730,7 @@
21730 "ru": "Удалить этого пользователя",
21731 "zh-chs": "删除该用户",
21732 "xloc": [
21721 - "default.handlebars->25->1623"
21733 + "default.handlebars->25->1626"
21734 ]
21735 },
21736 {
@@ -21735,7 +21747,7 @@
21747 "ru": "Удалить членство пользователя в группе",
21748 "zh-chs": "刪除用戶組成員身份",
21749 "xloc": [
21738 - "default.handlebars->25->1657"
21750 + "default.handlebars->25->1660"
21751 ]
21752 },
21753 {
@@ -21749,7 +21761,7 @@
21761 "nl": "Gebruikersrechten voor dit apparaat verwijderen",
21762 "zh-chs": "删除此设备的用户组权限",
21763 "xloc": [
21752 - "default.handlebars->25->1547"
21764 + "default.handlebars->25->1549"
21765 ]
21766 },
21767 {
@@ -21766,7 +21778,7 @@
21778 "ru": "Удалить права группы пользователей для этой группы устройств",
21779 "zh-chs": "刪除該設備組的用戶組權限",
21780 "xloc": [
21769 - "default.handlebars->25->1541",
21781 + "default.handlebars->25->1543",
21782 "default.handlebars->25->574"
21783 ]
21784 },
@@ -21785,9 +21797,9 @@
21797 "zh-chs": "刪除此設備組的用戶權限",
21798 "xloc": [
21799 "default.handlebars->25->1204",
21788 - "default.handlebars->25->1535",
21789 - "default.handlebars->25->1651",
21790 - "default.handlebars->25->1663",
21800 + "default.handlebars->25->1537",
21801 + "default.handlebars->25->1654",
21802 + "default.handlebars->25->1666",
21803 "default.handlebars->25->575"
21804 ]
21805 },
@@ -21849,8 +21861,8 @@
21861 "zh-chs": "要求:{0}。",
21862 "xloc": [
21863 "default-mobile.handlebars->9->89",
21852 - "default.handlebars->25->1484",
21853 - "default.handlebars->25->1641"
21864 + "default.handlebars->25->1486",
21865 + "default.handlebars->25->1644"
21866 ]
21867 },
21868 {
@@ -22092,7 +22104,7 @@
22104 "ru": "Ограничения",
22105 "zh-chs": "限制條件",
22106 "xloc": [
22095 - "default.handlebars->25->1573"
22107 + "default.handlebars->25->1575"
22108 ]
22109 },
22110 {
@@ -22315,8 +22327,8 @@
22327 "nl": "SMS",
22328 "zh-chs": "短信",
22329 "xloc": [
22318 - "default.handlebars->25->1612",
22319 - "default.handlebars->25->1617",
22330 + "default.handlebars->25->1615",
22331 + "default.handlebars->25->1620",
22332 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3",
22333 "login.handlebars->container->column_l->centralTable->1->0->logincell->tokenpanel->1->7->1->4->1->3"
22334 ]
@@ -22331,7 +22343,7 @@
22343 "nl": "SMS geschikt telefoonnummer voor deze gebruiker.",
22344 "zh-chs": "此用户的短信功能电话号码。",
22345 "xloc": [
22334 - "default.handlebars->25->1629"
22346 + "default.handlebars->25->1632"
22347 ]
22348 },
22349 {
@@ -22735,7 +22747,7 @@
22747 "xloc": [
22748 "default-mobile.handlebars->9->259",
22749 "default-mobile.handlebars->9->345",
22738 - "default.handlebars->25->1613",
22750 + "default.handlebars->25->1616",
22751 "default.handlebars->25->250",
22752 "default.handlebars->25->636",
22753 "default.handlebars->25->821"
@@ -22755,7 +22767,7 @@
22767 "ru": "Ключ безопасности",
22768 "zh-chs": "安全密鑰",
22769 "xloc": [
22758 - "default.handlebars->25->1610"
22770 + "default.handlebars->25->1613"
22771 ]
22772 },
22773 {
@@ -22791,7 +22803,7 @@
22803 "xloc": [
22804 "default.handlebars->25->1383",
22805 "default.handlebars->25->1440",
22794 - "default.handlebars->25->1509",
22806 + "default.handlebars->25->1511",
22807 "default.handlebars->25->394",
22808 "default.handlebars->25->751",
22809 "default.handlebars->25->753",
@@ -22819,7 +22831,7 @@
22831 "xloc": [
22832 "default.handlebars->25->1382",
22833 "default.handlebars->25->1439",
22822 - "default.handlebars->25->1508",
22834 + "default.handlebars->25->1510",
22835 "default.handlebars->25->393",
22836 "default.handlebars->25->752",
22837 "default.handlebars->meshContextMenu->cxselectnone"
@@ -22905,7 +22917,7 @@
22917 "zh-chs": "选择要对所有选定用户执行的操作。",
22918 "xloc": [
22919 "default.handlebars->25->1441",
22908 - "default.handlebars->25->1510"
22920 + "default.handlebars->25->1512"
22921 ]
22922 },
22923 {
@@ -23046,14 +23058,14 @@
23058 "nl": "Stuur een SMS bericht naar deze gebruiker",
23059 "zh-chs": "发送短信给该用户",
23060 "xloc": [
23049 - "default.handlebars->25->1618"
23061 + "default.handlebars->25->1621"
23062 ]
23063 },
23064 {
23065 "en": "Send a email message to this user",
23066 "nl": "Stuur een e-mailbericht naar deze gebruiker",
23067 "xloc": [
23056 - "default.handlebars->25->1620"
23068 + "default.handlebars->25->1623"
23069 ]
23070 },
23071 {
@@ -23070,7 +23082,7 @@
23082 "ru": "Отправить уведомление всем пользователям этой группы.",
23083 "zh-chs": "向該組中的所有用戶發送通知。",
23084 "xloc": [
23073 - "default.handlebars->25->1532"
23085 + "default.handlebars->25->1534"
23086 ]
23087 },
23088 {
@@ -23137,7 +23149,7 @@
23149 "ru": "Отправить приглашение по email.",
23150 "zh-chs": "發送邀請電子郵件。",
23151 "xloc": [
23140 - "default.handlebars->25->1483"
23152 + "default.handlebars->25->1485"
23153 ]
23154 },
23155 {
@@ -23203,7 +23215,7 @@
23215 "ru": "Отправить уведомление пользователю",
23216 "zh-chs": "發送用戶通知",
23217 "xloc": [
23206 - "default.handlebars->25->1622"
23218 + "default.handlebars->25->1625"
23219 ]
23220 },
23221 {
@@ -23255,7 +23267,7 @@
23267 "ru": "Резервное копирование сервера",
23268 "zh-chs": "服務器備份",
23269 "xloc": [
23258 - "default.handlebars->25->1493"
23270 + "default.handlebars->25->1495"
23271 ]
23272 },
23273 {
@@ -23272,7 +23284,7 @@
23284 "ru": "Сертификат сервера",
23285 "zh-chs": "服務器證書",
23286 "xloc": [
23275 - "default.handlebars->25->1767"
23287 + "default.handlebars->25->1770"
23288 ]
23289 },
23290 {
@@ -23289,7 +23301,7 @@
23301 "ru": "База данных сервера",
23302 "zh-chs": "服務器數據庫",
23303 "xloc": [
23292 - "default.handlebars->25->1768"
23304 + "default.handlebars->25->1771"
23305 ]
23306 },
23307 {
@@ -23310,7 +23322,7 @@
23322 "default-mobile.handlebars->9->416",
23323 "default.handlebars->25->1280",
23324 "default.handlebars->25->1308",
23313 - "default.handlebars->25->1490",
23325 + "default.handlebars->25->1492",
23326 "default.handlebars->25->588",
23327 "default.handlebars->25->607"
23328 ]
@@ -23330,7 +23342,7 @@
23342 "zh-chs": "服務器權限",
23343 "xloc": [
23344 "default.handlebars->25->1427",
23333 - "default.handlebars->25->1502"
23345 + "default.handlebars->25->1504"
23346 ]
23347 },
23348 {
@@ -23347,7 +23359,7 @@
23359 "ru": "Квота сервера",
23360 "zh-chs": "服務器配額",
23361 "xloc": [
23350 - "default.handlebars->25->1584"
23362 + "default.handlebars->25->1587"
23363 ]
23364 },
23365 {
@@ -23364,7 +23376,7 @@
23376 "ru": "Восстановление сервера",
23377 "zh-chs": "服務器還原",
23378 "xloc": [
23367 - "default.handlebars->25->1494"
23379 + "default.handlebars->25->1496"
23380 ]
23381 },
23382 {
@@ -23381,7 +23393,7 @@
23393 "ru": "Права",
23394 "zh-chs": "服務器權限",
23395 "xloc": [
23384 - "default.handlebars->25->1583"
23396 + "default.handlebars->25->1586"
23397 ]
23398 },
23399 {
@@ -23398,7 +23410,7 @@
23410 "ru": "Состояние сервера",
23411 "zh-chs": "服務器狀態",
23412 "xloc": [
23401 - "default.handlebars->25->1718"
23413 + "default.handlebars->25->1721"
23414 ]
23415 },
23416 {
@@ -23432,7 +23444,7 @@
23444 "ru": "Трассировка сервера",
23445 "zh-chs": "服務器跟踪",
23446 "xloc": [
23435 - "default.handlebars->25->1778"
23447 + "default.handlebars->25->1781"
23448 ]
23449 },
23450 {
@@ -23449,7 +23461,7 @@
23461 "ru": "Обновление сервера",
23462 "zh-chs": "服務器更新",
23463 "xloc": [
23452 - "default.handlebars->25->1495"
23464 + "default.handlebars->25->1497"
23465 ]
23466 },
23467 {
@@ -23571,7 +23583,7 @@
23583 "ru": "ServerStats.csv",
23584 "zh-chs": "ServerStats.csv",
23585 "xloc": [
23574 - "default.handlebars->25->1759"
23586 + "default.handlebars->25->1762"
23587 ]
23588 },
23589 {
@@ -23612,7 +23624,7 @@
23624 "en": "Session",
23625 "nl": "Sessie",
23626 "xloc": [
23615 - "default.handlebars->25->1682"
23627 + "default.handlebars->25->1685"
23628 ]
23629 },
23630 {
@@ -24151,8 +24163,8 @@
24163 "ru": "Размер",
24164 "zh-chs": "尺寸",
24165 "xloc": [
24154 - "default.handlebars->25->1685",
24155 - "default.handlebars->25->1700",
24166 + "default.handlebars->25->1688",
24167 + "default.handlebars->25->1703",
24168 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSize"
24169 ]
24170 },
@@ -24963,8 +24975,8 @@
24975 "en": "Start Time",
24976 "nl": "Start tijd",
24977 "xloc": [
24966 - "default.handlebars->25->1683",
24967 - "default.handlebars->25->1702",
24978 + "default.handlebars->25->1686",
24979 + "default.handlebars->25->1705",
24980 "default.handlebars->25->700"
24981 ]
24982 },
@@ -25017,8 +25029,8 @@
25029 "ru": "Статус",
25030 "zh-chs": "狀態",
25031 "xloc": [
25020 - "default.handlebars->25->1634",
25021 - "default.handlebars->25->1695",
25032 + "default.handlebars->25->1637",
25033 + "default.handlebars->25->1698",
25034 "default.handlebars->container->column_l->p42->p42tbl->1->0->7"
25035 ]
25036 },
@@ -25570,7 +25582,7 @@
25582 "xloc": [
25583 "default-mobile.handlebars->9->162",
25584 "default.handlebars->25->1247",
25573 - "default.handlebars->25->1689",
25585 + "default.handlebars->25->1692",
25586 "default.handlebars->25->215",
25587 "default.handlebars->25->445",
25588 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevTerminal",
@@ -25609,7 +25621,7 @@
25621 "zh-chs": "終端通知",
25622 "xloc": [
25623 "default.handlebars->25->1167",
25612 - "default.handlebars->25->1602",
25624 + "default.handlebars->25->1605",
25625 "default.handlebars->25->515"
25626 ]
25627 },
@@ -25628,7 +25640,7 @@
25640 "zh-chs": "終端提示",
25641 "xloc": [
25642 "default.handlebars->25->1166",
25631 - "default.handlebars->25->1601",
25643 + "default.handlebars->25->1604",
25644 "default.handlebars->25->514"
25645 ]
25646 },
@@ -25772,7 +25784,7 @@
25784 "ru": "На данный момент уведомлений нет",
25785 "zh-chs": "目前沒有任何通知",
25786 "xloc": [
25775 - "default.handlebars->25->1710"
25787 + "default.handlebars->25->1713"
25788 ]
25789 },
25790 {
@@ -27005,9 +27017,9 @@
27017 "default.handlebars->25->1144",
27018 "default.handlebars->25->1145",
27019 "default.handlebars->25->13",
27008 - "default.handlebars->25->1674",
27009 - "default.handlebars->25->1687",
27010 - "default.handlebars->25->1688",
27020 + "default.handlebars->25->1677",
27021 + "default.handlebars->25->1690",
27022 + "default.handlebars->25->1691",
27023 "default.handlebars->25->392",
27024 "default.handlebars->25->41",
27025 "default.handlebars->25->42",
@@ -27052,7 +27064,7 @@
27064 "ru": "Неизвестное действие",
27065 "zh-chs": "未知動作",
27066 "xloc": [
27055 - "default.handlebars->25->1724"
27067 + "default.handlebars->25->1727"
27068 ]
27069 },
27070 {
@@ -27069,8 +27081,8 @@
27081 "ru": "Неизвестное устройство",
27082 "zh-chs": "未知設備",
27083 "xloc": [
27072 - "default.handlebars->25->1546",
27073 - "default.handlebars->25->1662"
27084 + "default.handlebars->25->1548",
27085 + "default.handlebars->25->1665"
27086 ]
27087 },
27088 {
@@ -27087,9 +27099,9 @@
27099 "ru": "Неизвестная группа устройств",
27100 "zh-chs": "未知設備組",
27101 "xloc": [
27090 - "default.handlebars->25->1540",
27091 - "default.handlebars->25->1650",
27092 - "default.handlebars->25->1728"
27102 + "default.handlebars->25->1542",
27103 + "default.handlebars->25->1653",
27104 + "default.handlebars->25->1731"
27105 ]
27106 },
27107 {
@@ -27106,7 +27118,7 @@
27118 "ru": "Неизвестная группа",
27119 "zh-chs": "未知群組",
27120 "xloc": [
27109 - "default.handlebars->25->1720"
27121 + "default.handlebars->25->1723"
27122 ]
27123 },
27124 {
@@ -27141,7 +27153,7 @@
27153 "ru": "Неизвестная группа пользователей",
27154 "zh-chs": "未知用戶組",
27155 "xloc": [
27144 - "default.handlebars->25->1656"
27156 + "default.handlebars->25->1659"
27157 ]
27158 },
27159 {
@@ -27230,7 +27242,7 @@
27242 "ru": "Актуально",
27243 "zh-chs": "最新",
27244 "xloc": [
27233 - "default.handlebars->25->1785"
27245 + "default.handlebars->25->1788"
27246 ]
27247 },
27248 {
@@ -27479,8 +27491,8 @@
27491 "ru": "Использовано",
27492 "zh-chs": "用過的",
27493 "xloc": [
27482 - "default.handlebars->25->1714",
27483 - "default.handlebars->25->1716"
27494 + "default.handlebars->25->1717",
27495 + "default.handlebars->25->1719"
27496 ]
27497 },
27498 {
@@ -27499,8 +27511,8 @@
27511 "xloc": [
27512 "default.handlebars->25->1205",
27513 "default.handlebars->25->1428",
27502 - "default.handlebars->25->1536",
27503 - "default.handlebars->25->1707",
27514 + "default.handlebars->25->1538",
27515 + "default.handlebars->25->1710",
27516 "default.handlebars->25->193",
27517 "default.handlebars->25->577"
27518 ]
@@ -27556,7 +27568,7 @@
27568 "ru": "Учетные записи пользователей",
27569 "zh-chs": "用戶帳號",
27570 "xloc": [
27559 - "default.handlebars->25->1733"
27571 + "default.handlebars->25->1736"
27572 ]
27573 },
27574 {
@@ -27593,7 +27605,7 @@
27605 "zh-chs": "用戶同意",
27606 "xloc": [
27607 "default.handlebars->25->1173",
27596 - "default.handlebars->25->1608",
27608 + "default.handlebars->25->1611",
27609 "default.handlebars->25->521"
27610 ]
27611 },
@@ -27613,9 +27625,9 @@
27625 "xloc": [
27626 "default.handlebars->25->1261",
27627 "default.handlebars->25->1262",
27616 - "default.handlebars->25->1517",
27617 - "default.handlebars->25->1658",
27618 - "default.handlebars->25->1677",
27628 + "default.handlebars->25->1519",
27629 + "default.handlebars->25->1661",
27630 + "default.handlebars->25->1680",
27631 "default.handlebars->25->576"
27632 ]
27633 },
@@ -27650,7 +27662,7 @@
27662 "ru": "Членство в группах пользователей",
27663 "zh-chs": "用戶組成員資格",
27664 "xloc": [
27653 - "default.handlebars->25->1655"
27665 + "default.handlebars->25->1658"
27666 ]
27667 },
27668 {
@@ -27674,14 +27686,15 @@
27686 "zh-chs": "用戶標識",
27687 "xloc": [
27688 "default.handlebars->25->1322",
27677 - "default.handlebars->25->1578"
27689 + "default.handlebars->25->1580",
27690 + "default.handlebars->25->1581"
27691 ]
27692 },
27693 {
27694 "en": "User Identifiers",
27695 "xloc": [
27696 "default.handlebars->25->1259",
27684 - "default.handlebars->25->1565"
27697 + "default.handlebars->25->1567"
27698 ]
27699 },
27700 {
@@ -27778,7 +27791,7 @@
27791 "ru": "Сессии пользователя",
27792 "zh-chs": "用戶會話",
27793 "xloc": [
27781 - "default.handlebars->25->1750"
27794 + "default.handlebars->25->1753"
27795 ]
27796 },
27797 {
@@ -27912,7 +27925,7 @@
27925 "zh-chs": "用戶名",
27926 "xloc": [
27927 "default-mobile.handlebars->9->257",
27915 - "default.handlebars->25->1474",
27928 + "default.handlebars->25->1476",
27929 "default.handlebars->25->247",
27930 "default.handlebars->25->277",
27931 "default.handlebars->25->634",
@@ -27972,9 +27985,9 @@
27985 "ru": "Пользователи",
27986 "zh-chs": "用戶數",
27987 "xloc": [
27975 - "default.handlebars->25->1505",
27976 - "default.handlebars->25->1528",
27977 - "default.handlebars->25->1749",
27988 + "default.handlebars->25->1507",
27989 + "default.handlebars->25->1530",
27990 + "default.handlebars->25->1752",
27991 "default.handlebars->container->topbar->1->1->UsersSubMenuSpan->UsersSubMenu->1->0->UsersGeneral"
27992 ]
27993 },
@@ -27992,7 +28005,7 @@
28005 "ru": "Сессии пользователей",
28006 "zh-chs": "用戶會話",
28007 "xloc": [
27995 - "default.handlebars->25->1737"
28008 + "default.handlebars->25->1740"
28009 ]
28010 },
28011 {
@@ -28077,7 +28090,7 @@
28090 "ru": "Проверенный",
28091 "zh-chs": "已驗證",
28092 "xloc": [
28080 - "default.handlebars->25->1636"
28093 + "default.handlebars->25->1639"
28094 ]
28095 },
28096 {
@@ -28181,7 +28194,7 @@
28194 "ru": "Версия несовместима, пожалуйста, сначала обновите установку MeshCentral",
28195 "zh-chs": "版本不兼容,请先升级您的MeshCentral安装",
28196 "xloc": [
28184 - "default.handlebars->25->1781"
28197 + "default.handlebars->25->1784"
28198 ]
28199 },
28200 {
@@ -28249,8 +28262,8 @@
28262 "ru": "Просмотр журнала изменений",
28263 "zh-chs": "查看变更日志",
28264 "xloc": [
28252 - "default.handlebars->25->1784",
28253 - "default.handlebars->25->1786"
28265 + "default.handlebars->25->1787",
28266 + "default.handlebars->25->1789"
28267 ]
28268 },
28269 {
@@ -28301,7 +28314,7 @@
28314 "ru": "Посмотреть примечания об этом пользователе",
28315 "zh-chs": "查看有關此用戶的註釋",
28316 "xloc": [
28304 - "default.handlebars->25->1616"
28317 + "default.handlebars->25->1619"
28318 ]
28319 },
28320 {
@@ -28508,8 +28521,8 @@
28521 "ru": "Веб-сервер",
28522 "zh-chs": "網絡服務器",
28523 "xloc": [
28511 - "default.handlebars->25->1770",
28512 - "default.handlebars->25->1771"
28524 + "default.handlebars->25->1773",
28525 + "default.handlebars->25->1774"
28526 ]
28527 },
28528 {
@@ -28526,7 +28539,7 @@
28539 "ru": "Запросы веб-сервера",
28540 "zh-chs": "Web服務器請求",
28541 "xloc": [
28529 - "default.handlebars->25->1772"
28542 + "default.handlebars->25->1775"
28543 ]
28544 },
28545 {
@@ -28543,7 +28556,7 @@
28556 "ru": "Ретранслятор Web Socket",
28557 "zh-chs": "Web套接字中繼",
28558 "xloc": [
28546 - "default.handlebars->25->1773"
28559 + "default.handlebars->25->1776"
28560 ]
28561 },
28562 {
@@ -28648,7 +28661,7 @@
28661 "ru": "Будет изменено при следующем входе в систему.",
28662 "zh-chs": "下次登錄時將更改。",
28663 "xloc": [
28651 - "default.handlebars->25->1588"
28664 + "default.handlebars->25->1591"
28665 ]
28666 },
28667 {
@@ -29601,7 +29614,7 @@
29614 "ru": "\\\\'",
29615 "zh-chs": "\\\\'",
29616 "xloc": [
29604 - "default.handlebars->25->1782"
29617 + "default.handlebars->25->1785"
29618 ]
29619 },
29620 {
@@ -29876,7 +29889,7 @@
29889 "ru": "свободно",
29890 "zh-chs": "自由",
29891 "xloc": [
29879 - "default.handlebars->25->1745"
29892 + "default.handlebars->25->1748"
29893 ]
29894 },
29895 {
@@ -30162,7 +30175,7 @@
30175 "ru": "k max, пусто по умолчанию",
30176 "zh-chs": "k max,默认为空白",
30177 "xloc": [
30165 - "default.handlebars->25->1491"
30178 + "default.handlebars->25->1493"
30179 ]
30180 },
30181 {
@@ -30246,7 +30259,7 @@
30259 "ru": "servertrace.csv",
30260 "zh-chs": "servertrace.csv",
30261 "xloc": [
30249 - "default.handlebars->25->1780"
30262 + "default.handlebars->25->1783"
30263 ]
30264 },
30265 {
@@ -30303,7 +30316,7 @@
30316 "ru": "time, conn.agent, conn.users, conn.usersessions, conn.relaysession, conn.intelamt, mem.external, mem.heapused, mem.heaptotal, mem.rss",
30317 "zh-chs": "時間,conn.agent,conn.users,conn.usersessions,conn.relaysession,conn.intelamt,mem.external,mem.heapused,mem.heaptotal,mem.rss",
30318 "xloc": [
30306 - "default.handlebars->25->1758"
30319 + "default.handlebars->25->1761"
30320 ]
30321 },
30322 {
@@ -30320,7 +30333,7 @@
30333 "ru": "time, source, message",
30334 "zh-chs": "時間,來源,訊息",
30335 "xloc": [
30323 - "default.handlebars->25->1779"
30336 + "default.handlebars->25->1782"
30337 ]
30338 },
30339 {
@@ -30351,7 +30364,7 @@
30364 "ru": "всего",
30365 "zh-chs": "總",
30366 "xloc": [
30354 - "default.handlebars->25->1746"
30367 + "default.handlebars->25->1749"
30368 ]
30369 },
30370 {
@@ -30510,7 +30523,7 @@
30523 "zh-chs": "{0} Kb",
30524 "xloc": [
30525 "default.handlebars->25->1375",
30513 - "default.handlebars->25->1686"
30526 + "default.handlebars->25->1689"
30527 ]
30528 },
30529 {
@@ -30564,7 +30577,7 @@
30577 "ru": "{0} активных сессий",
30578 "zh-chs": "{0}個活動會話",
30579 "xloc": [
30567 - "default.handlebars->25->1628"
30580 + "default.handlebars->25->1631"
30581 ]
30582 },
30583 {
@@ -30600,7 +30613,7 @@
30613 "xloc": [
30614 "default-mobile.handlebars->9->119",
30615 "default.handlebars->25->1385",
30603 - "default.handlebars->25->1701"
30616 + "default.handlebars->25->1704"
30617 ]
30618 },
30619 {
@@ -30658,7 +30671,7 @@
30671 "ru": "{0} групп",
30672 "zh-chs": "{0}個群組",
30673 "xloc": [
30661 - "default.handlebars->25->1593"
30674 + "default.handlebars->25->1596"
30675 ]
30676 },
30677 {
views/default.handlebars
+30 -7
@@ -2866,8 +2866,10 @@
2866 go(xviewmode);
2867 goBackStack.push(2);
2868 } else if (args.gotouser != null) {
2869 - if ((users == null) || (users['user/' + domain + '/' + args.gotouser] == null)) return; // This user is not loaded yet
2870 - gotoUser('user/' + domain + '/' + args.gotouser);
2869 + var xuserid = args.gotouser;
2870 + if (args.gotouser.indexOf('/') < 0) { xuserid = 'user/' + domain + '/' + args.gotouser; }
2871 + if ((users == null) || (users[xuserid] == null)) return; // This user is not loaded yet
2872 + gotoUser(xuserid);
2873 go(xviewmode);
2874 goBackStack.push(4);
2875 } else if (args.gotougrp != null) {
@@ -10025,7 +10027,7 @@
10027 }
10028
10029 function addUserHtml(user, sessions) {
10028 - var x = '', gray = ' gray', icon = 'm2', msg = '', self = (user.name != userinfo.name), lastAccess = '', permissions = '';
10030 + var x = '', gray = ' gray', icon = 'm2', msg = '', self = (user._id != userinfo._id), lastAccess = '', permissions = '';
10031 if (sessions != null) {
10032 gray = '';
10033 if (self) {
@@ -10072,6 +10074,12 @@
10074 }
10075 }
10076
10077 + // If we are a cross-domain administrator, add the domain.
10078 + if ((userinfo.crossDomain != null)) {
10079 + var userdomain = user._id.split('/')[1];
10080 + if (userdomain != '') { username += ', <span style=color:#26F>' + userdomain + '</span>'; }
10081 + }
10082 +
10083 if ((user.otpsecret > 0) || (user.otphkeys > 0) || ((user.otpekey == 1) && (features & 0x00800000)) || ((user.phone != null) && (features & 0x04000000))) { username += ' <img src="images/key12.png" height=12 width=11 title="' + "2nd factor authentication enabled" + '" style="margin-top:2px" />'; }
10084 if (user.phone != null) { username += ' <img src="images/phone12.png" height=12 width=7 title="' + "Verified phone number" + '" style="margin-top:2px" />'; }
10085 if ((user.siteadmin != null) && ((user.siteadmin & 32) != 0) && (user.siteadmin != 0xFFFFFFFF)) { username += ' <img src="images/padlock12.png" height=12 width=8 title="' + "Account is locked" + '" style="margin-top:2px" />'; }
@@ -10288,6 +10296,14 @@
10296 function showCreateNewAccountDialog() {
10297 if (xxdialogMode) return;
10298 var x = '';
10299 +
10300 + if (userinfo.crossDomain) {
10301 + var y = '<select style=width:240px id=p4domain>';
10302 + for (var i in userinfo.crossDomain) { y += '<option value=' + i + '>' + ((userinfo.crossDomain[i] == '')?"Default":EscapeHtml(userinfo.crossDomain[i])) + '</option>'; }
10303 + y += '</select>';
10304 + x += addHtmlValue("Domain", y);
10305 + }
10306 +
10307 if ((features & 0x200000) == 0) { x += addHtmlValue('<span id=p4hname>' + "Username" + '</span>', '<input id=p4name maxlength=64 autocomplete=username onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />'); }
10308 x += addHtmlValue('<span id=p4hemail>' + "Email" + '</span>', '<input id=p4email maxlength=256 autocomplete="email" inputmode="email" onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />');
10309 x += addHtmlValue('<span id=p4hp1>' + "Password" + '</span>', '<input id=p4pass1 type=password maxlength=256 autocomplete="new-password" onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />');
@@ -10345,6 +10361,7 @@
10361 x.emailVerified = Q('p4verifiedEmail').checked;
10362 x.emailInvitation = Q('p4invitationEmail').checked;
10363 }
10364 + if (userinfo.crossDomain) { x.domain = userinfo.crossDomain[parseInt(Q('p4domain').value)]; }
10365 meshserver.send(x);
10366 }
10367
@@ -10916,7 +10933,13 @@
10933 if ((args.hide & 8) != 0) { x += '<br />' + addDeviceAttribute("Name", user.name); } // If title bar is hidden, display the user name here
10934 var email = user.email?EscapeHtml(user.email):'<i>' + "Not set" + '</i>', everify = '';
10935 if (serverinfo.emailcheck) { everify = ((user.emailVerified == true) ? '<b style=color:green;cursor:pointer title="' + "Email is verified" + '">&#x2713</b> ' : '<b style=color:red;cursor:pointer title="' + "Email not verified" + '">&#x2717;</b> '); }
10919 - if (user.name.toLowerCase() != user._id.split('/')[2]) { x += addDeviceAttribute("User Identifier", user._id.split('/')[2]); }
10936 +
10937 + if (userinfo.crossDomain) {
10938 + x += addDeviceAttribute("User Identifier", EscapeHtml(user._id));
10939 + } else {
10940 + if (user.name.toLowerCase() != user._id.split('/')[2]) { x += addDeviceAttribute("User Identifier", EscapeHtml(user._id.split('/')[2])); }
10941 + }
10942 +
10943 if (((user.siteadmin != 0xFFFFFFFF) || (userinfo.siteadmin == 0xFFFFFFFF))) { // If we are not site admin, we can't change a admin email.
10944 x += addDeviceAttribute("Email", everify + email + ' <a href="mailto:' + user.email + '" \'><img class=hoverButton src="images/link1.png" /></a>' + ' <img class=hoverButton style=cursor:pointer src="images/link5.png" onclick=p30showUserEmailChangeDialog(event,"' + userid + '") />');
10945 } else {
@@ -11016,7 +11039,7 @@
11039 // Change the URL
11040 var urlviewmode = '';
11041 if (((features & 0x10000000) == 0) && (xxcurrentView >= 30) && (xxcurrentView <= 39) && (currentUser != null)) {
11019 - urlviewmode = '?viewmode=' + xxcurrentView + '&gotouser=' + currentUser._id.split('/')[2];
11042 + urlviewmode = '?viewmode=' + xxcurrentView + '&gotouser=' + ((userinfo.crossDomain)?currentUser._id:currentUser._id.split('/')[2]);
11043 for (var i in urlargs) { urlviewmode += ('&' + i + '=' + urlargs[i]); }
11044 try { window.history.replaceState({}, document.title, window.location.pathname + urlviewmode); } catch (ex) { }
11045 }
@@ -12004,7 +12027,7 @@
12027 } else if ((x >= 20) && (x <= 29)) {
12028 if (currentMesh) { window.open(window.location.origin + '{{{domainurl}}}' + '?gotomesh=' + currentMesh._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentMesh._id); }
12029 } else if ((x >= 30) && (x <= 39)) {
12007 - if (currentUser) { window.open(window.location.origin + '{{{domainurl}}}' + '?gotouser=' + currentUser._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentUser._id); }
12030 + if (currentUser) { window.open(window.location.origin + '{{{domainurl}}}' + '?gotouser=' + ((userinfo.crossDomain)?currentUser._id:currentUser._id.split('/')[2]) + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentUser._id); }
12031 } else if ((x >= 50) && (x <= 59)) {
12032 if (currentUserGroup) { window.open(window.location.origin + '{{{domainurl}}}' + '?gotougrp=' + currentUserGroup._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentUserGroup._id); }
12033 } else { // if (x < 10))
@@ -12043,7 +12066,7 @@
12066 } else if ((xxcurrentView >= 20) && (xxcurrentView <= 29)) { // Device Group Link
12067 if (currentMesh != null) { urlviewmode = '?viewmode=' + xxcurrentView + '&gotomesh=' + currentMesh._id.split('/')[2]; }
12068 } else if ((xxcurrentView >= 30) && (xxcurrentView <= 39)) { // User Link
12046 - if (currentUser != null) { urlviewmode = '?viewmode=' + xxcurrentView + '&gotouser=' + currentUser._id.split('/')[2]; }
12069 + if (currentUser != null) { urlviewmode = '?viewmode=' + xxcurrentView + '&gotouser=' + ((userinfo.crossDomain)?currentUser._id:currentUser._id.split('/')[2]); }
12070 } else if ((xxcurrentView >= 51) && (xxcurrentView <= 51)) { // User Group Link
12071 if ((currentUserGroup != null) && (currentUserGroup._id != null)) { urlviewmode = '?viewmode=' + xxcurrentView + '&gotougrp=' + currentUserGroup._id.split('/')[2]; }
12072 } else if (xxcurrentView > 1) { urlviewmode = '?viewmode=' + xxcurrentView; }