Implemented user group permission query in the web app.
Ylian Saint-Hilaire committed
Jan 4, 2020 at 13:19 UTC
13cf8c12eb46c604c9b5d6b189c5c23b1c803f1e
3 files changed
+95
-40
views/default-mobile.handlebars
+44
-18
@@ -3425,37 +3425,63 @@
3425
//
3426
3427
// Get the right of a user on a given device group
3428
- function GetMeshRights(mesh, user) {
3428
+ function GetMeshRights(mesh, userid) {
3429
if (mesh == null) { return 0; }
3430
- if (user == null) { user = userinfo._id; }
3430
+ if (userid == null) { userid = userinfo._id; }
3431
if (typeof mesh == 'string') { mesh = meshes[mesh] }
3432
if ((mesh == null) || (mesh.links == null)) { return 0; }
3433
- var rights = mesh.links[user];
3434
- if (rights == null) { return 0; }
3435
- return rights.rights;
3433
+
3434
+ // Check direct link permission
3435
+ var rights = 0, r = mesh.links[userid];
3436
+ if (r != null) {
3437
+ rights = r.rights;
3438
+ if (rights == 0xFFFFFFFF) { return rights; } // User has full rights thru a direct link, stop here.
3439
+ }
3440
+
3441
+ // Check permissions thru user groups
3442
+ var user = null;
3443
+ if (userid == userinfo._id) { user = userinfo; } else { if (users != null) { user = users[userid]; } }
3444
+ if (user != null) {
3445
+ for (var i in user.links) {
3446
+ if (i.startsWith('ugrp/')) {
3447
+ r = mesh.links[i];
3448
+ if (r != null) {
3449
+ if (r.rights == 0xFFFFFFFF) { return r.rights; } // User has full rights thru a user group, stop here.
3450
+ rights |= r.rights; // TODO: Deal with reverse permissions
3451
+ }
3452
+ }
3453
+ }
3454
+ }
3455
+
3456
+ return rights;
3457
}
3458
3459
// Returns true if the user can view the given device group
3439
- function IsMeshViewable(mesh, user) {
3440
- if (mesh == null) { return 0; }
3441
- if (user == null) { user = userinfo._id; }
3460
+ function IsMeshViewable(mesh, userid) {
3461
+ if (mesh == null) { return false; }
3462
+ if (userid == null) { userid = userinfo._id; }
3463
if (typeof mesh == 'string') { mesh = meshes[mesh] }
3464
if ((mesh == null) || (mesh.links == null)) { return false; }
3444
- var rights = mesh.links[user];
3445
- if (rights == null) { return false; }
3446
- return true;
3465
+ if (mesh.links[userid] != null) { return true; } // User has visilibity thru a direct link
3466
+
3467
+ // Check permissions thru user groups
3468
+ var user = null;
3469
+ if (userid == userinfo._id) { user = userinfo; } else { if (users != null) { user = users[userid]; } }
3470
+ if (user != null) {
3471
+ for (var i in user.links) {
3472
+ if ((i.startsWith('ugrp/')) && (mesh.links[i] != null)) { return true; } // User has visilibity thru a user group
3473
+ }
3474
+ }
3475
+
3476
+ return rights;
3477
}
3478
3479
// Return the user rights for a given node
3450
- function GetNodeRights(node, user) {
3480
+ function GetNodeRights(node, userid) {
3481
if (node == null) { return 0; }
3452
- if (user == null) { user = userinfo._id; }
3482
+ if (userid == null) { userid = userinfo._id; }
3483
if (typeof node == 'string') { node = getNodeFromId(node); if (node == null) { return 0; } }
3454
- var mesh = meshes[node.meshid];
3455
- if ((mesh == null) || (mesh.links == null)) { return 0; }
3456
- var meshlinks = mesh.links[user];
3457
- if (meshlinks == null) { return 0; }
3458
- return meshlinks.rights;
3484
+ return GetMeshRights(node.meshid, userid);
3485
}
3486
3487
//
views/default.handlebars
+44
-18
@@ -10539,37 +10539,63 @@
10539
//
10540
10541
// Get the right of a user on a given device group
10542
- function GetMeshRights(mesh, user) {
10542
+ function GetMeshRights(mesh, userid) {
10543
if (mesh == null) { return 0; }
10544
- if (user == null) { user = userinfo._id; }
10544
+ if (userid == null) { userid = userinfo._id; }
10545
if (typeof mesh == 'string') { mesh = meshes[mesh] }
10546
if ((mesh == null) || (mesh.links == null)) { return 0; }
10547
- var rights = mesh.links[user];
10548
- if (rights == null) { return 0; }
10549
- return rights.rights;
10547
+
10548
+ // Check direct link permission
10549
+ var rights = 0, r = mesh.links[userid];
10550
+ if (r != null) {
10551
+ rights = r.rights;
10552
+ if (rights == 0xFFFFFFFF) { return rights; } // User has full rights thru a direct link, stop here.
10553
+ }
10554
+
10555
+ // Check permissions thru user groups
10556
+ var user = null;
10557
+ if (userid == userinfo._id) { user = userinfo; } else { if (users != null) { user = users[userid]; } }
10558
+ if (user != null) {
10559
+ for (var i in user.links) {
10560
+ if (i.startsWith('ugrp/')) {
10561
+ r = mesh.links[i];
10562
+ if (r != null) {
10563
+ if (r.rights == 0xFFFFFFFF) { return r.rights; } // User has full rights thru a user group, stop here.
10564
+ rights |= r.rights; // TODO: Deal with reverse permissions
10565
+ }
10566
+ }
10567
+ }
10568
+ }
10569
+
10570
+ return rights;
10571
}
10572
10573
// Returns true if the user can view the given device group
10553
- function IsMeshViewable(mesh, user) {
10554
- if (mesh == null) { return 0; }
10555
- if (user == null) { user = userinfo._id; }
10574
+ function IsMeshViewable(mesh, userid) {
10575
+ if (mesh == null) { return false; }
10576
+ if (userid == null) { userid = userinfo._id; }
10577
if (typeof mesh == 'string') { mesh = meshes[mesh] }
10578
if ((mesh == null) || (mesh.links == null)) { return false; }
10558
- var rights = mesh.links[user];
10559
- if (rights == null) { return false; }
10560
- return true;
10579
+ if (mesh.links[userid] != null) { return true; } // User has visilibity thru a direct link
10580
+
10581
+ // Check permissions thru user groups
10582
+ var user = null;
10583
+ if (userid == userinfo._id) { user = userinfo; } else { if (users != null) { user = users[userid]; } }
10584
+ if (user != null) {
10585
+ for (var i in user.links) {
10586
+ if ((i.startsWith('ugrp/')) && (mesh.links[i] != null)) { return true; } // User has visilibity thru a user group
10587
+ }
10588
+ }
10589
+
10590
+ return rights;
10591
}
10592
10593
// Return the user rights for a given node
10564
- function GetNodeRights(node, user) {
10594
+ function GetNodeRights(node, userid) {
10595
if (node == null) { return 0; }
10566
- if (user == null) { user = userinfo._id; }
10596
+ if (userid == null) { userid = userinfo._id; }
10597
if (typeof node == 'string') { node = getNodeFromId(node); if (node == null) { return 0; } }
10568
- var mesh = meshes[node.meshid];
10569
- if ((mesh == null) || (mesh.links == null)) { return 0; }
10570
- var meshlinks = mesh.links[user];
10571
- if (meshlinks == null) { return 0; }
10572
- return meshlinks.rights;
10598
+ return GetMeshRights(node.meshid, userid);
10599
}
10600
10601
//
webserver.js
+7
-4
@@ -4025,14 +4025,17 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4025
} else return 0;
4026
4027
// Check direct user to device group permissions
4028
+ var rights = 0;
4029
r = user.links[meshid];
4029
- if ((r != null) && (r.rights == 0xFFFFFFFF)) { return r.rights; } // If the user has full access thru direct link, stop here.
4030
- var rights = r.rights;
4030
+ if (r != null) {
4031
+ var rights = r.rights;
4032
+ if (rights == 0xFFFFFFFF) { return rights; } // If the user has full access thru direct link, stop here.
4033
+ }
4034
4035
// Check if we are part of any user groups that would give this user more access.
4036
for (var i in user.links) {
4037
if (i.startsWith('ugrp')) {
4035
- const g = obj.usersGroups[i];
4038
+ const g = obj.userGroups[i];
4039
if (g) {
4040
r = g.links[meshid];
4041
if (r != null) {
@@ -4068,7 +4071,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4071
// Check if we are part of any user groups that would give this user visibility to this device group.
4072
for (var i in user.links) {
4073
if (i.startsWith('ugrp')) {
4071
- const g = obj.usersGroups[i];
4074
+ const g = obj.userGroups[i];
4075
if (g && (g.links[meshid] != null)) { return true; } // If the user has a user group link, stop here.
4076
}
4077
}