From 5c7924f6b79db912929cf150f1c9aab333e5c841 Mon Sep 17 00:00:00 2001 From: fatchan Date: Thu, 12 Mar 2020 21:48:45 +1100 Subject: [PATCH] beta ver of per board logs with uncensored usernames for board staff --- controllers/pages.js | 4 ++- models/pages/manage/index.js | 1 + models/pages/manage/logs.js | 60 ++++++++++++++++++++++++++++++++++++ views/mixins/managenav.pug | 2 ++ views/pages/managelogs.pug | 51 ++++++++++++++++++++++++++++++ 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 models/pages/manage/logs.js create mode 100644 views/pages/managelogs.pug diff --git a/controllers/pages.js b/controllers/pages.js index 5347dd99..d7f14d42 100644 --- a/controllers/pages.js +++ b/controllers/pages.js @@ -13,7 +13,8 @@ const express = require('express') , csrf = require(__dirname+'/../helpers/checks/csrfmiddleware.js') , setMinimal = require(__dirname+'/../helpers/setminimal.js') //page models - , { manageRecent, manageReports, manageBanners, manageSettings, manageBans, manageBoard, manageThread } = require(__dirname+'/../models/pages/manage/') + , { manageRecent, manageReports, manageBanners, manageSettings, manageBans, + manageBoard, manageThread, manageLogs } = require(__dirname+'/../models/pages/manage/') , { globalManageSettings, globalManageReports, globalManageBans, globalManageRecent, globalManageAccounts, globalManageNews, globalManageLogs } = require(__dirname+'/../models/pages/globalmanage/') , { changePassword, blockBypass, home, register, login, logout, create, @@ -43,6 +44,7 @@ router.get('/randombanner', randombanner); //random banner router.get('/:board/manage/reports.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(3), csrf, manageReports); router.get('/:board/manage/recent.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(3), csrf, manageRecent); router.get('/:board/manage/bans.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(3), csrf, manageBans); +router.get('/:board/manage/logs.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(3), csrf, manageLogs); router.get('/:board/manage/settings.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(2), csrf, manageSettings); router.get('/:board/manage/banners.html', sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms(2), csrf, manageBanners); // if (mod view enabled) { diff --git a/models/pages/manage/index.js b/models/pages/manage/index.js index 4e2518cf..3c99af70 100644 --- a/models/pages/manage/index.js +++ b/models/pages/manage/index.js @@ -5,6 +5,7 @@ module.exports = { manageRecent: require(__dirname+'/recent.js'), manageSettings: require(__dirname+'/settings.js'), manageBans: require(__dirname+'/bans.js'), + manageLogs: require(__dirname+'/logs.js'), manageBanners: require(__dirname+'/banners.js'), manageBoard: require(__dirname+'/board.js'), manageThread: require(__dirname+'/thread.js'), diff --git a/models/pages/manage/logs.js b/models/pages/manage/logs.js new file mode 100644 index 00000000..8b91966f --- /dev/null +++ b/models/pages/manage/logs.js @@ -0,0 +1,60 @@ +'use strict'; + +const { Modlogs } = require(__dirname+'/../../../db/') + , { ipHashPermLevel } = require(__dirname+'/../../../configs/main.js') + , pageQueryConverter = require(__dirname+'/../../../helpers/pagequeryconverter.js') + , decodeQueryIP = require(__dirname+'/../../../helpers/decodequeryip.js') + , hashIp = require(__dirname+'/../../../helpers/haship.js') + , limit = 50; + +module.exports = async (req, res, next) => { + + const { page, offset, queryString } = pageQueryConverter(req.query, limit); + + let filter = { + board: req.params.board + }; + const username = req.query.username; + if (username && !Array.isArray(username)) { + filter.user = username; + } + const uri = req.query.uri; + if (uri && !Array.isArray(uri)) { + filter.board = uri; + } + const ipMatch = null;//decodeQueryIP(req.query, res.locals.permLevel); +//todo fetch log entry by id and then get ip and hash + if (ipMatch) { + filter.ip = ipMatch; + } + + let logs, maxPage; + try { + [logs, maxPage] = await Promise.all([ + Modlogs.find(filter, offset, limit), + Modlogs.count(filter), + ]); + maxPage = Math.ceil(maxPage/limit); + } catch (err) { + return next(err) + } + if (res.locals.permLevel > ipHashPermLevel) { + for (let i = 0; i < logs.length; i++) { + logs[i].ip = hashIp(logs[i].ip); + } + } + + res + .set('Cache-Control', 'private, max-age=5') + .render('managelogs', { + csrf: req.csrfToken(), + queryString, + username, + uri, + ip: ipMatch ? req.query.ip : null, + logs, + page, + maxPage, + }); + +} diff --git a/views/mixins/managenav.pug b/views/mixins/managenav.pug index 867f9f93..1fe2d76f 100644 --- a/views/mixins/managenav.pug +++ b/views/mixins/managenav.pug @@ -12,6 +12,8 @@ mixin managenav(selected, upLevel) | a(href=`${upLevel ? '../' : ''}bans.html` class=(selected === 'bans' ? 'bold' : '')) [Bans] | + a(href=`${upLevel ? '../' : ''}logs.html` class=(selected === 'logs' ? 'bold' : '')) [Logs] + | if permLevel < 3 a(href=`${upLevel ? '../' : ''}settings.html` class=(selected === 'settings' ? 'bold' : '')) [Settings] | diff --git a/views/pages/managelogs.pug b/views/pages/managelogs.pug new file mode 100644 index 00000000..401b4942 --- /dev/null +++ b/views/pages/managelogs.pug @@ -0,0 +1,51 @@ +extends ../layout.pug +include ../mixins/post.pug +include ../mixins/ban.pug +include ../mixins/managenav.pug +include ../mixins/boardheader.pug + +block head + title /#{board._id}/ - Manage + +block content + +boardheader('Logs') + br + +managenav('logs') + hr(size=1) + .form-wrapper.flexleft + h4.no-m-p Search: + form.form-post.mv-5(action=`/${board._id}/manage/logs.html` method='GET') + input(type='hidden' value=page) + .row + .label Username + input(type='text' name='username' value=username) + input(type='submit', value='Filter') + h4.no-m-p Logs: + if logs && logs.length > 0 + .table-container.flex-center.mv-10.text-center + table.fw + tr + th Date + th User + th IP + th Actions + th Post IDs + th Log Message + for log in logs + tr + - const logDate = new Date(log.date); + td: time.reltime(datetime=logDate.toISOString()) #{logDate.toLocaleString(undefined, {hour12:false})} + td + | #{log.user} + | + a(href=`?username=${log.user}`) [+] + td + - const logIp = permLevel > ipHashPermLevel ? log.ip.slice(-10) : log.ip; + | #{logIp} + td #{log.actions} + td #{log.postIds} + td #{log.message || '-'} + .pages.mv-5 + include ../includes/pages.pug + else + p No logs.