More work on user device permissions.

Ylian Saint-Hilaire committed Mar 27, 2020 at 00:21 UTC bd3b788094f08b12aa7c680102bd67f8df4929d6
2 files changed +68 -29
meshuser.js
+31 -12
@@ -1261,19 +1261,37 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1261 break;
1262 }
1263
1264 - // Remove all the mesh links to this user
1264 + // Remove all links to this user
1265 if (deluser.links != null) {
1266 - for (meshid in deluser.links) {
1267 - // Get the mesh
1268 - mesh = parent.meshes[meshid];
1269 - if (mesh) {
1270 - // Remove user from the mesh
1271 - if (mesh.links[deluser._id] != null) { delete mesh.links[deluser._id]; parent.db.Set(mesh); }
1272 - // Notify mesh change
1273 - change = 'Removed user ' + deluser.name + ' from group ' + mesh.name;
1274 - var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id, invite: mesh.invite };
1275 - 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.
1276 - parent.parent.DispatchEvent(['*', mesh._id, deluser._id, user._id], obj, event);
1266 + for (var i in deluser.links) {
1267 + if (i.startsWith('mesh/')) {
1268 + // Get the device group
1269 + mesh = parent.meshes[i];
1270 + if (mesh) {
1271 + // Remove user from the mesh
1272 + if (mesh.links[deluser._id] != null) { delete mesh.links[deluser._id]; parent.db.Set(mesh); }
1273 +
1274 + // Notify mesh change
1275 + change = 'Removed user ' + deluser.name + ' from group ' + mesh.name;
1276 + var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id, invite: mesh.invite };
1277 + 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.
1278 + parent.parent.DispatchEvent(['*', mesh._id, deluser._id, user._id], obj, event);
1279 + }
1280 + } else if (i.startsWith('node/')) {
1281 + // Get the node and the rights for this node
1282 + parent.GetNodeWithRights(domain, deluser, i, function (node, rights, visible) {
1283 + if ((node == null) || (node.links == null) || (node.links[deluser._id] == null)) return;
1284 +
1285 + // Remove the link and save the node to the database
1286 + delete node.links[deluser._id];
1287 + if (Object.keys(node.links).length == 0) { delete node.links; }
1288 + db.Set(node);
1289 +
1290 + // Event the node change
1291 + var event = { etype: 'node', userid: user._id, username: user.name, action: 'changenode', nodeid: node._id, domain: domain.id, msg: (command.rights == 0) ? ('Removed user device rights for ' + node.name) : ('Changed user device rights for ' + node.name), node: parent.CloneSafeNode(node) }
1292 + 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.
1293 + parent.parent.DispatchEvent(['*', node.meshid, node._id], obj, event);
1294 + });
1295 }
1296 }
1297 }
@@ -2255,6 +2273,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2273
2274 // Delete all devices attached to this mesh in the database
2275 db.RemoveMeshDocuments(command.meshid);
2276 + // TODO: We are possibly deleting devices that users will have links to. We need to clean up the broken links from on occasion.
2277
2278 if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'deletemesh', responseid: command.responseid, result: 'ok' })); } catch (ex) { } }
2279 break;
webserver.js
+37 -17
@@ -1346,32 +1346,52 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
1346
1347 // Check if the password is correct
1348 obj.authenticate(user.name, req.body.apassword1, domain, function (err, userid) {
1349 - var user = obj.users[userid];
1350 - if (user) {
1351 - // Remove all the mesh links to this user
1352 - if (user.links != null) {
1353 - for (var meshid in user.links) {
1354 - // Get the mesh
1355 - var mesh = obj.meshes[meshid];
1356 - if (mesh) {
1357 - // Remove user from the mesh
1358 - if (mesh.links[userid] != null) { delete mesh.links[userid]; obj.db.Set(mesh); }
1359 - // Notify mesh change
1360 - var change = 'Removed user ' + user.name + ' from group ' + mesh.name;
1361 - obj.parent.DispatchEvent(['*', mesh._id, user._id, userid], obj, { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id });
1349 + var deluser = obj.users[userid];
1350 + if ((deluser != null) || (userid == null)) {
1351 + // Remove all links to this user
1352 + if (deluser.links != null) {
1353 + for (var i in deluser.links) {
1354 + if (i.startsWith('mesh/')) {
1355 + // Get the device group
1356 + mesh = parent.meshes[i];
1357 + if (mesh) {
1358 + // Remove user from the mesh
1359 + if (mesh.links[deluser._id] != null) { delete mesh.links[deluser._id]; parent.db.Set(mesh); }
1360 +
1361 + // Notify mesh change
1362 + change = 'Removed user ' + deluser.name + ' from group ' + mesh.name;
1363 + var event = { etype: 'mesh', userid: user._id, username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id, invite: mesh.invite };
1364 + 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.
1365 + parent.parent.DispatchEvent(['*', mesh._id, deluser._id, user._id], obj, event);
1366 + }
1367 + } else if (i.startsWith('node/')) {
1368 + // Get the node and the rights for this node
1369 + parent.GetNodeWithRights(domain, deluser, i, function (node, rights, visible) {
1370 + if ((node == null) || (node.links == null) || (node.links[deluser._id] == null)) return;
1371 +
1372 + // Remove the link and save the node to the database
1373 + delete node.links[deluser._id];
1374 + if (Object.keys(node.links).length == 0) { delete node.links; }
1375 + db.Set(node);
1376 +
1377 + // Event the node change
1378 + var event = { etype: 'node', userid: user._id, username: user.name, action: 'changenode', nodeid: node._id, domain: domain.id, msg: (command.rights == 0) ? ('Removed user device rights for ' + node.name) : ('Changed user device rights for ' + node.name), node: parent.CloneSafeNode(node) }
1379 + 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.
1380 + parent.parent.DispatchEvent(['*', node.meshid, node._id], obj, event);
1381 + });
1382 }
1383 }
1384 }
1385
1386 // Remove notes for this user
1367 - obj.db.Remove('nt' + user._id);
1387 + obj.db.Remove('nt' + deluser._id);
1388
1389 // Remove the user
1370 - obj.db.Remove(user._id);
1371 - delete obj.users[user._id];
1390 + obj.db.Remove(deluser._id);
1391 + delete obj.users[deluser._id];
1392 req.session = null;
1393 if (direct === true) { handleRootRequestEx(req, res, domain); } else { res.redirect(domain.url + getQueryPortion(req)); }
1374 - obj.parent.DispatchEvent(['*', 'server-users'], obj, { etype: 'user', userid: user._id, username: user.name, action: 'accountremove', msg: 'Account removed', domain: domain.id });
1394 + obj.parent.DispatchEvent(['*', 'server-users'], obj, { etype: 'user', userid: deluser._id, username: deluser.name, action: 'accountremove', msg: 'Account removed', domain: domain.id });
1395 parent.debug('web', 'handleDeleteAccountRequest: removed user.');
1396 } else {
1397 parent.debug('web', 'handleDeleteAccountRequest: auth failed.');