Merge branch 'develop' of github.com:ether/etherpad-lite into develop

This commit is contained in:
John McLear 2015-04-11 00:24:30 +01:00
commit be0a96af6e
19 changed files with 40 additions and 39 deletions

View File

@ -22,7 +22,7 @@ Also, check out the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**,
# Installation # Installation
Etherpad works with node v0.8, v0.10 and v0.11, only. (We don't support v0.6) Etherpad works with node v0.10+ and io.js.
## Windows ## Windows

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
NODE_VERSION="0.8.4" NODE_VERSION="0.10.38"
#Move to the folder where ep-lite is installed #Move to the folder where ep-lite is installed
cd `dirname $0` cd `dirname $0`

View File

@ -50,9 +50,9 @@ NODE_V_MINOR=$(echo $NODE_VERSION | cut -d "." -f 1-2)
if hash iojs 2>/dev/null; then if hash iojs 2>/dev/null; then
IOJS_VERSION=$(iojs --version) IOJS_VERSION=$(iojs --version)
fi fi
if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.10" ] && [ ! $NODE_V_MINOR = "v0.11" ] && [ ! $NODE_V_MINOR = "v0.12" ]; then if [ ! $NODE_V_MINOR = "v0.10" ] && [ ! $NODE_V_MINOR = "v0.11" ] && [ ! $NODE_V_MINOR = "v0.12" ]; then
if [ ! $IOJS_VERSION ]; then if [ ! $IOJS_VERSION ]; then
echo "You're running a wrong version of node, or io.js is not installed. You're using $NODE_VERSION, we need v0.8.x, v0.10.x, v0.11.x or v0.12.x" >&2 echo "You're running a wrong version of node, or io.js is not installed. You're using $NODE_VERSION, we need v0.10.x, v0.11.x or v0.12.x" >&2
exit 1 exit 1
fi fi
fi fi

View File

@ -8,7 +8,7 @@ cmd /C node -e "" || ( echo "Please install node.js ( http://nodejs.org )" && ex
echo _ echo _
echo Checking node version... echo Checking node version...
set check_version="if(['8','10'].indexOf(process.version.split('.')[1].toString()) === -1) { console.log('You are running a wrong version of Node. Etherpad requires v0.8.x or v0.10.x'); process.exit(1) }" set check_version="if(['10','11','12'].indexOf(process.version.split('.')[1]) === -1 && process.version.split('.')[0] !== '1') { console.log('You are running a wrong version of Node. Etherpad requires v0.10+'); process.exit(1) }"
cmd /C node -e %check_version% || exit /B 1 cmd /C node -e %check_version% || exit /B 1
echo _ echo _

View File

@ -4,7 +4,7 @@
* This is not used for authors that are created via the API at current * This is not used for authors that are created via the API at current
*/ */
var Store = require('ep_etherpad-lite/node_modules/connect/lib/middleware/session/store'), var Store = require('ep_etherpad-lite/node_modules/express-session').Store,
db = require('ep_etherpad-lite/node/db/DB').db, db = require('ep_etherpad-lite/node/db/DB').db,
log4js = require('ep_etherpad-lite/node_modules/log4js'), log4js = require('ep_etherpad-lite/node_modules/log4js'),
messageLogger = log4js.getLogger("SessionStore"); messageLogger = log4js.getLogger("SessionStore");

View File

@ -103,7 +103,7 @@ exports.doExport = function(req, res, padId, type)
//send the file //send the file
function(callback) function(callback)
{ {
res.sendfile(destFile, null, callback); res.sendFile(destFile, null, callback);
}, },
//clean up temporary files //clean up temporary files
function(callback) function(callback)
@ -184,7 +184,7 @@ exports.doExport = function(req, res, padId, type)
//send the file //send the file
function(callback) function(callback)
{ {
res.sendfile(destFile, null, callback); res.sendFile(destFile, null, callback);
}, },
//clean up temporary files //clean up temporary files
function(callback) function(callback)

View File

@ -303,7 +303,7 @@ exports.doImport = function(req, res, padId)
var impexp = window.parent.padimpexp.handleFrameCall('" + directDatabaseAccess +"', '" + status + "'); \ var impexp = window.parent.padimpexp.handleFrameCall('" + directDatabaseAccess +"', '" + status + "'); \
}) \ }) \
</script>" </script>"
, 200); );
}); });
} }

