differentiate between report reason and ban reason, improve actions form, renamed some stuff

merge-requests/208/head
fatchan 5 years ago
parent ff4f6c4758
commit e80e9e4452
  1. 22
      controllers/forms.js
  2. 2
      controllers/pages.js
  3. 2
      db/accounts.js
  4. 4
      db/bans.js
  5. 2
      db/boards.js
  6. 10
      db/posts.js
  7. 2
      db/trips.js
  8. 2
      models/forms/ban-poster.js
  9. 2
      models/forms/report-post.js
  10. 14
      models/pages/globalmanage.js
  11. 8
      models/pages/manage.js
  12. 2
      server.js
  13. 36
      static/css/style.css
  14. 57
      views/includes/deletefooter.pug
  15. 4
      views/mixins/post.pug
  16. 3
      views/pages/board.pug
  17. 30
      views/pages/globalmanage.pug
  18. 7
      views/pages/manage.pug
  19. 1
      views/pages/thread.pug
  20. 2
      wipe.js

@ -154,9 +154,12 @@ router.post('/board/:board/actions', Boards.exists, banCheck, numberConverter, a
if (req.body.password && req.body.password.length > 50) { if (req.body.password && req.body.password.length > 50) {
errors.push('Password must be 50 characters or less'); 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'); 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 if (!(req.body.report
|| req.body.delete || req.body.delete
|| req.body.dismiss || req.body.dismiss
@ -165,12 +168,9 @@ router.post('/board/:board/actions', Boards.exists, banCheck, numberConverter, a
|| req.body.global_ban)) { || req.body.global_ban)) {
errors.push('Invalid actions selected') 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') 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) { if (errors.length > 0) {
return res.status(400).render('message', { 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; module.exports = router;

@ -2,7 +2,7 @@
const express = require('express') const express = require('express')
, router = express.Router() , router = express.Router()
, Boards = require(__dirname+'/../db-models/boards.js') , Boards = require(__dirname+'/../db/boards.js')
, hasPerms = require(__dirname+'/../helpers/haspermsmiddleware.js') , hasPerms = require(__dirname+'/../helpers/haspermsmiddleware.js')
, isLoggedIn = require(__dirname+'/../helpers/isloggedin.js') , isLoggedIn = require(__dirname+'/../helpers/isloggedin.js')
, numberConverter = require(__dirname+'/../helpers/number-converter.js') , numberConverter = require(__dirname+'/../helpers/number-converter.js')

@ -1,7 +1,7 @@
'use strict'; 'use strict';
const Mongo = require(__dirname+'/../helpers/db.js') const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan').collection('accounts') , db = Mongo.client.db('jschan').collection('accounts')
, bcrypt = require('bcrypt'); , bcrypt = require('bcrypt');

@ -1,7 +1,7 @@
'use strict'; 'use strict';
const Mongo = require(__dirname+'/../helpers/db.js') const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan').collection('bans'); , db = Mongo.client.db('jschan').collection('bans');
module.exports = { module.exports = {
@ -26,7 +26,7 @@ module.exports = {
}).toArray(); }).toArray();
}, },
getAll: () => { // for a global ban manage page maybe? still TODO getAllBans: () => {
return db.find({}).toArray(); return db.find({}).toArray();
}, },

@ -1,6 +1,6 @@
'use strict'; 'use strict';
const Mongo = require(__dirname+'/../helpers/db.js') const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan'); , db = Mongo.client.db('jschan');
module.exports = { module.exports = {

@ -1,6 +1,6 @@
'use strict'; 'use strict';
const Mongo = require(__dirname+'/../helpers/db.js') const Mongo = require(__dirname+'/db.js')
, Boards = require(__dirname+'/boards.js') , Boards = require(__dirname+'/boards.js')
, db = Mongo.client.db('jschan').collection('posts'); , db = Mongo.client.db('jschan').collection('posts');
@ -246,14 +246,6 @@ module.exports = {
'reports.0': { 'reports.0': {
'$exists': true '$exists': true
} }
}, {
'projection': {
'salt': 0,
'password': 0,
'ip': 0,
}
}).sort({
'board': 1
}).toArray(); }).toArray();
}, },

