mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-11-22 22:17:31 +03:00
Added database links cleanup code.
This commit is contained in:
parent
9514fa2536
commit
3c8a0bdc77
51
meshuser.js
51
meshuser.js
@ -504,6 +504,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
||||
if (docs == null) { docs = []; }
|
||||
var r = {};
|
||||
for (i in docs) {
|
||||
// Check device links, if a link points to an unknown user, remove it.
|
||||
parent.cleanDevice(docs[i]);
|
||||
|
||||
// Remove any connectivity and power state information, that should not be in the database anyway.
|
||||
// TODO: Find why these are sometimes saves in the db.
|
||||
if (docs[i].conn != null) { delete docs[i].conn; }
|
||||
@ -747,26 +750,36 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
||||
if (parent.parent.config.settings.maxinvalidlogin == false) {
|
||||
r = 'Bad login filter is disabled.';
|
||||
} else {
|
||||
if (typeof parent.parent.config.settings.maxinvalidlogin.coolofftime == 'number') {
|
||||
r = "Max is " + parent.parent.config.settings.maxinvalidlogin.count + " bad login(s) in " + parent.parent.config.settings.maxinvalidlogin.time + " minute(s), " + parent.parent.config.settings.maxinvalidlogin.coolofftime + " minute(s) cooloff.\r\n";
|
||||
} else {
|
||||
r = "Max is " + parent.parent.config.settings.maxinvalidlogin.count + " bad login(s) in " + parent.parent.config.settings.maxinvalidlogin.time + " minute(s).\r\n";
|
||||
}
|
||||
var badLoginCount = 0;
|
||||
parent.cleanBadLoginTable();
|
||||
for (var i in parent.badLoginTable) {
|
||||
badLoginCount++;
|
||||
if (typeof parent.badLoginTable[i] == 'number') {
|
||||
r += "Cooloff for " + Math.floor((parent.badLoginTable[i] - Date.now()) / 60000) + " minute(s)\r\n";
|
||||
if (cmdargs['_'] == 'reset') {
|
||||
// Reset bad login table
|
||||
parent.badLoginTable = {};
|
||||
parent.badLoginTableLastClean = 0;
|
||||
r = 'Done.'
|
||||
} else if (cmdargs['_'] == '') {
|
||||
// Show current bad login table
|
||||
if (typeof parent.parent.config.settings.maxinvalidlogin.coolofftime == 'number') {
|
||||
r = "Max is " + parent.parent.config.settings.maxinvalidlogin.count + " bad login(s) in " + parent.parent.config.settings.maxinvalidlogin.time + " minute(s), " + parent.parent.config.settings.maxinvalidlogin.coolofftime + " minute(s) cooloff.\r\n";
|
||||
} else {
|
||||
if (parent.badLoginTable[i].length > 1) {
|
||||
r += (i + ' - ' + parent.badLoginTable[i].length + " records\r\n");
|
||||
r = "Max is " + parent.parent.config.settings.maxinvalidlogin.count + " bad login(s) in " + parent.parent.config.settings.maxinvalidlogin.time + " minute(s).\r\n";
|
||||
}
|
||||
var badLoginCount = 0;
|
||||
parent.cleanBadLoginTable();
|
||||
for (var i in parent.badLoginTable) {
|
||||
badLoginCount++;
|
||||
if (typeof parent.badLoginTable[i] == 'number') {
|
||||
r += "Cooloff for " + Math.floor((parent.badLoginTable[i] - Date.now()) / 60000) + " minute(s)\r\n";
|
||||
} else {
|
||||
r += (i + ' - ' + parent.badLoginTable[i].length + " record\r\n");
|
||||
if (parent.badLoginTable[i].length > 1) {
|
||||
r += (i + ' - ' + parent.badLoginTable[i].length + " records\r\n");
|
||||
} else {
|
||||
r += (i + ' - ' + parent.badLoginTable[i].length + " record\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (badLoginCount == 0) { r += 'No bad logins.'; }
|
||||
} else {
|
||||
r = 'Usage: badlogin [reset]';
|
||||
}
|
||||
if (badLoginCount == 0) { r += 'No bad logins.'; }
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1305,7 +1318,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
||||
// Remove the link and save the node to the database
|
||||
delete node.links[deluser._id];
|
||||
if (Object.keys(node.links).length == 0) { delete node.links; }
|
||||
db.Set(node);
|
||||
db.Set(parent.cleanDevice(node));
|
||||
|
||||
// Event the node change
|
||||
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) }
|
||||
@ -2518,7 +2531,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
||||
// Save the device
|
||||
if (nodeChanged == true) {
|
||||
// Save the node to the database
|
||||
db.Set(node);
|
||||
db.Set(parent.cleanDevice(node));
|
||||
|
||||
// Event the node change
|
||||
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) }
|
||||
@ -2720,7 +2733,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
||||
// Perform the switch, start by saving the node with the new meshid.
|
||||
const oldMeshId = node.meshid;
|
||||
node.meshid = command.meshid;
|
||||
db.Set(node);
|
||||
db.Set(parent.cleanDevice(node));
|
||||
|
||||
// If the device is connected on this server, switch it now.
|
||||
var agentSession = parent.wsagents[node._id];
|
||||
@ -2997,7 +3010,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
||||
|
||||
if (change == 1) {
|
||||
// Save the node
|
||||
db.Set(node);
|
||||
db.Set(parent.cleanDevice(node));
|
||||
|
||||
// Event the node change. Only do this if the database will not do it.
|
||||
event.msg = 'Changed device ' + node.name + ' from group ' + mesh.name + ': ' + changes.join(', ');
|
||||
|
@ -1112,7 +1112,7 @@
|
||||
for (var i in nodes) { if (nodes[i]._id == message.event.nodeid) { index = i; break; } }
|
||||
if (index != -1) {
|
||||
var node = nodes[index];
|
||||
if (meshes[message.event.newMeshId] == null) {
|
||||
if ((meshes[message.event.newMeshId] == null) && ((userinfo.links == null) || (userinfo.links[node._id] == null))) {
|
||||
// We don't see the new mesh, remove this device
|
||||
|
||||
// TODO: Correctly disconnect from this node (Desktop/Terminal/Files...)
|
||||
@ -1764,7 +1764,7 @@
|
||||
r += '</span><span id=MxMESH style=cursor:pointer onclick=goForward("' + nodes[i].meshid + '")>' + EscapeHtml(meshes[nodes[i].meshid].name) + '</span>' + extra + '<span id=DevxHeader' + deviceHeaderId + ' style=color:lightgray></span></div>';
|
||||
current = nodes[i].meshid;
|
||||
} else {
|
||||
r += '</span><span id=MxMESH style=cursor:pointer><i>' + "Indivitual Devices" + '</i></span>' + extra + '<span id=DevxHeader' + deviceHeaderId + ' style=color:lightgray></span></div>';
|
||||
r += '</span><span id=MxMESH><i>' + "Indivitual Devices" + '</i></span><span id=DevxHeader' + deviceHeaderId + ' style=color:lightgray></span></div>';
|
||||
current = '*';
|
||||
}
|
||||
|
||||
|
@ -2465,7 +2465,7 @@
|
||||
for (var i in nodes) { if (nodes[i]._id == message.event.nodeid) { index = i; break; } }
|
||||
if (index != -1) {
|
||||
var node = nodes[index];
|
||||
if (meshes[message.event.newMeshId] == null) {
|
||||
if ((meshes[message.event.newMeshId] == null) && ((userinfo.links == null) || (userinfo.links[node._id] == null))) {
|
||||
// We don't see the new mesh, remove this device
|
||||
|
||||
// TODO: Correctly disconnect from this node (Desktop/Terminal/Files...)
|
||||
@ -2994,7 +2994,7 @@
|
||||
r += '<span id=MxMESH cmenu=meshContextMenu tabindex=0 style=cursor:pointer onclick=gotoMesh("' + node.meshid + '") onkeypress="if (event.key==\'Enter\') gotoMesh(\'' + node.meshid + '\')">' + EscapeHtml(meshes[node.meshid].name) + '</span>' + getMeshActions(mesh2, meshrights) + '</div>';
|
||||
current = node.meshid;
|
||||
} else {
|
||||
r += '<span id=MxMESH cmenu=meshContextMenu tabindex=0 style=cursor:pointer><i>' + "Indivitual Devices" + '</i></span></div>';
|
||||
r += '<span id=MxMESH><i>' + "Indivitual Devices" + '</i></span></div>';
|
||||
current = '*';
|
||||
}
|
||||
if (view == 2) { r += '</div>'; }
|
||||
|
59
webserver.js
59
webserver.js
@ -216,6 +216,8 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
|
||||
}
|
||||
|
||||
// Fetch all device groups (meshes) from the database, keep this in memory
|
||||
// As we load things in memory, we will also be doing some cleaning up.
|
||||
// We will not save any clean up in the database right now, instead it will be saved next time there is a change.
|
||||
obj.db.GetAllType('mesh', function (err, docs) {
|
||||
obj.common.unEscapeAllLinksFieldName(docs);
|
||||
for (var i in docs) { obj.meshes[docs[i]._id] = docs[i]; } // Get all meshes, including deleted ones.
|
||||
@ -223,14 +225,63 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
|
||||
// Fetch all user groups from the database, keep this in memory
|
||||
obj.db.GetAllType('ugrp', function (err, docs) {
|
||||
obj.common.unEscapeAllLinksFieldName(docs);
|
||||
for (var i in docs) { obj.userGroups[docs[i]._id] = docs[i]; } // Get all user groups
|
||||
|
||||
// We loaded the users, device groups and suer group state, start the server
|
||||
// Perform user group link cleanup
|
||||
for (var i in docs) {
|
||||
const ugrp = docs[i];
|
||||
if (ugrp.links != null) {
|
||||
for (var j in ugrp.links) {
|
||||
if (j.startsWith('user/') && (obj.users[j] == null)) { delete ugrp.links[j]; } // User group has a link to a user that does not exist
|
||||
else if (j.startsWith('mesh/') && ((obj.meshes[j] == null) || (obj.meshes[j].deleted != null))) { delete ugrp.links[j]; } // User has a link to a device group that does not exist
|
||||
}
|
||||
}
|
||||
obj.userGroups[docs[i]._id] = docs[i]; // Get all user groups
|
||||
}
|
||||
|
||||
// Perform device group link cleanup
|
||||
for (var i in obj.meshes) {
|
||||
const mesh = obj.meshes[i];
|
||||
if (mesh.links != null) {
|
||||
for (var j in mesh.links) {
|
||||
if (j.startsWith('ugrp/') && (obj.userGroups[j] == null)) { delete mesh.links[j]; } // Device group has a link to a user group that does not exist
|
||||
else if (j.startsWith('user/') && (obj.users[j] == null)) { delete mesh.links[j]; } // Device group has a link to a user that does not exist
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Perform user link cleanup
|
||||
for (var i in obj.users) {
|
||||
const user = obj.users[i];
|
||||
if (user.links != null) {
|
||||
for (var j in user.links) {
|
||||
if (j.startsWith('ugrp/') && (obj.userGroups[j] == null)) { delete user.links[j]; } // User has a link to a user group that does not exist
|
||||
else if (j.startsWith('mesh/') && ((obj.meshes[j] == null) || (obj.meshes[j].deleted != null))) { delete user.links[j]; } // User has a link to a device group that does not exist
|
||||
//else if (j.startsWith('node/') && (obj.nodes[j] == null)) { delete user.links[j]; } // TODO
|
||||
}
|
||||
//if (Object.keys(user.links).length == 0) { delete user.links; }
|
||||
}
|
||||
}
|
||||
|
||||
// We loaded the users, device groups and user group state, start the server
|
||||
serverStart();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Clean up a device, used before saving it in the database
|
||||
obj.cleanDevice = function (device) {
|
||||
// Check device links, if a link points to an unknown user, remove it.
|
||||
if (device.links != null) {
|
||||
for (var j in device.links) {
|
||||
if (obj.users[j] == null) {
|
||||
delete device.links[j];
|
||||
if (Object.keys(device.links).length == 0) { delete device.links; }
|
||||
}
|
||||
}
|
||||
}
|
||||
return device;
|
||||
}
|
||||
|
||||
// Return statistics about this web server
|
||||
obj.getStats = function () {
|
||||
return {
|
||||
@ -1372,7 +1423,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
|
||||
// Remove the link and save the node to the database
|
||||
delete node.links[deluser._id];
|
||||
if (Object.keys(node.links).length == 0) { delete node.links; }
|
||||
db.Set(node);
|
||||
db.Set(obj.cleanDevice(node));
|
||||
|
||||
// Event the node change
|
||||
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) }
|
||||
@ -3081,7 +3132,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
|
||||
// Update the database
|
||||
var oldname = node.host;
|
||||
node.host = amthost;
|
||||
obj.db.Set(node);
|
||||
obj.db.Set(obj.cleanDevice(node));
|
||||
|
||||
// Event the node change
|
||||
var event = { etype: 'node', action: 'changenode', nodeid: node._id, domain: domain.id, msg: 'Intel(R) AMT host change ' + node.name + ' from group ' + mesh.name + ': ' + oldname + ' to ' + amthost };
|
||||
|
Loading…
Reference in New Issue
Block a user