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')
, 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);

@ -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';
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) {

@ -21,7 +21,8 @@ const uuidv4 = require('uuid/v4')
}
, nameRegex = /^(?<name>[^\s#]+)?(?:##(?<tripcode>[^ ]{1}[^\s#]+))?(?:## (?<capcode>[^\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);

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

Loading…
Cancel
Save