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 }