Access control fixes.

Ylian Saint-Hilaire committed Apr 18, 2020 at 19:17 UTC dbfb1c51229053de5e6e1a4583cb20a6f4a6a857
3 files changed +131 -108
meshuser.js
+11 -6
@@ -2436,6 +2436,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2436 }
2437 }
2438
2439 + var selfMeshRights = 0;
2440 try {
2441 if (common.validateString(command.meshid, 1, 1024) == false) { err = 'Invalid groupid'; } // Check the meshid
2442 else if (common.validateInt(command.meshadmin) == false) { err = 'Invalid group rights'; } // Mesh rights must be an integer
@@ -2444,7 +2445,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2445 if (command.meshid.indexOf('/') == -1) { command.meshid = 'mesh/' + domain.id + '/' + command.meshid; }
2446 mesh = parent.meshes[command.meshid];
2447 if (mesh == null) { err = 'Unknown group'; }
2447 - else if ((parent.GetMeshRights(user, mesh) & MESHRIGHT_MANAGEUSERS) == 0) { err = 'Permission denied'; }
2448 + else if (((selfMeshRights = parent.GetMeshRights(user, mesh)) & MESHRIGHT_MANAGEUSERS) == 0) { err = 'Permission denied'; }
2449 else if ((command.meshid.split('/').length != 3) || (command.meshid.split('/')[1] != domain.id)) { err = 'Invalid domain'; } // Invalid domain, operation only valid for current domain
2450 }
2451 } catch (ex) { err = 'Validation exception: ' + ex; }
@@ -2475,16 +2476,20 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2476
2477 if (newuser != null) {
2478 // Can't add or modify self
2478 - if (newuserid == obj.user._id) { errors.push("Can't change self."); continue; }
2479 + if (newuserid == obj.user._id) { msgs.push("Can't change self"); continue; }
2480 +
2481 + var targetMeshRights = 0;
2482 + if (newuser.links[command.meshid]) { targetMeshRights = newuser.links[command.meshid].rights; }
2483 + if ((targetMeshRights == 0xFFFFFFFF) && (selfMeshRights != 0xFFFFFFFF)) { msgs.push("Can't change rights of device group administrator"); continue; } // A non-admin can't kick out an admin
2484
2485 if (command.remove === true) {
2486 // Remove mesh from user or user group
2482 - var selfMeshRights = parent.GetMeshRights(user, mesh);
2483 - var delmeshrights = 0;
2484 - if (newuser.links[command.meshid]) { delmeshrights = newuser.links[command.meshid].rights; }
2485 - if ((delmeshrights == 0xFFFFFFFF) && (selfMeshRights != 0xFFFFFFFF)) { console.log('ttt', delmeshrights, selfMeshRights); errors.push("Can't remove device group administrator."); continue; } // A non-admin can't kick out an admin
2487 delete newuser.links[command.meshid];
2488 } else {
2489 + // Adjust rights since we can't add more rights that we have outself for MESHRIGHT_MANAGEUSERS
2490 + if ((selfMeshRights != 0xFFFFFFFF) && (command.meshadmin == 0xFFFFFFFF)) { msgs.push("Can't set device group administrator, if not administrator"); continue; }
2491 + if (((selfMeshRights & 2) == 0) && ((command.meshadmin & 2) != 0) && ((targetMeshRights & 2) == 0)) { command.meshadmin -= 2; }
2492 +
2493 // Add mesh to user or user group
2494 if (newuser.links == null) { newuser.links = {}; }
2495 if (newuser.links[command.meshid]) { newuser.links[command.meshid].rights = command.meshadmin; } else { newuser.links[command.meshid] = { rights: command.meshadmin }; }
translate/translate.json
+99 -92
@@ -605,7 +605,7 @@
605 "default-mobile.handlebars->9->244",
606 "default-mobile.handlebars->9->70",
607 "default.handlebars->29->1312",
608 - "default.handlebars->29->1608",
608 + "default.handlebars->29->1610",
609 "default.handlebars->29->716"
610 ]
611 },
@@ -2375,7 +2375,7 @@
2375 "ru": "Добавить участие",
2376 "zh-chs": "添加會員",
2377 "xloc": [
2378 - "default.handlebars->29->1604"
2378 + "default.handlebars->29->1606"
2379 ]
2380 },
2381 {
@@ -2907,7 +2907,7 @@
2907 "ru": "Счетчик ошибок агента",
2908 "zh-chs": "座席錯誤計數器",
2909 "xloc": [
2910 - "default.handlebars->29->1617"
2910 + "default.handlebars->29->1619"
2911 ]
2912 },
2913 {
@@ -2976,7 +2976,7 @@
2976 "ru": "Сессии агентов",
2977 "zh-chs": "座席會議",
2978 "xloc": [
2979 - "default.handlebars->29->1633"
2979 + "default.handlebars->29->1635"
2980 ]
2981 },
2982 {
@@ -3099,7 +3099,7 @@
3099 "ru": "Агенты",
3100 "zh-chs": "代理商",
3101 "xloc": [
3102 - "default.handlebars->29->1646"
3102 + "default.handlebars->29->1648"
3103 ]
3104 },
3105 {
@@ -3909,7 +3909,7 @@
3909 "ru": "Вы уверенны, что {0} плагин: {1}",
3910 "zh-chs": "您確定要{0}插件嗎:{1}",
3911 "xloc": [
3912 - "default.handlebars->29->1686"
3912 + "default.handlebars->29->1688"
3913 ]
3914 },
3915 {
@@ -4322,7 +4322,7 @@
4322 "ru": "Плохой ключ",
4323 "zh-chs": "錯誤的簽名",
4324 "xloc": [
4325 - "default.handlebars->29->1624"
4325 + "default.handlebars->29->1626"
4326 ]
4327 },
4328 {
@@ -4339,7 +4339,7 @@
4339 "ru": "Плохой веб-сертификат",
4340 "zh-chs": "錯誤的網絡證書",
4341 "xloc": [
4342 - "default.handlebars->29->1623"
4342 + "default.handlebars->29->1625"
4343 ]
4344 },
4345 {
@@ -4600,7 +4600,7 @@
4600 "ru": "CIRA Сервер",
4601 "zh-chs": "CIRA服務器",
4602 "xloc": [
4603 - "default.handlebars->29->1674"
4603 + "default.handlebars->29->1676"
4604 ]
4605 },
4606 {
@@ -4617,7 +4617,7 @@
4617 "ru": "CIRA Сервер команды",
4618 "zh-chs": "CIRA服務器命令",
4619 "xloc": [
4620 - "default.handlebars->29->1675"
4620 + "default.handlebars->29->1677"
4621 ]
4622 },
4623 {
@@ -4634,7 +4634,7 @@
4634 "ru": "Загрузка CPU",
4635 "zh-chs": "CPU負載",
4636 "xloc": [
4637 - "default.handlebars->29->1638"
4637 + "default.handlebars->29->1640"
4638 ]
4639 },
4640 {
@@ -4651,7 +4651,7 @@
4651 "ru": "Загрузка CPU за последние 15 минут",
4652 "zh-chs": "最近15分鐘的CPU負載",
4653 "xloc": [
4654 - "default.handlebars->29->1641"
4654 + "default.handlebars->29->1643"
4655 ]
4656 },
4657 {
@@ -4668,7 +4668,7 @@
4668 "ru": "Загрузка CPU за последние 5 минут",
4669 "zh-chs": "最近5分鐘的CPU負載",
4670 "xloc": [
4671 - "default.handlebars->29->1640"
4671 + "default.handlebars->29->1642"
4672 ]
4673 },
4674 {
@@ -4685,7 +4685,7 @@
4685 "ru": "Загрузка CPU за последнюю минуту",
4686 "zh-chs": "最後一分鐘的CPU負載",
4687 "xloc": [
4688 - "default.handlebars->29->1639"
4688 + "default.handlebars->29->1641"
4689 ]
4690 },
4691 {
@@ -4740,7 +4740,7 @@
4740 "ru": "Ошибка вызова",
4741 "zh-chs": "通話錯誤",
4742 "xloc": [
4743 - "default.handlebars->29->1687"
4743 + "default.handlebars->29->1689"
4744 ]
4745 },
4746 {
@@ -5166,7 +5166,7 @@
5166 "ru": "Проверка...",
5167 "zh-chs": "檢查...",
5168 "xloc": [
5169 - "default.handlebars->29->1681",
5169 + "default.handlebars->29->1683",
5170 "default.handlebars->29->841"
5171 ]
5172 },
@@ -5414,7 +5414,7 @@
5414 "zh-chs": "清除此通知",
5415 "es": "Borrar esta notificación",
5416 "xloc": [
5417 - "default.handlebars->29->1611"
5417 + "default.handlebars->29->1613"
5418 ]
5419 },
5420 {
@@ -5790,7 +5790,7 @@
5790 "en": "Confirm membership removal of user group \\\"{0}\\\"?",
5791 "nl": "Bevestig lidmaatschap verwijdering van gebruikergroep \\\"{0}\\\"?",
5792 "xloc": [
5793 - "default.handlebars->29->1602"
5793 + "default.handlebars->29->1604"
5794 ]
5795 },
5796 {
@@ -5859,7 +5859,7 @@
5859 "nl": "Bevestig verwijdering van toegangsrechten voor apparaatgroep \\\"{0}\\\"?",
5860 "xloc": [
5861 "default.handlebars->29->1494",
5862 - "default.handlebars->29->1606"
5862 + "default.handlebars->29->1608"
5863 ]
5864 },
5865 {
@@ -5873,7 +5873,14 @@
5873 "en": "Confirm removal of access rights for user group \\\"{0}\\\"?",
5874 "nl": "Bevestig verwijdering van toegangsrechten voor gebruikergroep \\\"{0}\\\"?",
5875 "xloc": [
5876 - "default.handlebars->29->1599"
5876 + "default.handlebars->29->1600"
5877 + ]
5878 + },
5879 + {
5880 + "en": "Confirm removal of access rights?",
5881 + "xloc": [
5882 + "default.handlebars->29->1598",
5883 + "default.handlebars->29->1601"
5884 ]
5885 },
5886 {
@@ -6097,7 +6104,7 @@
6104 "ru": "Подключено Intel® AMT",
6105 "zh-chs": "連接的英特爾®AMT",
6106 "xloc": [
6100 - "default.handlebars->29->1629"
6107 + "default.handlebars->29->1631"
6108 ]
6109 },
6110 {
@@ -6114,7 +6121,7 @@
6121 "ru": "Подключенные пользователи",
6122 "zh-chs": "關聯用戶",
6123 "xloc": [
6117 - "default.handlebars->29->1634"
6124 + "default.handlebars->29->1636"
6125 ]
6126 },
6127 {
@@ -6190,7 +6197,7 @@
6197 "ru": "Подключений ",
6198 "zh-chs": "連接數",
6199 "xloc": [
6193 - "default.handlebars->29->1645"
6200 + "default.handlebars->29->1647"
6201 ]
6202 },
6203 {
@@ -6207,7 +6214,7 @@
6214 "ru": "Ретранслятор подключения",
6215 "zh-chs": "連接繼電器",
6216 "xloc": [
6210 - "default.handlebars->29->1673"
6217 + "default.handlebars->29->1675"
6218 ]
6219 },
6220 {
@@ -6332,7 +6339,7 @@
6339 "ru": "Cookie-кодировщик",
6340 "zh-chs": "Cookie編碼器",
6341 "xloc": [
6335 - "default.handlebars->29->1659"
6342 + "default.handlebars->29->1661"
6343 ]
6344 },
6345 {
@@ -6633,7 +6640,7 @@
6640 "ru": "Основной сервер",
6641 "zh-chs": "核心服務器",
6642 "xloc": [
6636 - "default.handlebars->29->1658"
6643 + "default.handlebars->29->1660"
6644 ]
6645 },
6646 {
@@ -7802,7 +7809,7 @@
7809 "default.handlebars->29->1447",
7810 "default.handlebars->29->1469",
7811 "default.handlebars->29->1531",
7805 - "default.handlebars->29->1632",
7812 + "default.handlebars->29->1634",
7813 "default.handlebars->container->column_l->p2->p2info->7"
7814 ]
7815 },
@@ -8819,7 +8826,7 @@
8826 "en": "Duplicate Agent",
8827 "nl": "Dubbele agent",
8828 "xloc": [
8822 - "default.handlebars->29->1628"
8829 + "default.handlebars->29->1630"
8830 ]
8831 },
8832 {
@@ -9342,7 +9349,7 @@
9349 "zh-chs": "电子邮件流量",
9350 "es": "Tráfico de correo electrónico",
9351 "xloc": [
9345 - "default.handlebars->29->1667"
9352 + "default.handlebars->29->1669"
9353 ]
9354 },
9355 {
@@ -10110,7 +10117,7 @@
10117 "ru": "Внешний",
10118 "zh-chs": "外部",
10119 "xloc": [
10113 - "default.handlebars->29->1652"
10120 + "default.handlebars->29->1654"
10121 ]
10122 },
10123 {
@@ -10596,8 +10603,8 @@
10603 "ru": "Свободно",
10604 "zh-chs": "自由",
10605 "xloc": [
10599 - "default.handlebars->29->1613",
10600 - "default.handlebars->29->1615"
10606 + "default.handlebars->29->1615",
10607 + "default.handlebars->29->1617"
10608 ]
10609 },
10610 {
@@ -11486,7 +11493,7 @@
11493 "ru": "Всего кучи",
11494 "zh-chs": "堆總數",
11495 "xloc": [
11489 - "default.handlebars->29->1654"
11496 + "default.handlebars->29->1656"
11497 ]
11498 },
11499 {
@@ -11503,7 +11510,7 @@
11510 "ru": "Куча используется",
11511 "zh-chs": "堆使用",
11512 "xloc": [
11506 - "default.handlebars->29->1653"
11513 + "default.handlebars->29->1655"
11514 ]
11515 },
11516 {
@@ -12275,8 +12282,8 @@
12282 "xloc": [
12283 "default.handlebars->29->1301",
12284 "default.handlebars->29->1307",
12278 - "default.handlebars->29->1650",
12279 - "default.handlebars->29->1672"
12285 + "default.handlebars->29->1652",
12286 + "default.handlebars->29->1674"
12287 ]
12288 },
12289 {
@@ -12981,7 +12988,7 @@
12988 "ru": "Некорректный тип группы устройств",
12989 "zh-chs": "無效的設備組類型",
12990 "xloc": [
12984 - "default.handlebars->29->1627"
12991 + "default.handlebars->29->1629"
12992 ]
12993 },
12994 {
@@ -12998,7 +13005,7 @@
13005 "ru": "Некорректный JSON",
13006 "zh-chs": "無效的JSON",
13007 "xloc": [
13001 - "default.handlebars->29->1621"
13008 + "default.handlebars->29->1623"
13009 ]
13010 },
13011 {
@@ -13050,7 +13057,7 @@
13057 "ru": "Некорректная сигнатура PKCS",
13058 "zh-chs": "無效的PKCS簽名",
13059 "xloc": [
13053 - "default.handlebars->29->1619"
13060 + "default.handlebars->29->1621"
13061 ]
13062 },
13063 {
@@ -13067,7 +13074,7 @@
13074 "ru": "Некорректная сигнатура RSA",
13075 "zh-chs": "無效的RSA密碼",
13076 "xloc": [
13070 - "default.handlebars->29->1620"
13077 + "default.handlebars->29->1622"
13078 ]
13079 },
13080 {
@@ -14128,7 +14135,7 @@
14135 "ru": "Меньше",
14136 "zh-chs": "減",
14137 "xloc": [
14131 - "default.handlebars->29->1689"
14138 + "default.handlebars->29->1691"
14139 ]
14140 },
14141 {
@@ -15204,7 +15211,7 @@
15211 "ru": "Сообщения главного сервера",
15212 "zh-chs": "主服務器消息",
15213 "xloc": [
15207 - "default.handlebars->29->1661"
15214 + "default.handlebars->29->1663"
15215 ]
15216 },
15217 {
@@ -15605,7 +15612,7 @@
15612 "ru": "Достигнуто максимальное число сессий",
15613 "zh-chs": "達到的會話數上限",
15614 "xloc": [
15608 - "default.handlebars->29->1625"
15615 + "default.handlebars->29->1627"
15616 ]
15617 },
15618 {
@@ -15659,7 +15666,7 @@
15666 "ru": "Мегабайт",
15667 "zh-chs": "兆字節",
15668 "xloc": [
15662 - "default.handlebars->29->1651"
15669 + "default.handlebars->29->1653"
15670 ]
15671 },
15672 {
@@ -15676,7 +15683,7 @@
15683 "ru": "ОЗУ",
15684 "zh-chs": "記憶",
15685 "xloc": [
15679 - "default.handlebars->29->1642",
15686 + "default.handlebars->29->1644",
15687 "default.handlebars->29->806",
15688 "default.handlebars->container->column_l->p40->3->1->p40type->3"
15689 ]
@@ -15812,7 +15819,7 @@
15819 "ru": "Трафик MeshAgent",
15820 "zh-chs": "MeshAgent流量",
15821 "xloc": [
15815 - "default.handlebars->29->1663"
15822 + "default.handlebars->29->1665"
15823 ]
15824 },
15825 {
@@ -15829,7 +15836,7 @@
15836 "ru": "Обновление MeshAgent",
15837 "zh-chs": "MeshAgent更新",
15838 "xloc": [
15832 - "default.handlebars->29->1664"
15839 + "default.handlebars->29->1666"
15840 ]
15841 },
15842 {
@@ -15932,7 +15939,7 @@
15939 "ru": "Соединения сервера MeshCentral",
15940 "zh-chs": "MeshCentral服務器對等",
15941 "xloc": [
15935 - "default.handlebars->29->1662"
15942 + "default.handlebars->29->1664"
15943 ]
15944 },
15945 {
@@ -16195,7 +16202,7 @@
16202 "ru": "Диспетчер сообщения",
16203 "zh-chs": "郵件調度程序",
16204 "xloc": [
16198 - "default.handlebars->29->1660"
16205 + "default.handlebars->29->1662"
16206 ]
16207 },
16208 {
@@ -16326,7 +16333,7 @@
16333 "ru": "Еще",
16334 "zh-chs": "更多",
16335 "xloc": [
16329 - "default.handlebars->29->1688"
16336 + "default.handlebars->29->1690"
16337 ]
16338 },
16339 {
@@ -17052,7 +17059,7 @@
17059 "zh-chs": "找不到活動",
17060 "xloc": [
17061 "default.handlebars->29->1350",
17055 - "default.handlebars->29->1607",
17062 + "default.handlebars->29->1609",
17063 "default.handlebars->29->754"
17064 ]
17065 },
@@ -18162,7 +18169,7 @@
18169 "ru": "Произошло в {0}",
18170 "zh-chs": "發生在{0}",
18171 "xloc": [
18165 - "default.handlebars->29->1610"
18172 + "default.handlebars->29->1612"
18173 ]
18174 },
18175 {
@@ -19192,7 +19199,7 @@
19199 "zh-chs": "插件動作",
19200 "xloc": [
19201 "default.handlebars->29->164",
19195 - "default.handlebars->29->1685"
19202 + "default.handlebars->29->1687"
19203 ]
19204 },
19205 {
@@ -19908,7 +19915,7 @@
19915 "ru": "RSS",
19916 "zh-chs": "的RSS",
19917 "xloc": [
19911 - "default.handlebars->29->1655"
19918 + "default.handlebars->29->1657"
19919 ]
19920 },
19921 {
@@ -20092,7 +20099,7 @@
20099 "ru": "Число ретрансляций",
20100 "zh-chs": "中繼計數",
20101 "xloc": [
20095 - "default.handlebars->29->1637"
20102 + "default.handlebars->29->1639"
20103 ]
20104 },
20105 {
@@ -20109,7 +20116,7 @@
20116 "ru": "Ошибки ретранслятора",
20117 "zh-chs": "中繼錯誤",
20118 "xloc": [
20112 - "default.handlebars->29->1630"
20119 + "default.handlebars->29->1632"
20120 ]
20121 },
20122 {
@@ -20126,8 +20133,8 @@
20133 "ru": "Сессии ретранслятора",
20134 "zh-chs": "接力會議",
20135 "xloc": [
20129 - "default.handlebars->29->1636",
20130 - "default.handlebars->29->1649"
20136 + "default.handlebars->29->1638",
20137 + "default.handlebars->29->1651"
20138 ]
20139 },
20140 {
@@ -20419,7 +20426,7 @@
20426 "nl": "Apparaatgroepmachtigingen verwijderen",
20427 "xloc": [
20428 "default.handlebars->29->1493",
20422 - "default.handlebars->29->1605"
20429 + "default.handlebars->29->1607"
20430 ]
20431 },
20432 {
@@ -20448,7 +20455,7 @@
20455 "en": "Remove User Group Membership",
20456 "nl": "Lidmaatschap van gebruikersgroep verwijderen",
20457 "xloc": [
20451 - "default.handlebars->29->1601"
20458 + "default.handlebars->29->1603"
20459 ]
20460 },
20461 {
@@ -20456,7 +20463,7 @@
20463 "nl": "Gebruikersgroepmachtigingen verwijderen",
20464 "xloc": [
20465 "default.handlebars->29->1277",
20459 - "default.handlebars->29->1598"
20466 + "default.handlebars->29->1599"
20467 ]
20468 },
20469 {
@@ -21950,7 +21957,7 @@
21957 "ru": "Сертификат сервера",
21958 "zh-chs": "服務器證書",
21959 "xloc": [
21953 - "default.handlebars->29->1665"
21960 + "default.handlebars->29->1667"
21961 ]
21962 },
21963 {
@@ -21967,7 +21974,7 @@
21974 "zh-chs": "服務器數據庫",
21975 "es": "Base de Datos del Servidor",
21976 "xloc": [
21970 - "default.handlebars->29->1666"
21977 + "default.handlebars->29->1668"
21978 ]
21979 },
21980 {
@@ -22076,7 +22083,7 @@
22083 "ru": "Состояние сервера",
22084 "zh-chs": "服務器狀態",
22085 "xloc": [
22079 - "default.handlebars->29->1616"
22086 + "default.handlebars->29->1618"
22087 ]
22088 },
22089 {
@@ -22110,7 +22117,7 @@
22117 "ru": "Трассировка сервера",
22118 "zh-chs": "服務器跟踪",
22119 "xloc": [
22113 - "default.handlebars->29->1676"
22120 + "default.handlebars->29->1678"
22121 ]
22122 },
22123 {
@@ -22249,7 +22256,7 @@
22256 "ru": "ServerStats.csv",
22257 "zh-chs": "ServerStats.csv",
22258 "xloc": [
22252 - "default.handlebars->29->1657"
22259 + "default.handlebars->29->1659"
22260 ]
22261 },
22262 {
@@ -24319,7 +24326,7 @@
24326 "ru": "На данный момент уведомлений нет",
24327 "zh-chs": "目前沒有任何通知",
24328 "xloc": [
24322 - "default.handlebars->29->1609"
24329 + "default.handlebars->29->1611"
24330 ]
24331 },
24332 {
@@ -25525,7 +25532,7 @@
25532 "default-mobile.handlebars->9->174",
25533 "default-mobile.handlebars->9->175",
25534 "default.handlebars->29->13",
25528 - "default.handlebars->29->1600",
25535 + "default.handlebars->29->1602",
25536 "default.handlebars->29->374",
25537 "default.handlebars->29->41",
25538 "default.handlebars->29->42",
@@ -25570,7 +25577,7 @@
25577 "ru": "Неизвестное действие",
25578 "zh-chs": "未知動作",
25579 "xloc": [
25573 - "default.handlebars->29->1622"
25580 + "default.handlebars->29->1624"
25581 ]
25582 },
25583 {
@@ -25607,7 +25614,7 @@
25614 "xloc": [
25615 "default.handlebars->29->1480",
25616 "default.handlebars->29->1578",
25610 - "default.handlebars->29->1626"
25617 + "default.handlebars->29->1628"
25618 ]
25619 },
25620 {
@@ -25624,7 +25631,7 @@
25631 "ru": "Неизвестная группа",
25632 "zh-chs": "未知群組",
25633 "xloc": [
25627 - "default.handlebars->29->1618"
25634 + "default.handlebars->29->1620"
25635 ]
25636 },
25637 {
@@ -25741,7 +25748,7 @@
25748 "ru": "Актуально",
25749 "zh-chs": "最新",
25750 "xloc": [
25744 - "default.handlebars->29->1683"
25751 + "default.handlebars->29->1685"
25752 ]
25753 },
25754 {
@@ -25990,8 +25997,8 @@
25997 "ru": "Использовано",
25998 "zh-chs": "用過的",
25999 "xloc": [
25993 - "default.handlebars->29->1612",
25994 - "default.handlebars->29->1614"
26000 + "default.handlebars->29->1614",
26001 + "default.handlebars->29->1616"
26002 ]
26003 },
26004 {
@@ -26067,7 +26074,7 @@
26074 "ru": "Учетные записи пользователей",
26075 "zh-chs": "用戶帳號",
26076 "xloc": [
26070 - "default.handlebars->29->1631"
26077 + "default.handlebars->29->1633"
26078 ]
26079 },
26080 {
@@ -26126,7 +26133,7 @@
26133 "default.handlebars->29->1211",
26134 "default.handlebars->29->1458",
26135 "default.handlebars->29->1586",
26129 - "default.handlebars->29->1603",
26136 + "default.handlebars->29->1605",
26137 "default.handlebars->29->555"
26138 ]
26139 },
@@ -26277,7 +26284,7 @@
26284 "ru": "Сессии пользователя",
26285 "zh-chs": "用戶會話",
26286 "xloc": [
26280 - "default.handlebars->29->1648"
26287 + "default.handlebars->29->1650"
26288 ]
26289 },
26290 {
@@ -26462,7 +26469,7 @@
26469 "xloc": [
26470 "default.handlebars->29->1446",
26471 "default.handlebars->29->1468",
26465 - "default.handlebars->29->1647",
26472 + "default.handlebars->29->1649",
26473 "default.handlebars->container->topbar->1->1->UsersSubMenuSpan->UsersSubMenu->1->0->UsersGeneral"
26474 ]
26475 },
@@ -26480,7 +26487,7 @@
26487 "ru": "Сессии пользователей",
26488 "zh-chs": "用戶會話",
26489 "xloc": [
26483 - "default.handlebars->29->1635"
26490 + "default.handlebars->29->1637"
26491 ]
26492 },
26493 {
@@ -26619,7 +26626,7 @@
26626 "zh-chs": "版本不兼容,请先升级您的MeshCentral安装",
26627 "es": "Versión Incompatible, por favor primero actualice su instalación de MeshCentral",
26628 "xloc": [
26622 - "default.handlebars->29->1679"
26629 + "default.handlebars->29->1681"
26630 ]
26631 },
26632 {
@@ -26685,8 +26692,8 @@
26692 "zh-chs": "查看变更日志",
26693 "es": "Ver registro de cambios",
26694 "xloc": [
26688 - "default.handlebars->29->1682",
26689 - "default.handlebars->29->1684"
26695 + "default.handlebars->29->1684",
26696 + "default.handlebars->29->1686"
26697 ]
26698 },
26699 {
@@ -26929,8 +26936,8 @@
26936 "ru": "Веб-сервер",
26937 "zh-chs": "網絡服務器",
26938 "xloc": [
26932 - "default.handlebars->29->1668",
26933 - "default.handlebars->29->1669"
26939 + "default.handlebars->29->1670",
26940 + "default.handlebars->29->1671"
26941 ]
26942 },
26943 {
@@ -26947,7 +26954,7 @@
26954 "ru": "Запросы веб-сервера",
26955 "zh-chs": "Web服務器請求",
26956 "xloc": [
26950 - "default.handlebars->29->1670"
26957 + "default.handlebars->29->1672"
26958 ]
26959 },
26960 {
@@ -26964,7 +26971,7 @@
26971 "ru": "Ретранслятор Web Socket",
26972 "zh-chs": "Web套接字中繼",
26973 "xloc": [
26967 - "default.handlebars->29->1671"
26974 + "default.handlebars->29->1673"
26975 ]
26976 },
26977 {
@@ -27985,7 +27992,7 @@
27992 "ru": "\\\\'",
27993 "zh-chs": "\\\\'",
27994 "xloc": [
27988 - "default.handlebars->29->1680"
27995 + "default.handlebars->29->1682"
27996 ]
27997 },
27998 {
@@ -28256,7 +28263,7 @@
28263 "ru": "свободно",
28264 "zh-chs": "自由",
28265 "xloc": [
28259 - "default.handlebars->29->1643"
28266 + "default.handlebars->29->1645"
28267 ]
28268 },
28269 {
@@ -28612,7 +28619,7 @@
28619 "ru": "servertrace.csv",
28620 "zh-chs": "servertrace.csv",
28621 "xloc": [
28615 - "default.handlebars->29->1678"
28622 + "default.handlebars->29->1680"
28623 ]
28624 },
28625 {
@@ -28665,7 +28672,7 @@
28672 "zh-chs": "時間,conn.agent,conn.users,conn.usersessions,conn.relaysession,conn.intelamt,mem.external,mem.heapused,mem.heaptotal,mem.rss",
28673 "es": "time, conn.agent, conn.users, conn.usersessions, conn.relaysession, conn.intelamt, mem.external, mem.heapused, mem.heaptotal, mem.rss",
28674 "xloc": [
28668 - "default.handlebars->29->1656"
28675 + "default.handlebars->29->1658"
28676 ]
28677 },
28678 {
@@ -28682,7 +28689,7 @@
28689 "ru": "time, source, message",
28690 "zh-chs": "時間,來源,訊息",
28691 "xloc": [
28685 - "default.handlebars->29->1677"
28692 + "default.handlebars->29->1679"
28693 ]
28694 },
28695 {
@@ -28713,7 +28720,7 @@
28720 "ru": "всего",
28721 "zh-chs": "總",
28722 "xloc": [
28716 - "default.handlebars->29->1644"
28723 + "default.handlebars->29->1646"
28724 ]
28725 },
28726 {
views/default.handlebars
+21 -10
@@ -1811,11 +1811,11 @@
1811 var groupCount = 0;
1812 if (Array.isArray(message.ugroups)) {
1813 usergroups = {};
1814 - for (var i in message.ugroups) { groupCount++; usergroups[message.ugroups[i]._id] = message.ugroups[i]; }
1814 + for (var i in message.ugroups) { groupCount++; usergroups[message.ugroups[i]._id] = message.ugroups[i]; }
1815 if (groupCount == 0) { usergroups = null; }
1816 } else {
1817 usergroups = message.ugroups;
1818 - for (var i in message.ugroups) { groupCount++; }
1818 + for (var i in message.ugroups) { groupCount++; message.ugroups[i]._id = i; }
1819 if (groupCount == 0) { usergroups = null; }
1820 }
1821 masterUpdate(8192);
@@ -8692,6 +8692,7 @@
8692
8693 if (userid == null) {
8694 setDialogMode(2, "Add Users to Device Group", 3, p20showAddMeshUserDialogEx, x);
8695 + QE('p20fulladmin', GetMeshRights(currentMesh) == 0xFFFFFFFF);
8696 Q('dp20username').focus();
8697 } else if (userid === 1) {
8698 setDialogMode(2, (selected == null)?"Add Device Group Permissions":"Edit Device Group Permissions", selected?7:3, p20showAddMeshUserDialogEx, x, userid);
@@ -8699,6 +8700,7 @@
8700 if (urights == 0xFFFFFFFF) { Q('p20fulladmin').checked = true; urights = -1; }
8701 } else if (userid === 2) {
8702 setDialogMode(2, "Add User Group", 3, p20showAddMeshUserDialogEx, x, userid);
8703 + QE('p20fulladmin', GetMeshRights(currentMesh) == 0xFFFFFFFF);
8704 } else if (userid === 3) {
8705 setDialogMode(2, (selected == null)?"Add Device Group":"Edit Device Group", selected?7:3, p20showAddMeshUserDialogEx, x, userid);
8706 QE('dp2groupid', selected == null);
@@ -8733,6 +8735,7 @@
8735 }
8736 var cmeshrights = GetMeshRights(currentMesh), urights = GetMeshRights(currentMesh, userid);
8737 if (urights == 0xFFFFFFFF) { Q('p20fulladmin').checked = true; urights = -1; }
8738 + QE('p20fulladmin', GetMeshRights(currentMesh) == 0xFFFFFFFF);
8739 }
8740
8741 if (urights != -1) {
@@ -10808,12 +10811,14 @@
10811
10812 function p30removeUserFromNode(event, userid) {
10813 if (xxdialogMode) return;
10811 - var user = users[decodeURIComponent(userid)];
10812 - if (user != null) {
10813 - setDialogMode(2, "Remove User Permissions", 3, function(b, user) { meshserver.send({ action: 'adddeviceuser', nodeid: currentNode._id, nodename: currentNode.name, userids: [ user._id ], rights: 0, remove: true }); }, format("Confirm removal of access rights for user \"{0}\"?", user.name), user);
10814 - } else if (usergroups != null) {
10815 - user = usergroups[decodeURIComponent(userid)];
10816 - if (user != null) { setDialogMode(2, "Remove User Group Permissions", 3, function(b, user) { meshserver.send({ action: 'adddeviceuser', nodeid: currentNode._id, nodename: currentNode.name, userids: [ user._id ], rights: 0, remove: true }); }, format("Confirm removal of access rights for user group \"{0}\"?", user.name), user); }
10814 + var user = null, name = '';
10815 + userid = decodeURIComponent(userid);
10816 + if (userid.startsWith('user/')) {
10817 + if (users) { user = users[userid]; if (user != null) { name = user.name; } }
10818 + setDialogMode(2, "Remove User Permissions", 3, function(b, user) { meshserver.send({ action: 'adddeviceuser', nodeid: currentNode._id, nodename: currentNode.name, userids: [ userid ], rights: 0, remove: true }); }, name?format("Confirm removal of access rights for user \"{0}\"?", name):"Confirm removal of access rights?", user);
10819 + } else if (userid.startsWith('ugrp/')) {
10820 + if (usergroups) { user = usergroups[userid]; if (user != null) { name = user.name; } }
10821 + setDialogMode(2, "Remove User Group Permissions", 3, function(b, user) { meshserver.send({ action: 'adddeviceuser', nodeid: currentNode._id, nodename: currentNode.name, userids: [ userid ], rights: 0, remove: true }); }, name?format("Confirm removal of access rights for user group \"{0}\"?", name):"Confirm removal of access rights?", user);
10822 }
10823 }
10824
@@ -11483,8 +11488,14 @@
11488 if (event && (event.shiftKey == true) && (x != 15) && ('{{currentNode}}' == '')) {
11489 // Open the device in a different tab
11490 if ((x >= 10) && (x <= 19)) {
11486 - if (currentNode) { window.open(window.location.origin + '?node=' + currentNode._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentNode._id); }
11487 - } else if (x < 10) {
11491 + if (currentNode) { window.open(window.location.origin + '?gotonode=' + currentNode._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentNode._id); }
11492 + } else if ((x >= 20) && (x <= 29)) {
11493 + if (currentMesh) { window.open(window.location.origin + '?gotomesh=' + currentMesh._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentMesh._id); }
11494 + } else if ((x >= 30) && (x <= 39)) {
11495 + if (currentUser) { window.open(window.location.origin + '?gotouser=' + currentUser._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentUser._id); }
11496 + } else if ((x >= 50) && (x <= 59)) {
11497 + if (currentUserGroup) { window.open(window.location.origin + '?gotougrp=' + currentUserGroup._id.split('/')[2] + '&viewmode=' + x + '&hide=16', 'meshcentral:' + currentUserGroup._id); }
11498 + } else { // if (x < 10))
11499 window.open(window.location.origin + '?viewmode=' + x + '&hide=0', 'meshcentral:' + x);
11500 }
11501 return;