From 2b7bdb26242c1f8bf768b2a926919e0825652299 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Mon, 9 Dec 2024 14:51:05 +0000 Subject: [PATCH] Merge pull request #22391 from overleaf/bg-issue22370 Provide fallback in web for requests to file urls GitOrigin-RevId: 793e8e138a08e28e097ac6dd0503333cc17375ab --- .../src/Features/History/HistoryController.js | 29 +++++++++++++++++++ services/web/app/src/router.mjs | 2 ++ 2 files changed, 31 insertions(+) diff --git a/services/web/app/src/Features/History/HistoryController.js b/services/web/app/src/Features/History/HistoryController.js index fe7cbe2c1d..19dfb3eb21 100644 --- a/services/web/app/src/Features/History/HistoryController.js +++ b/services/web/app/src/Features/History/HistoryController.js @@ -2,6 +2,7 @@ let HistoryController const OError = require('@overleaf/o-error') const async = require('async') const logger = require('@overleaf/logger') +const metrics = require('@overleaf/metrics') const request = require('request') const settings = require('@overleaf/settings') const SessionManager = require('../Authentication/SessionManager') @@ -11,6 +12,7 @@ const Errors = require('../Errors/Errors') const HistoryManager = require('./HistoryManager') const ProjectDetailsHandler = require('../Project/ProjectDetailsHandler') const ProjectEntityUpdateHandler = require('../Project/ProjectEntityUpdateHandler') +const ProjectLocator = require('../Project/ProjectLocator') const RestoreManager = require('./RestoreManager') const { pipeline } = require('stream') const Stream = require('stream') @@ -68,6 +70,33 @@ module.exports = HistoryController = { getBlob: expressify(getBlob), headBlob: expressify(headBlob), + /** Middleware to translate fileId requests to use the blob API. + * + * e.g. incoming requests to /project/:project_id/file/:file_id are + * internally redirected to /project/:project_id/blob/:hash if the file + * has a hash. + * */ + fileToBlobRedirectMiddleware(req, res, next) { + const projectId = req.params.Project_id + const fileId = req.params.File_id + ProjectLocator.findElement( + { project_id: projectId, element_id: fileId, type: 'file' }, + (err, file) => { + if (err) { + return next(err) + } + if (file?.hash) { + req.url = `/project/${projectId}/blob/${file.hash}` + } + metrics.inc('fileToBlobRedirectMiddleware', 1, { + method: req.method, + status: Boolean(file?.hash), + }) + next() + } + ) + }, + proxyToHistoryApi(req, res, next) { const userId = SessionManager.getLoggedInUserId(req.session) const url = settings.apis.project_history.url + req.url diff --git a/services/web/app/src/router.mjs b/services/web/app/src/router.mjs index 6e920d9dc9..2ec36f55ee 100644 --- a/services/web/app/src/router.mjs +++ b/services/web/app/src/router.mjs @@ -543,11 +543,13 @@ async function initialize(webRouter, privateApiRouter, publicApiRouter) { webRouter.head( '/Project/:Project_id/file/:File_id', AuthorizationMiddleware.ensureUserCanReadProject, + HistoryController.fileToBlobRedirectMiddleware, FileStoreController.getFileHead ) webRouter.get( '/Project/:Project_id/file/:File_id', AuthorizationMiddleware.ensureUserCanReadProject, + HistoryController.fileToBlobRedirectMiddleware, FileStoreController.getFile ) webRouter.head(