Prevent using images larger than 25MB, automatically cancel request after 15 seconds

This commit is contained in:
TheEssem 2020-07-16 19:53:44 -05:00
parent 7100c408b9
commit 710dfdcf84
3 changed files with 29 additions and 3 deletions

13
package-lock.json generated
View file

@ -73,6 +73,14 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.20.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.20.tgz",
"integrity": "sha512-MRn/NP3dee8yL5QhbSA6riuwkS+UOcsPUMOIOG3KMUQpuor/2TopdRBu8QaaB4fGU+gz/bzyDWt0FtUbeJ8H1A==" "integrity": "sha512-MRn/NP3dee8yL5QhbSA6riuwkS+UOcsPUMOIOG3KMUQpuor/2TopdRBu8QaaB4fGU+gz/bzyDWt0FtUbeJ8H1A=="
}, },
"abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"requires": {
"event-target-shim": "^5.0.0"
}
},
"acorn": { "acorn": {
"version": "6.4.1", "version": "6.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
@ -843,6 +851,11 @@
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
"dev": true "dev": true
}, },
"event-target-shim": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
},
"expand-template": { "expand-template": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",

View file

@ -19,6 +19,7 @@
}, },
"dependencies": { "dependencies": {
"@lavacord/eris": "0.0.3", "@lavacord/eris": "0.0.3",
"abort-controller": "^3.0.0",
"cowsay": "^1.4.0", "cowsay": "^1.4.0",
"cron": "^1.8.2", "cron": "^1.8.2",
"dblapi.js": "^2.4.0", "dblapi.js": "^2.4.0",

View file

@ -1,4 +1,5 @@
const fetch = require("node-fetch"); const fetch = require("node-fetch");
const AbortController = require("abort-controller");
const fileType = require("file-type"); const fileType = require("file-type");
const { promisify } = require("util"); const { promisify } = require("util");
const writeFile = promisify(require("fs").writeFile); const writeFile = promisify(require("fs").writeFile);
@ -8,9 +9,14 @@ const urlRegex = /(?:\w+:)?\/\/(\S+)/;
// this checks if the file is, in fact, an image // this checks if the file is, in fact, an image
const typeCheck = async (image, image2, gifv = false) => { const typeCheck = async (image, image2, gifv = false) => {
// download the file to a buffer // download the file to a buffer
const imageRequest = await fetch(image); const controller = new AbortController();
const imageBuffer = await imageRequest.buffer(); const timeout = setTimeout(() => {
controller.abort();
}, 15000);
try { try {
const imageRequest = await fetch(image, { signal: controller.signal });
const imageBuffer = await imageRequest.buffer();
if (imageBuffer.size >= 25 * 1024 * 1024) return;
// get the file type // get the file type
const imageType = await fileType.fromBuffer(imageBuffer); const imageType = await fileType.fromBuffer(imageBuffer);
// check if the file is a jpeg, png, or webp // check if the file is a jpeg, png, or webp
@ -33,8 +39,14 @@ const typeCheck = async (image, image2, gifv = false) => {
return false; return false;
} }
} catch (error) { } catch (error) {
if (error.name === "AbortError") {
throw Error("Timed out");
} else {
throw error; throw error;
} }
} finally {
clearTimeout(timeout);
}
}; };
// this checks for the latest message containing an image and returns the url of the image // this checks for the latest message containing an image and returns the url of the image