@ -1,6 +1,6 @@
'use strict'; 'use strict';
const Mongo = require(__dirname+'/../helpers/db.js') const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan').collection('tripcodes'); , db = Mongo.client.db('jschan').collection('tripcodes');
module.exports = { module.exports = {

@ -24,7 +24,7 @@ module.exports = async (req, res, next, board, checkedPosts) => {
const bans = posts.map(post => { const bans = posts.map(post => {
return { return {
'ip': post.ip, 'ip': post.ip,
'reason': req.body.reason || 'No reason specified', 'reason': req.body.ban_reason || 'No reason specified',
'board': board, 'board': board,
'post': req.body.preserve_post ? post : null, 'post': req.body.preserve_post ? post : null,
'issuer': req.session.user.username, 'issuer': req.session.user.username,

@ -6,7 +6,7 @@ module.exports = async (req, res, next) => {
const ip = req.headers['x-real-ip'] || req.connection.remoteAddress; const ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
const report = { const report = {
'reason': req.body.reason, 'reason': req.body.report_reason,
'date': new Date(), 'date': new Date(),
'ip': ip 'ip': ip
} }

@ -1,20 +1,24 @@
'use strict'; '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) => { module.exports = async (req, res, next) => {
let posts; let reports;
let bans;
try { try {
posts = await Posts.getAllReports(); reports = await Posts.getAllReports();
bans = await Bans.getAllBans();
} catch (err) { } catch (err) {
return next(err); return next(err)
} }
//render the page //render the page
res.render('globalmanage', { res.render('globalmanage', {
csrf: req.csrfToken(), csrf: req.csrfToken(),
posts: posts reports,
bans,
}); });
} }

@ -5,10 +5,10 @@ const Posts = require(__dirname+'/../../db/posts.js')
module.exports = async (req, res, next) => { module.exports = async (req, res, next) => {
let posts; let reports;
let bans; let bans;
try { try {
posts = await Posts.getReports(req.params.board); reports = await Posts.getReports(req.params.board);
bans = await Bans.getBoardBans(req.params.board); bans = await Bans.getBoardBans(req.params.board);
} catch (err) { } catch (err) {
return next(err) return next(err)
@ -17,8 +17,8 @@ module.exports = async (req, res, next) => {
//render the page //render the page
res.render('manage', { res.render('manage', {
csrf: req.csrfToken(), csrf: req.csrfToken(),
posts: posts, reports,
bans: bans || [], bans,
}); });
} }

@ -13,7 +13,7 @@ const express = require('express')
, bodyParser = require('body-parser') , bodyParser = require('body-parser')
, cookieParser = require('cookie-parser') , cookieParser = require('cookie-parser')
, configs = require(__dirname+'/configs/main.json') , configs = require(__dirname+'/configs/main.json')
, Mongo = require(__dirname+'/helpers/db.js') , Mongo = require(__dirname+'/db/db.js')
, upload = require('express-fileupload'); , upload = require('express-fileupload');
(async () => { (async () => {

@ -9,6 +9,10 @@ body {
margin: 0; margin: 0;
} }
.pages a {
text-decoration: none;
}
object { object {
object-fit: scale-down; object-fit: scale-down;
} }
@ -57,9 +61,9 @@ object {
.catalog { .catalog {
display:flex; display:flex;
flex-direction: row;
align-items:flex-start; align-items:flex-start;
flex-wrap: wrap; justify-content: space-evenly;
flex-flow: row wrap;
} }
.spoiler { .spoiler {
@ -126,13 +130,26 @@ input, textarea {
margin: 10px 0; 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 { .action-wrapper {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-start;
} }
.action-wrapper * { .actions label {
margin: 3px 0; margin: 2px 0;
} }
.form-post { .form-post {
@ -211,7 +228,8 @@ input textarea {
} }
.post-container, .ban { .post-container, .ban {
margin: 1px; box-sizing: border-box;
margin: 2px 0;
padding: 2px; padding: 2px;
background: #D6DAF0; background: #D6DAF0;
border-color: #B7C5D9; border-color: #B7C5D9;
@ -242,7 +260,7 @@ input textarea {
font-weight: bold; font-weight: bold;
} }
.post-container.op .post-info { .post-container.op .post-info, .catalog-tile-content .post-info {
background: none; background: none;
} }
@ -320,10 +338,6 @@ hr {
@media only screen and (max-width: 800px) { @media only screen and (max-width: 800px) {
body {
/*font-size: 14pt;*/
}
input { input {
height: 30px; height: 30px;
} }
@ -352,8 +366,6 @@ hr {
.catalog-tile { .catalog-tile {
overflow-y: hidden; overflow-y: hidden;
width: 49%;
justify-content: space-evenly;
} }
.boards-table { .boards-table {

@ -1,25 +1,32 @@
.action-wrapper Actions: .action-wrapper
label .actions Actions:
input.post-check(type='checkbox', name='delete' value=1) label
| Delete Post input.post-check(type='checkbox', name='delete' value=1)
label | Delete Post
input.post-check(type='checkbox', name='spoiler' value=1) label
| Spoiler Images input.post-check(type='checkbox', name='spoiler' value=1)
label | Spoiler Images
input#password(type='text', name='password', placeholder='post password' autocomplete='off') label
.action-wrapper Mod Actions: input#password(type='text', name='password', placeholder='post password' autocomplete='off')
label label
input.post-check(type='checkbox', name='dismiss' value=1) input.post-check(type='checkbox', name='report' value=1)
| Dismiss Reports | Report Post
label label
input.post-check(type='checkbox', name='ban' value=1) input#report(type='text', name='report_reason', placeholder='report reason' autocomplete='off')
| Ban Poster .actions Mod Actions:
label label
input.post-check(type='checkbox', name='global_ban' value=1) input.post-check(type='checkbox', name='dismiss' value=1)
| Global Ban Poster | Dismiss Reports
label label
input.post-check(type='checkbox', name='preserve_post' value=1) input.post-check(type='checkbox', name='ban' value=1)
| Show Post In Ban | Ban Poster
label label
input#report(type='text', name='reason', placeholder='ban reason' autocomplete='off') input.post-check(type='checkbox', name='global_ban' value=1)
input(type='submit', value='submit') | 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')

@ -12,7 +12,7 @@ mixin post(post, truncate, showreports)
span.post-name #{post.name} span.post-name #{post.name}
span #{post.date.toLocaleString()} span #{post.date.toLocaleString()}
span.user-id(style=`background: #${post.userId}`) #{post.userId} 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 if post.files.length > 0
.post-files .post-files
each file in post.files each file in post.files
@ -40,7 +40,7 @@ mixin post(post, truncate, showreports)
} }
if truncated if truncated
blockquote.post-message !{truncatedMessage} 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 else
blockquote.post-message !{post.message} blockquote.post-message !{post.message}
else else

@ -6,7 +6,6 @@ block head
block content block content
include ../includes/boardheader.pug include ../includes/boardheader.pug
hr(size=1)
include ../includes/postform.pug include ../includes/postform.pug
.mode Posting mode: Thread [#[a.no-decoration(href=`/${board._id}/catalog`) Catalog]] .mode Posting mode: Thread [#[a.no-decoration(href=`/${board._id}/catalog`) Catalog]]
hr(size=1) hr(size=1)
@ -22,7 +21,7 @@ block content
+post(thread, true) +post(thread, true)
for post in thread.replies for post in thread.replies
+post(post, true) +post(post, true)
hr(size=1) hr(size=1)
include ../includes/pages.pug include ../includes/pages.pug
hr(size=1) hr(size=1)
include ../includes/deletefooter.pug include ../includes/deletefooter.pug

@ -1,11 +1,35 @@
extends ../layout.pug extends ../layout.pug
include ../mixins/post.pug include ../mixins/post.pug
include ../mixins/ban.pug
block head block head
title Manage title Manage
block content block content
h1.board-title Global Management h1.board-title Global Management
hr(size=1) h4 All Reports:
p under construction 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')

@ -7,17 +7,16 @@ block head
block content block content
include ../includes/boardheader.pug include ../includes/boardheader.pug
hr(size=1)
h4 Reports: h4 Reports:
form(action=`/forms/board/${board._id}/actions` method='POST' enctype='application/x-www-form-urlencoded') form(action=`/forms/board/${board._id}/actions` method='POST' enctype='application/x-www-form-urlencoded')
input(type='hidden' name='_csrf' value=csrf) input(type='hidden' name='_csrf' value=csrf)
if posts.length === 0 if reports.length === 0
p No reports. p No reports.
hr(size=1) hr(size=1)
else else
for post in posts for report in reports
section.thread section.thread
+post(post, false, true) +post(report, false, true)
hr(size=1) hr(size=1)
include ../includes/deletefooter.pug include ../includes/deletefooter.pug
hr(size=1) hr(size=1)

@ -11,7 +11,6 @@ block head
block content block content
include ../includes/boardheader.pug include ../includes/boardheader.pug
hr(size=1)
include ../includes/postform.pug include ../includes/postform.pug
.mode Posting mode: Reply [#[a.no-decoration(href=`/${board._id}`) Go Back]] .mode Posting mode: Reply [#[a.no-decoration(href=`/${board._id}`) Go Back]]
hr(size=1) hr(size=1)

@ -1,6 +1,6 @@
'use strict'; 'use strict';
const Mongo = require(__dirname+'/helpers/db.js') const Mongo = require(__dirname+'/db/db.js')
, util = require('util') , util = require('util')
, path = require('path') , path = require('path')
, fs = require('fs') , fs = require('fs')

Loading…
Cancel
Save