diff options
Diffstat (limited to 'lib/web/imageRouter')
-rw-r--r-- | lib/web/imageRouter/imgur.js | 30 | ||||
-rw-r--r-- | lib/web/imageRouter/index.js | 19 |
2 files changed, 41 insertions, 8 deletions
diff --git a/lib/web/imageRouter/imgur.js b/lib/web/imageRouter/imgur.js index dcb03a7a..ed0e1182 100644 --- a/lib/web/imageRouter/imgur.js +++ b/lib/web/imageRouter/imgur.js @@ -1,8 +1,8 @@ 'use strict' const config = require('../../config') const logger = require('../../logger') - -const imgur = require('imgur') +const fs = require('fs') +const fetch = require('node-fetch') exports.uploadImage = function (imagePath, callback) { if (!callback || typeof callback !== 'function') { @@ -15,12 +15,30 @@ exports.uploadImage = function (imagePath, callback) { return } - imgur.setClientId(config.imgur.clientID) - imgur.uploadFile(imagePath) - .then(function (json) { + // The following client ID is for use with HedgeDoc only + const clientId = config.imgur.clientID || '032aa2f687790cd' + + const buffer = fs.readFileSync(imagePath) + + const params = new URLSearchParams() + params.append('image', buffer.toString('base64')) + params.append('type', 'base64') + fetch('https://api.imgur.com/3/image', { + method: 'POST', + body: params, + headers: { Authorization: `Client-ID ${clientId}` } + }) + .then((res) => { + if (!res.ok) { + callback(new Error(res.statusText), null) + return + } + return res.json() + }) + .then((json) => { logger.debug(`SERVER uploadimage success: ${JSON.stringify(json)}`) callback(null, json.data.link.replace(/^http:\/\//i, 'https://')) - }).catch(function (err) { + }).catch((err) => { callback(new Error(err), null) }) } diff --git a/lib/web/imageRouter/index.js b/lib/web/imageRouter/index.js index 0a72c65c..ee123867 100644 --- a/lib/web/imageRouter/index.js +++ b/lib/web/imageRouter/index.js @@ -7,6 +7,7 @@ const FileType = require('file-type') const fs = require('fs') const os = require('os') const rimraf = require('rimraf') +const isSvg = require('is-svg') const config = require('../../config') const logger = require('../../logger') @@ -15,12 +16,26 @@ const errors = require('../../errors') const imageRouter = (module.exports = Router()) async function checkUploadType (filePath) { - const typeFromMagic = await FileType.fromFile(filePath) + const extension = path.extname(filePath).toLowerCase() + let typeFromMagic = await FileType.fromFile(filePath) + if (extension === '.svg' && (typeFromMagic === undefined || typeFromMagic.mime === 'application/xml')) { + const fileContent = fs.readFileSync(filePath) + if (isSvg(fileContent)) { + typeFromMagic = { + ext: 'svg', + mime: 'image/svg+xml' + } + } + } if (typeFromMagic === undefined) { logger.error('Image upload error: Could not determine MIME-type') return false } - if (path.extname(filePath) !== '.' + typeFromMagic.ext) { + // .jpeg, .jfif, .jpe files are identified by FileType to have the extension jpg + if (['.jpeg', '.jfif', '.jpe'].includes(extension) && typeFromMagic.ext === 'jpg') { + typeFromMagic.ext = extension.substr(1) + } + if (extension !== '.' + typeFromMagic.ext) { logger.error( 'Image upload error: Provided file extension does not match MIME-type' ) |