View File

@ -70,9 +70,7 @@ exports.restartServer = function () {
app.enable('trust proxy'); app.enable('trust proxy');
} }
app.configure(function() { hooks.callAll("expressConfigure", {"app": app});
hooks.callAll("expressConfigure", {"app": app});
});
hooks.callAll("expressCreateServer", {"app": app, "server": server}); hooks.callAll("expressCreateServer", {"app": app, "server": server});
server.listen(settings.port, settings.ip); server.listen(settings.port, settings.ip);

View File

@ -39,7 +39,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
// if an error occurs Connect will pass it down // if an error occurs Connect will pass it down
// through these "error-handling" middleware // through these "error-handling" middleware
// allowing you to respond however you like // allowing you to respond however you like
res.send(500, { error: 'Sorry, something bad happened!' }); res.status(500).send({ error: 'Sorry, something bad happened!' });
console.error(err.stack? err.stack : err.toString()); console.error(err.stack? err.stack : err.toString());
stats.meter('http500').mark() stats.meter('http500').mark()
}) })

View File

@ -55,7 +55,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
ERR(err); ERR(err);
if(err == "notfound") if(err == "notfound")
res.send(404, '404 - Not Found'); res.status(404).send('404 - Not Found');
else else
res.send(html); res.send(html);
}); });

View File

@ -7,7 +7,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
//ensure the padname is valid and the url doesn't end with a / //ensure the padname is valid and the url doesn't end with a /
if(!padManager.isValidPadId(padId) || /\/$/.test(req.url)) if(!padManager.isValidPadId(padId) || /\/$/.test(req.url))
{ {
res.send(404, 'Such a padname is forbidden'); res.status(404).send('Such a padname is forbidden');
} }
else else
{ {
@ -19,7 +19,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
var query = url.parse(req.url).query; var query = url.parse(req.url).query;
if ( query ) real_url += '?' + query; if ( query ) real_url += '?' + query;
res.header('Location', real_url); res.header('Location', real_url);
res.send(302, 'You should be redirected to <a href="' + real_url + '">' + real_url + '</a>'); res.status(302).send('You should be redirected to <a href="' + real_url + '">' + real_url + '</a>');
} }
//the pad id was fine, so just render it //the pad id was fine, so just render it
else else

View File

