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.');