diff --git a/plugins/c9.vfs.server/vfs.server.js b/plugins/c9.vfs.server/vfs.server.js index 069fd3ed..99b32b9c 100644 --- a/plugins/c9.vfs.server/vfs.server.js +++ b/plugins/c9.vfs.server/vfs.server.js @@ -343,6 +343,8 @@ function plugin(options, imports, register) { case "update_member_access": handleProjectMemberAccessChange(vfs, message); break; + case "project_changed": + handleProjectVisibilityChanged(vfs, message); default: break; } @@ -359,6 +361,16 @@ function plugin(options, imports, register) { }, 100); } + function handleProjectVisibilityChanged(vfs, message) { + if (vfs.uid == message.body.owner) return; + + if ((message.body.visibility && message.body.visibility == "private") || + (message.body.appAccess && message.body.appAccess == "private")) { + console.log("Project ", vfs.pid, " recieved message: ", message.body, ". Killing connection of user ", vfs.uid); + cache.remove(vfs.id); + } + } + register(null, { "vfs.server": { get section() { return section; }, diff --git a/plugins/c9.vfs.server/vfs.server_test.js b/plugins/c9.vfs.server/vfs.server_test.js index 492907e3..f5378d3a 100644 --- a/plugins/c9.vfs.server/vfs.server_test.js +++ b/plugins/c9.vfs.server/vfs.server_test.js @@ -116,6 +116,33 @@ describe(__filename, function() { }); }); + describe("project_changed", function() { + it("If the project is being made private all non-owner connected users should be ejected", function (done) { + var projectOwnerVfs = { + id: "9c123", + uid: "123" + }; + var projectMemberVfs = { + id: "9c456", + uid: "456" + }; + var message = JSON.stringify({ + action: "project_changed", + body: { + owner: 123, + visibility: "private" + } + }); + server.handlePublish(projectOwnerVfs, message); + server.handlePublish(projectMemberVfs, message); + setTimeout(function() { + assert(mockCache.remove.neverCalledWith(projectOwnerVfs.id)); + assert(mockCache.remove.calledWith(projectMemberVfs.id)); + done(); + }, 150); + }); + }); + });