diff --git a/build.js b/build.js index baef993b..e9849d15 100644 --- a/build.js +++ b/build.js @@ -143,4 +143,8 @@ module.exports = { return render('register.html', 'register.pug'); }, + buildCaptcha: () => { + return render('captcha.html', 'captcha.pug'); + }, + } diff --git a/controllers/forms.js b/controllers/forms.js index 4a663c01..492a9bf3 100644 --- a/controllers/forms.js +++ b/controllers/forms.js @@ -39,6 +39,7 @@ const express = require('express') , deleteBanners = require(__dirname+'/../models/forms/deletebanners.js') , loginAccount = require(__dirname+'/../models/forms/login.js') , changePassword = require(__dirname+'/../models/forms/changepassword.js') + , changeBoardSettings = require(__dirname+'/../models/forms/changeboardsettings.js') , registerAccount = require(__dirname+'/../models/forms/register.js') , checkPermsMiddleware = require(__dirname+'/../helpers/haspermsmiddleware.js') , checkPerms = require(__dirname+'/../helpers/hasperms.js') @@ -196,15 +197,15 @@ router.post('/board/:board/post', Boards.exists, banCheck, postFiles, paramConve if (!req.body.message && numFiles === 0) { errors.push('Must provide a message or file'); } - if (!req.body.thread && (res.locals.board.settings.forceOPFile && res.locals.board.settings.maxFiles === 0)) { + if (!req.body.thread && (res.locals.board.settings.forceOPFile && res.locals.board.settings.maxFiles !== 0) && numFiles === 0) { errors.push('Threads must include a file'); } if (!req.body.thread && res.locals.board.settings.forceOPMessage && (!req.body.message || req.body.message.length === 0)) { errors.push('Threads must include a message'); } if (req.body.message) { - if (req.body.message.length > 2000) { - errors.push('Message must be 2000 characters or less'); + if (req.body.message.length > 4000) { + errors.push('Message must be 4000 characters or less'); } else if (req.body.message.length < res.locals.board.settings.minMessageLength) { errors.push(`Message must be at least ${res.locals.board.settings.minMessageLength} characters long`); } @@ -260,6 +261,9 @@ router.post('/board/:board/settings', csrf, Boards.exists, checkPermsMiddleware, if (typeof req.body.max_files === 'number' && (req.body.max_files < 1 || req.body.max_files > 3)) { errors.push('Max files must be 1-3'); } + if (typeof req.body.min_message_length === 'number' && (req.body.min_message_length < 0 || req.body.min_message_length > 4000)) { + errors.push('Min message length must be 0-4000. 0 is disabled.'); + } if (errors.length > 0) { return res.status(400).render('message', { @@ -270,10 +274,7 @@ router.post('/board/:board/settings', csrf, Boards.exists, checkPermsMiddleware, } try { - return res.status(501).render('message', { - 'title': 'Not implemented', - 'redirect': `/${req.params.board}/manage.html` - }) + await changeBoardSettings(req, res, next); } catch (err) { return next(err); } @@ -538,5 +539,12 @@ router.post('/global/unban', csrf, checkPermsMiddleware, paramConverter, async(r }); +router.post('/newcaptcha', async(req, res, next) => { + + res.clearCookie('captchaid'); + return res.redirect('/captcha.html'); + +}); + module.exports = router; diff --git a/controllers/pages.js b/controllers/pages.js index 4b3e0c66..0479e953 100644 --- a/controllers/pages.js +++ b/controllers/pages.js @@ -18,6 +18,7 @@ const express = require('express') , board = require(__dirname+'/../models/pages/board.js') , catalog = require(__dirname+'/../models/pages/catalog.js') , banners = require(__dirname+'/../models/pages/banners.js') + , captchaPage = require(__dirname+'/../models/pages/captchapage.js') , captcha = require(__dirname+'/../models/pages/captcha.js') , thread = require(__dirname+'/../models/pages/thread.js'); @@ -30,6 +31,9 @@ router.get('/login.html', login); //registration page router.get('/register.html', register); +//captcha page +router.get('/captcha.html', captchaPage); + //change password page router.get('/changepassword.html', changePassword); @@ -42,7 +46,7 @@ router.get('/logout', isLoggedIn, (req, res, next) => { }); -// get captcha +// get captcha image and cookie router.get('/captcha', captcha); // random board banner diff --git a/gulp/res/css/style.css b/gulp/res/css/style.css index 39d6258f..85c43021 100644 --- a/gulp/res/css/style.css +++ b/gulp/res/css/style.css @@ -23,6 +23,7 @@ pre { font-family: inherit; margin: 1em 2em; white-space: pre-wrap; + word-break: break-word; } .replies { diff --git a/models/pages/captchapage.js b/models/pages/captchapage.js new file mode 100644 index 00000000..9e3e1052 --- /dev/null +++ b/models/pages/captchapage.js @@ -0,0 +1,16 @@ +'use strict'; + +const { buildCaptcha } = require(__dirname+'/../../build.js') + , uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js'); + +module.exports = async (req, res, next) => { + + try { + await buildCaptcha(); + } catch (err) { + return next(err); + } + + return res.sendFile(`${uploadDirectory}html/captcha.html`); + +} diff --git a/views/includes/actionfooter.pug b/views/includes/actionfooter.pug index 54c3997c..fb1449e5 100644 --- a/views/includes/actionfooter.pug +++ b/views/includes/actionfooter.pug @@ -54,6 +54,6 @@ details.toggle-label input#report(type='text', name='ban_reason', placeholder='ban reason' autocomplete='off') .actions h4.no-m-p Captcha: - img.captcha(src='/captcha' width=200 height=80) + iframe.captcha(src='/captcha.html' width=200 height=110 scrolling='no') input#captcha(type='text', name='captcha', autocomplete='off' placeholder='captcha text' maxlength='6') input(type='submit', value='submit') diff --git a/views/includes/postform.pug b/views/includes/postform.pug index 496f2f28..08a2f75f 100644 --- a/views/includes/postform.pug +++ b/views/includes/postform.pug @@ -5,7 +5,7 @@ section.form-wrapper.flex-center unless board.settings.forceAnon section.postform-row .postform-label Name - input#name(type='text', name='name', placeholder=board.defaultName autocomplete='off' maxlength='50') + input#name(type='text', name='name', placeholder=board.settings.defaultName autocomplete='off' maxlength='50') a.close.postform-style.ml-1(href='#!') X section.postform-row .postform-label Subject @@ -26,7 +26,7 @@ section.form-wrapper.flex-center input#title(type='text', name='subject', autocomplete='off' maxlength='50') section.postform-row .postform-label Message - textarea#message(name='message', rows='5', autocomplete='off' maxlength='2000') + textarea#message(name='message', rows='5', autocomplete='off' maxlength='4000') if board.settings.maxFiles !== 0 section.postform-row .postform-label Files @@ -41,6 +41,6 @@ section.form-wrapper.flex-center section.postform-row .postform-label Captcha .postform-col - img.captcha(src='/captcha' width=200 height=80) + iframe.captcha(src='/captcha.html' width=200 height=110 scrolling='no') input#captcha(type='text', name='captcha', autocomplete='off' placeholder='captcha text' maxlength='6') input(type='submit', value=`New ${threads ? 'Thread' : 'Reply'}`) diff --git a/views/pages/captcha.pug b/views/pages/captcha.pug new file mode 100644 index 00000000..35a2d954 --- /dev/null +++ b/views/pages/captcha.pug @@ -0,0 +1,8 @@ +doctype html +html + head + link(rel='stylesheet', href='/css/style.css') + body(style='margin:0;padding:0;background:white;') + img(src='/captcha', style='width:200px;height:80px;') + form(action='/forms/newcaptcha', method='POST') + input(style='width: 100%;border-width: 1px 0 0 0;', type='submit', value='New Captcha') diff --git a/views/pages/changepassword.pug b/views/pages/changepassword.pug index 1a217ec4..daba045a 100644 --- a/views/pages/changepassword.pug +++ b/views/pages/changepassword.pug @@ -22,6 +22,6 @@ block content section.postform-row .postform-label Captcha span.postform-col - img.captcha(src='/captcha' width=200 height=80) + iframe.captcha(src='/captcha.html' width=200 height=110 scrolling='no') input#captcha(type='text', name='captcha', autocomplete='off' placeholder='captcha text' maxlength='6') input(type='submit', value='Change Password') diff --git a/views/pages/register.pug b/views/pages/register.pug index e57f0c99..96f3c86e 100644 --- a/views/pages/register.pug +++ b/views/pages/register.pug @@ -19,7 +19,7 @@ block content section.postform-row .postform-label Captcha span.postform-col - img.captcha(src='/captcha' width=200 height=80) + iframe.captcha(src='/captcha.html' width=200 height=110 scrolling='no') input#captcha(type='text', name='captcha', autocomplete='off' placeholder='captcha text' maxlength='6') input(type='submit', value='Register') p Already have an account? #[a(href='/login.html') Login]