modlog records for non-delete actions now link to posts closes #193

merge-requests/208/head
Thomas Lynch 4 years ago
parent c2c29f1ce1
commit 1f7e670c7c
  1. 7
      gulpfile.js
  2. 8
      helpers/addmodlogs.js
  3. 1
      migrations/index.js
  4. 35
      migrations/migration-0.0.10.js
  5. 9
      models/forms/actionhandler.js
  6. 3
      models/forms/addban.js
  7. 6
      models/forms/editpost.js
  8. 51
      package-lock.json
  9. 3
      package.json
  10. 10
      views/pages/globalmanagelogs.pug
  11. 10
      views/pages/managelogs.pug
  12. 10
      views/pages/modlog.pug

@ -2,6 +2,7 @@
const gulp = require('gulp') const gulp = require('gulp')
, fs = require('fs-extra') , fs = require('fs-extra')
, semver = require('semver')
, formatSize = require(__dirname+'/helpers/files/formatsize.js') , formatSize = require(__dirname+'/helpers/files/formatsize.js')
, uploadDirectory = require(__dirname+'/helpers/files/uploadDirectory.js') , uploadDirectory = require(__dirname+'/helpers/files/uploadDirectory.js')
, configs = require(__dirname+'/configs/main.js') , configs = require(__dirname+'/configs/main.js')
@ -251,10 +252,12 @@ async function migrate() {
'_id': 'version' '_id': 'version'
}).then(res => res ? res.version : '0.0.0'); // 0.0.0 for old versions }).then(res => res ? res.version : '0.0.0'); // 0.0.0 for old versions
if (currentVersion < migrateVersion) { if (semver.lt(currentVersion, migrateVersion)) {
console.log(`Current version: ${currentVersion}`); console.log(`Current version: ${currentVersion}`);
const migrations = require(__dirname+'/migrations/'); const migrations = require(__dirname+'/migrations/');
const migrationVersions = Object.keys(migrations).sort().filter(v => v > currentVersion); const migrationVersions = Object.keys(migrations)
.sort(semver.compare)
.filter(v => semver.gt(v, currentVersion));
console.log(`Migrations needed: ${currentVersion} -> ${migrationVersions.join(' -> ')}`); console.log(`Migrations needed: ${currentVersion} -> ${migrationVersions.join(' -> ')}`);
for (let ver of migrationVersions) { for (let ver of migrationVersions) {
console.log(`=====\nStarting migration to version ${ver}`); console.log(`=====\nStarting migration to version ${ver}`);

@ -16,7 +16,8 @@
if (!modlog[post.board]) { if (!modlog[post.board]) {
//per board actions, all actions combined to one event //per board actions, all actions combined to one event
modlog[post.board] = { modlog[post.board] = {
postIds: [], showLinks:
postLinks: [],
actions: modlogActions, actions: modlogActions,
date: logDate, date: logDate,
showUser: !req.body.hide_name || logUser === 'Unregistered User' ? true : false, showUser: !req.body.hide_name || logUser === 'Unregistered User' ? true : false,
@ -29,7 +30,10 @@
}; };
} }
//push each post id //push each post id
modlog[post.board].postIds.push(post.postId); modlog[post.board].postLinks.push({
postId: post.postId,
thread: req.body.move ? req.body.move_to_thread : post.thread,
})
} }
const modlogDocuments = []; const modlogDocuments = [];
for (let i = 0; i < threadBoards.length; i++) { for (let i = 0; i < threadBoards.length; i++) {

@ -10,4 +10,5 @@ module.exports = {
'0.0.7': require(__dirname+'/migration-0.0.7.js'), //sage only email without force anon for some reason '0.0.7': require(__dirname+'/migration-0.0.7.js'), //sage only email without force anon for some reason
'0.0.8': require(__dirname+'/migration-0.0.8.js'), //option to auto reset triggers after hour is over '0.0.8': require(__dirname+'/migration-0.0.8.js'), //option to auto reset triggers after hour is over
'0.0.9': require(__dirname+'/migration-0.0.9.js'), //ip changes '0.0.9': require(__dirname+'/migration-0.0.9.js'), //ip changes
'0.0.10': require(__dirname+'/migration-0.0.10.js'), //add links to modlog for new logs
} }

@ -0,0 +1,35 @@
'use strict';
const hashIp = require(__dirname+'/../helpers/haship.js');
module.exports = async(db, redis) => {
console.log('update moglog postids to postlinks');
await db.collection('modlog').updateMany({},
[{
$addFields: {
postLinks: [
{
$arrayToObject: {
$map: {
input: "$postIds",
as: 'postId',
in: {
k: 'postId',
v: '$$postId'
}
}
}
}
]
}
}
]);
await db.collection('modlog').updateMany({}, {
'$unset': {
'postIds': ''
},
'$set': {
'showLinks': false
}
});
};

@ -286,7 +286,8 @@ module.exports = async (req, res, next) => {
if (!modlog[post.board]) { if (!modlog[post.board]) {
//per board actions, all actions combined to one event //per board actions, all actions combined to one event
modlog[post.board] = { modlog[post.board] = {
postIds: [], showLinks: !deleting,
postLinks: [],
actions: modlogActions, actions: modlogActions,
date: logDate, date: logDate,
showUser: !req.body.hide_name || logUser === 'Unregistered User' ? true : false, showUser: !req.body.hide_name || logUser === 'Unregistered User' ? true : false,
@ -298,8 +299,10 @@ module.exports = async (req, res, next) => {
} }
}; };
} }
//push each post id modlog[post.board].postLinks.push({
modlog[post.board].postIds.push(post.postId); postId: post.postId,
thread: req.body.move ? req.body.move_to_thread : post.thread,
});
} }
const modlogDocuments = []; const modlogDocuments = [];
for (let i = 0; i < threadBoards.length; i++) { for (let i = 0; i < threadBoards.length; i++) {

@ -31,7 +31,8 @@ module.exports = async (req, res, redirect) => {
const modlogPromise = Modlogs.insertOne({ const modlogPromise = Modlogs.insertOne({
'board': req.params.board || null, 'board': req.params.board || null,
'postIds': [], 'showLinks': false,
'postLinks': [],
'actions': [(req.params.board ? 'Ban' : 'Global Ban')], 'actions': [(req.params.board ? 'Ban' : 'Global Ban')],
'date': actionDate, 'date': actionDate,
'showUser': !req.body.hide_name || res.locals.permLevel >= 4 ? true : false, 'showUser': !req.body.hide_name || res.locals.permLevel >= 4 ? true : false,

@ -139,7 +139,11 @@ todo: handle some more situations
//add the edit to the modlog //add the edit to the modlog
await Modlogs.insertOne({ await Modlogs.insertOne({
board: board._id, board: board._id,
postIds: [post.postId], showLinks: true,
postLinks: [{
postId: post.postId,
thread: post.thread,
}],
actions: 'Edit', actions: 'Edit',
date: new Date(), date: new Date(),
showUser: req.body.hide_name ? false : true, showUser: req.body.hide_name ? false : true,

51
package-lock.json generated

@ -57,6 +57,13 @@
"semver": "^5.5.0", "semver": "^5.5.0",
"shimmer": "^1.2.0", "shimmer": "^1.2.0",
"uuid": "^3.2.1" "uuid": "^3.2.1"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
} }
}, },
"@opencensus/propagation-b3": { "@opencensus/propagation-b3": {
@ -78,6 +85,13 @@
"semver": "^5.5.0", "semver": "^5.5.0",
"shimmer": "^1.2.0", "shimmer": "^1.2.0",
"uuid": "^3.2.1" "uuid": "^3.2.1"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
} }
} }
} }
@ -422,6 +436,13 @@
"semver": "^5.3.0", "semver": "^5.3.0",
"uglify-js": "^2.8.22", "uglify-js": "^2.8.22",
"when": "^3.7.8" "when": "^3.7.8"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
} }
}, },
"acorn": { "acorn": {
@ -820,6 +841,13 @@
"requires": { "requires": {
"semver": "^5.3.0", "semver": "^5.3.0",
"shimmer": "^1.1.0" "shimmer": "^1.1.0"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
} }
}, },
"async-settle": { "async-settle": {
@ -5181,6 +5209,11 @@
"iconv-lite": "^0.4.4", "iconv-lite": "^0.4.4",
"sax": "^1.2.4" "sax": "^1.2.4"
} }
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
} }
} }
}, },
@ -5211,6 +5244,11 @@
"requires": { "requires": {
"path-parse": "^1.0.6" "path-parse": "^1.0.6"
} }
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
} }
} }
}, },
@ -6672,6 +6710,13 @@
"requires": { "requires": {
"resolve-from": "^2.0.0", "resolve-from": "^2.0.0",
"semver": "^5.1.0" "semver": "^5.1.0"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
} }
}, },
"resolve": { "resolve": {
@ -6793,9 +6838,9 @@
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
}, },
"semver": { "semver": {
"version": "5.5.1", "version": "7.3.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
"integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
}, },
"semver-greatest-satisfied-range": { "semver-greatest-satisfied-range": {
"version": "1.1.0", "version": "1.1.0",

@ -1,7 +1,7 @@
{ {
"name": "jschan", "name": "jschan",
"version": "0.0.1", "version": "0.0.1",
"migrateVersion": "0.0.9", "migrateVersion": "0.0.10",
"description": "", "description": "",
"main": "server.js", "main": "server.js",
"dependencies": { "dependencies": {
@ -38,6 +38,7 @@
"redlock": "^4.1.0", "redlock": "^4.1.0",
"sanitize-html": "^1.27.2", "sanitize-html": "^1.27.2",
"saslprep": "^1.0.3", "saslprep": "^1.0.3",
"semver": "^7.3.2",
"socket.io": "^2.3.0", "socket.io": "^2.3.0",
"socket.io-redis": "^5.2.0", "socket.io-redis": "^5.2.0",
"socks-proxy-agent": "^5.0.0" "socks-proxy-agent": "^5.0.0"

@ -34,7 +34,7 @@ block content
th User th User
th IP th IP
th Actions th Actions
th Post IDs th Posts
th Log Message th Log Message
for log in logs for log in logs
tr tr
@ -57,7 +57,13 @@ block content
| |
a(href=`?ip=${encodeURIComponent(logIp)}`) [+] a(href=`?ip=${encodeURIComponent(logIp)}`) [+]
td #{log.actions} td #{log.actions}
td #{log.postIds} td
if log.showLinks
for postLink in log.postLinks
a(href=`/${board._id}/manage/thread/${postLink.thread || postLink.postId}.html#${postLink.postId}`) &gt;&gt;#{postLink.postId}
|
else
| #{log.postLinks.map(l => l.postId)}
td #{log.message || '-'} td #{log.message || '-'}
.pages.mv-5 .pages.mv-5
include ../includes/pages.pug include ../includes/pages.pug

@ -29,7 +29,7 @@ block content
th User th User
th IP th IP
th Actions th Actions
th Post IDs th Posts
th Log Message th Log Message
for log in logs for log in logs
tr tr
@ -43,7 +43,13 @@ block content
- const logIp = permLevel > ipHashPermLevel ? log.ip.single.slice(-10) : log.ip.raw; - const logIp = permLevel > ipHashPermLevel ? log.ip.single.slice(-10) : log.ip.raw;
| #{logIp} | #{logIp}
td #{log.actions} td #{log.actions}
td #{log.postIds} td
if log.showLinks
for postLink in log.postLinks
a(href=`/${board._id}/manage/thread/${postLink.thread || postLink.postId}.html#${postLink.postId}`) &gt;&gt;#{postLink.postId}
|
else
| #{log.postLinks.map(l => l.postId)}
td #{log.message || '-'} td #{log.message || '-'}
.pages.mv-5 .pages.mv-5
include ../includes/pages.pug include ../includes/pages.pug

@ -18,7 +18,7 @@ block content
th Date th Date
th User th User
th Actions th Actions
th Post IDs th Posts
th Log Message th Log Message
for log in logs for log in logs
tr tr
@ -26,7 +26,13 @@ block content
td: time.reltime(datetime=logDate.toISOString()) #{logDate.toLocaleString(undefined, {hour12:false})} td: time.reltime(datetime=logDate.toISOString()) #{logDate.toLocaleString(undefined, {hour12:false})}
td(class=(!log.showUser ? 'em' : '')) #{log.showUser ? log.user : 'Hidden User'} td(class=(!log.showUser ? 'em' : '')) #{log.showUser ? log.user : 'Hidden User'}
td #{log.actions} td #{log.actions}
td #{log.postIds} td
if log.showLinks
for postLink in log.postLinks
a(href=`/${board._id}/thread/${postLink.thread || postLink.postId}.html#${postLink.postId}`) &gt;&gt;#{postLink.postId}
|
else
| #{log.postLinks.map(l => l.postId)}
td #{log.message || '-'} td #{log.message || '-'}
hr(size=1) hr(size=1)
.pages .pages

Loading…
Cancel
Save