From 1c8b7a3661ce7239b33a0e91fc010022303f7ba6 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 17 Apr 2013 14:25:23 +0200 Subject: [PATCH 1/4] Add a server-side changeset queue per pad fixes #1573 --- src/node/handler/PadMessageHandler.js | 20 +++++++++++++++----- src/package.json | 3 ++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 85efb008..b6d22c14 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -35,6 +35,7 @@ var messageLogger = log4js.getLogger("message"); var accessLogger = log4js.getLogger("access"); var _ = require('underscore'); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js"); +var channels = require("channels"); /** * A associative array that saves informations about a session @@ -48,6 +49,11 @@ var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js"); */ var sessioninfos = {}; +/** + * A changeset queue per pad that is processed by handleUserChanges() + */ +var padChannels = new channels.channels(handleUserChanges); + /** * Saves the Socket class we need to send and recieve data from the client */ @@ -176,7 +182,7 @@ exports.handleMessage = function(client, message) if (sessioninfos[client.id].readonly) { messageLogger.warn("Dropped message, COLLABROOM for readonly pad"); } else if (message.data.type == "USER_CHANGES") { - handleUserChanges(client, message); + padChannels.emit(message.padId, {client: client, message: message});// add to pad queue } else if (message.data.type == "USERINFO_UPDATE") { handleUserInfoUpdate(client, message); } else if (message.data.type == "CHAT_MESSAGE") { @@ -522,23 +528,26 @@ function handleUserInfoUpdate(client, message) * @param client the client that send this message * @param message the message from the client */ -function handleUserChanges(client, message) +function handleUserChanges(data, cb) { + var client = data.client + , message = data.message + // Make sure all required fields are present if(message.data.baseRev == null) { messageLogger.warn("Dropped message, USER_CHANGES Message has no baseRev!"); - return; + return cb(); } if(message.data.apool == null) { messageLogger.warn("Dropped message, USER_CHANGES Message has no apool!"); - return; + return cb(); } if(message.data.changeset == null) { messageLogger.warn("Dropped message, USER_CHANGES Message has no changeset!"); - return; + return cb(); } //get all Vars we need @@ -679,6 +688,7 @@ function handleUserChanges(client, message) } ], function(err) { + cb(); ERR(err); }); } diff --git a/src/package.json b/src/package.json index e7c56549..900308de 100644 --- a/src/package.json +++ b/src/package.json @@ -37,7 +37,8 @@ "underscore" : "1.3.1", "unorm" : "1.0.0", "languages4translatewiki" : "0.1.3", - "swagger-node-express" : "1.2.3" + "swagger-node-express" : "1.2.3", + "channels" : "0.0.x" }, "bin": { "etherpad-lite": "./node/server.js" }, "devDependencies": { From cd288c70cb6bc738014cae9315170b238e0898a1 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 17 Apr 2013 14:26:11 +0200 Subject: [PATCH 2/4] Don't block changeset queue with delivering changeset --- src/node/handler/PadMessageHandler.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index b6d22c14..a24390a6 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -684,7 +684,10 @@ function handleUserChanges(data, cb) pad.appendRevision(nlChangeset); } - exports.updatePadClients(pad, callback); + exports.updatePadClients(pad, function(er) { + ERR(er) + }); + callback(); } ], function(err) { From 3b8621c6a00551d38b15c646d233baeef9fdee4b Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 17 Apr 2013 19:50:05 +0100 Subject: [PATCH 3/4] dont crash on no auth, ust a bandaid --- src/node/handler/PadMessageHandler.js | 37 +++++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 85efb008..3da5057d 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -224,22 +224,31 @@ exports.handleMessage = function(client, message) // FIXME: Call our "sessions" "connections". // FIXME: Use a hook instead // FIXME: Allow to override readwrite access with readonly - var auth = sessioninfos[client.id].auth; - securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, auth.password, function(err, statusObject) - { - if(ERR(err, callback)) return; - //access was granted - if(statusObject.accessStatus == "grant") + // FIXME: A message might arrive but wont have an auth object, this is obviously bad so we should deny it + // Simulate using the load testing tool + if(!sessioninfos[client.id].auth){ + console.error("Auth was never applied to a session", sessioninfos[client.id]) + client.json.send({accessStatus: "deny"}); + callback(); + }else{ + var auth = sessioninfos[client.id].auth; + securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, auth.password, function(err, statusObject) { - callback(); - } - //no access, send the client a message that tell him why - else - { - client.json.send({accessStatus: statusObject.accessStatus}) - } - }); + if(ERR(err, callback)) return; + + //access was granted + if(statusObject.accessStatus == "grant") + { + callback(); + } + //no access, send the client a message that tell him why + else + { + client.json.send({accessStatus: statusObject.accessStatus}) + } + }); + } }, finalHandler ]); From bf4c86ed94b33f74902eab04abc1d2538c7e2001 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 17 Apr 2013 23:48:11 +0100 Subject: [PATCH 4/4] better message for admins --- src/node/handler/PadMessageHandler.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index f051b9ed..1e079b52 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -234,8 +234,7 @@ exports.handleMessage = function(client, message) // FIXME: A message might arrive but wont have an auth object, this is obviously bad so we should deny it // Simulate using the load testing tool if(!sessioninfos[client.id].auth){ - console.error("Auth was never applied to a session", sessioninfos[client.id]) - client.json.send({accessStatus: "deny"}); + console.error("Auth was never applied to a session. If you are using the stress-test tool then restart Etherpad and the Stress test tool.") callback(); }else{ var auth = sessioninfos[client.id].auth;