Example #1
0
exports.restartServer = function () {

  if (server) {
    console.log("Restarting express server");
    server.close();
  }

  var app = express(); // New syntax for express v3

  if (settings.ssl) {

    console.log( "SSL -- enabled");
    console.log( "SSL -- server key file: " + settings.ssl.key );
    console.log( "SSL -- Certificate Authority's certificate file: " + settings.ssl.cert );
    
    var options = {
      key: fs.readFileSync( settings.ssl.key ),
      cert: fs.readFileSync( settings.ssl.cert )
    };
    if (settings.ssl.ca) {
      options.ca = [];
      for(var i = 0; i < settings.ssl.ca.length; i++) {
        var caFileName = settings.ssl.ca[i];
        options.ca.push(fs.readFileSync(caFileName));
      }
    }
    
    var https = require('https');
    server = https.createServer(options, app);

  } else {

    var http = require('http');
    server = http.createServer(app);
  }

  app.use(function (req, res, next) {
    // res.header("X-Frame-Options", "deny"); // breaks embedded pads
    if(settings.ssl){ // if we use SSL
      res.header("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
    }

    // Stop IE going into compatability mode
    // https://github.com/ether/etherpad-lite/issues/2547
    res.header("X-UA-Compatible", "IE=Edge,chrome=1");
    res.header("Server", serverName);
    next();
  });

  if(settings.trustProxy){
    app.enable('trust proxy');
  }

  hooks.callAll("expressConfigure", {"app": app});
  hooks.callAll("expressCreateServer", {"app": app, "server": server});

  server.listen(settings.port, settings.ip);
}
Example #2
0
exports.restartServer = function () {

  if (server) {
    console.log("Restarting express server");
    server.close();
  }

  var app = express(); // New syntax for express v3

  if (settings.ssl) {

    console.log( "SSL -- enabled");
    console.log( "SSL -- server key file: " + settings.ssl.key );
    console.log( "SSL -- Certificate Authority's certificate file: " + settings.ssl.cert );
    
    var options = {
      key: fs.readFileSync( settings.ssl.key ),
      cert: fs.readFileSync( settings.ssl.cert )
    };
    
    var https = require('https');
    server = https.createServer(options, app);

  } else {

    var http = require('http');
    server = http.createServer(app);
  }

  app.use(function (req, res, next) {
    // res.header("X-Frame-Options", "deny"); // breaks embedded pads
    if(settings.ssl){ // if we use SSL
      res.header("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
    }

    res.header("Server", serverName);
    next();
  });

  if(settings.trustProxy){
    app.enable('trust proxy');
  }

  hooks.callAll("expressConfigure", {"app": app});
  hooks.callAll("expressCreateServer", {"app": app, "server": server});

  server.listen(settings.port, settings.ip);
}
Example #3
0
 //delete the pad entry and delete pad from padManager
 function(callback)
 {
   db.remove("pad:"+padID);
   padManager.unloadPad(padID);
   hooks.callAll("padRemove", {'padID':padID});
   callback();
 }
  db.get("pad:"+this.id, function(err, value)
  {
    if(ERR(err, callback)) return;

    //if this pad exists, load it
    if(value != null)
    {
      //copy all attr. To a transfrom via fromJsonable if necassary
      for(var attr in value){
        if(jsonableList.indexOf(attr) !== -1){
          _this[attr] = _this[attr].fromJsonable(value[attr]);
        } else {
          _this[attr] = value[attr];
        }
      }
    }
    //this pad doesn't exist, so create it
    else
    {
      var firstChangeset = Changeset.makeSplice("\n", 0, 0, exports.cleanText(text));

      _this.appendRevision(firstChangeset, '');
    }

    hooks.callAll("padLoad", {'pad':_this});
    callback(null);
  });
Example #5
0
exports.expressCreateServer = function (hook_name, args, cb) {
  //init socket.io and redirect all requests to the MessageHandler
  // there shouldn't be a browser that isn't compatible to all
  // transports in this list at once
  // e.g. XHR is disabled in IE by default, so in IE it should use jsonp-polling
  var io = socketio({
    transports: settings.socketTransportProtocols
  }).listen(args.server);

  /* Require an express session cookie to be present, and load the
   * session. See http://www.danielbaulig.de/socket-ioexpress for more
   * info */

  io.use(function(socket, accept) {
    var data = socket.request;
    // Use a setting if we want to allow load Testing
    if(!data.headers.cookie && settings.loadTest){
      accept(null, true);
    }else{
      if (!data.headers.cookie) return accept('No session cookie transmitted.', false);
    }
    // Use connect's cookie parser, because it knows how to parse signed cookies
    connect.cookieParser(webaccess.secret)(data, {}, function(err){
      if(err) {
        console.error(err);
        accept("Couldn't parse request cookies. ", false);
        return;
      }

      data.sessionID = data.signedCookies.express_sid;
      args.app.sessionStore.get(data.sessionID, function (err, session) {
        if (err || !session) return accept('Bad session / session has expired', false);
        data.session = new connect.middleware.session.Session(data, session);
        accept(null, true);
      });
    });
  });

  // var socketIOLogger = log4js.getLogger("socket.io");
  // Debug logging now has to be set at an environment level, this is stupid.
  // https://github.com/Automattic/socket.io/wiki/Migrating-to-1.0
  // This debug logging environment is set in Settings.js

  //minify socket.io javascript
  // Due to a shitty decision by the SocketIO team minification is
  // no longer available, details available at:
  // http://stackoverflow.com/questions/23981741/minify-socket-io-socket-io-js-with-1-0
  // if(settings.minify) io.enable('browser client minification');
  
  //Initalize the Socket.IO Router
  socketIORouter.setSocketIO(io);
  socketIORouter.addComponent("pad", padMessageHandler);

  hooks.callAll("socketio", {"app": args.app, "io": io, "server": args.server});
}
Example #6
0
  args.app.get('/p/:pad', function(req, res, next)
  {
    hooks.callAll("padInitToolbar", {
      toolbar: toolbar
    });

    res.send(eejs.require("ep_etherpad-lite/templates/pad.html", {
      req: req,
      toolbar: toolbar
    }));
  });
Example #7
0
exports.expressCreateServer = function (hook_name, args, cb) {
  //init socket.io and redirect all requests to the MessageHandler
  var io = socketio.listen(args.app);

  /* Require an express session cookie to be present, and load the
   * session. See http://www.danielbaulig.de/socket-ioexpress for more
   * info */
  io.set('authorization', function (data, accept) {
    if (!data.headers.cookie) return accept('No session cookie transmitted.', false);
    data.cookie = connect.utils.parseCookie(data.headers.cookie);
    data.sessionID = data.cookie.express_sid;
    args.app.sessionStore.get(data.sessionID, function (err, session) {
      if (err || !session) return accept('Bad session / session has expired', false);
      data.session = new connect.middleware.session.Session(data, session);
      accept(null, true);
    });
  });


  //this is only a workaround to ensure it works with all browers behind a proxy
  //we should remove this when the new socket.io version is more stable
  io.set('transports', ['xhr-polling']);

  var socketIOLogger = log4js.getLogger("socket.io");
  io.set('logger', {
    debug: function (str)
    {
      socketIOLogger.debug.apply(socketIOLogger, arguments);
    }, 
    info: function (str)
    {
      socketIOLogger.info.apply(socketIOLogger, arguments);
    },
    warn: function (str)
    {
      socketIOLogger.warn.apply(socketIOLogger, arguments);
    },
    error: function (str)
    {
      socketIOLogger.error.apply(socketIOLogger, arguments);
    },
  });

  //minify socket.io javascript
  if(settings.minify)
    io.enable('browser client minification');

  //Initalize the Socket.IO Router
  socketIORouter.setSocketIO(io);
  socketIORouter.addComponent("pad", padMessageHandler);
  socketIORouter.addComponent("timeslider", timesliderMessageHandler);

  hooks.callAll("socketio", {"app": args.app, "io": io});
}
Pad.prototype.appendRevision = function appendRevision(aChangeset, author) {
  if(!author)
    author = '';

  var newAText = Changeset.applyToAText(aChangeset, this.atext, this.pool);
  Changeset.copyAText(newAText, this.atext);

  var newRev = ++this.head;

  var newRevData = {};
  newRevData.changeset = aChangeset;
  newRevData.meta = {};
  newRevData.meta.author = author;
  newRevData.meta.timestamp = new Date().getTime();

  //ex. getNumForAuthor
  if(author != '')
    this.pool.putAttrib(['author', author || '']);

  if(newRev % 100 == 0)
  {
    newRevData.meta.atext = this.atext;
  }

  db.set("pad:"+this.id+":revs:"+newRev, newRevData);
  this.saveToDatabase();

  // set the author to pad
  if(author)
    authorManager.addPad(author, this.id);

  if (this.head == 0) {
    hooks.callAll("padCreate", {'pad':this, 'author': author});
  } else {
    hooks.callAll("padUpdate", {'pad':this, 'author': author});
  }
};
Example #9
0
	socket.on('widget-positions', function(positions){
		widgetPositions = positions;

		if (widgetPositions) {
			var widgets = $(".widget-column").children();
			$(".widget-column").html('');

			// check if there are widgets which don't have positions
			// and if so, then add them to the position list
			widgets.each(function(i, widget){
				if (widgetPositions.indexOf(widget.id) === -1) {
					console.log('widget without position found:', widget.id);
					widgetPositions.push(widget.id);
				}
			});

			// place widgets to specified positions
			$.each(widgetPositions, function(i, id) {
				$(".widget-column").append( widgets.filter('#'+id));
			});
		}

		$( ".widget-column" ).sortable({
			connectWith: '.widget-column',
			axis: 'y',
			handle: '.widget-header',
			cursor: 'move',
			placeholder: 'widget-placeholder',

			// store widget positions after sorting
			stop: function(event, ui) {
				widgetPositions = $( ".widget-column" ).sortable('toArray');
				socket.emit('widget-positions', widgetPositions);
			},
			// calculate placeholder height
			start: function(e, ui){
				ui.placeholder.height(ui.item.height());
			}

		});

		hooks.callAll('loadWidgets', {'socket': socket});
	});
Example #10
0
  //initalize the http server
  function (callback)
  {
    //create server
    var app = express.createServer();

    app.use(function (req, res, next) {
      res.header("Server", serverName);
      next();
    });
    
    app.configure(function() { hooks.callAll("expressConfigure", {"app": app}); });
    
    hooks.callAll("expressCreateServer", {"app": app});
    
    //let the server listen
    app.listen(settings.port, settings.ip);
    console.log("Server is listening at " + settings.ip + ":" + settings.port);

    callback(null);  
  }
Example #11
0
exports.restartServer = function () {
  if (server) {
    console.log("Restarting express server");
    server.close();
  }

  server = express.createServer();

  server.use(function (req, res, next) {
    res.header("Server", serverName);
    next();
  });

  server.configure(function() {
    hooks.callAll("expressConfigure", {"app": server});
  });
  hooks.callAll("expressCreateServer", {"app": server});

  server.listen(settings.port, settings.ip);
}
Example #12
0
exports.restartServer = function () {

  if (server) {
    console.log("Restarting express server");
    server.close();
  }

  var app = express(); // New syntax for express v3

  if (settings.ssl) {

    console.log( "SSL -- enabled");
    console.log( "SSL -- server key file: " + settings.ssl.key );
    console.log( "SSL -- Certificate Authority's certificate file: " + settings.ssl.cert );
    
    options = {
      key: fs.readFileSync( settings.ssl.key ),
      cert: fs.readFileSync( settings.ssl.cert )
    };
    
    var https = require('https');
    server = https.createServer(options, app);

  } else {

    var http = require('http');
    server = http.createServer(app);
  }

  app.use(function (req, res, next) {
    res.header("Server", serverName);
    next();
  });

  app.configure(function() {
    hooks.callAll("expressConfigure", {"app": app});
  });
  hooks.callAll("expressCreateServer", {"app": app, "server": server});

  server.listen(settings.port, settings.ip);
}
Example #13
0
exports.expressCreateServer = function (hook_name, args, cb) {
  //init socket.io and redirect all requests to the MessageHandler
  var io = socketio.listen(args.app);

  //this is only a workaround to ensure it works with all browers behind a proxy
  //we should remove this when the new socket.io version is more stable
  io.set('transports', ['xhr-polling']);

  var socketIOLogger = log4js.getLogger("socket.io");
  io.set('logger', {
    debug: function (str)
    {
      socketIOLogger.debug.apply(socketIOLogger, arguments);
    }, 
    info: function (str)
    {
      socketIOLogger.info.apply(socketIOLogger, arguments);
    },
    warn: function (str)
    {
      socketIOLogger.warn.apply(socketIOLogger, arguments);
    },
    error: function (str)
    {
      socketIOLogger.error.apply(socketIOLogger, arguments);
    },
  });

  //minify socket.io javascript
  if(settings.minify)
    io.enable('browser client minification');

  //Initalize the Socket.IO Router
  socketIORouter.setSocketIO(io);
  socketIORouter.addComponent("pad", padMessageHandler);
  socketIORouter.addComponent("timeslider", timesliderMessageHandler);

  hooks.callAll("socketio", {"app": args.app, "io": io});
}
Example #14
0
  args.app.get('/p/:pad', function(req, res, next)
  {
    // Set language for pad editor for the first time
    // Or if language cookie doesn't exist
    if (req.cookies.language === undefined)
    {
      res.cookie('language', settings.padOptions.lang);
    }

    // The below might break for pads being rewritten
    var isReadOnly = req.url.indexOf("/p/r.") === 0;

    hooks.callAll("padInitToolbar", {
      toolbar: toolbar,
      isReadOnly: isReadOnly
    });

    res.send(eejs.require("ep_etherpad-lite/templates/pad.html", {
      req: req,
      toolbar: toolbar,
      isReadOnly: isReadOnly
    }));
  });
 //delete the pad entry and delete pad from padManager
 function(callback)
 {
   padManager.removePad(padID);
   hooks.callAll("padRemove", {'padID':padID});
   callback();
 }
Example #16
0
 server.configure(function() {
   hooks.callAll("expressConfigure", {"app": server});
 });
Example #17
0
 app.configure(function() {
   hooks.callAll("expressConfigure", {"app": app});
 });
 // let the plugins know the pad was copied
 function(callback) {
   hooks.callAll('padCopy', { 'originalPad': _this, 'destinationID': destinationID });
   callback();
 }