Improved MongoDB indexes.
Ylian Saint-Hilaire committed
Jan 10, 2022 at 12:25 UTC
f8e9426350e5cb04e145210cced618b8e387608d
3 files changed
+14
-13
db.js
+9
-9
@@ -784,12 +784,11 @@ module.exports.CreateDB = function (parent, func) {
784
// Check if we need to reset indexes
785
var indexesByName = {}, indexCount = 0;
786
for (var i in indexes) { indexesByName[indexes[i].name] = indexes[i]; indexCount++; }
787
- if ((indexCount != 6) || (indexesByName['UsernameAction1'] == null) || (indexesByName['UserIdAction1'] == null) || (indexesByName['DomainNodeTime1'] == null) || (indexesByName['IdsAndTime1'] == null) || (indexesByName['ExpireTime1'] == null)) {
787
+ if ((indexCount != 5) || (indexesByName['UsernameAction1'] == null) || (indexesByName['DomainNodeTime1'] == null) || (indexesByName['IdsAndTime1'] == null) || (indexesByName['ExpireTime1'] == null)) {
788
// Reset all indexes
789
console.log("Resetting events indexes...");
790
obj.eventsfile.dropIndexes(function (err) {
791
obj.eventsfile.createIndex({ username: 1, action: 1 }, { sparse: 1, name: 'UsernameAction1' });
792
- obj.eventsfile.createIndex({ userid: 1, action: 1 }, { sparse: 1, name: 'UserIdAction1' });
792
obj.eventsfile.createIndex({ domain: 1, nodeid: 1, time: -1 }, { sparse: 1, name: 'DomainNodeTime1' });
793
obj.eventsfile.createIndex({ ids: 1, time: -1 }, { sparse: 1, name: 'IdsAndTime1' });
794
obj.eventsfile.createIndex({ time: 1 }, { expireAfterSeconds: expireEventsSeconds, name: 'ExpireTime1' });
@@ -873,12 +872,13 @@ module.exports.CreateDB = function (parent, func) {
872
// Check if we need to reset indexes
873
var indexesByName = {}, indexCount = 0;
874
for (var i in indexes) { indexesByName[indexes[i].name] = indexes[i]; indexCount++; }
876
- if ((indexCount != 4) || (indexesByName['TypeDomainMesh1'] == null) || (indexesByName['Email1'] == null) || (indexesByName['Mesh1'] == null)) {
875
+ if ((indexCount != 5) || (indexesByName['TypeDomainMesh1'] == null) || (indexesByName['Email1'] == null) || (indexesByName['Mesh1'] == null) || (indexesByName['AmtUuid1'] == null)) {
876
console.log("Resetting main indexes...");
877
obj.file.dropIndexes(function (err) {
878
obj.file.createIndex({ type: 1, domain: 1, meshid: 1 }, { sparse: 1, name: 'TypeDomainMesh1' }); // Speeds up GetAllTypeNoTypeField() and GetAllTypeNoTypeFieldMeshFiltered()
879
obj.file.createIndex({ email: 1 }, { sparse: 1, name: 'Email1' }); // Speeds up GetUserWithEmail() and GetUserWithVerifiedEmail()
880
obj.file.createIndex({ meshid: 1 }, { sparse: 1, name: 'Mesh1' }); // Speeds up RemoveMesh()
881
+ obj.file.createIndex({ 'intelamt.uuid': 1 }, { sparse: 1, name: 'AmtUuid1' }); // Speeds up getAmtUuidMeshNode()
882
});
883
}
884
});
@@ -889,11 +889,11 @@ module.exports.CreateDB = function (parent, func) {
889
// Check if we need to reset indexes
890
var indexesByName = {}, indexCount = 0;
891
for (var i in indexes) { indexesByName[indexes[i].name] = indexes[i]; indexCount++; }
892
- if ((indexCount != 5) || (indexesByName['Username1'] == null) || (indexesByName['DomainNodeTime1'] == null) || (indexesByName['IdsAndTime1'] == null) || (indexesByName['ExpireTime1'] == null)) {
892
+ if ((indexCount != 5) || (indexesByName['UsernameAction1'] == null) || (indexesByName['DomainNodeTime1'] == null) || (indexesByName['IdsAndTime1'] == null) || (indexesByName['ExpireTime1'] == null)) {
893
// Reset all indexes
894
console.log("Resetting events indexes...");
895
obj.eventsfile.dropIndexes(function (err) {
896
- obj.eventsfile.createIndex({ username: 1 }, { sparse: 1, name: 'Username1' });
896
+ obj.eventsfile.createIndex({ username: 1, action: 1 }, { sparse: 1, name: 'UsernameAction1' });
897
obj.eventsfile.createIndex({ domain: 1, nodeid: 1, time: -1 }, { sparse: 1, name: 'DomainNodeTime1' });
898
obj.eventsfile.createIndex({ ids: 1, time: -1 }, { sparse: 1, name: 'IdsAndTime1' });
899
obj.eventsfile.createIndex({ time: 1 }, { expireAfterSeconds: expireEventsSeconds, name: 'ExpireTime1' });
@@ -1638,7 +1638,7 @@ module.exports.CreateDB = function (parent, func) {
1638
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); };
1639
obj.GetUserEventsWithLimit = function (ids, domain, username, limit, 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 }).limit(limit).toArray(func); };
1640
obj.GetEventsTimeRange = function (ids, domain, msgids, start, end, func) { obj.eventsfile.find({ domain: domain, $or: [{ ids: { $in: ids } }], msgid: { $in: msgids }, time: { $gte: start, $lte: end } }).project({ type: 0, _id: 0, domain: 0, node: 0 }).sort({ time: 1 }).toArray(func); };
1641
- obj.GetUserLoginEvents = function (domain, userid, func) { obj.eventsfile.find({ domain: domain, action: { $in: ['authfail', 'login'] }, userid: userid, msgArgs: { $exists: true } }).project({ action: 1, time: 1, msgid: 1, msgArgs: 1, tokenName: 1 }).sort({ time: -1 }).toArray(func); };
1641
+ obj.GetUserLoginEvents = function (domain, username, func) { obj.eventsfile.find({ domain: domain, action: { $in: ['authfail', 'login'] }, username: username, msgArgs: { $exists: true } }).project({ action: 1, time: 1, msgid: 1, msgArgs: 1, tokenName: 1 }).sort({ time: -1 }).toArray(func); };
1642
obj.GetNodeEventsWithLimit = function (nodeid, domain, limit, func) { obj.eventsfile.find({ domain: domain, nodeid: nodeid }).project({ type: 0, etype: 0, _id: 0, domain: 0, ids: 0, node: 0, nodeid: 0 }).sort({ time: -1 }).limit(limit).toArray(func); };
1643
obj.GetNodeEventsSelfWithLimit = function (nodeid, domain, userid, limit, func) { obj.eventsfile.find({ domain: domain, nodeid: nodeid, userid: { $in: [userid, null] } }).project({ type: 0, etype: 0, _id: 0, domain: 0, ids: 0, node: 0, nodeid: 0 }).sort({ time: -1 }).limit(limit).toArray(func); };
1644
obj.RemoveAllEvents = function (domain) { obj.eventsfile.deleteMany({ domain: domain }, { multi: true }); };
@@ -1831,11 +1831,11 @@ module.exports.CreateDB = function (parent, func) {
1831
obj.eventsfile.find({ domain: domain, $or: [{ ids: { $in: ids } }], msgid: { $in: msgids }, time: { $gte: start, $lte: end } }, { type: 0, _id: 0, domain: 0, node: 0 }).sort({ time: 1 }, func);
1832
}
1833
};
1834
- obj.GetUserLoginEvents = function (domain, userid, func) {
1834
+ obj.GetUserLoginEvents = function (domain, username, func) {
1835
if (obj.databaseType == 1) {
1836
- obj.eventsfile.find({ domain: domain, action: { $in: ['authfail', 'login'] }, userid: userid, msgArgs: { $exists: true } }, { action: 1, time: 1, msgid: 1, msgArgs: 1, tokenName: 1 }).sort({ time: -1 }).exec(func);
1836
+ obj.eventsfile.find({ domain: domain, action: { $in: ['authfail', 'login'] }, username: username, msgArgs: { $exists: true } }, { action: 1, time: 1, msgid: 1, msgArgs: 1, tokenName: 1 }).sort({ time: -1 }).exec(func);
1837
} else {
1838
- obj.eventsfile.find({ domain: domain, action: { $in: ['authfail', 'login'] }, userid: userid, msgArgs: { $exists: true } }, { action: 1, time: 1, msgid: 1, msgArgs: 1, tokenName: 1 }).sort({ time: -1 }, func);
1838
+ obj.eventsfile.find({ domain: domain, action: { $in: ['authfail', 'login'] }, username: username, msgArgs: { $exists: true } }, { action: 1, time: 1, msgid: 1, msgArgs: 1, tokenName: 1 }).sort({ time: -1 }, func);
1839
}
1840
};
1841
obj.GetNodeEventsWithLimit = function (nodeid, domain, limit, func) { if (obj.databaseType == 1) { obj.eventsfile.find({ domain: domain, nodeid: nodeid }, { type: 0, etype: 0, _id: 0, domain: 0, ids: 0, node: 0, nodeid: 0 }).sort({ time: -1 }).limit(limit).exec(func); } else { obj.eventsfile.find({ domain: domain, nodeid: nodeid }, { type: 0, etype: 0, _id: 0, domain: 0, ids: 0, node: 0, nodeid: 0 }).sort({ time: -1 }).limit(limit, func); } };
meshuser.js
+4
-3
@@ -4327,10 +4327,11 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
4327
case 'previousLogins': {
4328
// TODO: Make a better database call to get filtered data.
4329
if (command.userid == null) {
4330
+ var splitUser = user._id.split('/');
4331
// Get previous logins for self
4332
if (db.GetUserLoginEvents) {
4333
// New way
4333
- db.GetUserLoginEvents(domain.id, user._id, function (err, docs) {
4334
+ db.GetUserLoginEvents(domain.id, splitUser[2], function (err, docs) {
4335
if (err != null) return;
4336
var e = [];
4337
for (var i in docs) { e.push({ t: docs[i].time, m: docs[i].msgid, a: docs[i].msgArgs, tn: docs[i].tokenName }); }
@@ -4338,7 +4339,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
4339
});
4340
} else {
4341
// Old way
4341
- db.GetUserEvents([user._id], domain.id, user._id.split('/')[2], function (err, docs) {
4342
+ db.GetUserEvents([user._id], domain.id, splitUser[2], function (err, docs) {
4343
if (err != null) return;
4344
var e = [];
4345
for (var i in docs) {
@@ -4356,7 +4357,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
4357
if ((obj.crossDomain === true) || (splitUser[1] === domain.id)) {
4358
if (db.GetUserLoginEvents) {
4359
// New way
4359
- db.GetUserLoginEvents(splitUser[1], command.userid, function (err, docs) {
4360
+ db.GetUserLoginEvents(splitUser[1], splitUser[2], function (err, docs) {
4361
if (err != null) return;
4362
var e = [];
4363
for (var i in docs) { e.push({ t: docs[i].time, m: docs[i].msgid, a: docs[i].msgArgs }); }
webserver.js
+1
-1
@@ -6361,7 +6361,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
6361
if ((domain == null) || (domain.auth == 'sspi')) { res.sendStatus(404); return; }
6362
if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL
6363
const cspNonce = obj.crypto.randomBytes(15).toString('base64');
6364
- res.set({ 'Content-Security-Policy': "default-src 'none'; script-src 'self' 'nonce-" + cspNonce + "'; img-src 'self'; style-src 'self' 'nonce-" + cspNonce + "';" });
6364
+ res.set({ 'Content-Security-Policy': "default-src 'none'; script-src 'self' 'nonce-" + cspNonce + "'; img-src 'self'; style-src 'self' 'nonce-" + cspNonce + "';" }); // This page supports very tight CSP policy
6365
res.status(404).render(getRenderPage((domain.sitestyle == 2) ? 'error4042' : 'error404', req, domain), getRenderArgs({ cspNonce: cspNonce }, req, domain));
6366
});
6367
}