diff --git a/controllers/forms.js b/controllers/forms.js index 23726a8e..1abac162 100644 --- a/controllers/forms.js +++ b/controllers/forms.js @@ -54,9 +54,9 @@ const express = require('express') , logout = require(__dirname+'/../models/forms/logout.js'); //make new post -router.post('/board/:board/post', geoAndTor, fileMiddlewares.handlePostFilesEarlyTor, torPreBypassCheck, processIp, useSession, sessionRefresh, Boards.exists, calcPerms, banCheck, fileMiddlewares.handlePostFiles, +router.post('/board/:board/post', geoAndTor, fileMiddlewares.postsEarly, torPreBypassCheck, processIp, useSession, sessionRefresh, Boards.exists, calcPerms, banCheck, fileMiddlewares.posts, paramConverter, verifyCaptcha, numFiles, blockBypassCheck, dnsblCheck, imageHashes, makePostController); -router.post('/board/:board/modpost', geoAndTor, fileMiddlewares.handlePostFilesEarlyTor, torPreBypassCheck, processIp, useSession, sessionRefresh, Boards.exists, calcPerms, banCheck, isLoggedIn, hasPerms(3), fileMiddlewares.handlePostFiles, +router.post('/board/:board/modpost', geoAndTor, fileMiddlewares.postsEarly, torPreBypassCheck, processIp, useSession, sessionRefresh, Boards.exists, calcPerms, banCheck, isLoggedIn, hasPerms(3), fileMiddlewares.posts, paramConverter, csrf, numFiles, blockBypassCheck, dnsblCheck, makePostController); //mod post has token instead of captcha //post actions @@ -71,9 +71,9 @@ router.post('/editpost', geoAndTor, torPreBypassCheck, processIp, useSession, se //board management forms router.post('/board/:board/transfer', useSession, sessionRefresh, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, transferController); router.post('/board/:board/settings', useSession, sessionRefresh, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, boardSettingsController); -router.post('/board/:board/addbanners', useSession, sessionRefresh, fileMiddlewares.handleBannerFiles, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, numFiles, uploadBannersController); //add banners +router.post('/board/:board/addbanners', useSession, sessionRefresh, fileMiddlewares.banner, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, numFiles, uploadBannersController); //add banners router.post('/board/:board/deletebanners', useSession, sessionRefresh, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, deleteBannersController); //delete banners -router.post('/board/:board/addflags', useSession, sessionRefresh, fileMiddlewares.handleFlagFiles, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, numFiles, addFlagsController); //add flags +router.post('/board/:board/addflags', useSession, sessionRefresh, fileMiddlewares.flag, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, numFiles, addFlagsController); //add flags router.post('/board/:board/deleteflags', useSession, sessionRefresh, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, deleteFlagsController); //delete flags router.post('/board/:board/addcustompages', useSession, sessionRefresh, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, addCustomPageController); //add banners router.post('/board/:board/deletecustompages', useSession, sessionRefresh, csrf, Boards.exists, calcPerms, isLoggedIn, hasPerms(2), paramConverter, deleteCustomPageController); //delete banners diff --git a/helpers/filemiddlewares.js b/helpers/filemiddlewares.js index 1fdd0e8b..67891163 100644 --- a/helpers/filemiddlewares.js +++ b/helpers/filemiddlewares.js @@ -3,120 +3,67 @@ const { debugLogs } = require(__dirname+'/../configs/secrets.js') , dynamicResponse = require(__dirname+'/dynamic.js') , { addCallback } = require(__dirname+'/../redis.js') - , upload = require('express-fileupload'); - -let postFiles, - uploadLimitFunction, - handleBannerFiles, - handleFlagFiles, - numFilesUploadLimitFunction, - numFlagsUploadLimitFunction, - numBannersUploadLimitFunction; - -const updateHandlers = () => { - //this thing is kinda gross - const { globalLimits, filterFileNames, spaceFileNameReplacement } = require(__dirname+'/../config.js').get - uploadLimitFunction = (req, res, next) => { + , upload = require('express-fileupload') + , fileHandlers = {} + , fileSizeLimitFunction = (req, res, next) => { return dynamicResponse(req, res, 413, 'message', { 'title': 'Payload Too Large', 'message': 'Your upload was too large', 'redirect': req.headers.referer }); - }; - numFilesUploadLimitFunction = (req, res, next) => { - return dynamicResponse(req, res, 400, 'message', { - 'title': 'Too many files', - 'message': res.locals.board ? `Max files per post ${res.locals.board.settings.maxFiles < globalLimits.postFiles.max ? 'on this board ' : ''}is ${res.locals.board.settings.maxFiles}` - : `Max files per request is ${globalLimits.postFiles.max}`, //because of difference in TOR body parsing, we dont populate res.locals.board at this point. something to address later. - 'redirect': req.headers.referer - }); - }; - numBannersUploadLimitFunction = (req, res, next) => { - return dynamicResponse(req, res, 400, 'message', { - 'title': 'Too many files', - 'message': `Max banners per request is ${globalLimits.bannerFiles.max}`, - 'redirect': req.headers.referer - }); - }; - numFlagsUploadLimitFunction = (req, res, next) => { - return dynamicResponse(req, res, 400, 'message', { - 'title': 'Too many files', - 'message': `Max banners per request is ${globalLimits.flagFiles.max}`, - 'redirect': req.headers.referer + } + , updateHandlers = () => { + const { globalLimits, filterFileNames, spaceFileNameReplacement } = require(__dirname+'/../config.js').get; + ['flag', 'banner', 'post'].forEach(fileType => { + //one day this will be more easy to extend + const fileSizeLimit = globalLimits[`${fileType}FilesSize`]; + const fileNumLimit = globalLimits[`${fileType}Files`]; + const fileNumLimitFunction = (req, res, next) => { + return dynamicResponse(req, res, 400, 'message', { + 'title': 'Too many files', + 'message': (req.path.endsWith('/post') && res.locals.board) ? `Max files per post ${res.locals.board.settings.maxFiles < globalLimits.postFiles.max ? 'on this board ' : ''}is ${res.locals.board.settings.maxFiles}` + : `Max files per request is ${fileNumLimit.max}`, + 'redirect': req.headers.referer + }); + }; + fileHandlers[fileType] = upload({ + debug: debugLogs, + createParentPath: true, + safeFileNames: filterFileNames, + spaceFileNameReplacement, + preserveExtension: 4, + limits: { + totalSize: fileSizeLimit.max, + fileSize: fileSizeLimit.max, + files: fileNumLimit.max, + }, + numFilesLimitHandler: fileNumLimitFunction, + limitHandler: fileSizeLimitFunction, + useTempFiles: true, + tempFileDir: __dirname+'/../tmp/' + }); + module.exports[fileType] = fileHandlers[fileType]; }); }; - handleBannerFiles = upload({ - debug: debugLogs, - createParentPath: true, - safeFileNames: filterFileNames, - spaceFileNameReplacement, - preserveExtension: 4, - limits: { - totalSize: globalLimits.bannerFilesSize.max, - fileSize: globalLimits.bannerFilesSize.max, - files: globalLimits.bannerFiles.max - }, - numFilesLimitHandler: numBannersUploadLimitFunction, - limitHandler: uploadLimitFunction, - useTempFiles: true, - tempFileDir: __dirname+'/../tmp/' - }); - module.exports.handleBannerFiles = handleBannerFiles; - handleFlagFiles = upload({ - debug: debugLogs, - createParentPath: true, - safeFileNames: filterFileNames, - spaceFileNameReplacement, - preserveExtension: 4, - limits: { - totalSize: globalLimits.flagFilesSize.max, - fileSize: globalLimits.flagFilesSize.max, - files: globalLimits.flagFiles.max - }, - numFilesLimitHandler: numFlagsUploadLimitFunction, - limitHandler: uploadLimitFunction, - useTempFiles: true, - tempFileDir: __dirname+'/../tmp/' - }); - module.exports.handleFlagFiles = handleFlagFiles; - postFiles = upload({ - debug: debugLogs, - createParentPath: true, - safeFileNames: filterFileNames, - spaceFileNameReplacement, - preserveExtension: 4, - limits: { - totalSize: globalLimits.postFilesSize.max, - fileSize: globalLimits.postFilesSize.max, - files: globalLimits.postFiles.max - }, - numFilesLimitHandler: numFilesUploadLimitFunction, - limitHandler: uploadLimitFunction, - useTempFiles: true, - tempFileDir: __dirname+'/../tmp/' - }); -}; updateHandlers(); addCallback('config', updateHandlers); module.exports = { - handleBannerFiles, - handleFlagFiles, - - handlePostFilesEarlyTor: (req, res, next) => { + banner: fileHandlers.banner, + flag: fileHandlers.flag, + posts: (req, res, next) => { if (res.locals.anonymizer) { - return postFiles(req, res, next); + return next(); } - return next(); + return fileHandlers.post(req, res, next); }, - - handlePostFiles: (req, res, next) => { + postsEarly: (req, res, next) => { if (res.locals.anonymizer) { - return next(); + return fileHandlers.post(req, res, next); } - return postFiles(req, res, next); + return next(); }, -} +};