From e80e9e44529ebba88a487295e46defc2cb97a13d Mon Sep 17 00:00:00 2001 From: fatchan Date: Tue, 16 Apr 2019 06:43:17 +0000 Subject: [PATCH] differentiate between report reason and ban reason, improve actions form, renamed some stuff --- controllers/forms.js | 22 ++++++++++--- controllers/pages.js | 2 +- db/accounts.js | 2 +- db/bans.js | 4 +-- db/boards.js | 2 +- db/posts.js | 10 +----- db/trips.js | 2 +- models/forms/ban-poster.js | 2 +- models/forms/report-post.js | 2 +- models/pages/globalmanage.js | 14 +++++--- models/pages/manage.js | 8 ++--- server.js | 2 +- static/css/style.css | 36 ++++++++++++++------- views/includes/deletefooter.pug | 57 ++++++++++++++++++--------------- views/mixins/post.pug | 4 +-- views/pages/board.pug | 3 +- views/pages/globalmanage.pug | 30 +++++++++++++++-- views/pages/manage.pug | 7 ++-- views/pages/thread.pug | 1 - wipe.js | 2 +- 20 files changed, 130 insertions(+), 82 deletions(-) diff --git a/controllers/forms.js b/controllers/forms.js index da521304..66d6df9a 100644 --- a/controllers/forms.js +++ b/controllers/forms.js @@ -154,9 +154,12 @@ router.post('/board/:board/actions', Boards.exists, banCheck, numberConverter, a if (req.body.password && req.body.password.length > 50) { errors.push('Password must be 50 characters or less'); } - if (req.body.reason && req.body.reason.length > 50) { + if (req.body.report_reason && req.body.report_reason.length > 50) { errors.push('Report must be 50 characters or less'); } + if (req.body.ban_reason && req.body.ban_reason.length > 50) { + errors.push('Ban reason must be 50 characters or less'); + } if (!(req.body.report || req.body.delete || req.body.dismiss @@ -165,12 +168,9 @@ router.post('/board/:board/actions', Boards.exists, banCheck, numberConverter, a || req.body.global_ban)) { errors.push('Invalid actions selected') } - if (req.body.report && (!req.body.reason || req.body.reason.length === 0)) { + if (req.body.report && (!req.body.report_reason || req.body.report_reason.length === 0)) { errors.push('Reports must have a reason') } - if ((req.body.ban || req.body.global_ban) && (!req.body.reason || req.body.reason.length === 0)) { - errors.push('Bans must have a reason') - } if (errors.length > 0) { return res.status(400).render('message', { @@ -266,5 +266,17 @@ router.post('/board/:board/unban', Boards.exists, banCheck, hasPerms, numberConv }); +router.post('/global/actions', hasPerms, numberConverter, async(req, res, next) => { + + //TODO + +}); + +router.post('/global/unban', hasPerms, numberConverter, async(req, res, next) => { + + //TODO + +}); + module.exports = router; diff --git a/controllers/pages.js b/controllers/pages.js index e9a37d0a..b863aa89 100644 --- a/controllers/pages.js +++ b/controllers/pages.js @@ -2,7 +2,7 @@ const express = require('express') , router = express.Router() - , Boards = require(__dirname+'/../db-models/boards.js') + , Boards = require(__dirname+'/../db/boards.js') , hasPerms = require(__dirname+'/../helpers/haspermsmiddleware.js') , isLoggedIn = require(__dirname+'/../helpers/isloggedin.js') , numberConverter = require(__dirname+'/../helpers/number-converter.js') diff --git a/db/accounts.js b/db/accounts.js index 0d142d8b..9138c218 100644 --- a/db/accounts.js +++ b/db/accounts.js @@ -1,7 +1,7 @@ 'use strict'; -const Mongo = require(__dirname+'/../helpers/db.js') +const Mongo = require(__dirname+'/db.js') , db = Mongo.client.db('jschan').collection('accounts') , bcrypt = require('bcrypt'); diff --git a/db/bans.js b/db/bans.js index 21ef11bb..8977968f 100644 --- a/db/bans.js +++ b/db/bans.js @@ -1,7 +1,7 @@ 'use strict'; -const Mongo = require(__dirname+'/../helpers/db.js') +const Mongo = require(__dirname+'/db.js') , db = Mongo.client.db('jschan').collection('bans'); module.exports = { @@ -26,7 +26,7 @@ module.exports = { }).toArray(); }, - getAll: () => { // for a global ban manage page maybe? still TODO + getAllBans: () => { return db.find({}).toArray(); }, diff --git a/db/boards.js b/db/boards.js index eb5a0f37..b242bd28 100644 --- a/db/boards.js +++ b/db/boards.js @@ -1,6 +1,6 @@ 'use strict'; -const Mongo = require(__dirname+'/../helpers/db.js') +const Mongo = require(__dirname+'/db.js') , db = Mongo.client.db('jschan'); module.exports = { diff --git a/db/posts.js b/db/posts.js index dfbfab98..a0788c6f 100644 --- a/db/posts.js +++ b/db/posts.js @@ -1,6 +1,6 @@ 'use strict'; -const Mongo = require(__dirname+'/../helpers/db.js') +const Mongo = require(__dirname+'/db.js') , Boards = require(__dirname+'/boards.js') , db = Mongo.client.db('jschan').collection('posts'); @@ -246,14 +246,6 @@ module.exports = { 'reports.0': { '$exists': true } - }, { - 'projection': { - 'salt': 0, - 'password': 0, - 'ip': 0, - } - }).sort({ - 'board': 1 }).toArray(); }, diff --git a/db/trips.js b/db/trips.js index 22726dbe..c284388e 100644 --- a/db/trips.js +++ b/db/trips.js @@ -1,6 +1,6 @@ 'use strict'; -const Mongo = require(__dirname+'/../helpers/db.js') +const Mongo = require(__dirname+'/db.js') , db = Mongo.client.db('jschan').collection('tripcodes'); module.exports = { diff --git a/models/forms/ban-poster.js b/models/forms/ban-poster.js index 8ee14f41..25f4218a 100644 --- a/models/forms/ban-poster.js +++ b/models/forms/ban-poster.js @@ -24,7 +24,7 @@ module.exports = async (req, res, next, board, checkedPosts) => { const bans = posts.map(post => { return { 'ip': post.ip, - 'reason': req.body.reason || 'No reason specified', + 'reason': req.body.ban_reason || 'No reason specified', 'board': board, 'post': req.body.preserve_post ? post : null, 'issuer': req.session.user.username, diff --git a/models/forms/report-post.js b/models/forms/report-post.js index dad4bf94..c2866e35 100644 --- a/models/forms/report-post.js +++ b/models/forms/report-post.js @@ -6,7 +6,7 @@ module.exports = async (req, res, next) => { const ip = req.headers['x-real-ip'] || req.connection.remoteAddress; const report = { - 'reason': req.body.reason, + 'reason': req.body.report_reason, 'date': new Date(), 'ip': ip } diff --git a/models/pages/globalmanage.js b/models/pages/globalmanage.js index 30f775d1..97daf7ae 100644 --- a/models/pages/globalmanage.js +++ b/models/pages/globalmanage.js @@ -1,20 +1,24 @@ 'use strict'; -const Posts = require(__dirname+'/../../db/posts.js'); +const Posts = require(__dirname+'/../../db/posts.js') + , Bans = require(__dirname+'/../../db/bans.js'); module.exports = async (req, res, next) => { - let posts; + let reports; + let bans; try { - posts = await Posts.getAllReports(); + reports = await Posts.getAllReports(); + bans = await Bans.getAllBans(); } catch (err) { - return next(err); + return next(err) } //render the page res.render('globalmanage', { csrf: req.csrfToken(), - posts: posts + reports, + bans, }); } diff --git a/models/pages/manage.js b/models/pages/manage.js index a4b7cc02..962f5039 100644 --- a/models/pages/manage.js +++ b/models/pages/manage.js @@ -5,10 +5,10 @@ const Posts = require(__dirname+'/../../db/posts.js') module.exports = async (req, res, next) => { - let posts; + let reports; let bans; try { - posts = await Posts.getReports(req.params.board); + reports = await Posts.getReports(req.params.board); bans = await Bans.getBoardBans(req.params.board); } catch (err) { return next(err) @@ -17,8 +17,8 @@ module.exports = async (req, res, next) => { //render the page res.render('manage', { csrf: req.csrfToken(), - posts: posts, - bans: bans || [], + reports, + bans, }); } diff --git a/server.js b/server.js index 8773f802..932e84b2 100644 --- a/server.js +++ b/server.js @@ -13,7 +13,7 @@ const express = require('express') , bodyParser = require('body-parser') , cookieParser = require('cookie-parser') , configs = require(__dirname+'/configs/main.json') - , Mongo = require(__dirname+'/helpers/db.js') + , Mongo = require(__dirname+'/db/db.js') , upload = require('express-fileupload'); (async () => { diff --git a/static/css/style.css b/static/css/style.css index 2a45827a..04df4a8d 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -9,6 +9,10 @@ body { margin: 0; } +.pages a { + text-decoration: none; +} + object { object-fit: scale-down; } @@ -57,9 +61,9 @@ object { .catalog { display:flex; - flex-direction: row; align-items:flex-start; - flex-wrap: wrap; + justify-content: space-evenly; + flex-flow: row wrap; } .spoiler { @@ -126,13 +130,26 @@ input, textarea { margin: 10px 0; } +.actions { + background: #D6DAF0; + border-color: #B7C5D9; + border-width: 0 1px 1px 0; + border-style: none solid solid none; + max-width: 100%; + display: flex; + flex-direction: column; + margin: 2px 0; + padding: 2px; +} + .action-wrapper { display: flex; flex-direction: column; + align-items: flex-start; } -.action-wrapper * { - margin: 3px 0; +.actions label { + margin: 2px 0; } .form-post { @@ -211,7 +228,8 @@ input textarea { } .post-container, .ban { - margin: 1px; + box-sizing: border-box; + margin: 2px 0; padding: 2px; background: #D6DAF0; border-color: #B7C5D9; @@ -242,7 +260,7 @@ input textarea { font-weight: bold; } -.post-container.op .post-info { +.post-container.op .post-info, .catalog-tile-content .post-info { background: none; } @@ -320,10 +338,6 @@ hr { @media only screen and (max-width: 800px) { - body { - /*font-size: 14pt;*/ - } - input { height: 30px; } @@ -352,8 +366,6 @@ hr { .catalog-tile { overflow-y: hidden; - width: 49%; - justify-content: space-evenly; } .boards-table { diff --git a/views/includes/deletefooter.pug b/views/includes/deletefooter.pug index 0aba7b03..b86e6ddf 100644 --- a/views/includes/deletefooter.pug +++ b/views/includes/deletefooter.pug @@ -1,25 +1,32 @@ -.action-wrapper Actions: - label - input.post-check(type='checkbox', name='delete' value=1) - | Delete Post - label - input.post-check(type='checkbox', name='spoiler' value=1) - | Spoiler Images - label - input#password(type='text', name='password', placeholder='post password' autocomplete='off') -.action-wrapper Mod Actions: - label - input.post-check(type='checkbox', name='dismiss' value=1) - | Dismiss Reports - label - input.post-check(type='checkbox', name='ban' value=1) - | Ban Poster - label - input.post-check(type='checkbox', name='global_ban' value=1) - | Global Ban Poster - label - input.post-check(type='checkbox', name='preserve_post' value=1) - | Show Post In Ban - label - input#report(type='text', name='reason', placeholder='ban reason' autocomplete='off') -input(type='submit', value='submit') +.action-wrapper + .actions Actions: + label + input.post-check(type='checkbox', name='delete' value=1) + | Delete Post + label + input.post-check(type='checkbox', name='spoiler' value=1) + | Spoiler Images + label + input#password(type='text', name='password', placeholder='post password' autocomplete='off') + label + input.post-check(type='checkbox', name='report' value=1) + | Report Post + label + input#report(type='text', name='report_reason', placeholder='report reason' autocomplete='off') + .actions Mod Actions: + label + input.post-check(type='checkbox', name='dismiss' value=1) + | Dismiss Reports + label + input.post-check(type='checkbox', name='ban' value=1) + | Ban Poster + label + input.post-check(type='checkbox', name='global_ban' value=1) + | Global Ban Poster + label + input.post-check(type='checkbox', name='preserve_post' value=1) + | Show Post In Ban + label + input#report(type='text', name='ban_reason', placeholder='ban reason' autocomplete='off') + input(type='submit', value='submit') + diff --git a/views/mixins/post.pug b/views/mixins/post.pug index 3474f78f..f3a8ea49 100644 --- a/views/mixins/post.pug +++ b/views/mixins/post.pug @@ -12,7 +12,7 @@ mixin post(post, truncate, showreports) span.post-name #{post.name} span #{post.date.toLocaleString()} span.user-id(style=`background: #${post.userId}`) #{post.userId} - span: a(href=`/${post.board}/thread/${post.thread ? post.thread : post.postId}#${post.postId}`) ##{post.postId} + span: a(href=`/${post.board}/thread/${post.thread || post.postId}#${post.postId}`) ##{post.postId} if post.files.length > 0 .post-files each file in post.files @@ -40,7 +40,7 @@ mixin post(post, truncate, showreports) } if truncated blockquote.post-message !{truncatedMessage} - p Message too long. #[a(href=`/${post.board}/thread/${post.thread == null ? post.postId : post.thread}#${post.postId}`) Click here] to view the full text. + p Message too long. #[a(href=`/${post.board}/thread/${post.thread || post.postId}#${post.postId}`) Click here] to view the full text. else blockquote.post-message !{post.message} else diff --git a/views/pages/board.pug b/views/pages/board.pug index e95e6304..1fbf0369 100644 --- a/views/pages/board.pug +++ b/views/pages/board.pug @@ -6,7 +6,6 @@ block head block content include ../includes/boardheader.pug - hr(size=1) include ../includes/postform.pug .mode Posting mode: Thread [#[a.no-decoration(href=`/${board._id}/catalog`) Catalog]] hr(size=1) @@ -22,7 +21,7 @@ block content +post(thread, true) for post in thread.replies +post(post, true) - hr(size=1) + hr(size=1) include ../includes/pages.pug hr(size=1) include ../includes/deletefooter.pug diff --git a/views/pages/globalmanage.pug b/views/pages/globalmanage.pug index 75b0bb85..36eb1444 100644 --- a/views/pages/globalmanage.pug +++ b/views/pages/globalmanage.pug @@ -1,11 +1,35 @@ extends ../layout.pug include ../mixins/post.pug +include ../mixins/ban.pug block head title Manage block content h1.board-title Global Management - hr(size=1) - p under construction - + h4 All Reports: + form(action=`/forms/global/actions` method='POST' enctype='application/x-www-form-urlencoded') + input(type='hidden' name='_csrf' value=csrf) + if reports.length === 0 + p No reports. + hr(size=1) + else + for report in reports + section.thread + +post(report, false, true) + hr(size=1) + include ../includes/deletefooter.pug + hr(size=1) + h4 All Bans: + form(action=`/forms/global/unban` method='POST' enctype='application/x-www-form-urlencoded') + input(type='hidden' name='_csrf' value=csrf) + if bans.length === 0 + p No bans. + hr(size=1) + else + for ban in bans + section.thread + +ban(ban) + hr(size=1) + section.action-wrapper + input(type='submit', value='unban') diff --git a/views/pages/manage.pug b/views/pages/manage.pug index 888fbf32..e0816182 100644 --- a/views/pages/manage.pug +++ b/views/pages/manage.pug @@ -7,17 +7,16 @@ block head block content include ../includes/boardheader.pug - hr(size=1) h4 Reports: form(action=`/forms/board/${board._id}/actions` method='POST' enctype='application/x-www-form-urlencoded') input(type='hidden' name='_csrf' value=csrf) - if posts.length === 0 + if reports.length === 0 p No reports. hr(size=1) else - for post in posts + for report in reports section.thread - +post(post, false, true) + +post(report, false, true) hr(size=1) include ../includes/deletefooter.pug hr(size=1) diff --git a/views/pages/thread.pug b/views/pages/thread.pug index f0fcfbf4..001ad2cd 100644 --- a/views/pages/thread.pug +++ b/views/pages/thread.pug @@ -11,7 +11,6 @@ block head block content include ../includes/boardheader.pug - hr(size=1) include ../includes/postform.pug .mode Posting mode: Reply [#[a.no-decoration(href=`/${board._id}`) Go Back]] hr(size=1) diff --git a/wipe.js b/wipe.js index cf542eb8..220ce56c 100644 --- a/wipe.js +++ b/wipe.js @@ -1,6 +1,6 @@ 'use strict'; -const Mongo = require(__dirname+'/helpers/db.js') +const Mongo = require(__dirname+'/db/db.js') , util = require('util') , path = require('path') , fs = require('fs')