diff --git a/services/web/app/coffee/Features/PasswordReset/PasswordResetController.coffee b/services/web/app/coffee/Features/PasswordReset/PasswordResetController.coffee index 3acf680952..6874cbe43d 100644 --- a/services/web/app/coffee/Features/PasswordReset/PasswordResetController.coffee +++ b/services/web/app/coffee/Features/PasswordReset/PasswordResetController.coffee @@ -9,7 +9,7 @@ module.exports = title:"Reset Password" requestReset: (req, res)-> - email = req.body.email.trim() + email = req.body.email.trim().toLowerCase() opts = endpointName:"auto_compile" timeInterval:60 diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index 8b593b2305..00768b095f 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -293,10 +293,6 @@ module.exports = class Router AuthorizationManager.ensureClientCanEditProject client, (error, project_id) => EditorController.setRootDoc(project_id, newRootDocID, callback) - client.on 'deleteProject', (callback)-> - AuthorizationManager.ensureClientCanAdminProject client, (error, project_id) => - EditorController.deleteProject(project_id, callback) - client.on 'setPublicAccessLevel', (newAccessLevel, callback)-> AuthorizationManager.ensureClientCanAdminProject client, (error, project_id) => EditorController.setPublicAccessLevel(project_id, newAccessLevel, callback) diff --git a/services/web/public/coffee/file-tree/DeletedDocsFolderView.coffee b/services/web/public/coffee/file-tree/DeletedDocsFolderView.coffee index 3ce1ec12fd..48217e24c5 100644 --- a/services/web/public/coffee/file-tree/DeletedDocsFolderView.coffee +++ b/services/web/public/coffee/file-tree/DeletedDocsFolderView.coffee @@ -24,6 +24,10 @@ define [ hideToggle: () -> @$(".js-toggle").hide() + makeReadOnly: () -> + + makeReadWrite: () -> + diff --git a/services/web/public/coffee/file-tree/EntityView.coffee b/services/web/public/coffee/file-tree/EntityView.coffee index c7b17e7419..b22f2910aa 100644 --- a/services/web/public/coffee/file-tree/EntityView.coffee +++ b/services/web/public/coffee/file-tree/EntityView.coffee @@ -23,7 +23,8 @@ define [ render: () -> @$el.append(Mustache.to_html @entityTemplate, @model.attributes) @_bindToDomElements() - @_makeEditable() + @_initializeRenameBox() + @_initializeDrag() return @ _bindToDomElements: () -> @@ -32,12 +33,6 @@ define [ @$entityListItemEl = @$el.children(".entity-list-item") @$labelEl = @$entityListItemEl.children(".entity-label") - _makeEditable: () -> - if @ide.isAllowedToDoIt "readAndWrite" - @_initializeRenameBox() - @_initializeDrag() - @hideRenameBox() - bindToModel: () -> @model.on "change:name", (model) => @$nameEl.text(model.get("name")) @@ -84,7 +79,7 @@ define [ onDoubleClick: (e) -> e.preventDefault() e.stopPropagation() - if @ide.isAllowedToDoIt "readAndWrite" + if !@readonly @startRename() showContextMenuFromCaret: (e) -> @@ -121,6 +116,7 @@ define [ delete @contextMenu getContextMenuEntries: () -> + return null if @readonly return [{ text: "Rename" onClick: () => @@ -171,5 +167,13 @@ define [ @manager.renameEntity(@model, name) @hideRenameBox() + makeReadOnly: () -> + @$entityListItemEl.draggable("disable") + @readonly = true + + makeReadWrite: () -> + @$entityListItemEl.draggable("enable") + delete @readonly + diff --git a/services/web/public/coffee/file-tree/FileTreeManager.coffee b/services/web/public/coffee/file-tree/FileTreeManager.coffee index 2f66bec030..27b7d82d2f 100644 --- a/services/web/public/coffee/file-tree/FileTreeManager.coffee +++ b/services/web/public/coffee/file-tree/FileTreeManager.coffee @@ -17,6 +17,7 @@ define [ @multiSelectedEntities = [] @ide.on "afterJoinProject", (@project) => @populateFileTree() + @makeReadWriteIfAllowed() @project_id = @project.id if @ide.editor?.current_doc_id? @openDoc(@ide.editor.current_doc_id) @@ -312,3 +313,17 @@ define [ hideDeletedDocs: () -> @deletedDocsView.$el.hide() + + makeReadOnly: () -> + for id, view of @views or [] + view.makeReadOnly?() + + makeReadWrite: () -> + for id, view of @views or [] + view.makeReadWrite?() + + makeReadWriteIfAllowed: () -> + if @ide.isAllowedToDoIt("readAndWrite") + @makeReadWrite() + else + @makeReadOnly() diff --git a/services/web/public/coffee/file-tree/FolderView.coffee b/services/web/public/coffee/file-tree/FolderView.coffee index e8ad803034..e62140a538 100644 --- a/services/web/public/coffee/file-tree/FolderView.coffee +++ b/services/web/public/coffee/file-tree/FolderView.coffee @@ -123,6 +123,7 @@ define [ @showEntries() getContextMenuEntries: (args...) -> + return null if @readonly entries = EntityView::getContextMenuEntries.apply(this, args) entries.push { divider: true diff --git a/services/web/public/coffee/file-tree/RootFolderView.coffee b/services/web/public/coffee/file-tree/RootFolderView.coffee index 70f065148f..ff5c1c20c3 100644 --- a/services/web/public/coffee/file-tree/RootFolderView.coffee +++ b/services/web/public/coffee/file-tree/RootFolderView.coffee @@ -36,8 +36,7 @@ define [ type: "project" }) @_bindToDomElements() - if @ide.isAllowedToDoIt("readAndWrite") - @renderActions() + @renderActions() @hideRenameBox() @hideToggle() @renderEntries() @@ -45,8 +44,8 @@ define [ return @ renderActions: () -> - actions = $(@actionsTemplate) - actions.insertAfter(@$entityListItemEl) + @$actions = $(@actionsTemplate) + @$actions.insertAfter(@$entityListItemEl) @$(".js-new-entity-menu > a").dropdown() onClick: () -> @@ -61,6 +60,12 @@ define [ hideToggle: () -> @$(".js-toggle").hide() + makeReadOnly: () -> + @$actions.hide() + + makeReadWrite: () -> + @$actions.show() + diff --git a/services/web/public/coffee/models/Project.coffee b/services/web/public/coffee/models/Project.coffee index f62098b154..ab3ed089ca 100644 --- a/services/web/public/coffee/models/Project.coffee +++ b/services/web/public/coffee/models/Project.coffee @@ -36,11 +36,11 @@ define [ owner.set("privileges", "owner") members.add owner - for rawMember in rawAttributes.members + for rawMember in rawAttributes.members or [] member = User.findOrBuild rawMember._id, rawMember members.add member - for doc in rawAttributes.deletedDocs + for doc in rawAttributes.deletedDocs or [] doc.deleted = true attributes.deletedDocs = new Folder({ diff --git a/services/web/public/coffee/pdf/PdfManager.coffee b/services/web/public/coffee/pdf/PdfManager.coffee index d988797904..4b9fd876cf 100644 --- a/services/web/public/coffee/pdf/PdfManager.coffee +++ b/services/web/public/coffee/pdf/PdfManager.coffee @@ -125,11 +125,6 @@ define [ @_refreshPdfWhenProjectIsLoaded(opts) _refreshPdfWhenProjectIsLoaded: (opts = {}) -> - doneCompiling = _.once => - @compiling = false - @view.doneCompiling() - @syncButtonsView?.show() - setTimeout doneCompiling, 1000 * 60 if !@ide.project.get("rootDoc_id")? new Modal @@ -145,8 +140,9 @@ define [ @compiling = true @_doCompile opts, (error, status, outputFiles) => @compiling = false - doneCompiling() - + @view.doneCompiling() + @syncButtonsView?.show() + if error? @view.updateLog(systemError: true) @view.unsetPdf() diff --git a/services/web/public/coffee/settings/SettingsManager.coffee b/services/web/public/coffee/settings/SettingsManager.coffee index 9f9e20347c..47791833de 100644 --- a/services/web/public/coffee/settings/SettingsManager.coffee +++ b/services/web/public/coffee/settings/SettingsManager.coffee @@ -38,9 +38,14 @@ define [ $("#deleteProject").click (event)=> event.preventDefault() self = @ - deleteProject = -> - self.ide.socket.emit 'deleteProject', -> - window.location = '/' + deleteProject = => + $.ajax + url: "/Project/#{@ide.project_id}", + type: 'DELETE' + data: + _csrf: window.csrfToken + success: -> + window.location = '/' modalOptions = templateId:'deleteEntityModal' isStatic: false diff --git a/services/web/public/coffee/track-changes/DiffView.coffee b/services/web/public/coffee/track-changes/DiffView.coffee index d704ae6bb0..b5c3269ce4 100644 --- a/services/web/public/coffee/track-changes/DiffView.coffee +++ b/services/web/public/coffee/track-changes/DiffView.coffee @@ -279,7 +279,7 @@ define [ @aceEditor.scrollToLine(@firstHiddenChangeAfter.range.end.row, true, false) resize: () -> - @aceEditor.resize() + @aceEditor?.resize() return DiffView diff --git a/services/web/public/coffee/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/track-changes/TrackChangesManager.coffee index 0c45197047..dfa6d52ead 100644 --- a/services/web/public/coffee/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/track-changes/TrackChangesManager.coffee @@ -72,6 +72,7 @@ define [ @ide.editor.disable() @ide.fileViewManager.disable() + @ide.fileTreeManager.makeReadOnly() @ide.fileTreeManager.showDeletedDocs() @enable() @@ -93,9 +94,16 @@ define [ @ide.editor.enable() @ide.fileViewManager.enable() @disable() - @ide.fileTreeManager.openDoc(@doc_id) + + doc = @ide.fileTreeManager.getEntity(@doc_id, include_deleted: true) + if doc? and doc.get("deleted") + @ide.fileTreeManager.openDoc(@ide.project.get("rootDoc_id")) + else + @ide.fileTreeManager.openDoc(@doc_id) + @ide.tabManager.show "code" @resetLabels() + @ide.fileTreeManager.makeReadWriteIfAllowed() @ide.fileTreeManager.hideDeletedDocs() autoSelectDiff: () -> diff --git a/services/web/test/UnitTests/coffee/PasswordReset/PasswordResetControllerTests.coffee b/services/web/test/UnitTests/coffee/PasswordReset/PasswordResetControllerTests.coffee index 4dc3af38dc..187719dcd3 100644 --- a/services/web/test/UnitTests/coffee/PasswordReset/PasswordResetControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/PasswordReset/PasswordResetControllerTests.coffee @@ -63,6 +63,17 @@ describe "PasswordResetController", -> done() @PasswordResetController.requestReset @req, @res + it "should lowercase the email address", (done)-> + @email = "UPerCaseEMAIL@example.Com" + @req.body.email = @email + @RateLimiter.addCount.callsArgWith(1, null, true) + @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1) + @res.send = (code)=> + code.should.equal 200 + @PasswordResetHandler.generateAndEmailResetToken.calledWith(@email.toLowerCase()).should.equal true + done() + @PasswordResetController.requestReset @req, @res + describe "setNewUserPassword", -> it "should tell the user handler to reset the password", (done)->