overleaf/services/web/app/src/Features/FileStore/FileStoreController.js

77 lines
2.5 KiB
JavaScript
Raw Normal View History

/* eslint-disable
camelcase,
max-len,
no-unused-vars,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const logger = require('logger-sharelatex')
const FileStoreHandler = require('./FileStoreHandler')
const ProjectLocator = require('../Project/ProjectLocator')
const _ = require('underscore')
const is_mobile_safari = user_agent =>
user_agent &&
(user_agent.indexOf('iPhone') >= 0 || user_agent.indexOf('iPad') >= 0)
const is_html = function(file) {
const ends_with = ext =>
file.name != null &&
file.name.length > ext.length &&
file.name.lastIndexOf(ext) === file.name.length - ext.length
return ends_with('.html') || ends_with('.htm') || ends_with('.xhtml')
}
module.exports = {
getFile(req, res) {
const project_id = req.params.Project_id
const file_id = req.params.File_id
const queryString = req.query
const user_agent = req.get('User-Agent')
logger.log({ project_id, file_id, queryString }, 'file download')
return ProjectLocator.findElement(
{ project_id, element_id: file_id, type: 'file' },
function(err, file) {
if (err != null) {
logger.err(
{ err, project_id, file_id, queryString },
'error finding element for downloading file'
)
return res.sendStatus(500)
}
return FileStoreHandler.getFileStream(
project_id,
file_id,
queryString,
function(err, stream) {
if (err != null) {
logger.err(
{ err, project_id, file_id, queryString },
'error getting file stream for downloading file'
)
return res.sendStatus(500)
}
// mobile safari will try to render html files, prevent this
if (is_mobile_safari(user_agent) && is_html(file)) {
logger.log(
{ filename: file.name, user_agent },
'sending html file to mobile-safari as plain text'
)
res.setHeader('Content-Type', 'text/plain')
}
res.setContentDisposition('attachment', { filename: file.name })
return stream.pipe(res)
}
)
}
)
}
}