From e9abd875db11768cca2c5328dd4f251c8ef4b070 Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 19 Feb 2014 17:16:32 +0000 Subject: [PATCH] Protect against infinite loops with clients send remote changes back to server --- .../web/public/coffee/models/Project.coffee | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/services/web/public/coffee/models/Project.coffee b/services/web/public/coffee/models/Project.coffee index 852890ea8d..952dbdb3d6 100644 --- a/services/web/public/coffee/models/Project.coffee +++ b/services/web/public/coffee/models/Project.coffee @@ -42,38 +42,58 @@ define [ return attributes bindToRootDocId: -> + remoteChange = false @on "change:rootDoc_id", (project, docId) => - @get("ide").socket.emit "setRootDoc", docId + if !remoteChange + @get("ide").socket.emit "setRootDoc", docId @get("ide").socket.on "rootDocUpdated", (docId) => + remoteChange = true @set("rootDoc_id", docId) + remoteChange = false bindToProjectName: -> + remoteChange = false @on "change:name", (project, name) => - @get("ide").socket.emit "setProjectName", window.window_id, name + if !remoteChange + @get("ide").socket.emit "setProjectName", window.window_id, name @get("ide").socket.on "projectNameUpdated", (senderWindowId, name) => + remoteChange = true @set("name", name) + remoteChange = false bindToCompiler: -> + remoteChange = false @on "change:compiler", (project, name) => - @get("ide").socket.emit "setCompiler", name + if !remoteChange + @get("ide").socket.emit "setCompiler", name @get("ide").socket.on "compilerUpdated", (compiler) => - @set("compiler", compiler) + remoteChange = true + @set("compiler", compiler) + remoteChange = false bindToSpellingPreference: -> @on "change:spellCheckLanguage", (project, languageCode) => @get("ide").socket.emit "setSpellCheckLanguage", languageCode bindToPublicAccessLevel: -> + remoteChange = false @on "change:publicAccesLevel", (project, level) => - @get("ide").socket.emit "setPublicAccessLevel", level + if !remoteChange + @get("ide").socket.emit "setPublicAccessLevel", level @get("ide").socket.on 'publicAccessLevelUpdated', (level) => + remoteChange = true @set("publicAccesLevel", level) + remoteChange = false bindToProjectDescription: -> + remoteChange = false @on "change:description", (project, description) => - @get("ide").socket.emit "updateProjectDescription", description + if !remoteChange + @get("ide").socket.emit "updateProjectDescription", description @get("ide").socket.on 'projectDescriptionUpdated', (description) => + remoteChange = true @set("description", description) + remoteChange = false getRootDocumentsList: (callback) -> @get("ide").socket.emit "getRootDocumentsList", (err, listOfDocs) ->