@ -6,7 +6,8 @@ var webaccess = require("ep_etherpad-lite/node/hooks/express/webaccess");
var padMessageHandler = require("../../handler/PadMessageHandler"); var padMessageHandler = require("../../handler/PadMessageHandler");
var connect = require('connect'); var cookieParser = require('cookie-parser');
var sessionModule = require('express-session');
exports.expressCreateServer = function (hook_name, args, cb) { exports.expressCreateServer = function (hook_name, args, cb) {
//init socket.io and redirect all requests to the MessageHandler //init socket.io and redirect all requests to the MessageHandler
@ -20,6 +21,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
/* Require an express session cookie to be present, and load the /* Require an express session cookie to be present, and load the
* session. See http://www.danielbaulig.de/socket-ioexpress for more * session. See http://www.danielbaulig.de/socket-ioexpress for more
* info */ * info */
var cookieParserFn = cookieParser(webaccess.secret, {});
io.use(function(socket, accept) { io.use(function(socket, accept) {
var data = socket.request; var data = socket.request;
@ -29,8 +31,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
}else{ }else{
if (!data.headers.cookie) return accept('No session cookie transmitted.', false); if (!data.headers.cookie) return accept('No session cookie transmitted.', false);
} }
// Use connect's cookie parser, because it knows how to parse signed cookies cookieParserFn(data, {}, function(err){
connect.cookieParser(webaccess.secret)(data, {}, function(err){
if(err) { if(err) {
console.error(err); console.error(err);
accept("Couldn't parse request cookies. ", false); accept("Couldn't parse request cookies. ", false);
@ -40,7 +41,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
data.sessionID = data.signedCookies.express_sid; data.sessionID = data.signedCookies.express_sid;
args.app.sessionStore.get(data.sessionID, function (err, session) { args.app.sessionStore.get(data.sessionID, function (err, session) {
if (err || !session) return accept('Bad session / session has expired', false); if (err || !session) return accept('Bad session / session has expired', false);
data.session = new connect.middleware.session.Session(data, session); data.session = new sessionModule.Session(data, session);
accept(null, true); accept(null, true);
}); });
}); });

View File

@ -19,13 +19,13 @@ exports.expressCreateServer = function (hook_name, args, cb) {
args.app.get('/robots.txt', function(req, res) args.app.get('/robots.txt', function(req, res)
{ {
var filePath = path.normalize(__dirname + "/../../../static/custom/robots.txt"); var filePath = path.normalize(__dirname + "/../../../static/custom/robots.txt");
res.sendfile(filePath, function(err) res.sendFile(filePath, function(err)
{ {
//there is no custom favicon, send the default robots.txt which dissallows all //there is no custom favicon, send the default robots.txt which dissallows all
if(err) if(err)
{ {
filePath = path.normalize(__dirname + "/../../../static/robots.txt"); filePath = path.normalize(__dirname + "/../../../static/robots.txt");
res.sendfile(filePath); res.sendFile(filePath);
} }
}); });
}); });
@ -60,13 +60,13 @@ exports.expressCreateServer = function (hook_name, args, cb) {
args.app.get( /\/favicon.ico$/, function(req, res) args.app.get( /\/favicon.ico$/, function(req, res)
{ {
var filePath = path.normalize(__dirname + "/../../../static/custom/favicon.ico"); var filePath = path.normalize(__dirname + "/../../../static/custom/favicon.ico");
res.sendfile(filePath, function(err) res.sendFile(filePath, function(err)
{ {
//there is no custom favicon, send the default favicon //there is no custom favicon, send the default favicon
if(err) if(err)
{ {
filePath = path.normalize(__dirname + "/../../../static/favicon.ico"); filePath = path.normalize(__dirname + "/../../../static/favicon.ico");
res.sendfile(filePath); res.sendFile(filePath);
} }
}); });
}); });

View File

@ -9,7 +9,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
// Cache both minified and static. // Cache both minified and static.
var assetCache = new CachingMiddleware; var assetCache = new CachingMiddleware;
args.app.all('/(javascripts|static)/*', assetCache.handle); args.app.all(/\/(javascripts|static)\/(.*)/, assetCache.handle);
// Minify will serve static files compressed (minify enabled). It also has // Minify will serve static files compressed (minify enabled). It also has
// file-specific hacks for ace/require-kernel/etc. // file-specific hacks for ace/require-kernel/etc.
@ -30,7 +30,8 @@ exports.expressCreateServer = function (hook_name, args, cb) {
Yajsml.associators.associationsForSimpleMapping(minify.tar); Yajsml.associators.associationsForSimpleMapping(minify.tar);
var associator = new StaticAssociator(associations); var associator = new StaticAssociator(associations);
jsServer.setAssociator(associator); jsServer.setAssociator(associator);
args.app.use(jsServer);
args.app.use(jsServer.handle.bind(jsServer));
// serve plugin definitions // serve plugin definitions
// not very static, but served here so that client can do require("pluginfw/static/js/plugin-definitions.js"); // not very static, but served here so that client can do require("pluginfw/static/js/plugin-definitions.js");

View File

@ -50,7 +50,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
args.app.get('/tests/frontend/*', function (req, res) { args.app.get('/tests/frontend/*', function (req, res) {
var filePath = url2FilePath(req.url); var filePath = url2FilePath(req.url);
res.sendfile(filePath); res.sendFile(filePath);
}); });
args.app.get('/tests/frontend', function (req, res) { args.app.get('/tests/frontend', function (req, res) {

View File

@ -4,7 +4,8 @@ var httpLogger = log4js.getLogger("http");
var settings = require('../../utils/Settings'); var settings = require('../../utils/Settings');
var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks');
var ueberStore = require('../../db/SessionStore'); var ueberStore = require('../../db/SessionStore');
var stats = require('ep_etherpad-lite/node/stats') var stats = require('ep_etherpad-lite/node/stats');
var sessionModule = require('express-session');
//checks for basic http auth //checks for basic http auth
exports.basicAuth = function (req, res, next) { exports.basicAuth = function (req, res, next) {
@ -56,10 +57,10 @@ exports.basicAuth = function (req, res, next) {
res.header('WWW-Authenticate', 'Basic realm="Protected Area"'); res.header('WWW-Authenticate', 'Basic realm="Protected Area"');
if (req.headers.authorization) { if (req.headers.authorization) {
setTimeout(function () { setTimeout(function () {
res.send(401, 'Authentication required'); res.status(401).send('Authentication required');
}, 1000); }, 1000);
} else { } else {
res.send(401, 'Authentication required'); res.status(401).send('Authentication required');
} }
})); }));
} }
@ -117,9 +118,8 @@ exports.expressConfigure = function (hook_name, args, cb) {
exports.secret = settings.sessionKey; // Isn't this being reset each time the server spawns? exports.secret = settings.sessionKey; // Isn't this being reset each time the server spawns?
} }
args.app.use(express.cookieParser(exports.secret));
args.app.sessionStore = exports.sessionStore; args.app.sessionStore = exports.sessionStore;
args.app.use(express.session({secret: exports.secret, store: args.app.sessionStore, key: 'express_sid' })); args.app.use(sessionModule({secret: exports.secret, store: args.app.sessionStore, resave: true, saveUninitialized: true, name: 'express_sid' }));
args.app.use(exports.basicAuth); args.app.use(exports.basicAuth);
} }

View File

@ -91,7 +91,7 @@ exports.expressCreateServer = function(n, args) {
res.setHeader('Content-Type', 'application/json; charset=utf-8'); res.setHeader('Content-Type', 'application/json; charset=utf-8');
res.send('{"'+locale+'":'+JSON.stringify(locales[locale])+'}'); res.send('{"'+locale+'":'+JSON.stringify(locales[locale])+'}');
} else { } else {
res.send(404, 'Language not available'); res.status(404).send('Language not available');
} }
}) })

