add board locking, and add it as a tph trigger action

merge-requests/208/head
fatchan 5 years ago
parent 3e4ff79a8a
commit ac55522492
  1. 5
      gulpfile.js
  2. 2
      helpers/paramconverter.js
  3. 5
      models/forms/changeboardsettings.js
  4. 5
      models/forms/create.js
  5. 39
      models/forms/makepost.js
  6. 19
      views/pages/manage.pug

@ -53,8 +53,9 @@ async function wipe() {
'name': 'test',
'description': 'testing board',
'captchaMode': 0,
'captchaTrigger': 10,
'captchaTriggerMode': 2,
'locked': true,
'tphTrigger': 10,
'tphTriggerAction': 2,
'forceAnon': true,
'ids': false,
'userPostDelete': true,

@ -3,7 +3,7 @@
const Mongo = require(__dirname+'/../db/db.js')
, allowedArrays = new Set(['checkedposts', 'globalcheckedposts', 'checkedbans', 'checkedbanners']) //only these can be arrays, since express bodyparser will output arrays
, trimFields = ['uri', 'filters', 'announcement', 'description', 'message', 'name', 'subject', 'email', 'password', 'default_name', 'report_reason', 'ban_reason'] //trim if we dont want filed with whitespace
, numberFields = ['filter_mode', 'captcha_mode', 'captcha_trigger', 'captcha_trigger_mode', 'reply_limit', 'max_files', 'thread_limit', 'thread', 'min_message_length'] //convert these to numbers before they hit our routes
, numberFields = ['filter_mode', 'captcha_mode', 'tph_trigger', 'tph_trigger_action', 'reply_limit', 'max_files', 'thread_limit', 'thread', 'min_message_length'] //convert these to numbers before they hit our routes
, banDurationRegex = /^(?<year>[\d]+y)?(?<month>[\d]+m)?(?<week>[\d]+w)?(?<day>[\d]+d)?(?<hour>[\d]+h)?$/
, msTime = require(__dirname+'/mstime.js')

@ -32,14 +32,15 @@ module.exports = async (req, res, next) => {
const newSettings = {
name: req.body.name && req.body.name.trim().length > 0 ? req.body.name : oldSettings.name,
description: req.body.description && req.body.description.trim().length > 0 ? req.body.description : oldSettings.description,
locked: req.body.locked ? true : false,
ids: req.body.ids ? true : false,
forceAnon: req.body.force_anon ? true : false,
userPostDelete: req.body.user_post_delete ? true : false,
userPostSpoiler: req.body.user_post_spoiler ? true : false,
userPostUnlink: req.body.user_post_unlink ? true : false,
captchaMode: typeof req.body.captcha_mode === 'number' && req.body.captcha_mode !== oldSettings.captchaMode ? req.body.captcha_mode : oldSettings.captchaMode,
captchaTriggerMode: typeof req.body.captcha_trigger === 'number' && req.body.captcha_trigger_mode !== oldSettings.captchaTriggerMode ? req.body.captcha_trigger_mode : oldSettings.captchaTriggerMode,
captchaTrigger: typeof req.body.captcha_trigger === 'number' && req.body.captcha_trigger !== oldSettings.captchaTrigger ? req.body.captcha_trigger : oldSettings.captchaTrigger,
tphTrigger: typeof req.body.tph_trigger === 'number' && req.body.tph_trigger !== oldSettings.tphTrigger ? req.body.tph_trigger : oldSettings.tphTrigger,
tphTriggerAction: typeof req.body.tph_trigger_action === 'number' && req.body.tph_trigger_action !== oldSettings.tphTriggerAction ? req.body.tph_trigger_action : oldSettings.tphTriggerAction,
threadLimit: typeof req.body.thread_limit === 'number' && req.body.thread_limit !== oldSettings.threadLimit ? req.body.thread_limit : oldSettings.threadLimit,
replyLimit: typeof req.body.reply_limit === 'number' && req.body.reply_limit !== oldSettings.replyLimit ? req.body.reply_limit : oldSettings.replyLimit,
maxFiles: typeof req.body.max_files === 'number' && req.body.max_files !== oldSettings.maxFiles ? req.body.max_files : oldSettings.maxFiles,

@ -33,9 +33,10 @@ module.exports = async (req, res, next) => {
'settings': {
name,
description,
'locked': true,
'captchaMode': 0,
'captchaTrigger': 0,
'captchaTriggerMode': 0,
'tphTrigger': 0,
'tphTriggerAction': 0,
'forceAnon': false,
'ids': false,
'userPostDelete': true,

@ -43,7 +43,19 @@ module.exports = async (req, res, next) => {
let salt = null;
let thread = null;
const permLevel = permsCheck(req, res);
const { filters, filterBanDuration, filterMode, maxFiles, forceAnon, replyLimit, threadLimit, ids, userPostSpoiler, defaultName, captchaTrigger, captchaTriggerMode, captchaMode } = res.locals.board.settings;
const { filters, filterBanDuration, filterMode,
maxFiles, forceAnon, replyLimit,
threadLimit, ids, userPostSpoiler,
defaultName, tphTrigger, tphTriggerAction,
captchaMode, locked } = res.locals.board.settings;
if (locked === true) {
await deleteTempFiles(req).catch(e => console.error);
return res.status(400).render('message', {
'title': 'Bad request',
'message': 'Board is locked.',
'redirect': redirect
});
}
if (req.body.thread) {
thread = await Posts.getPost(req.params.board, req.body.thread, true);
if (!thread || thread.thread != null) {
@ -333,8 +345,9 @@ module.exports = async (req, res, next) => {
const postId = await Posts.insertOne(res.locals.board, data, thread);
if (!data.thread //if this is a new thread
&& captchaTriggerMode > 0 //and the triger mode is not nothing
&& captchaMode < captchaTriggerMode) { //and the current captcha mode is less than the trigger mode
&& tphTriggerAction > 0 //and the triger mode is not nothing
&& ((tphTriggerAction < 3 && captchaMode < tphTriggerAction) //and captcha mode less than captcha trigger
|| (tphTriggerAction === 3 && locked !== true))) { //and not locked with lock trigger
const pastHourMongoId = Mongo.ObjectId.createFromTime(Math.floor((Date.now() - msTime.hour)/1000));
//count threads in past hour
const tph = await Posts.db.countDocuments({
@ -345,17 +358,23 @@ module.exports = async (req, res, next) => {
'board': res.locals.board._id
});
//if its above the trigger
if (tph > captchaTrigger) {
if (tph > tphTrigger) {
//update in memory for other stuff done e.g. rebuilds
res.locals.board.settings.captchaMode = captchaTriggerMode;
const update = {
'$set': {}
};
if (tphTriggerAction < 3) {
res.locals.board.settings.captchaMode = tphTriggerAction;
update['$set']['settings.captchaMode'] = tphTriggerAction;
}
if (tphTriggerAction === 3) {
res.locals.board.settings.locked = true;
update['$set']['settings.locked'] = true;
}
//set it in the db
await Boards.db.updateOne({
'_id': res.locals.board._id,
}, {
'$set': {
'settings.captchaMode': captchaTriggerMode
}
});
}, update);
//remove the html (since pages will need captcha in postform now)
await remove(`${uploadDirectory}html/${req.params.board}/`);
}

@ -18,6 +18,10 @@ block content
section.row
.label Board Description
input(type='text' name='description' value=board.settings.description)
section.row
.label Board Locked
label.postform-style.ph-5
input(type='checkbox', name='locked', value='true' checked=board.settings.locked)
section.row
.label IDs
label.postform-style.ph-5
@ -33,14 +37,15 @@ block content
option(value='1', selected=board.settings.captchaMode === 1) Captcha for new thread
option(value='2', selected=board.settings.captchaMode === 2) Captcha for all posts
section.row
.label Captcha Trigger Threshold
input(type='number', name='captcha_trigger', value=board.settings.captchaTrigger)
.label TPH Trigger Threshold
input(type='number', name='tph_trigger', value=board.settings.tphTrigger)
section.row
.label Captcha Trigger Mode
select(name='captcha_trigger_mode')
option(value='0', selected=board.settings.captchaTriggerMode === 0) Do nothing
option(value='1', selected=board.settings.captchaTriggerMode === 1) Enable for new thread
option(value='2', selected=board.settings.captchaTriggerMode === 2) Enable for all posts
.label TPH Trigger Action
select(name='tph_trigger_action')
option(value='0', selected=board.settings.tphTriggerAction === 0) Do nothing
option(value='1', selected=board.settings.tphTriggerAction === 1) Enable captcha for new thread
option(value='2', selected=board.settings.tphTriggerAction === 2) Enable captcha for all posts
option(value='3', selected=board.settings.tphTriggerAction === 3) Lock Board
section.row
.label Post Deletion
label.postform-style.ph-5

Loading…
Cancel
Save