rj1
about | log | files | refs | license
commit 2b973552b981d0822f814ce3d8d83971c36834b7
parent 293bb727ed002ebc80f00f49e610417f380aee16
author: rj1 <[email protected]>
date:   Wed, 17 Aug 2022 13:08:42 -0500

added filetype detection

Diffstat:
Mupload.js | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 83 insertions(+), 9 deletions(-)

diff --git a/upload.js b/upload.js @@ -2,23 +2,20 @@ browser.contextMenus.create({ title: "Upload image [POST]", contexts: ["image"], onclick: function(info, tab) { - // get the image from cache: var download = new XMLHttpRequest(); download.onload = function() { - var filename = info.srcUrl.split(/[\\/]/).pop(); + var og_filename = info.srcUrl.split(/[\\/]/).pop(); // maybe we'll use this later - // if filename has no extension, add .png to it - // TODO: detect filetype and add the proper extension - if(filename == filename.split('.')) { - filename = filename + '.png'; - } + formatDetect(download.response, function(extension) { + filename = makeid(5) + '.' + extension; + }); var fd = new FormData(); fd.append("files[]", download.response, filename); var upload = new XMLHttpRequest(); upload.responseType = 'json'; - upload.onload = function() { + upload.onload = function() { url = upload.response.files[0].url; browser.tabs.create({url: url}); } @@ -26,11 +23,88 @@ browser.contextMenus.create({ // upload image upload.open('POST', 'https://uguu.se/upload.php'); upload.send(fd); + }; - // get uguu url + download.responseType = 'blob'; download.open('GET', info.srcUrl); download.send(); } }); +function makeid(length) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * + charactersLength)); + } + return result; +} + +function formatDetect(file, callback) { + // https://mimesniff.spec.whatwg.org/#matching-an-image-type-pattern + var mimes = [ + { + mime: 'image/jpeg', + extension: 'jpg', + pattern: [0xFF, 0xD8, 0xFF], + mask: [0xFF, 0xFF, 0xFF] + }, + { + mime: 'image/png', + extension: 'png', + pattern: [0x89, 0x50, 0x4E, 0x47], + mask: [0xFF, 0xFF, 0xFF, 0xFF] + }, + { + mime: 'image/webp', + extension: 'webp', + pattern: [0x52, 0x49, 0x46, 0x46], + mask: [0xFF, 0xFF, 0xFF, 0xFF] + }, + { + mime: 'image/gif', + extension: 'gif', + pattern: [0x47, 0x49, 0x46, 0x38], + mask: [0xFF, 0xFF, 0xFF, 0xFF] + }, + { + mime: 'image/svg+xml', + extension: 'svg', + pattern: [0x3c, 0x3f, 0x78, 0x6d], + mask: [0xFF, 0xFF, 0xFF, 0xFF] + } + ]; + + function check(bytes, mime) { + for(var i = 0, l = mime.mask.length; i < l; ++i) { + if((bytes[i] & mime.mask[i]) - mime.pattern[i] !== 0) { + return false; + } + } + return true; + } + + var blob = file.slice(0, 4); + + var reader = new FileReader(); + reader.onloadend = function(e) { + if(e.target.readyState === FileReader.DONE) { + var bytes = new Uint8Array(e.target.result); + + for(var i=0, l = mimes.length; i<l; ++i) { + if(check(bytes, mimes[i])) { + // return the proper extension for the file + return callback(mimes[i].extension) + } + } + + // return a default extension + return callback('png'); + } + }; + reader.readAsArrayBuffer(blob); +} +