diff --git a/app.coffee b/app.coffee index 44d3157..dd2bae5 100644 --- a/app.coffee +++ b/app.coffee @@ -36,7 +36,24 @@ app.delete "/project/:project_id", CompileController.clearCache app.get "/project/:project_id/sync/code", CompileController.syncFromCode app.get "/project/:project_id/sync/pdf", CompileController.syncFromPdf -staticServer = express.static Settings.path.compilesDir, setHeaders: (res, path, stat) -> +url = require "url" + +staticForbidSymLinks = (root, options) -> + expressStatic = express.static root, options + basePath = Path.resolve(root) + return (req, res, next) -> + path = url.parse(req.url).pathname + requestedFsPath = Path.normalize("#{basePath}/#{path}") + fs.realpath requestedFsPath, (err, realFsPath)-> + if err? + return res.send(500) + else if requestedFsPath != realFsPath + logger.warn requestedFsPath:requestedFsPath, realFsPath:realFsPath, path: req.params[0], project_id: req.params.project_id, "trying to access a different file (symlink), aborting" + return res.send(404) + else + expressStatic(req, res, next) + +staticServer = staticForbidSymLinks Settings.path.compilesDir, setHeaders: (res, path, stat) -> if Path.basename(path) == "output.pdf" res.set("Content-Type", "application/pdf") # Calculate an etag in the same way as nginx @@ -51,7 +68,10 @@ staticServer = express.static Settings.path.compilesDir, setHeaders: (res, path, res.set("Content-Type", "text/plain") app.get "/project/:project_id/output/*", require("./app/js/SymlinkCheckerMiddlewear"), (req, res, next) -> - req.url = "/#{req.params.project_id}/#{req.params[0]}" + if req.query?.build? && req.query.build.match(/^[0-9]+$/) + req.url = "/#{req.params.project_id}/.cache/clsi/#{req.query.build}/#{req.params[0]}" + else + req.url = "/#{req.params.project_id}/#{req.params[0]}" staticServer(req, res, next) app.get "/status", (req, res, next) -> diff --git a/app/coffee/CompileController.coffee b/app/coffee/CompileController.coffee index c738202..29373c3 100644 --- a/app/coffee/CompileController.coffee +++ b/app/coffee/CompileController.coffee @@ -35,6 +35,7 @@ module.exports = CompileController = outputFiles: outputFiles.map (file) -> url: "#{Settings.apis.clsi.url}/project/#{request.project_id}/output/#{file.path}" type: file.type + build: file.build } clearCache: (req, res, next = (error) ->) -> diff --git a/app/coffee/CompileManager.coffee b/app/coffee/CompileManager.coffee index dbdb39f..ac0c241 100644 --- a/app/coffee/CompileManager.coffee +++ b/app/coffee/CompileManager.coffee @@ -33,7 +33,7 @@ module.exports = CompileManager = OutputFileFinder.findOutputFiles request.resources, compileDir, (error, outputFiles) -> return callback(error) if error? - OutputCacheManager.saveOutputFiles outputFiles, compileDir, (error, newOutputFiles) -> + OutputCacheManager.saveOutputFiles outputFiles, compileDir, (error, newOutputFiles) -> callback null, newOutputFiles clearProject: (project_id, _callback = (error) ->) -> diff --git a/app/coffee/OutputCacheManager.coffee b/app/coffee/OutputCacheManager.coffee index 479637d..c34a662 100644 --- a/app/coffee/OutputCacheManager.coffee +++ b/app/coffee/OutputCacheManager.coffee @@ -15,7 +15,7 @@ module.exports = OutputCacheManager = # copy all the output files into it # # TODO: use Path module - buildId = 'build-' + Date.now() + buildId = Date.now() relDir = OutputCacheManager.CACHE_DIR + '/' + buildId newDir = target + '/' + relDir OutputCacheManager.expireOutputFiles target @@ -25,9 +25,8 @@ module.exports = OutputCacheManager = else async.mapSeries outputFiles, (file, cb) -> newFile = _.clone(file) - newFile.path = relDir + '/' + file.path src = target + '/' + file.path - dst = target + '/' + newFile.path + dst = target + '/' + relDir + '/' + file.path #console.log 'src', src, 'dst', dst fs.stat src, (err, stats) -> if err? @@ -36,6 +35,8 @@ module.exports = OutputCacheManager = #console.log 'isFile: copying' fse.copy src, dst, (err) -> OutputFileOptimiser.optimiseFile src, dst, (err, result) -> + console.log 'setting buildId on', newFile, 'to', buildId + newFile.build = buildId cb(err, newFile) else # other filetype - shouldn't happen