remove EXIF from images, delete temp files on upload, correct thread pruning to on new thread post, not new reply

merge-requests/208/head
fatchan 5 years ago
parent cca0f4264c
commit 39f8ed78c8
  1. 10
      controllers/forms.js
  2. 19
      helpers/files/imageupload.js
  3. 5
      helpers/files/videoupload.js
  4. 25
      models/forms/make-post.js
  5. 11
      models/forms/uploadbanners.js

@ -8,6 +8,7 @@ const express = require('express')
, Trips = require(__dirname+'/../db/trips.js') , Trips = require(__dirname+'/../db/trips.js')
, Bans = require(__dirname+'/../db/bans.js') , Bans = require(__dirname+'/../db/bans.js')
, Mongo = require(__dirname+'/../db/db.js') , Mongo = require(__dirname+'/../db/db.js')
, remove = require('fs-extra').remove
, deletePosts = require(__dirname+'/../models/forms/delete-post.js') , deletePosts = require(__dirname+'/../models/forms/delete-post.js')
, dismissGlobaReports = require(__dirname+'/../models/forms/dismissglobalreport.js') , dismissGlobaReports = require(__dirname+'/../models/forms/dismissglobalreport.js')
, banPoster = require(__dirname+'/../models/forms/ban-poster.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) { if (!req.body.message && numFiles === 0) {
errors.push('Must provide a message or file'); 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'); errors.push('Threads must include a file');
} }
if (!req.body.thread && res.locals.board.settings.forceOPMessage && (!req.body.message || req.body.message.length === 0)) { 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 { try {
await makePost(req, res, next, numFiles); await makePost(req, res, next, numFiles);
} catch (err) { } catch (err) {
//handler errors here better
if (numFiles > 0) { 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); await deletePostFiles(fileNames).catch(err => console.error);
} }
return next(err); return next(err);

@ -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();
});
});
};

@ -1,9 +1,8 @@
'use strict'; 'use strict';
const configs = require(__dirname+'/../../configs/main.json') const uploadDirectory = require(__dirname+'/../uploadDirectory.js');
, uploadDirectory = require(__dirname+'/../uploadDirectory.js');
module.exports = (req, res, file, filename, folder) => { module.exports = (file, filename, folder) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
file.mv(`${uploadDirectory}${folder}/${filename}`, function (err) { file.mv(`${uploadDirectory}${folder}/${filename}`, function (err) {

@ -21,7 +21,8 @@ const uuidv4 = require('uuid/v4')
} }
, nameRegex = /^(?<name>[^\s#]+)?(?:##(?<tripcode>[^ ]{1}[^\s#]+))?(?:## (?<capcode>[^\s#]+))?$/ , nameRegex = /^(?<name>[^\s#]+)?(?:##(?<tripcode>[^ ]{1}[^\s#]+))?(?:## (?<capcode>[^\s#]+))?$/
, permsCheck = require(__dirname+'/../../helpers/hasperms.js') , 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') , fileCheckMimeType = require(__dirname+'/../../helpers/files/file-check-mime-types.js')
, imageThumbnail = require(__dirname+'/../../helpers/files/image-thumbnail.js') , imageThumbnail = require(__dirname+'/../../helpers/files/image-thumbnail.js')
, imageIdentify = require(__dirname+'/../../helpers/files/image-identify.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); const filename = uuid + path.extname(file.name);
file.filename = filename; //for error to delete failed files file.filename = filename; //for error to delete failed files
//upload file
await fileUpload(req, res, file, filename, 'img');
//get metadata //get metadata
let processedFile = { let processedFile = {
filename: filename, filename: filename,
@ -106,6 +104,7 @@ module.exports = async (req, res, next, numFiles) => {
const mainType = file.mimetype.split('/')[0]; const mainType = file.mimetype.split('/')[0];
switch (mainType) { switch (mainType) {
case 'image': case 'image':
await imageUpload(file, filename, 'img');
const imageData = await imageIdentify(filename, 'img'); const imageData = await imageIdentify(filename, 'img');
processedFile.geometry = imageData.size // object with width and height pixels processedFile.geometry = imageData.size // object with width and height pixels
processedFile.sizeString = formatSize(processedFile.size) // 123 Ki string processedFile.sizeString = formatSize(processedFile.size) // 123 Ki string
@ -114,6 +113,7 @@ module.exports = async (req, res, next, numFiles) => {
break; break;
case 'video': case 'video':
//video metadata //video metadata
await videoUpload(file, filename, 'img');
const videoData = await videoIdentify(filename); const videoData = await videoIdentify(filename);
processedFile.duration = videoData.format.duration; processedFile.duration = videoData.format.duration;
processedFile.durationString = new Date(videoData.format.duration*1000).toLocaleString('en-US', {hour12:false}).split(' ')[1].replace(/^00:/, ''); 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); return next(err);
} }
//delete the temp file
await remove(file.tempFilePath);
//handle gifs with multiple geometry and size //handle gifs with multiple geometry and size
if (Array.isArray(processedFile.geometry)) { if (Array.isArray(processedFile.geometry)) {
processedFile.geometry = processedFile.geometry[0]; processedFile.geometry = processedFile.geometry[0];
@ -137,6 +140,7 @@ module.exports = async (req, res, next, numFiles) => {
processedFile.geometryString = processedFile.geometryString[0]; processedFile.geometryString = processedFile.geometryString[0];
} }
files.push(processedFile); files.push(processedFile);
} }
} }
@ -230,12 +234,7 @@ module.exports = async (req, res, next, numFiles) => {
//always need to rebuild catalog //always need to rebuild catalog
parallelPromises.push(buildCatalog(res.locals.board)); parallelPromises.push(buildCatalog(res.locals.board));
if (data.thread) { if (data.thread) {
//if we just added a new thread, prune any old ones //new reply, so build the thread first
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
parallelPromises.push(buildThread(thread.postId, res.locals.board)); parallelPromises.push(buildThread(thread.postId, res.locals.board));
//refersh pages //refersh pages
const threadPage = await Posts.getThreadPage(req.params.board, thread); 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)); parallelPromises.push(buildBoardMultiple(res.locals.board, 1, threadPage));
} }
} else { } 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)); parallelPromises.push(buildBoardMultiple(res.locals.board, 1, 10));
} }
await Promise.all(parallelPromises); await Promise.all(parallelPromises);

