More user group UI improvements.
Ylian Saint-Hilaire committed
Dec 29, 2019 at 22:38 UTC
d42c54f32e0dea61c6deaac340ad1b62ac6496f8
4 files changed
+371
-173
common.js
+2
-2
@@ -149,8 +149,8 @@ module.exports.unEscapeFieldName = function (name) { if (name.indexOf('%') == -1
149
// Escape all links
150
module.exports.escapeLinksFieldName = function (docx) { var doc = Object.assign({}, docx); if (doc.links != null) { doc.links = Object.assign({}, doc.links); for (var i in doc.links) { var ue = module.exports.escapeFieldName(i); if (ue !== i) { doc.links[ue] = doc.links[i]; delete doc.links[i]; } } } return doc; };
151
module.exports.unEscapeLinksFieldName = function (doc) { if (doc.links != null) { for (var j in doc.links) { var ue = module.exports.unEscapeFieldName(j); if (ue !== j) { doc.links[ue] = doc.links[j]; delete doc.links[j]; } } } return doc; };
152
-//module.exports.escapeAllLinksFieldName = function (docs) { for (var i in docs) { module.exports.escapeLinksFieldName(docs[i]); } };
153
-module.exports.unEscapeAllLinksFieldName = function (docs) { for (var i in docs) { docs[i] = module.exports.unEscapeLinksFieldName(docs[i]); } };
152
+//module.exports.escapeAllLinksFieldName = function (docs) { for (var i in docs) { module.exports.escapeLinksFieldName(docs[i]); } return docs; };
153
+module.exports.unEscapeAllLinksFieldName = function (docs) { for (var i in docs) { docs[i] = module.exports.unEscapeLinksFieldName(docs[i]); } return docs; };
154
155
// Validation methods
156
module.exports.validateString = function (str, minlen, maxlen) { return ((str != null) && (typeof str == 'string') && ((minlen == null) || (str.length >= minlen)) && ((maxlen == null) || (str.length <= maxlen))); };
meshuser.js
+131
-25
@@ -1199,9 +1199,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1199
var err = null;
1200
try {
1201
// Broadcast a message to all currently connected users.
1202
- if ((user.siteadmin & 2) == 0) { err = 'Permission denied'; }
1203
- else if (common.validateString(command.msg, 1, 512) == false) { err = 'Message is too long'; } // Notification message is between 1 and 256 characters
1204
- } catch (ex) { err = 'Validation exception: ' + ex; }
1202
+ if ((user.siteadmin & 2) == 0) { err = "Permission denied"; }
1203
+ else if (common.validateString(command.msg, 1, 512) == false) { err = "Message is too long"; } // Notification message is between 1 and 256 characters
1204
+ } catch (ex) { err = "Validation exception: " + ex; }
1205
1206
// Handle any errors
1207
if (err != null) {
@@ -1210,20 +1210,22 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1210
}
1211
1212
// Create the notification message
1213
- var notification = { action: "msg", type: "notify", domain: domain.id, "value": command.msg, "title": user.name, icon: 0, tag: "broadcast" };
1213
+ var notification = { action: 'msg', type: 'notify', domain: domain.id, value: command.msg, title: user.name, icon: 0, tag: 'broadcast' };
1214
1215
// Send the notification on all user sessions for this server
1216
for (var i in parent.wssessions2) {
1217
try {
1218
if (parent.wssessions2[i].domainid == domain.id) {
1219
- if ((user.groups == null) || (user.groups.length == 0)) {
1220
- // We are part of no user groups, send to everyone.
1221
- parent.wssessions2[i].send(JSON.stringify(notification));
1222
- } else {
1223
- // We are part of user groups, only send to sessions of users in our groups.
1224
- var sessionUser = parent.users[parent.wssessions2[i].userid];
1225
- if ((sessionUser != null) && findOne(sessionUser.groups, user.groups)) {
1219
+ var sessionUser = parent.users[parent.wssessions2[i].userid];
1220
+ if ((command.target == null) || ((sessionUser.links) != null && (sessionUser.links[command.target] != null))) {
1221
+ if ((user.groups == null) || (user.groups.length == 0)) {
1222
+ // We are part of no user groups, send to everyone.
1223
parent.wssessions2[i].send(JSON.stringify(notification));
1224
+ } else {
1225
+ // We are part of user groups, only send to sessions of users in our groups.
1226
+ if ((sessionUser != null) && findOne(sessionUser.groups, user.groups)) {
1227
+ parent.wssessions2[i].send(JSON.stringify(notification));
1228
+ }
1229
}
1230
}
1231
}
@@ -1478,7 +1480,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1480
1481
// Request a list of all user groups this user as rights to
1482
db.GetAllTypeNoTypeField('ugrp', domain.id, function (err, docs) {
1481
- try { ws.send(JSON.stringify({ action: 'usergroups', ugroups: docs, tag: command.tag })); } catch (ex) { }
1483
+ try { ws.send(JSON.stringify({ action: 'usergroups', ugroups: common.unEscapeAllLinksFieldName(docs), tag: command.tag })); } catch (ex) { }
1484
});
1485
break;
1486
}
@@ -1493,7 +1495,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1495
else if ((parent.parent.mailserver != null) && (domain.auth != 'sspi') && (domain.auth != 'ldap') && (user.emailVerified !== true) && (user.siteadmin != 0xFFFFFFFF)) { err = 'Email verification required'; } // User must verify it's email first.
1496
1497
// Create user group
1496
- else if (common.validateString(command.name, 1, 64) == false) { err = 'Invalid group name'; } // User group name is between 1 and 64 characters
1498
+ else if ((common.validateString(command.name, 1, 64) == false) || (command.name.indexOf(' ') >= 0)) { err = 'Invalid group name'; } // User group name is between 1 and 64 characters
1499
else if ((command.desc != null) && (common.validateString(command.desc, 0, 1024) == false)) { err = 'Invalid group description'; } // User group description is between 0 and 1024 characters
1500
} catch (ex) { err = 'Validation exception: ' + ex; }
1501
@@ -1532,8 +1534,24 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1534
1535
db.Get(command.ugrpid, function (err, groups) {
1536
if ((err != null) || (groups.length != 1)) return;
1535
- var group = groups[0];
1537
+ var group = common.unEscapeLinksFieldName(groups[0]);
1538
+
1539
+ // Unlink any user that has a link to this group
1540
+ if (group.links) {
1541
+ for (var i in group.links) {
1542
+ var xuser = parent.users[i];
1543
+ if ((xuser != null) && (xuser.links != null)) {
1544
+ delete xuser.links[group._id];
1545
+ db.SetUser(xuser);
1546
+ parent.parent.DispatchEvent([xuser._id], obj, 'resubscribe');
1547
+ }
1548
+ }
1549
+ }
1550
+
1551
+ // Remove the user group from the database
1552
db.Remove(group._id);
1553
+
1554
+ // Event the user group being removed
1555
var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, action: 'deleteusergroup', msg: change, domain: domain.id };
1556
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.
1557
parent.parent.DispatchEvent(['*', group._id, user._id], obj, event);
@@ -1551,9 +1569,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1569
1570
db.Get(command.ugrpid, function (err, groups) {
1571
if ((err != null) || (groups.length != 1)) return;
1554
- var group = groups[0], change = '';
1572
+ var group = common.unEscapeLinksFieldName(groups[0]), change = '';
1573
1556
- if ((common.validateString(command.name, 1, 64) == true) && (command.name != group.name)) { change = 'User group name changed from "' + group.name + '" to "' + command.name + '"'; group.name = command.name; }
1574
+ if ((common.validateString(command.name, 1, 64) == true) && (command.name != group.name) && (command.name.indexOf(' ') >= 0)) { change = 'User group name changed from "' + group.name + '" to "' + command.name + '"'; group.name = command.name; }
1575
if ((common.validateString(command.desc, 0, 1024) == true) && (command.desc != group.desc)) { if (change != '') change += ' and description changed'; else change += 'User group "' + group.name + '" description changed'; group.desc = command.desc; }
1576
if (change != '') {
1577
db.Set(common.escapeLinksFieldName(group));
@@ -1566,20 +1584,108 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1584
}
1585
case 'addusertousergroup':
1586
{
1569
- if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { return; }
1587
+ var err = null;
1588
+ try {
1589
+ if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
1590
+ else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; } // Check the meshid
1591
+ else if (common.validateStrArray(command.usernames, 1, 64) == false) { err = 'Invalid usernames'; } // Username is between 1 and 64 characters
1592
+ else {
1593
+ var ugroupidsplit = command.ugrpid.split('/');
1594
+ if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || (ugroupidsplit[1] != domain.id)) { err = 'Invalid groupid'; }
1595
+ }
1596
+ } catch (ex) { err = 'Validation exception: ' + ex; }
1597
1571
- // Change the name or description of a user group
1572
- if (common.validateString(command.ugrpid, 1, 1024) == false) break; // Check the user group id
1573
- var ugroupidsplit = command.ugrpid.split('/');
1574
- if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || (ugroupidsplit[1] != domain.id)) break;
1598
+ // Handle any errors
1599
+ if (err != null) {
1600
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
1601
+ break;
1602
+ }
1603
1604
db.Get(command.ugrpid, function (err, groups) {
1577
- if ((err != null) || (groups.length != 1)) return;
1578
- var group = groups[0];
1605
+ if ((err != null) || (groups.length != 1)) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'Invalid groupid' })); } catch (ex) { } return; }
1606
+ var group = common.unEscapeLinksFieldName(groups[0]);
1607
+ if (group.links == null) { group.links = {}; }
1608
+
1609
+ var unknownUsers = [], addedCount = 0, failCount = 0;
1610
+ for (var i in command.usernames) {
1611
+ // Check if the user exists
1612
+ var newuserid = 'user/' + domain.id + '/' + command.usernames[i].toLowerCase(), newuser = parent.users[newuserid];
1613
+ if (newuser != null) {
1614
+ // Add mesh to user
1615
+ if (newuser.links == null) { newuser.links = {}; }
1616
+ newuser.links[group._id] = { rights: 1 };
1617
+ db.SetUser(newuser);
1618
+ parent.parent.DispatchEvent([newuser._id], obj, 'resubscribe');
1619
+
1620
+ // Add a user to the mesh
1621
+ group.links[newuserid] = { userid: newuser.id, name: newuser.name, rights: 1 };
1622
+ db.Set(common.escapeLinksFieldName(group));
1623
+
1624
+ // Notify mesh change
1625
+ var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msg: 'Added user ' + newuser.name + ' to user group ' + group.name, domain: domain.id };
1626
+ if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user group. Another event will come.
1627
+ parent.parent.DispatchEvent(['*', group._id, user._id, newuserid], obj, event);
1628
+ addedCount++;
1629
+ } else {
1630
+ unknownUsers.push(command.usernames[i]);
1631
+ failCount++;
1632
+ }
1633
+ }
1634
1580
- // TODO
1581
- console.log(command);
1635
+ if (unknownUsers.length > 0) {
1636
+ // Send error back, user not found.
1637
+ displayNotificationMessage('User' + ((unknownUsers.length > 1) ? 's' : '') + ' ' + EscapeHtml(unknownUsers.join(', ')) + ' not found.', 'Device Group', 'ServerNotify');
1638
+ }
1639
+
1640
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
1641
});
1642
+ break;
1643
+ }
1644
+ case 'removeuserfromusergroup':
1645
+ {
1646
+ var err = null;
1647
+ try {
1648
+ if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
1649
+ else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; }
1650
+ else if (common.validateString(command.userid, 1, 256) == false) { err = 'Invalid userid'; }
1651
+ else {
1652
+ var ugroupidsplit = command.ugrpid.split('/');
1653
+ if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || (ugroupidsplit[1] != domain.id)) { err = 'Invalid groupid'; }
1654
+ }
1655
+ } catch (ex) { err = 'Validation exception: ' + ex; }
1656
+
1657
+ // Handle any errors
1658
+ if (err != null) {
1659
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'removeuserfromusergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
1660
+ break;
1661
+ }
1662
+
1663
+ db.Get(command.ugrpid, function (err, groups) {
1664
+ if ((err != null) || (groups.length != 1)) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'Invalid groupid' })); } catch (ex) { } return; }
1665
+ var group = common.unEscapeLinksFieldName(groups[0]);
1666
+ if (group.links == null) { group.links = {}; }
1667
+
1668
+ // Check if the user exists
1669
+ newuser = parent.users[command.userid];
1670
+ if (newuser != null) {
1671
+ var change = false;
1672
+ if ((newuser.links != null) && (newuser.links[command.ugrpid] != null)) { change = true; delete newuser.links[command.ugrpid]; }
1673
+ db.SetUser(newuser);
1674
+ parent.parent.DispatchEvent([newuser._id], obj, 'resubscribe');
1675
+
1676
+ // Remove the user from the group
1677
+ if ((group.links != null) && (group.links[command.userid] != null)) { change = true; delete group.links[command.userid]; }
1678
+ db.Set(common.escapeLinksFieldName(group));
1679
+
1680
+ // Notify mesh change
1681
+ if (change) {
1682
+ var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msg: 'Removed user ' + newuser.name + ' from user group ' + group.name, domain: domain.id };
1683
+ if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user group. Another event will come.
1684
+ parent.parent.DispatchEvent(['*', group._id, user._id, newuserid], obj, event);
1685
+ }
1686
+ }
1687
+ });
1688
+
1689
break;
1690
}
1691
case 'changemeshnotify':
translate/translate.json
+215
-135
@@ -178,7 +178,8 @@
178
"ja": " ユーザーは、デバイスグループに追加する前にこのサーバーに1回ログインする必要があります。",
179
"nl": " Gebruikers moeten inloggen bij de server voordat ze kunnen worden toegevoegd aan een apparaatgroep.",
180
"xloc": [
181
- "default.handlebars->23->1051"
181
+ "default.handlebars->23->1051",
182
+ "default.handlebars->23->1256"
183
]
184
},
185
{
@@ -391,7 +392,7 @@
392
"xloc": [
393
"default.handlebars->23->620",
394
"default.handlebars->23->1116",
394
- "default.handlebars->23->1284",
395
+ "default.handlebars->23->1312",
396
"default-mobile.handlebars->9->64",
397
"default-mobile.handlebars->9->240"
398
]
@@ -414,7 +415,7 @@
415
"ja": "1つのアクティブなセッション",
416
"nl": "1 actieve sessie",
417
"xloc": [
417
- "default.handlebars->23->1268"
418
+ "default.handlebars->23->1296"
419
]
420
},
421
{
@@ -451,7 +452,7 @@
452
"ja": "1グループ",
453
"nl": "1 groep",
454
"xloc": [
454
- "default.handlebars->23->1252"
455
+ "default.handlebars->23->1280"
456
]
457
},
458
{
@@ -995,7 +996,7 @@
996
"ja": "サーバーファイルへのアクセス",
997
"nl": "Toegang tot de server bestanden",
998
"xloc": [
998
- "default.handlebars->23->1233"
999
+ "default.handlebars->23->1261"
1000
]
1001
},
1002
{
@@ -1388,7 +1389,8 @@
1389
"ja": "ユーザーを追加",
1390
"nl": "Gebruikers toevoegen",
1391
"xloc": [
1391
- "default.handlebars->23->983"
1392
+ "default.handlebars->23->983",
1393
+ "default.handlebars->23->1241"
1394
]
1395
},
1396
{
@@ -1448,7 +1450,7 @@
1450
"ja": "管理レルム",
1451
"nl": "Beheerdersgebied",
1452
"xloc": [
1451
- "default.handlebars->23->1256"
1453
+ "default.handlebars->23->1284"
1454
]
1455
},
1456
{
@@ -1601,7 +1603,7 @@
1603
"ja": "エージェント",
1604
"nl": "Agents",
1605
"xloc": [
1604
- "default.handlebars->23->1321"
1606
+ "default.handlebars->23->1349"
1607
]
1608
},
1609
{
@@ -1657,7 +1659,8 @@
1659
"cs": "Umožnit uživatelům spravovat tuto skupinu a zařízení v této skupině.",
1660
"nl": "Gebruikers toestaan deze apparaatgroep en apparaten in deze groep te beheren.",
1661
"xloc": [
1660
- "default.handlebars->23->1050"
1662
+ "default.handlebars->23->1050",
1663
+ "default.handlebars->23->1255"
1664
]
1665
},
1666
{
@@ -2066,7 +2069,7 @@
2069
"cs": "Opravdu chcete {0} zásuvný modul: {1}",
2070
"nl": "Weet u zeker dat u de plug-in {0} wilt gebruiken: {1}",
2071
"xloc": [
2069
- "default.handlebars->23->1356"
2072
+ "default.handlebars->23->1384"
2073
]
2074
},
2075
{
@@ -2150,7 +2153,7 @@
2153
"cs": "Aplikace pro ověřování se",
2154
"nl": "Verificatie-app",
2155
"xloc": [
2153
- "default.handlebars->23->1257"
2156
+ "default.handlebars->23->1285"
2157
]
2158
},
2159
{
@@ -2267,6 +2270,7 @@
2270
"default.handlebars->container->column_l->p30->1->1->0->1->p30title->1",
2271
"default.handlebars->container->column_l->p31->p31title->1",
2272
"default.handlebars->container->column_l->p43->p43BackButton",
2273
+ "default.handlebars->container->column_l->p51->1->1->0->1->p30title->1",
2274
"error404.handlebars->container->footer->1->1->0->3->0",
2275
"error404-mobile.handlebars->container->footer->1->1->0->3->1",
2276
"terms.handlebars->container->footer->1->1->0->3->0",
@@ -2341,7 +2345,7 @@
2345
"cs": "Záložní kódy",
2346
"nl": "Back-up codes",
2347
"xloc": [
2344
- "default.handlebars->23->1259"
2348
+ "default.handlebars->23->1287"
2349
]
2350
},
2351
{
@@ -2422,7 +2426,8 @@
2426
"cs": "Hromadná zpráva",
2427
"nl": "Uitzending",
2428
"xloc": [
2425
- "default.handlebars->container->column_l->p4->3->1->0->3->1"
2429
+ "default.handlebars->container->column_l->p4->3->1->0->3->1",
2430
+ "default.handlebars->23->1239"
2431
]
2432
},
2433
{
@@ -2474,7 +2479,7 @@
2479
"cs": "Chyba volání",
2480
"nl": "Oproepfout",
2481
"xloc": [
2477
- "default.handlebars->23->1357"
2482
+ "default.handlebars->23->1385"
2483
]
2484
},
2485
{
@@ -2564,7 +2569,7 @@
2569
"ja": "{0}のメールを変更",
2570
"nl": "Verander e-mail voor {0}",
2571
"xloc": [
2567
- "default.handlebars->23->1272"
2572
+ "default.handlebars->23->1300"
2573
]
2574
},
2575
{
@@ -2587,7 +2592,7 @@
2592
"nl": "Verander wachtwoord",
2593
"xloc": [
2594
"default.handlebars->23->915",
2590
- "default.handlebars->23->1267",
2595
+ "default.handlebars->23->1295",
2596
"default-mobile.handlebars->9->46"
2597
]
2598
},
@@ -2609,7 +2614,7 @@
2614
"cs": "Změnit heslo pro {0}",
2615
"nl": "Verander wachtwoord voor {0}",
2616
"xloc": [
2612
- "default.handlebars->23->1279"
2617
+ "default.handlebars->23->1307"
2618
]
2619
},
2620
{
@@ -2733,7 +2738,7 @@
2738
"nl": "Controleren...",
2739
"xloc": [
2740
"default.handlebars->23->689",
2736
- "default.handlebars->23->1353"
2741
+ "default.handlebars->23->1381"
2742
]
2743
},
2744
{
@@ -2828,7 +2833,7 @@
2833
"cs": "CIRA Server",
2834
"nl": "CIRA Server",
2835
"xloc": [
2831
- "default.handlebars->23->1347"
2836
+ "default.handlebars->23->1375"
2837
]
2838
},
2839
{
@@ -2838,7 +2843,7 @@
2843
"cs": "příkazy CIRA serveru",
2844
"nl": "CIRA Server opdrachten",
2845
"xloc": [
2841
- "default.handlebars->23->1348"
2846
+ "default.handlebars->23->1376"
2847
]
2848
},
2849
{
@@ -3023,6 +3028,7 @@
3028
"default.handlebars->23->542",
3029
"default.handlebars->23->551",
3030
"default.handlebars->23->1031",
3031
+ "default.handlebars->23->1251",
3032
"default-mobile.handlebars->9->217",
3033
"default-mobile.handlebars->9->284"
3034
]
@@ -3109,6 +3115,7 @@
3115
"nl": "Bevestig de verwijdering van gebruiker {0}?",
3116
"xloc": [
3117
"default.handlebars->23->1097",
3118
+ "default.handlebars->23->1254",
3119
"default-mobile.handlebars->9->330"
3120
]
3121
},
@@ -3216,7 +3223,7 @@
3223
"cs": "Počitadlo připojení",
3224
"nl": "Aantal verbindingen",
3225
"xloc": [
3219
- "default.handlebars->23->1320"
3226
+ "default.handlebars->23->1348"
3227
]
3228
},
3229
{
@@ -3226,7 +3233,7 @@
3233
"cs": "Předávání (relay) spojení",
3234
"nl": "Verbindings Relay",
3235
"xloc": [
3229
- "default.handlebars->23->1346"
3236
+ "default.handlebars->23->1374"
3237
]
3238
},
3239
{
@@ -3292,7 +3299,7 @@
3299
"cs": "Cookie enkodér",
3300
"nl": "Cookie encoder",
3301
"xloc": [
3295
- "default.handlebars->23->1334"
3302
+ "default.handlebars->23->1362"
3303
]
3304
},
3305
{
@@ -3468,7 +3475,7 @@
3475
"cs": "Hlavní server",
3476
"nl": "Core Server",
3477
"xloc": [
3471
- "default.handlebars->23->1333"
3478
+ "default.handlebars->23->1361"
3479
]
3480
},
3481
{
@@ -3488,7 +3495,7 @@
3495
"cs": "vytížení procesoru v uplynulých 15 minutách",
3496
"nl": "CPU-belasting in de afgelopen 15 minuten",
3497
"xloc": [
3491
- "default.handlebars->23->1316"
3498
+ "default.handlebars->23->1344"
3499
]
3500
},
3501
{
@@ -3498,7 +3505,7 @@
3505
"cs": "vyžítení procesoru v uplynulých 5 minutách",
3506
"nl": "CPU-belasting in de afgelopen 5 minuten",
3507
"xloc": [
3501
- "default.handlebars->23->1315"
3508
+ "default.handlebars->23->1343"
3509
]
3510
},
3511
{
@@ -3508,7 +3515,7 @@
3515
"ja": "直前のCPU負荷",
3516
"nl": "CPU-belasting in de laatste minuut",
3517
"xloc": [
3511
- "default.handlebars->23->1314"
3518
+ "default.handlebars->23->1342"
3519
]
3520
},
3521
{
@@ -3593,7 +3600,7 @@
3600
"cs": "Vytváření",
3601
"nl": "Aanmaken",
3602
"xloc": [
3596
- "default.handlebars->23->1245"
3603
+ "default.handlebars->23->1273"
3604
]
3605
},
3606
{
@@ -3761,7 +3768,7 @@
3768
"nl": "Dag",
3769
"xloc": [
3770
"default.handlebars->23->526",
3764
- "default.handlebars->23->1281"
3771
+ "default.handlebars->23->1309"
3772
]
3773
},
3774
{
@@ -3901,7 +3908,7 @@
3908
"ja": "ユーザーを削除{0}",
3909
"nl": "Verwijder gebruiker {0}",
3910
"xloc": [
3904
- "default.handlebars->23->1280"
3911
+ "default.handlebars->23->1308"
3912
]
3913
},
3914
{
@@ -3981,7 +3988,10 @@
3988
"default.handlebars->23->927",
3989
"default.handlebars->23->951",
3990
"default.handlebars->23->1034",
3984
- "default.handlebars->23->1229",
3991
+ "default.handlebars->23->1232",
3992
+ "default.handlebars->23->1236",
3993
+ "default.handlebars->23->1238",
3994
+ "default.handlebars->23->1248",
3995
"default-mobile.handlebars->9->57",
3996
"default-mobile.handlebars->9->138",
3997
"default-mobile.handlebars->9->139",
@@ -4166,8 +4176,8 @@
4176
"nl": "Apparaatgroepen",
4177
"xloc": [
4178
"default.handlebars->container->column_l->p2->9",
4169
- "default.handlebars->23->1254",
4170
- "default.handlebars->23->1307",
4179
+ "default.handlebars->23->1282",
4180
+ "default.handlebars->23->1335",
4181
"default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->3"
4182
]
4183
},
@@ -4864,9 +4874,9 @@
4874
"xloc": [
4875
"default.handlebars->23->277",
4876
"default.handlebars->23->1203",
4867
- "default.handlebars->23->1241",
4868
- "default.handlebars->23->1242",
4877
+ "default.handlebars->23->1269",
4878
"default.handlebars->23->1270",
4879
+ "default.handlebars->23->1298",
4880
"default-mobile.handlebars->9->34"
4881
]
4882
},
@@ -4888,7 +4898,7 @@
4898
"ja": "メールが確認されました",
4899
"nl": "E-mail is geverifieerd",
4900
"xloc": [
4891
- "default.handlebars->23->1238"
4901
+ "default.handlebars->23->1266"
4902
]
4903
},
4904
{
@@ -4908,7 +4918,7 @@
4918
"ja": "メールが確認されていません",
4919
"nl": "E-mail is niet geverifieerd",
4920
"xloc": [
4911
- "default.handlebars->23->1239"
4921
+ "default.handlebars->23->1267"
4922
]
4923
},
4924
{
@@ -5550,7 +5560,7 @@
5560
"nl": "Forceer wachtwoord opnieuw instellen bij de volgende aanmelding.",
5561
"xloc": [
5562
"default.handlebars->23->1207",
5553
- "default.handlebars->23->1277"
5563
+ "default.handlebars->23->1305"
5564
]
5565
},
5566
{
@@ -5603,8 +5613,8 @@
5613
"cs": "Volné",
5614
"nl": "Vrij",
5615
"xloc": [
5606
- "default.handlebars->23->1288",
5607
- "default.handlebars->23->1290"
5616
+ "default.handlebars->23->1316",
5617
+ "default.handlebars->23->1318"
5618
]
5619
},
5620
{
@@ -5615,7 +5625,7 @@
5625
"cs": "volné",
5626
"nl": "vrij",
5627
"xloc": [
5618
- "default.handlebars->23->1318"
5628
+ "default.handlebars->23->1346"
5629
]
5630
},
5631
{
@@ -5754,7 +5764,7 @@
5764
"ja": "完全な管理者",
5765
"nl": "Volledige beheerder",
5766
"xloc": [
5757
- "default.handlebars->23->1234"
5767
+ "default.handlebars->23->1262"
5768
]
5769
},
5770
{
@@ -6524,8 +6534,8 @@
6534
"xloc": [
6535
"default.handlebars->23->1105",
6536
"default.handlebars->23->1111",
6527
- "default.handlebars->23->1325",
6528
- "default.handlebars->23->1345"
6537
+ "default.handlebars->23->1353",
6538
+ "default.handlebars->23->1373"
6539
]
6540
},
6541
{
@@ -7463,7 +7473,7 @@
7473
"ja": "最終変更:{0}",
7474
"nl": "Laatst gewijzigd: {0}",
7475
"xloc": [
7466
- "default.handlebars->23->1250"
7476
+ "default.handlebars->23->1278"
7477
]
7478
},
7479
{
@@ -7496,7 +7506,7 @@
7506
"cs": "Poslední přihlášení",
7507
"nl": "Laatste inlog",
7508
"xloc": [
7499
- "default.handlebars->23->1246"
7509
+ "default.handlebars->23->1274"
7510
]
7511
},
7512
{
@@ -7596,7 +7606,7 @@
7606
"cs": "Méně",
7607
"nl": "Minder",
7608
"xloc": [
7599
- "default.handlebars->23->1359"
7609
+ "default.handlebars->23->1387"
7610
]
7611
},
7612
{
@@ -7956,7 +7966,7 @@
7966
"cs": "Uzamknutý účet",
7967
"nl": "Vergrendeld account",
7968
"xloc": [
7959
- "default.handlebars->23->1231"
7969
+ "default.handlebars->23->1259"
7970
]
7971
},
7972
{
@@ -8112,7 +8122,7 @@
8122
"cs": "Zprávy hlavního serveru",
8123
"nl": "Hoofdserver berichten",
8124
"xloc": [
8115
- "default.handlebars->23->1336"
8125
+ "default.handlebars->23->1364"
8126
]
8127
},
8128
{
@@ -8356,7 +8366,7 @@
8366
"ja": "メガバイト",
8367
"nl": "Megabytes",
8368
"xloc": [
8359
- "default.handlebars->23->1326"
8369
+ "default.handlebars->23->1354"
8370
]
8371
},
8372
{
@@ -8369,7 +8379,7 @@
8379
"xloc": [
8380
"default.handlebars->container->column_l->p40->3->1->p40type->3",
8381
"default.handlebars->23->70",
8372
- "default.handlebars->23->1317"
8382
+ "default.handlebars->23->1345"
8383
]
8384
},
8385
{
@@ -8440,7 +8450,7 @@
8450
"cs": "MeshAgent provoz",
8451
"nl": "MeshAgent verkeer",
8452
"xloc": [
8443
- "default.handlebars->23->1338"
8453
+ "default.handlebars->23->1366"
8454
]
8455
},
8456
{
@@ -8449,7 +8459,7 @@
8459
"cs": "MeshAgent aktualizace",
8460
"nl": "MeshAgent update",
8461
"xloc": [
8452
- "default.handlebars->23->1339"
8462
+ "default.handlebars->23->1367"
8463
]
8464
},
8465
{
@@ -8510,7 +8520,7 @@
8520
"cs": "MeshCentral Server Peering",
8521
"nl": "MeshCentral Server Peering",
8522
"xloc": [
8513
- "default.handlebars->23->1337"
8523
+ "default.handlebars->23->1365"
8524
]
8525
},
8526
{
@@ -8595,7 +8605,7 @@
8605
"cs": "Odesílatel",
8606
"nl": "Bericht Dispatcher",
8607
"xloc": [
8598
- "default.handlebars->23->1335"
8608
+ "default.handlebars->23->1363"
8609
]
8610
},
8611
{
@@ -8668,7 +8678,7 @@
8678
"ja": "もっと",
8679
"nl": "Meer",
8680
"xloc": [
8671
- "default.handlebars->23->1358"
8681
+ "default.handlebars->23->1386"
8682
]
8683
},
8684
{
@@ -8985,6 +8995,10 @@
8995
"default.handlebars->23->1161",
8996
"default.handlebars->23->1202",
8997
"default.handlebars->23->1228",
8998
+ "default.handlebars->23->1231",
8999
+ "default.handlebars->23->1235",
9000
+ "default.handlebars->23->1237",
9001
+ "default.handlebars->23->1247",
9002
"default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea3->deskarea3x->DeskTools->5->1->1",
9003
"default-mobile.handlebars->9->53",
9004
"default-mobile.handlebars->9->132",
@@ -9249,7 +9263,7 @@
9263
"xloc": [
9264
"default.handlebars->23->657",
9265
"default.handlebars->23->1151",
9252
- "default.handlebars->23->1283"
9266
+ "default.handlebars->23->1311"
9267
]
9268
},
9269
{
@@ -9412,7 +9426,7 @@
9426
"cs": "Žádná práva k serveru",
9427
"nl": "Geen server rechten",
9428
"xloc": [
9415
- "default.handlebars->23->1232"
9429
+ "default.handlebars->23->1260"
9430
]
9431
},
9432
{
@@ -9513,8 +9527,9 @@
9527
"default.handlebars->23->968",
9528
"default.handlebars->23->973",
9529
"default.handlebars->23->1123",
9516
- "default.handlebars->23->1251",
9517
- "default.handlebars->23->1255",
9530
+ "default.handlebars->23->1234",
9531
+ "default.handlebars->23->1279",
9532
+ "default.handlebars->23->1283",
9533
"default-mobile.handlebars->9->72",
9534
"default-mobile.handlebars->9->90",
9535
"default-mobile.handlebars->9->92",
@@ -9599,7 +9614,7 @@
9614
"ja": "設定されていません",
9615
"nl": "Niet ingesteld",
9616
"xloc": [
9602
- "default.handlebars->23->1237"
9617
+ "default.handlebars->23->1265"
9618
]
9619
},
9620
{
@@ -9613,7 +9628,7 @@
9628
"default.handlebars->23->480",
9629
"default.handlebars->23->513",
9630
"default.handlebars->23->981",
9616
- "default.handlebars->23->1262"
9631
+ "default.handlebars->23->1290"
9632
]
9633
},
9634
{
@@ -9664,7 +9679,7 @@
9679
"cs": "Upozornit",
9680
"nl": "Melden",
9681
"xloc": [
9667
- "default.handlebars->23->1264"
9682
+ "default.handlebars->23->1292"
9683
]
9684
},
9685
{
@@ -9708,7 +9723,7 @@
9723
"cs": "Nastalo na {0}",
9724
"nl": "Heeft plaatsgevonden op {0}",
9725
"xloc": [
9711
- "default.handlebars->23->1286"
9726
+ "default.handlebars->23->1314"
9727
]
9728
},
9729
{
@@ -9986,7 +10001,7 @@
10001
"cs": "Částečná práva",
10002
"nl": "Gedeeltelijke rechten",
10003
"xloc": [
9989
- "default.handlebars->23->1235"
10004
+ "default.handlebars->23->1263"
10005
]
10006
},
10007
{
@@ -10012,10 +10027,10 @@
10027
"default.handlebars->23->530",
10028
"default.handlebars->23->1204",
10029
"default.handlebars->23->1205",
10015
- "default.handlebars->23->1247",
10016
- "default.handlebars->23->1249",
10017
- "default.handlebars->23->1273",
10018
- "default.handlebars->23->1274",
10030
+ "default.handlebars->23->1275",
10031
+ "default.handlebars->23->1277",
10032
+ "default.handlebars->23->1301",
10033
+ "default.handlebars->23->1302",
10034
"default-mobile.handlebars->9->210"
10035
]
10036
},
@@ -10037,7 +10052,7 @@
10052
"cs": "Nápověda k heslu",
10053
"nl": "wachtwoord hint",
10054
"xloc": [
10040
- "default.handlebars->23->1275"
10055
+ "default.handlebars->23->1303"
10056
]
10057
},
10058
{
@@ -10359,7 +10374,7 @@
10374
"nl": "Plugin Actie",
10375
"xloc": [
10376
"default.handlebars->23->171",
10362
- "default.handlebars->23->1355"
10377
+ "default.handlebars->23->1383"
10378
]
10379
},
10380
{
@@ -10819,8 +10834,8 @@
10834
"cs": "Předávané relace",
10835
"nl": "Relay Sessies",
10836
"xloc": [
10822
- "default.handlebars->23->1311",
10823
- "default.handlebars->23->1324"
10837
+ "default.handlebars->23->1339",
10838
+ "default.handlebars->23->1352"
10839
]
10840
},
10841
{
@@ -10969,7 +10984,7 @@
10984
"cs": "Odstranit celé 2-faktorové ověřování.",
10985
"nl": "Verwijder alle Tweestapsverificatie.",
10986
"xloc": [
10972
- "default.handlebars->23->1278"
10987
+ "default.handlebars->23->1306"
10988
]
10989
},
10990
{
@@ -11001,7 +11016,8 @@
11016
"cs": "Odstranit uživatelská práva pro tuto skupinu zařízení",
11017
"nl": "Gebruikersrechten voor deze apparaatgroep verwijderen",
11018
"xloc": [
11004
- "default.handlebars->23->1000"
11019
+ "default.handlebars->23->1000",
11020
+ "default.handlebars->23->1243"
11021
]
11022
},
11023
{
@@ -11042,7 +11058,7 @@
11058
"nl": "Vereisten: {0}.",
11059
"xloc": [
11060
"default.handlebars->23->1211",
11045
- "default.handlebars->23->1276",
11061
+ "default.handlebars->23->1304",
11062
"default-mobile.handlebars->9->45"
11063
]
11064
},
@@ -11192,7 +11208,7 @@
11208
"ja": "制限事項",
11209
"nl": "Beperkingen",
11210
"xloc": [
11195
- "default.handlebars->23->1236"
11211
+ "default.handlebars->23->1264"
11212
]
11213
},
11214
{
@@ -11547,7 +11563,7 @@
11563
"xloc": [
11564
"default.handlebars->23->238",
11565
"default.handlebars->23->531",
11550
- "default.handlebars->23->1260",
11566
+ "default.handlebars->23->1288",
11567
"default-mobile.handlebars->9->211"
11568
]
11569
},
@@ -11559,7 +11575,7 @@
11575
"cs": "Bezpečnostní klíč",
11576
"nl": "Veiligheidssleutel",
11577
"xloc": [
11562
- "default.handlebars->23->1258"
11578
+ "default.handlebars->23->1286"
11579
]
11580
},
11581
{
@@ -11755,7 +11771,7 @@
11771
"cs": "Poslat upozornění uživateli",
11772
"nl": "Stuur gebruikersmelding",
11773
"xloc": [
11758
- "default.handlebars->23->1265"
11774
+ "default.handlebars->23->1293"
11775
]
11776
},
11777
{
@@ -11804,7 +11820,7 @@
11820
"cs": "Certifikát serveru",
11821
"nl": "Server Certificaat",
11822
"xloc": [
11807
- "default.handlebars->23->1340"
11823
+ "default.handlebars->23->1368"
11824
]
11825
},
11826
{
@@ -11882,7 +11898,7 @@
11898
"cs": "Kvóta serveru",
11899
"nl": "Serverquotum",
11900
"xloc": [
11885
- "default.handlebars->23->1244"
11901
+ "default.handlebars->23->1272"
11902
]
11903
},
11904
{
@@ -11903,7 +11919,7 @@
11919
"cs": "Práva serveru",
11920
"nl": "Serverrechten",
11921
"xloc": [
11906
- "default.handlebars->23->1243"
11922
+ "default.handlebars->23->1271"
11923
]
11924
},
11925
{
@@ -11925,7 +11941,7 @@
11941
"cs": "Trasování serveru",
11942
"nl": "Server traceren",
11943
"xloc": [
11928
- "default.handlebars->23->1349"
11944
+ "default.handlebars->23->1377"
11945
]
11946
},
11947
{
@@ -11966,7 +11982,7 @@
11982
"cs": "ServerStats.csv",
11983
"nl": "ServerStats.csv",
11984
"xloc": [
11969
- "default.handlebars->23->1332"
11985
+ "default.handlebars->23->1360"
11986
]
11987
},
11988
{
@@ -11976,7 +11992,7 @@
11992
"cs": "servertrace.csv",
11993
"nl": "servertrace.csv",
11994
"xloc": [
11979
- "default.handlebars->23->1351"
11995
+ "default.handlebars->23->1379"
11996
]
11997
},
11998
{
@@ -12770,7 +12786,7 @@
12786
"nl": "Status",
12787
"xloc": [
12788
"default.handlebars->container->column_l->p42->p42tbl->1->0->7",
12773
- "default.handlebars->23->1271"
12789
+ "default.handlebars->23->1299"
12790
]
12791
},
12792
{
@@ -13101,7 +13117,7 @@
13117
"cs": "V tuto chvíli zde nejsou žádná upozornění",
13118
"nl": "Er zijn momenteel geen meldingen",
13119
"xloc": [
13104
- "default.handlebars->23->1285"
13120
+ "default.handlebars->23->1313"
13121
]
13122
},
13123
{
@@ -13266,7 +13282,7 @@
13282
"cs": "time, conn.agent, conn.users, conn.usersessions, conn.relaysession, conn.intelamt, mem.external, mem.heapused, mem.heaptotal, mem.rss",
13283
"nl": "tijd, conn.agent, conn.gebruikers, conn.gebruikerssessies, conn.relaysessie, conn.intelamt, mem.extern, mem.heapused, mem.heaptotaal, mem.rss",
13284
"xloc": [
13269
- "default.handlebars->23->1331"
13285
+ "default.handlebars->23->1359"
13286
]
13287
},
13288
{
@@ -13276,7 +13292,7 @@
13292
"cs": "time, source, message",
13293
"nl": "tijd, bron, bericht",
13294
"xloc": [
13279
- "default.handlebars->23->1350"
13295
+ "default.handlebars->23->1378"
13296
]
13297
},
13298
{
@@ -13574,7 +13590,7 @@
13590
"ja": "合計",
13591
"nl": "totaal",
13592
"xloc": [
13577
- "default.handlebars->23->1319"
13593
+ "default.handlebars->23->1347"
13594
]
13595
},
13596
{
@@ -13932,7 +13948,7 @@
13948
"cs": "Aktuální",
13949
"nl": "Bijgewerkt",
13950
"xloc": [
13935
- "default.handlebars->23->1354"
13951
+ "default.handlebars->23->1382"
13952
]
13953
},
13954
{
@@ -14067,8 +14083,8 @@
14083
"ja": "中古",
14084
"nl": "Gebruikt",
14085
"xloc": [
14070
- "default.handlebars->23->1287",
14071
- "default.handlebars->23->1289"
14086
+ "default.handlebars->23->1315",
14087
+ "default.handlebars->23->1317"
14088
]
14089
},
14090
{
@@ -14082,6 +14098,7 @@
14098
"default.handlebars->23->194",
14099
"default.handlebars->23->1001",
14100
"default.handlebars->23->1176",
14101
+ "default.handlebars->23->1244",
14102
"default-mobile.handlebars->9->325"
14103
]
14104
},
@@ -14149,7 +14166,7 @@
14166
"nl": "gebruikersID",
14167
"xloc": [
14168
"default.handlebars->23->1092",
14152
- "default.handlebars->23->1240"
14169
+ "default.handlebars->23->1268"
14170
]
14171
},
14172
{
@@ -14195,7 +14212,8 @@
14212
"cs": "Uživatelská jména",
14213
"nl": "Gebruikersnamen",
14214
"xloc": [
14198
- "default.handlebars->23->1052"
14215
+ "default.handlebars->23->1052",
14216
+ "default.handlebars->23->1257"
14217
]
14218
},
14219
{
@@ -14205,7 +14223,7 @@
14223
"cs": "Relace uživatele",
14224
"nl": "Gebruikerssessie",
14225
"xloc": [
14208
- "default.handlebars->23->1323"
14226
+ "default.handlebars->23->1351"
14227
]
14228
},
14229
{
@@ -14301,7 +14319,8 @@
14319
"nl": "Gebruikers",
14320
"xloc": [
14321
"default.handlebars->container->topbar->1->1->UsersSubMenuSpan->UsersSubMenu->1->0->UsersGeneral",
14304
- "default.handlebars->23->1322"
14322
+ "default.handlebars->23->1229",
14323
+ "default.handlebars->23->1350"
14324
]
14325
},
14326
{
@@ -14435,7 +14454,7 @@
14454
"cs": "Zobrazit poznámky o tomto uživateli",
14455
"nl": "Bekijk opmerkingen over deze gebruiker",
14456
"xloc": [
14438
- "default.handlebars->23->1263"
14457
+ "default.handlebars->23->1291"
14458
]
14459
},
14460
{
@@ -14555,8 +14574,8 @@
14574
"cs": "Webový server",
14575
"nl": "webserver",
14576
"xloc": [
14558
- "default.handlebars->23->1341",
14559
- "default.handlebars->23->1342"
14577
+ "default.handlebars->23->1369",
14578
+ "default.handlebars->23->1370"
14579
]
14580
},
14581
{
@@ -14567,7 +14586,7 @@
14586
"cs": "Požadavky webového serveru",
14587
"nl": "Webserver Verzoeken",
14588
"xloc": [
14570
- "default.handlebars->23->1343"
14589
+ "default.handlebars->23->1371"
14590
]
14591
},
14592
{
@@ -14578,7 +14597,7 @@
14597
"cs": "Web Socket Relay",
14598
"nl": "Web Socket Relay",
14599
"xloc": [
14581
- "default.handlebars->23->1344"
14600
+ "default.handlebars->23->1372"
14601
]
14602
},
14603
{
@@ -14622,7 +14641,7 @@
14641
"ja": "次回ログイン時に変更されます。",
14642
"nl": "Wordt bij de volgende aanmelding gewijzigd.",
14643
"xloc": [
14625
- "default.handlebars->23->1248"
14644
+ "default.handlebars->23->1276"
14645
]
14646
},
14647
{
@@ -15025,7 +15044,7 @@
15044
"cs": "{0} aktivních spojení",
15045
"nl": "{0} actieve sessies",
15046
"xloc": [
15028
- "default.handlebars->23->1269"
15047
+ "default.handlebars->23->1297"
15048
]
15049
},
15050
{
@@ -15088,7 +15107,7 @@
15107
"cs": "{0} skupin",
15108
"nl": "{0} groepen",
15109
"xloc": [
15091
- "default.handlebars->23->1253"
15110
+ "default.handlebars->23->1281"
15111
]
15112
},
15113
{
@@ -15486,7 +15505,7 @@
15505
"cs": "2-faktorové ověřování zapnuto",
15506
"nl": "Tweestapsverificatie ingeschakeld",
15507
"xloc": [
15489
- "default.handlebars->23->1261"
15508
+ "default.handlebars->23->1289"
15509
]
15510
},
15511
{
@@ -15495,7 +15514,7 @@
15514
"cs": "\\\\'",
15515
"nl": "\\\\'",
15516
"xloc": [
15498
- "default.handlebars->23->1352"
15517
+ "default.handlebars->23->1380"
15518
]
15519
},
15520
{
@@ -15694,7 +15713,7 @@
15713
"cs": "Smazat uživatele",
15714
"nl": "Verwijder gebruiker",
15715
"xloc": [
15697
- "default.handlebars->23->1266"
15716
+ "default.handlebars->23->1294"
15717
]
15718
},
15719
{
@@ -15702,7 +15721,7 @@
15721
"cs": "Stav přihlášení za 7 dnů",
15722
"nl": "Inlogstatus afgelopen 7 dagen",
15723
"xloc": [
15705
- "default.handlebars->23->1282"
15724
+ "default.handlebars->23->1310"
15725
]
15726
},
15727
{
@@ -15710,7 +15729,7 @@
15729
"cs": "Vytížení procesoru",
15730
"nl": "CPU gebruik",
15731
"xloc": [
15713
- "default.handlebars->23->1313"
15732
+ "default.handlebars->23->1341"
15733
]
15734
},
15735
{
@@ -15718,14 +15737,14 @@
15737
"cs": "Stav serveru",
15738
"nl": "Server Status",
15739
"xloc": [
15721
- "default.handlebars->23->1291"
15740
+ "default.handlebars->23->1319"
15741
]
15742
},
15743
{
15744
"en": "Agent Error Counters",
15745
"cs": "Počitadla chyb agenta",
15746
"xloc": [
15728
- "default.handlebars->23->1292"
15747
+ "default.handlebars->23->1320"
15748
]
15749
},
15750
{
@@ -15733,7 +15752,7 @@
15752
"cs": "Neznámá skupina",
15753
"nl": "Onbekende groep",
15754
"xloc": [
15736
- "default.handlebars->23->1293"
15755
+ "default.handlebars->23->1321"
15756
]
15757
},
15758
{
@@ -15741,7 +15760,7 @@
15760
"cs": "Neplatný PKCS podpis",
15761
"nl": "Onjuiste PKCS handtekening",
15762
"xloc": [
15744
- "default.handlebars->23->1294"
15763
+ "default.handlebars->23->1322"
15764
]
15765
},
15766
{
@@ -15749,7 +15768,7 @@
15768
"cs": "Neplatný RSA podpis",
15769
"nl": "Ongeldige RSA handtekening",
15770
"xloc": [
15752
- "default.handlebars->23->1295"
15771
+ "default.handlebars->23->1323"
15772
]
15773
},
15774
{
@@ -15757,7 +15776,7 @@
15776
"cs": "Neplatný JSON",
15777
"nl": "Onjuiste JSON",
15778
"xloc": [
15760
- "default.handlebars->23->1296"
15779
+ "default.handlebars->23->1324"
15780
]
15781
},
15782
{
@@ -15765,7 +15784,7 @@
15784
"cs": "Neznámá akce",
15785
"nl": "Onbekende actie",
15786
"xloc": [
15768
- "default.handlebars->23->1297"
15787
+ "default.handlebars->23->1325"
15788
]
15789
},
15790
{
@@ -15773,7 +15792,7 @@
15792
"cs": "Nesprávný certifikát webu",
15793
"nl": "Onjuist webcertificaat",
15794
"xloc": [
15776
- "default.handlebars->23->1298"
15795
+ "default.handlebars->23->1326"
15796
]
15797
},
15798
{
@@ -15781,7 +15800,7 @@
15800
"cs": "Nesprávný podpis",
15801
"nl": "Ongeldige handtening",
15802
"xloc": [
15784
- "default.handlebars->23->1299"
15803
+ "default.handlebars->23->1327"
15804
]
15805
},
15806
{
@@ -15789,7 +15808,7 @@
15808
"cs": "Dosaženo maximálního počtu relací",
15809
"nl": "Max Sessies bereikt",
15810
"xloc": [
15792
- "default.handlebars->23->1300"
15811
+ "default.handlebars->23->1328"
15812
]
15813
},
15814
{
@@ -15797,7 +15816,7 @@
15816
"cs": "Neznámá skupina zařízení",
15817
"nl": "Onbekende apparaatgroep",
15818
"xloc": [
15800
- "default.handlebars->23->1301"
15819
+ "default.handlebars->23->1329"
15820
]
15821
},
15822
{
@@ -15805,7 +15824,7 @@
15824
"cs": "Neplatný typ skupiny zařízení",
15825
"nl": "Ongeldige apparaatgroep type",
15826
"xloc": [
15808
- "default.handlebars->23->1302"
15827
+ "default.handlebars->23->1330"
15828
]
15829
},
15830
{
@@ -15813,7 +15832,7 @@
15832
"cs": "Duplikovat agenta",
15833
"nl": "Duplicaat Agent",
15834
"xloc": [
15816
- "default.handlebars->23->1303"
15835
+ "default.handlebars->23->1331"
15836
]
15837
},
15838
{
@@ -15821,7 +15840,7 @@
15840
"cs": "Připojené Intel® AMT",
15841
"nl": "Verbonden Intel® AMT",
15842
"xloc": [
15824
- "default.handlebars->23->1304"
15843
+ "default.handlebars->23->1332"
15844
]
15845
},
15846
{
@@ -15829,7 +15848,7 @@
15848
"cs": "Chyby předávání (relay)",
15849
"nl": "Relay fouten",
15850
"xloc": [
15832
- "default.handlebars->23->1305"
15851
+ "default.handlebars->23->1333"
15852
]
15853
},
15854
{
@@ -15837,14 +15856,14 @@
15856
"cs": "Uživatelské účty",
15857
"nl": "Gebruikersaccounts",
15858
"xloc": [
15840
- "default.handlebars->23->1306"
15859
+ "default.handlebars->23->1334"
15860
]
15861
},
15862
{
15863
"en": "Agent Sessions",
15864
"cs": "Relace agenta",
15865
"xloc": [
15847
- "default.handlebars->23->1308"
15866
+ "default.handlebars->23->1336"
15867
]
15868
},
15869
{
@@ -15852,7 +15871,7 @@
15871
"cs": "Připojení",
15872
"nl": "Verbonden gebruikers",
15873
"xloc": [
15855
- "default.handlebars->23->1309"
15874
+ "default.handlebars->23->1337"
15875
]
15876
},
15877
{
@@ -15860,7 +15879,7 @@
15879
"cs": "Uživatelské relace",
15880
"nl": "gebruikers Sessies",
15881
"xloc": [
15863
- "default.handlebars->23->1310"
15882
+ "default.handlebars->23->1338"
15883
]
15884
},
15885
{
@@ -15909,28 +15928,28 @@
15928
"cs": "Externí",
15929
"nl": "Extern",
15930
"xloc": [
15912
- "default.handlebars->23->1327"
15931
+ "default.handlebars->23->1355"
15932
]
15933
},
15934
{
15935
"en": "Heap Used",
15936
"nl": "Heap gebruikt",
15937
"xloc": [
15919
- "default.handlebars->23->1328"
15938
+ "default.handlebars->23->1356"
15939
]
15940
},
15941
{
15942
"en": "Heap Total",
15943
"nl": "Heap Totaal",
15944
"xloc": [
15926
- "default.handlebars->23->1329"
15945
+ "default.handlebars->23->1357"
15946
]
15947
},
15948
{
15949
"en": "RSS",
15950
"nl": "RSS",
15951
"xloc": [
15933
- "default.handlebars->23->1330"
15952
+ "default.handlebars->23->1358"
15953
]
15954
},
15955
{
@@ -15958,7 +15977,7 @@
15977
"en": "Relay Count",
15978
"cs": "Počet předávání (relay)",
15979
"xloc": [
15961
- "default.handlebars->23->1312"
15980
+ "default.handlebars->23->1340"
15981
]
15982
},
15983
{
@@ -15993,9 +16012,70 @@
16012
},
16013
{
16014
"en": "Create User Group",
16015
+ "xloc": [
16016
+ "default.handlebars->23->1233"
16017
+ ]
16018
+ },
16019
+ {
16020
+ "en": "User Group -",
16021
+ "xloc": [
16022
+ "default.handlebars->container->column_l->p51->1->1->0->1->p30title->3"
16023
+ ]
16024
+ },
16025
+ {
16026
+ "en": "No groups found.",
16027
"xloc": [
16028
"default.handlebars->23->1230"
16029
]
16030
+ },
16031
+ {
16032
+ "en": "Send a notice to all users in this group.",
16033
+ "xloc": [
16034
+ "default.handlebars->23->1240"
16035
+ ]
16036
+ },
16037
+ {
16038
+ "en": "Group Members",
16039
+ "xloc": [
16040
+ "default.handlebars->23->1242"
16041
+ ]
16042
+ },
16043
+ {
16044
+ "en": "No Members",
16045
+ "xloc": [
16046
+ "default.handlebars->23->1245"
16047
+ ]
16048
+ },
16049
+ {
16050
+ "en": "Delete User Group",
16051
+ "xloc": [
16052
+ "default.handlebars->23->1246",
16053
+ "default.handlebars->23->1252"
16054
+ ]
16055
+ },
16056
+ {
16057
+ "en": "Edit User Group",
16058
+ "xloc": [
16059
+ "default.handlebars->23->1249"
16060
+ ]
16061
+ },
16062
+ {
16063
+ "en": "Delete user group {0}?",
16064
+ "xloc": [
16065
+ "default.handlebars->23->1250"
16066
+ ]
16067
+ },
16068
+ {
16069
+ "en": "Remote User",
16070
+ "xloc": [
16071
+ "default.handlebars->23->1253"
16072
+ ]
16073
+ },
16074
+ {
16075
+ "en": "Add Users to User Group",
16076
+ "xloc": [
16077
+ "default.handlebars->23->1258"
16078
+ ]
16079
}
16080
]
16081
}
\ No newline at end of file
views/default.handlebars
+23
-11
@@ -8851,15 +8851,15 @@
8851
return false;
8852
}
8853
8854
- function showUserBroadcastDialog() {
8854
+ function showUserBroadcastDialog(targetid) {
8855
if (xxdialogMode) return;
8856
var x = "Broadcast a message to all connected users." + '<textarea id=broadcastMessage value="" maxlength="256"/></textarea>';
8857
- setDialogMode(2, "Broadcast Message", 3, showUserBroadcastDialogEx, x);
8857
+ setDialogMode(2, "Broadcast Message", 3, showUserBroadcastDialogEx, x, targetid?decodeURIComponent(targetid):null);
8858
Q('broadcastMessage').focus();
8859
}
8860
8861
- function showUserBroadcastDialogEx() {
8862
- meshserver.send({ action: 'userbroadcast', msg: Q('broadcastMessage').value });
8861
+ function showUserBroadcastDialogEx(b, targetid) {
8862
+ meshserver.send({ action: 'userbroadcast', msg: Q('broadcastMessage').value, target: targetid });
8863
}
8864
8865
function showCreateNewAccountDialog() {
@@ -9104,6 +9104,10 @@
9104
}
9105
x += '</table></div><br />';
9106
9107
+ if ((userinfo.siteadmin & 256) != 0) {
9108
+ x += '<input type=button value=\"' + "Broadcast" + '\" title=\"' + "Send a notice to all users in this group." + '\" onclick=showUserBroadcastDialog("' + encodeURIComponent(group._id) + '") />';
9109
+ }
9110
+
9111
// Setup the panel
9112
QH('p51group', x);
9113
@@ -9125,7 +9129,7 @@
9129
// Display all users for this mesh
9130
for (var i in sortedusers) {
9131
var trash = '<a href=# onclick=\'return p51deleteUser(event,"' + encodeURIComponent(sortedusers[i].id) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
9128
- x += '<tr tabindex=0 onclick=p20viewuser("' + encodeURIComponent(sortedusers[i].id) + '") onkeypress="if (event.key==\'Enter\') p20viewuser(\'' + encodeURIComponent(sortedusers[i].id) + '\')" style=cursor:pointer' + (((count % 2) == 0) ? ';background-color:#DDD' : '') + '><td><div title=\"' + "User" + '\" class=m2></div><div> ' + EscapeHtml(decodeURIComponent(sortedusers[i].name)) + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
9132
+ x += '<tr ' + (((count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title=\"' + "User" + '\" class=m2></div><div> ' + EscapeHtml(decodeURIComponent(sortedusers[i].name)) + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
9133
++count;
9134
}
9135
@@ -9178,12 +9182,20 @@
9182
}
9183
9184
function p51deleteUser(e, id) {
9181
- console.log('p51deleteUser', id);
9185
+ haltEvent(e);
9186
+ p51viewuserEx(2, decodeURIComponent(id));
9187
+ return false;
9188
}
9183
-
9184
-
9185
-
9189
9190
+ function p51viewuserEx(button, userid) {
9191
+ if (button != 2) return;
9192
+ var uname = userid.split('/')[2];
9193
+ if (users && users[userid]) { uname = users[userid].name; }
9194
+ if (userinfo._id == userid) { uname = userinfo.name; }
9195
+ setDialogMode(2, "Remote User", 3, p51viewuserEx2, format("Confirm removal of user {0}?", EscapeHtml(decodeURIComponent(uname))), userid);
9196
+ }
9197
+ function p51viewuserEx2(button, userid) { meshserver.send({ action: 'removeuserfromusergroup', ugrpid: currentUserGroup._id, userid: userid }); }
9198
+
9199
function p51showAddUserDialog() {
9200
if (xxdialogMode) return false;
9201
var x = "Allow users to manage this device group and devices in this group.";
@@ -9244,9 +9256,9 @@
9256
if (t == null) {
9257
var users = Q('dp51username').value.split(','), users2 = [];
9258
for (var i in users) { users2.push(users[i].trim()); }
9247
- meshserver.send({ action: 'addusertousergroup', meshid: currentUserGroup._id, usernames: users2 });
9259
+ meshserver.send({ action: 'addusertousergroup', ugrpid: currentUserGroup._id, usernames: users2 });
9260
} else {
9249
- meshserver.send({ action: 'addusertousergroup', meshid: currentUserGroup._id, usernames: [ t.split('/')[2] ] });
9261
+ meshserver.send({ action: 'addusertousergroup', ugrpid: currentUserGroup._id, usernames: [ t.split('/')[2] ] });
9262
}
9263
}
9264