View File

@ -15,7 +15,7 @@ module.exports = function (req, res, callback) {
callback(); callback();
//no access //no access
} else { } else {
res.send(403, "403 - Can't touch this"); res.status(403).send("403 - Can't touch this");
} }
}); });
} }

View File

@ -18,9 +18,10 @@
"resolve" : "1.1.6", "resolve" : "1.1.6",
"socket.io" : "1.3.5", "socket.io" : "1.3.5",
"ueberDB" : "0.2.15", "ueberDB" : "0.2.15",
"express" : "3.8.1", "express" : "4.12.3",
"express-session" : "1.10.4",
"cookie-parser" : "1.3.4",
"async" : "0.9.0", "async" : "0.9.0",
"connect" : "2.7.11",
"clean-css" : "3.1.9", "clean-css" : "3.1.9",
"uglify-js" : "2.4.19", "uglify-js" : "2.4.19",
"formidable" : "1.0.17", "formidable" : "1.0.17",
@ -48,7 +49,7 @@
"devDependencies": { "devDependencies": {
"wd" : "0.3.11" "wd" : "0.3.11"
}, },
"engines" : { "node" : ">=0.6.3", "engines" : { "node" : ">=0.10.0",
"npm" : ">=1.0" "npm" : ">=1.0"
}, },
"repository" : { "type" : "git", "repository" : { "type" : "git",