Allow CLSI cache to be cleared from within the editor

This commit is contained in:
James Allen 2014-03-27 17:00:41 +00:00
parent 7515586f3b
commit 767b220fab
6 changed files with 86 additions and 40 deletions

View file

@ -19,6 +19,9 @@ module.exports = CompileController =
res.header('Content-Disposition', "filename=#{project.getSafeProjectName()}.pdf")
CompileController.proxyToClsi("/project/#{project_id}/output/output.pdf", req, res, next)
deleteAuxFiles: (req, res, next) ->
project_id = req.params.Project_id
CompileController.proxyToClsi("/project/#{project_id}", req, res, next)
compileAndDownloadPdf: (req, res, next)->
project_id = req.params.project_id
@ -29,8 +32,6 @@ module.exports = CompileController =
url = "/project/#{project_id}/output/output.pdf"
CompileController.proxyToClsi url, req, res, next
getFileFromClsi: (req, res, next = (error) ->) ->
CompileController.proxyToClsi("/project/#{req.params.Project_id}/output/#{req.params.file}", req, res, next)
@ -38,7 +39,7 @@ module.exports = CompileController =
logger.log url: url, "proxying to CLSI"
url = "#{Settings.apis.clsi.url}#{url}"
oneMinute = 60 * 1000
proxy = request.get(url: url, timeout: oneMinute)
proxy = request(url: url, method: req.method, timeout: oneMinute)
proxy.pipe(res)
proxy.on "error", (error) ->
logger.error err: error, url: url, "CLSI proxy error"

View file

