Added checks to catch MongoDB . in key exception.

Ylian Saint-Hilaire committed Oct 10, 2019 at 13:46 UTC 483f270a23c96cb44ab85185e38b2ddc37539dbe
2 files changed +77 -15
db.js
+76 -14
@@ -607,10 +607,20 @@ module.exports.CreateDB = function (parent, func) {
607 setupFunctions(func); // Completed setup of NeDB
608 }
609
610 + // Check the object names for a "."
611 + function checkObjectNames(r) {
612 + if (typeof r != 'object') return;
613 + for (var i in r) {
614 + if (i.indexOf('.') >= 0) { throw('BadDbName: ' + JSON.stringify(r)); }
615 + checkObjectNames(r[i]);
616 + }
617 + }
618 +
619 function setupFunctions(func) {
620 if (obj.databaseType == 3) {
621 // Database actions on the main collection (MongoDB)
622 obj.Set = function (data, func) {
623 + checkObjectNames(data); // DEBUG CHECKING
624 obj.file.replaceOne({ _id: data._id }, performTypedRecordEncrypt(data), { upsert: true }, func);
625 };
626 obj.Get = function (id, func) {
@@ -640,11 +650,25 @@ module.exports.CreateDB = function (parent, func) {
650 obj.Remove = function (id) { obj.file.deleteOne({ _id: id }); };
651 obj.RemoveAll = function (func) { obj.file.deleteMany({}, { multi: true }, func); };
652 obj.RemoveAllOfType = function (type, func) { obj.file.deleteMany({ type: type }, { multi: true }, func); };
643 - obj.InsertMany = function (data, func) { obj.file.insertMany(data, func); };
653 + obj.InsertMany = function (data, func) {
654 + checkObjectNames(data); // DEBUG CHECKING
655 + obj.file.insertMany(data, func);
656 + };
657 obj.RemoveMeshDocuments = function (id) { obj.file.deleteMany({ meshid: id }, { multi: true }); obj.file.deleteOne({ _id: 'nt' + id }); };
645 - obj.MakeSiteAdmin = function (username, domain) { obj.Get('user/' + domain + '/' + username, function (err, docs) { if (docs.length == 1) { docs[0].siteadmin = 0xFFFFFFFF; obj.Set(docs[0]); } }); };
658 + obj.MakeSiteAdmin = function (username, domain) {
659 + obj.Get('user/' + domain + '/' + username, function (err, docs) {
660 + if (docs.length == 1) {
661 + checkObjectNames(docs[0]); // DEBUG CHECKING
662 + docs[0].siteadmin = 0xFFFFFFFF; obj.Set(docs[0]);
663 + }
664 + });
665 + };
666 obj.DeleteDomain = function (domain, func) { obj.file.deleteMany({ domain: domain }, { multi: true }, func); };
647 - obj.SetUser = function (user) { var u = Clone(user); if (u.subscriptions) { delete u.subscriptions; } obj.Set(u); };
667 + obj.SetUser = function (user) {
668 + checkObjectNames(user); // DEBUG CHECKING
669 + var u = Clone(user);
670 + if (u.subscriptions) { delete u.subscriptions; } obj.Set(u);
671 + };
672 obj.dispose = function () { for (var x in obj) { if (obj[x].close) { obj[x].close(); } delete obj[x]; } };
673 obj.getLocalAmtNodes = function (func) { obj.file.find({ type: 'node', host: { $exists: true, $ne: null }, intelamt: { $exists: true } }).toArray(func); };
674 obj.getAmtUuidNode = function (meshid, uuid, func) { obj.file.find({ type: 'node', meshid: meshid, 'intelamt.uuid': uuid }).toArray(func); };
@@ -656,7 +680,10 @@ module.exports.CreateDB = function (parent, func) {
680
681 // Database actions on the events collection
682 obj.GetAllEvents = function (func) { obj.eventsfile.find({}).toArray(func); };
659 - obj.StoreEvent = function (event) { obj.eventsfile.insertOne(event); };
683 + obj.StoreEvent = function (event) {
684 + checkObjectNames(event); // DEBUG CHECKING
685 + obj.eventsfile.insertOne(event);
686 + };
687 obj.GetEvents = function (ids, domain, func) { obj.eventsfile.find({ domain: domain, ids: { $in: ids } }).project({ type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: -1 }).toArray(func); };
688 obj.GetEventsWithLimit = function (ids, domain, limit, func) { obj.eventsfile.find({ domain: domain, ids: { $in: ids } }).project({ type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: -1 }).limit(limit).toArray(func); };
689 obj.GetUserEvents = function (ids, domain, username, func) { obj.eventsfile.find({ domain: domain, $or: [{ ids: { $in: ids } }, { username: username }] }).project({ type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: -1 }).toArray(func); };
@@ -668,18 +695,27 @@ module.exports.CreateDB = function (parent, func) {
695
696 // Database actions on the power collection
697 obj.getAllPower = function (func) { obj.powerfile.find({}).toArray(func); };
671 - obj.storePowerEvent = function (event, multiServer, func) { if (multiServer != null) { event.server = multiServer.serverid; } obj.powerfile.insertOne(event, func); };
698 + obj.storePowerEvent = function (event, multiServer, func) {
699 + checkObjectNames(event); // DEBUG CHECKING
700 + if (multiServer != null) { event.server = multiServer.serverid; } obj.powerfile.insertOne(event, func);
701 + };
702 obj.getPowerTimeline = function (nodeid, func) { obj.powerfile.find({ nodeid: { $in: ['*', nodeid] } }).project({ _id: 0, nodeid: 0, s: 0 }).sort({ time: 1 }).toArray(func); };
703 obj.removeAllPowerEvents = function () { obj.powerfile.deleteMany({}, { multi: true }); };
704 obj.removeAllPowerEventsForNode = function (nodeid) { obj.powerfile.deleteMany({ nodeid: nodeid }, { multi: true }); };
705
706 // Database actions on the SMBIOS collection
677 - obj.SetSMBIOS = function (smbios, func) { obj.smbiosfile.updateOne({ _id: smbios._id }, { $set: smbios }, { upsert: true }, func); };
707 + obj.SetSMBIOS = function (smbios, func) {
708 + checkObjectNames(smbios); // DEBUG CHECKING
709 + obj.smbiosfile.updateOne({ _id: smbios._id }, { $set: smbios }, { upsert: true }, func);
710 + };
711 obj.RemoveSMBIOS = function (id) { obj.smbiosfile.deleteOne({ _id: id }); };
712 obj.GetSMBIOS = function (id, func) { obj.smbiosfile.find({ _id: id }).toArray(func); };
713
714 // Database actions on the Server Stats collection
682 - obj.SetServerStats = function (data, func) { obj.serverstatsfile.insertOne(data, func); };
715 + obj.SetServerStats = function (data, func) {
716 + checkObjectNames(data); // DEBUG CHECKING
717 + obj.serverstatsfile.insertOne(data, func);
718 + };
719 obj.GetServerStats = function (hours, func) { var t = new Date(); t.setTime(t.getTime() - (60 * 60 * 1000 * hours)); obj.serverstatsfile.find({ time: { $gt: t } }, { _id: 0, cpu: 0 }).toArray(func); };
720
721 // Read a configuration file from the database
@@ -706,7 +742,11 @@ module.exports.CreateDB = function (parent, func) {
742 }
743 } else {
744 // Database actions on the main collection (NeDB and MongoJS)
709 - obj.Set = function (data, func) { var xdata = performTypedRecordEncrypt(data); obj.file.update({ _id: xdata._id }, xdata, { upsert: true }, func); };
745 + obj.Set = function (data, func) {
746 + checkObjectNames(data); // DEBUG CHECKING
747 + var xdata = performTypedRecordEncrypt(data);
748 + obj.file.update({ _id: xdata._id }, xdata, { upsert: true }, func);
749 + };
750 obj.Get = function (id, func) {
751 if (arguments.length > 2) {
752 var parms = [func];
@@ -734,11 +774,24 @@ module.exports.CreateDB = function (parent, func) {
774 obj.Remove = function (id) { obj.file.remove({ _id: id }); };
775 obj.RemoveAll = function (func) { obj.file.remove({}, { multi: true }, func); };
776 obj.RemoveAllOfType = function (type, func) { obj.file.remove({ type: type }, { multi: true }, func); };
737 - obj.InsertMany = function (data, func) { obj.file.insert(data, func); };
777 + obj.InsertMany = function (data, func) {
778 + checkObjectNames(data); // DEBUG CHECKING
779 + obj.file.insert(data, func);
780 + };
781 obj.RemoveMeshDocuments = function (id) { obj.file.remove({ meshid: id }, { multi: true }); obj.file.remove({ _id: 'nt' + id }); };
739 - obj.MakeSiteAdmin = function (username, domain) { obj.Get('user/' + domain + '/' + username, function (err, docs) { if (docs.length == 1) { docs[0].siteadmin = 0xFFFFFFFF; obj.Set(docs[0]); } }); };
782 + obj.MakeSiteAdmin = function (username, domain) {
783 + obj.Get('user/' + domain + '/' + username, function (err, docs) {
784 + if (docs.length == 1) {
785 + checkObjectNames(docs[0]); // DEBUG CHECKING
786 + docs[0].siteadmin = 0xFFFFFFFF; obj.Set(docs[0]);
787 + }
788 + });
789 + };
790 obj.DeleteDomain = function (domain, func) { obj.file.remove({ domain: domain }, { multi: true }, func); };
741 - obj.SetUser = function (user) { var u = Clone(user); if (u.subscriptions) { delete u.subscriptions; } obj.Set(u); };
791 + obj.SetUser = function (user) {
792 + checkObjectNames(user); // DEBUG CHECKING
793 + var u = Clone(user); if (u.subscriptions) { delete u.subscriptions; } obj.Set(u);
794 + };
795 obj.dispose = function () { for (var x in obj) { if (obj[x].close) { obj[x].close(); } delete obj[x]; } };
796 obj.getLocalAmtNodes = function (func) { obj.file.find({ type: 'node', host: { $exists: true, $ne: null }, intelamt: { $exists: true } }, func); };
797 obj.getAmtUuidNode = function (meshid, uuid, func) { obj.file.find({ type: 'node', meshid: meshid, 'intelamt.uuid': uuid }, func); };
@@ -746,7 +799,10 @@ module.exports.CreateDB = function (parent, func) {
799
800 // Database actions on the events collection
801 obj.GetAllEvents = function (func) { obj.eventsfile.find({}, func); };
749 - obj.StoreEvent = function (event) { obj.eventsfile.insert(event); };
802 + obj.StoreEvent = function (event) {
803 + checkObjectNames(event); // DEBUG CHECKING
804 + obj.eventsfile.insert(event);
805 + };
806 obj.GetEvents = function (ids, domain, func) { if (obj.databaseType == 1) { obj.eventsfile.find({ domain: domain, ids: { $in: ids } }, { _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: -1 }).exec(func); } else { obj.eventsfile.find({ domain: domain, ids: { $in: ids } }, { type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: -1 }, func); } };
807 obj.GetEventsWithLimit = function (ids, domain, limit, func) { if (obj.databaseType == 1) { obj.eventsfile.find({ domain: domain, ids: { $in: ids } }, { _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: -1 }).limit(limit).exec(func); } else { obj.eventsfile.find({ domain: domain, ids: { $in: ids } }, { type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: -1 }).limit(limit, func); } };
808 obj.GetUserEvents = function (ids, domain, username, func) {
@@ -770,7 +826,10 @@ module.exports.CreateDB = function (parent, func) {
826
827 // Database actions on the power collection
828 obj.getAllPower = function (func) { obj.powerfile.find({}, func); };
773 - obj.storePowerEvent = function (event, multiServer, func) { if (multiServer != null) { event.server = multiServer.serverid; } obj.powerfile.insert(event, func); };
829 + obj.storePowerEvent = function (event, multiServer, func) {
830 + checkObjectNames(event); // DEBUG CHECKING
831 + if (multiServer != null) { event.server = multiServer.serverid; } obj.powerfile.insert(event, func);
832 + };
833 obj.getPowerTimeline = function (nodeid, func) { if (obj.databaseType == 1) { obj.powerfile.find({ nodeid: { $in: ['*', nodeid] } }, { _id: 0, nodeid: 0, s: 0 }).sort({ time: 1 }).exec(func); } else { obj.powerfile.find({ nodeid: { $in: ['*', nodeid] } }, { _id: 0, nodeid: 0, s: 0 }).sort({ time: 1 }, func); } };
834 obj.removeAllPowerEvents = function () { obj.powerfile.remove({}, { multi: true }); };
835 obj.removeAllPowerEventsForNode = function (nodeid) { obj.powerfile.remove({ nodeid: nodeid }, { multi: true }); };
@@ -781,7 +840,10 @@ module.exports.CreateDB = function (parent, func) {
840 obj.GetSMBIOS = function (id, func) { obj.smbiosfile.find({ _id: id }, func); };
841
842 // Database actions on the Server Stats collection
784 - obj.SetServerStats = function (data, func) { obj.serverstatsfile.insert(data, func); };
843 + obj.SetServerStats = function (data, func) {
844 + checkObjectNames(data); // DEBUG CHECKING
845 + obj.serverstatsfile.insert(data, func);
846 + };
847 obj.GetServerStats = function (hours, func) { var t = new Date(); t.setTime(t.getTime() - (60 * 60 * 1000 * hours)); obj.serverstatsfile.find({ time: { $gt: t } }, { _id: 0, cpu: 0 }, func); };
848
849 // Read a configuration file from the database
package.json
+1 -1
@@ -1,6 +1,6 @@
1 {
2 "name": "meshcentral",
3 - "version": "0.4.2-a",
3 + "version": "0.4.2-b",
4 "keywords": [
5 "Remote Management",
6 "Intel AMT",