@ -2,8 +2,9 @@
const uuidv4 = require('uuid/v4') const uuidv4 = require('uuid/v4')
, path = require('path') , path = require('path')
, remove = require('fs-extra').remove
, uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js') , 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') , fileCheckMimeType = require(__dirname+'/../../helpers/files/file-check-mime-types.js')
, deleteFailedFiles = require(__dirname+'/../../helpers/files/deletefailed.js') , deleteFailedFiles = require(__dirname+'/../../helpers/files/deletefailed.js')
, imageIdentify = require(__dirname+'/../../helpers/files/image-identify.js') , imageIdentify = require(__dirname+'/../../helpers/files/image-identify.js')
@ -35,9 +36,10 @@ module.exports = async (req, res, next, numFiles) => {
// try to save // try to save
try { try {
//upload it //upload it
await fileUpload(req, res, file, filename, 'banner'); await imageUpload(file, filename, 'banner');
const imageData = await imageIdentify(filename, 'banner'); const imageData = await imageIdentify(filename, 'banner');
const geometry = imageData.size; const geometry = imageData.size;
await remove(file.tempFilePath);
//make sure its 300x100 banner //make sure its 300x100 banner
if (geometry.width !== 300 || geometry.height !== 100) { if (geometry.width !== 300 || geometry.height !== 100) {
await deleteFailedFiles(filenames, 'banner'); await deleteFailedFiles(filenames, 'banner');
@ -48,8 +50,9 @@ module.exports = async (req, res, next, numFiles) => {
}); });
} }
} catch (err) { } catch (err) {
//TODO: this better //TODO: this better, catch errors some how
await deleteFailedFiles(filenames, 'banner'); await remove(file.tempFilePath).catch(e => console.error);
await deleteFailedFiles(filenames, 'banner').catch(e => console.error);
return next(err); return next(err);
} }
} }

Loading…
Cancel
Save