@ -6,7 +6,7 @@ ProjectApiController = require("./Features/Project/ProjectApiController")
InfoController = require('./controllers/InfoController')
SpellingController = require('./Features/Spelling/SpellingController')
CollaberationManager = require('./managers/CollaberationManager')
SecutiryManager = require('./managers/SecurityManager')
SecurityManager = require('./managers/SecurityManager')
AuthorizationManager = require('./Features/Security/AuthorizationManager')
versioningController = require("./Features/Versioning/VersioningApiController")
EditorController = require("./Features/Editor/EditorController")
@ -56,7 +56,7 @@ module.exports = class Router
app.get '/login', UserController.loginForm
app.post '/login', AuthenticationController.login
app.get '/logout', UserController.logout
app.get '/restricted', SecutiryManager.restricted
app.get '/restricted', SecurityManager.restricted
app.get '/resources', HomeController.resources
app.get '/comments', HomeController.comments
@ -99,13 +99,10 @@ module.exports = class Router
app.post '/project/new', AuthenticationController.requireLogin(), Project.apiNewProject
app.get '/project/new/template', TemplatesMiddlewear.saveTemplateDataInSession, AuthenticationController.requireLogin(), TemplatesController.createProjectFromZipTemplate
app.get '/Project/:Project_id', SecutiryManager.requestCanAccessProject, Project.loadEditor
app.get '/Project/:Project_id/file/:File_id', SecutiryManager.requestCanAccessProject, FileStoreController.getFile
app.get '/Project/:Project_id', SecurityManager.requestCanAccessProject, Project.loadEditor
app.get '/Project/:Project_id/file/:File_id', SecurityManager.requestCanAccessProject, FileStoreController.getFile
# This is left for legacy reasons and can be removed once all editors have had a chance to refresh:
app.get '/Project/:Project_id/download/pdf', SecutiryManager.requestCanAccessProject, CompileController.downloadPdf
app.get '/Project/:Project_id/output/output.pdf', SecutiryManager.requestCanAccessProject, CompileController.downloadPdf
app.get '/Project/:Project_id/output/output.pdf', SecurityManager.requestCanAccessProject, CompileController.downloadPdf
app.get /^\/project\/([^\/]*)\/output\/(.*)$/,
((req, res, next) ->
params =
@ -113,25 +110,26 @@ module.exports = class Router
"file": req.params[1]
req.params = params
next()
), SecutiryManager.requestCanAccessProject, CompileController.getFileFromClsi
), SecurityManager.requestCanAccessProject, CompileController.getFileFromClsi
app.del "/project/:Project_id/output", SecurityManager.requestCanAccessProject, CompileController.deleteAuxFiles
app.del '/Project/:Project_id', SecutiryManager.requestIsOwner, Project.deleteProject
app.post '/Project/:Project_id/clone', SecutiryManager.requestCanAccessProject, Project.cloneProject
app.del '/Project/:Project_id', SecurityManager.requestIsOwner, Project.deleteProject
app.post '/Project/:Project_id/clone', SecurityManager.requestCanAccessProject, Project.cloneProject
app.post '/Project/:Project_id/snapshot', SecutiryManager.requestCanModifyProject, versioningController.takeSnapshot
app.get '/Project/:Project_id/version', SecutiryManager.requestCanAccessProject, versioningController.listVersions
app.get '/Project/:Project_id/version/:Version_id', SecutiryManager.requestCanAccessProject, versioningController.getVersion
app.get '/Project/:Project_id/version', SecutiryManager.requestCanAccessProject, versioningController.listVersions
app.get '/Project/:Project_id/version/:Version_id', SecutiryManager.requestCanAccessProject, versioningController.getVersion
app.post '/Project/:Project_id/snapshot', SecurityManager.requestCanModifyProject, versioningController.takeSnapshot
app.get '/Project/:Project_id/version', SecurityManager.requestCanAccessProject, versioningController.listVersions
app.get '/Project/:Project_id/version/:Version_id', SecurityManager.requestCanAccessProject, versioningController.getVersion
app.get '/Project/:Project_id/version', SecurityManager.requestCanAccessProject, versioningController.listVersions
app.get '/Project/:Project_id/version/:Version_id', SecurityManager.requestCanAccessProject, versioningController.getVersion
app.get "/project/:Project_id/updates", SecutiryManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi
app.get "/project/:Project_id/doc/:doc_id/diff", SecutiryManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi
app.post "/project/:Project_id/doc/:doc_id/version/:version_id/restore", SecutiryManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi
app.get "/project/:Project_id/updates", SecurityManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi
app.get "/project/:Project_id/doc/:doc_id/diff", SecurityManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi
app.post "/project/:Project_id/doc/:doc_id/version/:version_id/restore", SecurityManager.requestCanAccessProject, TrackChangesController.proxyToTrackChangesApi
app.post '/project/:project_id/leave', AuthenticationController.requireLogin(), CollaboratorsController.removeSelfFromProject
app.get '/project/:Project_id/collaborators', SecutiryManager.requestCanAccessProject(allow_auth_token: true), CollaboratorsController.getCollaborators
app.get '/project/:Project_id/collaborators', SecurityManager.requestCanAccessProject(allow_auth_token: true), CollaboratorsController.getCollaborators
app.get '/Project/:Project_id/download/zip', SecutiryManager.requestCanAccessProject, ProjectDownloadsController.downloadProject
app.get '/Project/:Project_id/download/zip', SecurityManager.requestCanAccessProject, ProjectDownloadsController.downloadProject
app.get '/tag', AuthenticationController.requireLogin(), TagsController.getAllTags
@ -164,21 +162,21 @@ module.exports = class Router
req.params = params
next()
),
SecutiryManager.requestCanAccessProject, versioningController.getVersionFile
SecurityManager.requestCanAccessProject, versioningController.getVersionFile
app.post "/spelling/check", AuthenticationController.requireLogin(), SpellingController.proxyRequestToSpellingApi
app.post "/spelling/learn", AuthenticationController.requireLogin(), SpellingController.proxyRequestToSpellingApi
#Admin Stuff
app.get '/admin', SecutiryManager.requestIsAdmin, AdminController.index
app.post '/admin/closeEditor', SecutiryManager.requestIsAdmin, AdminController.closeEditor
app.post '/admin/dissconectAllUsers', SecutiryManager.requestIsAdmin, AdminController.dissconectAllUsers
app.post '/admin/writeAllDocsToMongo', SecutiryManager.requestIsAdmin, AdminController.writeAllToMongo
app.post '/admin/addquote', SecutiryManager.requestIsAdmin, AdminController.addQuote
app.post '/admin/syncUserToSubscription', SecutiryManager.requestIsAdmin, AdminController.syncUserToSubscription
app.post '/admin/flushProjectToTpds', SecutiryManager.requestIsAdmin, AdminController.flushProjectToTpds
app.post '/admin/pollUsersWithDropbox', SecutiryManager.requestIsAdmin, AdminController.pollUsersWithDropbox
app.post '/admin/updateProjectCompiler', SecutiryManager.requestIsAdmin, AdminController.updateProjectCompiler
app.get '/admin', SecurityManager.requestIsAdmin, AdminController.index
app.post '/admin/closeEditor', SecurityManager.requestIsAdmin, AdminController.closeEditor
app.post '/admin/dissconectAllUsers', SecurityManager.requestIsAdmin, AdminController.dissconectAllUsers
app.post '/admin/writeAllDocsToMongo', SecurityManager.requestIsAdmin, AdminController.writeAllToMongo
app.post '/admin/addquote', SecurityManager.requestIsAdmin, AdminController.addQuote
app.post '/admin/syncUserToSubscription', SecurityManager.requestIsAdmin, AdminController.syncUserToSubscription
app.post '/admin/flushProjectToTpds', SecurityManager.requestIsAdmin, AdminController.flushProjectToTpds
app.post '/admin/pollUsersWithDropbox', SecurityManager.requestIsAdmin, AdminController.pollUsersWithDropbox
app.post '/admin/updateProjectCompiler', SecurityManager.requestIsAdmin, AdminController.updateProjectCompiler
app.get '/perfTest', (req,res)->
res.send("hello")
@ -190,7 +188,7 @@ module.exports = class Router
app.get '/health_check', HealthCheckController.check
app.get "/status/compiler/:Project_id", SecutiryManager.requestCanAccessProject, (req, res) ->
app.get "/status/compiler/:Project_id", SecurityManager.requestCanAccessProject, (req, res) ->
sendRes = _.once (statusCode, message)->
res.writeHead statusCode
res.end message

