From 39f8ed78c811c0bd0f43bdf1b189d51098f1d373 Mon Sep 17 00:00:00 2001 From: fatchan Date: Sun, 12 May 2019 14:57:02 +0000 Subject: [PATCH] remove EXIF from images, delete temp files on upload, correct thread pruning to on new thread post, not new reply --- controllers/forms.js | 10 ++++++-- helpers/files/imageupload.js | 19 ++++++++++++++ .../files/{file-upload.js => videoupload.js} | 5 ++-- models/forms/make-post.js | 25 +++++++++++-------- models/forms/uploadbanners.js | 11 +++++--- 5 files changed, 50 insertions(+), 20 deletions(-) create mode 100644 helpers/files/imageupload.js rename helpers/files/{file-upload.js => videoupload.js} (52%) diff --git a/controllers/forms.js b/controllers/forms.js index e5875a27..b6884080 100644 --- a/controllers/forms.js +++ b/controllers/forms.js @@ -8,6 +8,7 @@ const express = require('express') , Trips = require(__dirname+'/../db/trips.js') , Bans = require(__dirname+'/../db/bans.js') , Mongo = require(__dirname+'/../db/db.js') + , remove = require('fs-extra').remove , deletePosts = require(__dirname+'/../models/forms/delete-post.js') , dismissGlobaReports = require(__dirname+'/../models/forms/dismissglobalreport.js') , banPoster = require(__dirname+'/../models/forms/ban-poster.js') @@ -174,7 +175,7 @@ router.post('/board/:board/post', Boards.exists, banCheck, paramConverter, verif 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)) { errors.push('Threads must include a file'); } if (!req.body.thread && res.locals.board.settings.forceOPMessage && (!req.body.message || req.body.message.length === 0)) { @@ -214,8 +215,13 @@ router.post('/board/:board/post', Boards.exists, banCheck, paramConverter, verif try { await makePost(req, res, next, numFiles); } catch (err) { + //handler errors here better if (numFiles > 0) { - const fileNames = req.files.file.map(file => file.filename); + const fileNames = [] + for (let i = 0; i < req.files.file.length; i++) { + await remove(req.files.file[i].tempFilePath).catch(e => console.error); + fileNames.push(file.filename); + } await deletePostFiles(fileNames).catch(err => console.error); } return next(err); diff --git a/helpers/files/imageupload.js b/helpers/files/imageupload.js new file mode 100644 index 00000000..310143f4 --- /dev/null +++ b/helpers/files/imageupload.js @@ -0,0 +1,19 @@ +'use strict'; + +const uploadDirectory = require(__dirname+'/../uploadDirectory.js') + , gm = require('@tohru/gm'); + +module.exports = (file, filename, folder) => { + + return new Promise((resolve, reject) => { + gm(file.tempFilePath) + .noProfile() + .write(`${uploadDirectory}${folder}/${filename}`, function (err) { + if (err) { + return reject(err); + } + return resolve(); + }); + }); + +}; diff --git a/helpers/files/file-upload.js b/helpers/files/videoupload.js similarity index 52% rename from helpers/files/file-upload.js rename to helpers/files/videoupload.js index 1bf7953b..a709d272 100644 --- a/helpers/files/file-upload.js +++ b/helpers/files/videoupload.js @@ -1,9 +1,8 @@ 'use strict'; -const configs = require(__dirname+'/../../configs/main.json') - , uploadDirectory = require(__dirname+'/../uploadDirectory.js'); +const uploadDirectory = require(__dirname+'/../uploadDirectory.js'); -module.exports = (req, res, file, filename, folder) => { +module.exports = (file, filename, folder) => { return new Promise((resolve, reject) => { file.mv(`${uploadDirectory}${folder}/${filename}`, function (err) { diff --git a/models/forms/make-post.js b/models/forms/make-post.js index 00991c73..a42989d9 100644 --- a/models/forms/make-post.js +++ b/models/forms/make-post.js @@ -21,7 +21,8 @@ const uuidv4 = require('uuid/v4') } , nameRegex = /^(?[^\s#]+)?(?:##(?[^ ]{1}[^\s#]+))?(?:## (?[^\s#]+))?$/ , permsCheck = require(__dirname+'/../../helpers/hasperms.js') - , fileUpload = require(__dirname+'/../../helpers/files/file-upload.js') + , imageUpload = require(__dirname+'/../../helpers/files/imageupload.js') + , videoUpload = require(__dirname+'/../../helpers/files/videoupload.js') , fileCheckMimeType = require(__dirname+'/../../helpers/files/file-check-mime-types.js') , imageThumbnail = require(__dirname+'/../../helpers/files/image-thumbnail.js') , imageIdentify = require(__dirname+'/../../helpers/files/image-identify.js') @@ -91,9 +92,6 @@ module.exports = async (req, res, next, numFiles) => { const filename = uuid + path.extname(file.name); file.filename = filename; //for error to delete failed files - //upload file - await fileUpload(req, res, file, filename, 'img'); - //get metadata let processedFile = { filename: filename, @@ -106,6 +104,7 @@ module.exports = async (req, res, next, numFiles) => { const mainType = file.mimetype.split('/')[0]; switch (mainType) { case 'image': + await imageUpload(file, filename, 'img'); const imageData = await imageIdentify(filename, 'img'); processedFile.geometry = imageData.size // object with width and height pixels processedFile.sizeString = formatSize(processedFile.size) // 123 Ki string @@ -114,6 +113,7 @@ module.exports = async (req, res, next, numFiles) => { break; case 'video': //video metadata + await videoUpload(file, filename, 'img'); const videoData = await videoIdentify(filename); processedFile.duration = videoData.format.duration; processedFile.durationString = new Date(videoData.format.duration*1000).toLocaleString('en-US', {hour12:false}).split(' ')[1].replace(/^00:/, ''); @@ -126,6 +126,9 @@ module.exports = async (req, res, next, numFiles) => { return next(err); } + //delete the temp file + await remove(file.tempFilePath); + //handle gifs with multiple geometry and size if (Array.isArray(processedFile.geometry)) { processedFile.geometry = processedFile.geometry[0]; @@ -137,6 +140,7 @@ module.exports = async (req, res, next, numFiles) => { processedFile.geometryString = processedFile.geometryString[0]; } files.push(processedFile); + } } @@ -230,12 +234,7 @@ module.exports = async (req, res, next, numFiles) => { //always need to rebuild catalog parallelPromises.push(buildCatalog(res.locals.board)); if (data.thread) { - //if we just added a new thread, prune any old ones - const prunedThreads = await Posts.pruneOldThreads(req.params.board, res.locals.board.settings.threadLimit); - for (let i = 0; i < prunedThreads.length; i++) { - parallelPromises.push(remove(`${uploadDirectory}html/${req.params.board}/thread/${prunedThreads[i]}.html`)); - } - //refresh the thread itself + //new reply, so build the thread first parallelPromises.push(buildThread(thread.postId, res.locals.board)); //refersh pages const threadPage = await Posts.getThreadPage(req.params.board, thread); @@ -247,7 +246,11 @@ module.exports = async (req, res, next, numFiles) => { parallelPromises.push(buildBoardMultiple(res.locals.board, 1, threadPage)); } } else { - //new thread, rebuild all pages + //new thread, rebuild all pages and prune old threads + const prunedThreads = await Posts.pruneOldThreads(req.params.board, res.locals.board.settings.threadLimit); + for (let i = 0; i < prunedThreads.length; i++) { + parallelPromises.push(remove(`${uploadDirectory}html/${req.params.board}/thread/${prunedThreads[i]}.html`)); + } parallelPromises.push(buildBoardMultiple(res.locals.board, 1, 10)); } await Promise.all(parallelPromises); diff --git a/models/forms/uploadbanners.js b/models/forms/uploadbanners.js index b3f40416..64f97378 100644 --- a/models/forms/uploadbanners.js +++ b/models/forms/uploadbanners.js @@ -2,8 +2,9 @@ const uuidv4 = require('uuid/v4') , path = require('path') + , remove = require('fs-extra').remove , uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js') - , fileUpload = require(__dirname+'/../../helpers/files/file-upload.js') + , imageUpload = require(__dirname+'/../../helpers/files/imageupload.js') , fileCheckMimeType = require(__dirname+'/../../helpers/files/file-check-mime-types.js') , deleteFailedFiles = require(__dirname+'/../../helpers/files/deletefailed.js') , imageIdentify = require(__dirname+'/../../helpers/files/image-identify.js') @@ -35,9 +36,10 @@ module.exports = async (req, res, next, numFiles) => { // try to save try { //upload it - await fileUpload(req, res, file, filename, 'banner'); + await imageUpload(file, filename, 'banner'); const imageData = await imageIdentify(filename, 'banner'); const geometry = imageData.size; + await remove(file.tempFilePath); //make sure its 300x100 banner if (geometry.width !== 300 || geometry.height !== 100) { await deleteFailedFiles(filenames, 'banner'); @@ -48,8 +50,9 @@ module.exports = async (req, res, next, numFiles) => { }); } } catch (err) { - //TODO: this better - await deleteFailedFiles(filenames, 'banner'); + //TODO: this better, catch errors some how + await remove(file.tempFilePath).catch(e => console.error); + await deleteFailedFiles(filenames, 'banner').catch(e => console.error); return next(err); } }