From 586ea62b291de40bc372e2472541a0383cb6b6b3 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Thu, 29 Sep 2016 00:04:24 +0000 Subject: [PATCH 01/16] When a user is removed from a project, kill their VFS session --- plugins/c9.vfs.server/vfs.server.js | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/plugins/c9.vfs.server/vfs.server.js b/plugins/c9.vfs.server/vfs.server.js index 3be49599..aa259a99 100644 --- a/plugins/c9.vfs.server/vfs.server.js +++ b/plugins/c9.vfs.server/vfs.server.js @@ -277,7 +277,7 @@ function plugin(options, imports, register) { var vfsid = req.params.vfsid; var scope = req.params.scope; var path = req.params.path; - + var entry = cache.get(vfsid); if (!entry) { var err = new error.PreconditionFailed("VFS connection does not exist"); @@ -335,10 +335,32 @@ function plugin(options, imports, register) { user.save && user.save(function() {}); } } - + + function handlePublish(vfs, messageString) { + var message = JSON.parse(messageString); + switch (message.action) { + case "remove_member": + handleRemoveProjectMember(vfs, message); + break; + default: + break; + } + } + + function handleRemoveProjectMember(vfs, message) { + if (vfs.uid !== message.body.uid) return; + + console.log("Removing ", vfs.id, " for user ", vfs.uid, " project ", vfs.pid, " from the vfs connection cache"); + // Remove after 2s so client has time to recieve final "You've been removed" PubSub message. + setTimeout(function() { + cache.remove(vfs.id); + }, 2000); + } + register(null, { "vfs.server": { - get section() { return section; } + get section() { return section; }, + get handlePublish() { return handlePublish; } } }); } From 820ff42781802261e12f772764d1da6a9b61b58d Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Thu, 29 Sep 2016 20:41:28 +0000 Subject: [PATCH 02/16] Add tests. Kill the vfs connection when a users access level is changed too. --- plugins/c9.vfs.server/vfs.server.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/c9.vfs.server/vfs.server.js b/plugins/c9.vfs.server/vfs.server.js index aa259a99..8bbbc4f3 100644 --- a/plugins/c9.vfs.server/vfs.server.js +++ b/plugins/c9.vfs.server/vfs.server.js @@ -340,21 +340,23 @@ function plugin(options, imports, register) { var message = JSON.parse(messageString); switch (message.action) { case "remove_member": - handleRemoveProjectMember(vfs, message); + case "update_member_access": + handleProjectMemberAccessChange(vfs, message); break; default: break; } } - function handleRemoveProjectMember(vfs, message) { + function handleProjectMemberAccessChange(vfs, message) { if (vfs.uid !== message.body.uid) return; console.log("Removing ", vfs.id, " for user ", vfs.uid, " project ", vfs.pid, " from the vfs connection cache"); - // Remove after 2s so client has time to recieve final "You've been removed" PubSub message. - setTimeout(function() { + + // Remove next tick so client has time to recieve final "You've been removed" PubSub message. + process.nextTick(function() { cache.remove(vfs.id); - }, 2000); + }); } register(null, { From 6cd0202b4171d98e42fa9edb09d18766a473c283 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Thu, 29 Sep 2016 20:55:02 +0000 Subject: [PATCH 03/16] Need a timeout of 100ms for the message to show --- plugins/c9.vfs.server/vfs.server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/c9.vfs.server/vfs.server.js b/plugins/c9.vfs.server/vfs.server.js index 8bbbc4f3..069fd3ed 100644 --- a/plugins/c9.vfs.server/vfs.server.js +++ b/plugins/c9.vfs.server/vfs.server.js @@ -354,9 +354,9 @@ function plugin(options, imports, register) { console.log("Removing ", vfs.id, " for user ", vfs.uid, " project ", vfs.pid, " from the vfs connection cache"); // Remove next tick so client has time to recieve final "You've been removed" PubSub message. - process.nextTick(function() { + setTimeout(function() { cache.remove(vfs.id); - }); + }, 100); } register(null, { From b7bae15ec273fc7d37116c45786240ea81cbf200 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Fri, 30 Sep 2016 19:09:05 +0000 Subject: [PATCH 04/16] Adding md5 of collab users emails for gravatar pictures --- package.json | 2 +- plugins/c9.core/util.js | 9 ++++++++- plugins/c9.core/util_test.js | 10 ++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2d8879fe..4b7571c4 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "c9.ide.language.javascript.infer": "#b9c2e4bdb8", "c9.ide.language.jsonalyzer": "#a0549e14ff", "c9.ide.language.codeintel": "#0fe92d6f46", - "c9.ide.collab": "#54aa1cbee0", + "c9.ide.collab": "#78c38d73d1", "c9.ide.local": "#9169fec157", "c9.ide.find": "#e632ecf4be", "c9.ide.find.infiles": "#ad9ff74638", diff --git a/plugins/c9.core/util.js b/plugins/c9.core/util.js index af2f4d63..dc50b101 100644 --- a/plugins/c9.core/util.js +++ b/plugins/c9.core/util.js @@ -196,12 +196,19 @@ define(function(require, exports, module) { return "<" + tag + " " + plugin.toXmlAttributes(attrs) + (noclose ? ">" : " />"); }; + function isMd5String(str) { + return /^[0-9a-f]{32}$/.test(str); + } + /** * Returns the gravatar url for this user * @param {Number} size the size of the image */ plugin.getGravatarUrl = function getGravatarUrl(email, size, defaultImage) { - var md5Email = apf.crypto.MD5.hex_md5((email || "").trim().toLowerCase()); + var md5Email = email + if (!isMd5String(md5Email)) { + md5Email = apf.crypto.MD5.hex_md5((email || "").trim().toLowerCase()); + } return "https://secure.gravatar.com/avatar/" + md5Email + "?s=" + size + "&d=" + (defaultImage || "retro"); }; diff --git a/plugins/c9.core/util_test.js b/plugins/c9.core/util_test.js index ef668547..57b4df7c 100644 --- a/plugins/c9.core/util_test.js +++ b/plugins/c9.core/util_test.js @@ -9,6 +9,7 @@ require(["lib/architect/architect", "lib/chai/chai"], function (architect, chai) expect.setupArchitectTest([ "plugins/c9.core/ext", "plugins/c9.core/util", + "plugins/c9.ide.ui/lib_apf", // Mock plugins { consumes: [], @@ -32,6 +33,15 @@ require(["lib/architect/architect", "lib/chai/chai"], function (architect, chai) }); }); + describe("getGravatarUrl", function() { + it("Should hash a normal email", function() { + expect(util.getGravatarUrl("test@test.com", 32)).to.match(/^https:\/\/secure.gravatar.com\/avatar\/b642b4217b34b1e8d3bd915fc65c4452.*/); + }); + it("Should use not re-hash an md5 passed in", function() { + expect(util.getGravatarUrl("b642b4217b34b1e8d3bd915fc65c4452", 32)).to.match(/^https:\/\/secure.gravatar.com\/avatar\/b642b4217b34b1e8d3bd915fc65c4452.*/); + }); + }); + describe('normalizePath', function() { var normalizePath = util.normalizePath; it('should handle home in workspaceDir', function() { From b7e2142d2a691e402fd95465a947df6705d44ec1 Mon Sep 17 00:00:00 2001 From: basdewachter Date: Tue, 4 Oct 2016 15:36:36 +0200 Subject: [PATCH 05/16] add missing test to sdk config --- plugins/c9.vfs.server/vfs.server_test.js | 122 +++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 plugins/c9.vfs.server/vfs.server_test.js diff --git a/plugins/c9.vfs.server/vfs.server_test.js b/plugins/c9.vfs.server/vfs.server_test.js new file mode 100644 index 00000000..492907e3 --- /dev/null +++ b/plugins/c9.vfs.server/vfs.server_test.js @@ -0,0 +1,122 @@ +#!/usr/bin/env node +"use strict"; +"use server"; + + +require("c9/inline-mocha")(module); +if (typeof define === "undefined") { + require("amd-loader"); +} + +var sinon = require("sinon"); +var assert = require("assert"); +var vfsServer = require("./vfs.server"); +var mockDb = {}; +var mockCache = { + remove: sinon.stub() +}; +var mockApi = { + section: sinon.stub().returns({ + registerType: sinon.stub(), + post: sinon.stub(), + get: sinon.stub(), + delete: sinon.stub(), + all: sinon.stub() + }), + use: sinon.stub(), + ensureAdmin: sinon.stub(), + get: sinon.stub(), + authenticate: sinon.stub() +}; +var mockRender = { + setTemplatePath: sinon.stub() +}; +var mockConnect = { + getModule: sinon.stub().returns({ + compress: sinon.stub() + }) +}; + +describe(__filename, function() { + var server; + beforeEach(function (done) { + vfsServer({testing: true}, { + "db": mockDb, + "vfs.cache": mockCache, + "api": mockApi, + "connect.render": mockRender, + "connect": mockConnect, + }, function (err, _server) { + if (err) return done(err); + server = _server["vfs.server"]; + done(); + }); + }); + + describe("handlePublish", function() { + beforeEach(function() { + mockCache.remove = sinon.stub(); + }); + + describe("remove_member", function() { + it("Should kill the removed members VFS connection", function (done) { + var vfs = { + id: "9c123", + uid: "123" + }; + var message = JSON.stringify({ + action: "remove_member", + body: { + uid: "123" + } + }); + server.handlePublish(vfs, message); + setTimeout(function() { + assert(mockCache.remove.calledWith(vfs.id)); + done(); + }, 150); + }); + + it("Should not kill the other members VFS connection", function (done) { + var vfs = { + id: "9c123", + uid: "456" + }; + var message = JSON.stringify({ + action: "remove_member", + body: { + uid: "123" + } + }); + server.handlePublish(vfs, message); + setTimeout(function() { + assert.equal(mockCache.remove.callCount, 0); + done(); + }, 150); + }); + }); + + describe("update_member_access", function() { + it("Should kill the members VFS connection so they rejoin with the new access level", function (done) { + var vfs = { + id: "9c123", + uid: "123" + }; + var message = JSON.stringify({ + action: "update_member_access", + body: { + uid: "123" + } + }); + server.handlePublish(vfs, message); + setTimeout(function() { + assert(mockCache.remove.calledWith(vfs.id)); + done(); + }, 150); + }); + }); + + }); + + +}); \ No newline at end of file From da1f958a704d22454bdc1cb55d0f9822fa999ecb Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Tue, 4 Oct 2016 19:39:30 +0200 Subject: [PATCH 06/16] c9-auto-bump 3.1.3132 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d8879fe..87c18931 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3131", + "version": "3.1.3132", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9", From 5d7d4e3b3dab1d781a2b171cf2e75e75b02d483f Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Wed, 5 Oct 2016 00:39:38 +0000 Subject: [PATCH 07/16] git.js doesn't need amd-loader and it's causing a global variable leak which makes mocha tests fail --- node_modules/c9/git.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/node_modules/c9/git.js b/node_modules/c9/git.js index dea02285..6228914a 100644 --- a/node_modules/c9/git.js +++ b/node_modules/c9/git.js @@ -1,7 +1,5 @@ "use strict"; -require("amd-loader"); - var Fs = require("fs"); var Path = require("path"); var exec = require("child_process").exec; From 9335c281e7ccc52d6190326eceac9d0596bd94a8 Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Wed, 5 Oct 2016 03:22:15 +0200 Subject: [PATCH 08/16] c9-auto-bump 3.1.3133 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87c18931..606532bd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3132", + "version": "3.1.3133", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9", From f9b8230b0ddc11db3f0ca9fb24c312a0715a06b1 Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Wed, 5 Oct 2016 09:42:06 +0200 Subject: [PATCH 09/16] c9-auto-bump 3.1.3134 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 606532bd..1da72f35 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3133", + "version": "3.1.3134", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9", From a71b9fe9b6fd18e32efed47ac4c093cd36c5569a Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Wed, 5 Oct 2016 11:09:53 +0200 Subject: [PATCH 10/16] c9-auto-bump 3.1.3135 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1da72f35..577bc91d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3134", + "version": "3.1.3135", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9", From 30cf22dde99b99d3122b89ca3d29a8f8410cde0b Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Wed, 5 Oct 2016 14:11:21 +0200 Subject: [PATCH 11/16] c9-auto-bump 3.1.3136 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 577bc91d..ee29dc57 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3135", + "version": "3.1.3136", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9", From 1900546da812831b9fc0b667e720c66033c4ded1 Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Wed, 5 Oct 2016 19:09:41 +0200 Subject: [PATCH 12/16] c9-auto-bump 3.1.3137 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ee29dc57..efe9fe15 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3136", + "version": "3.1.3137", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9", From 82a6745a68dbc144936022506a792707b80db117 Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Wed, 5 Oct 2016 19:11:45 +0200 Subject: [PATCH 13/16] c9-auto-bump 3.1.3138 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index efe9fe15..f7f2b785 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3137", + "version": "3.1.3138", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9", From a74c8c049d9cceace37cf8684314864b336a0190 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Wed, 5 Oct 2016 20:41:45 +0000 Subject: [PATCH 14/16] Also return hashed email from collab-server --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b7571c4..f8983367 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "c9.ide.language.javascript.infer": "#b9c2e4bdb8", "c9.ide.language.jsonalyzer": "#a0549e14ff", "c9.ide.language.codeintel": "#0fe92d6f46", - "c9.ide.collab": "#78c38d73d1", + "c9.ide.collab": "#f60595d380", "c9.ide.local": "#9169fec157", "c9.ide.find": "#e632ecf4be", "c9.ide.find.infiles": "#ad9ff74638", From a5e116697c23c8ade368cfe60d6a297e4689c14d Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Thu, 6 Oct 2016 00:05:41 +0200 Subject: [PATCH 15/16] c9-auto-bump 3.1.3139 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f7f2b785..7d6ebfc2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3138", + "version": "3.1.3139", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9", From 4403f53f21627da21a9656306af56a04c24de676 Mon Sep 17 00:00:00 2001 From: c9jenkinsv3 Date: Thu, 6 Oct 2016 02:09:15 +0200 Subject: [PATCH 16/16] c9-auto-bump 3.1.3140 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e240056c..69b2e446 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "c9", "description": "New Cloud9 Client", - "version": "3.1.3139", + "version": "3.1.3140", "author": "Ajax.org B.V. ", "private": true, "main": "bin/c9",