View file

@ -182,7 +182,11 @@
button#downloadPdf.btn Download
button#downloadLinksButton.btn.dropdown-toggle(data-toggle="dropdown")
span.caret
ul.dropdown-menu#downloadLinks
ul.dropdown-menu
#downloadLinks
li.divider
li.delete-cached-files
a(href="#") Clear cached files
.btn-group.pull-right(data-toggle="buttons-radio")
button(type="button", title="Flat view")#flatViewButton.btn
i.icon-flatview

View file

@ -51,6 +51,7 @@ define [
"click #splitViewButton": ->
$.localStorage("layout.pdf", "split")
@options.manager.switchToSplitView()
"click .delete-cached-files > a": -> @options.manager.deleteCachedFiles()
initialize: (@options) ->
@ide = @options.ide

View file

@ -187,3 +187,26 @@ define [
downloadPdf: () ->
@ide.mainAreaManager.setIframeSrc "/project/#{@ide.project_id}/output/output.pdf?popupDownload=true"
deleteCachedFiles: () ->
modal = new Modal
title: "Clear cache?"
message: "This will clear all hidden LaTeX files like .aux, .bbl, etc, from our compile server. You generally don't need to do this unless you're having trouble with references. Your project files will not be deleted or changed."
buttons: [{
text: "Cancel"
}, {
text: "Clear from cache",
class: "btn-primary",
close: false
callback: ($button) =>
$button.text("Clearing...")
$button.prop("disabled", true)
$.ajax({
url: "/project/#{@ide.project_id}/output"
type: "DELETE"
headers:
"X-CSRF-Token": window.csrfToken
complete: () -> modal.remove()
})
}]

View file

@ -16,7 +16,7 @@ describe "CompileController", ->
apis:
clsi:
url: "clsi.example.com"
"request": @request = {}
"request": @request = sinon.stub()
"../../models/Project": Project: @Project = {}
"logger-sharelatex": @logger = { log: sinon.stub(), error: sinon.stub() }
"../../infrastructure/Metrics": @Metrics = { inc: sinon.stub() }
@ -68,15 +68,23 @@ describe "CompileController", ->
describe "proxyToClsi", ->
beforeEach ->
@request.get = sinon.stub().returns(@proxy = {
@request.returns(@proxy = {
pipe: sinon.stub()
on: sinon.stub()
})
@upstream =
statusCode: 204
headers: { "mock": "header" }
@req.method = "mock-method"
@CompileController.proxyToClsi(@url = "/test", @req, @res, @next)
it "should open a request to the CLSI", ->
@request.get
.calledWith(url: "#{@settings.apis.clsi.url}#{@url}", timeout: 60 * 1000)
@request
.calledWith(
method: @req.method
url: "#{@settings.apis.clsi.url}#{@url}",
timeout: 60 * 1000
)
.should.equal true
it "should pass the request on to the client", ->
@ -87,6 +95,17 @@ describe "CompileController", ->
it "should bind an error handle to the request proxy", ->
@proxy.on.calledWith("error").should.equal true
describe "deleteAuxFiles", ->
beforeEach ->
@CompileController.proxyToClsi = sinon.stub()
@req.params =
Project_id: @project_id
@CompileController.deleteAuxFiles @req, @res, @next
it "should proxy to the CLSI", ->
@CompileController.proxyToClsi
.calledWith("/project/#{@project_id}", @req, @res, @next)
.should.equal true
describe "compileAndDownloadPdf", ->
beforeEach ->