Server.coffee 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. express = require('express')
  2. Settings = require('settings-sharelatex')
  3. logger = require 'logger-sharelatex'
  4. metrics = require('./Metrics')
  5. crawlerLogger = require('./CrawlerLogger')
  6. expressLocals = require('./ExpressLocals')
  7. socketIoConfig = require('./SocketIoConfig')
  8. soareqid = require('soa-req-id')
  9. Router = require('../router')
  10. metrics.inc("startup")
  11. redis = require('redis')
  12. RedisStore = require('connect-redis')(express)
  13. SessionSockets = require('session.socket.io')
  14. sessionStore = new RedisStore(host:Settings.redis.web.host, port:Settings.redis.web.port, pass:Settings.redis.web.password)
  15. cookieParser = express.cookieParser(Settings.security.sessionSecret)
  16. oneDayInMilliseconds = 86400000
  17. ReferalConnect = require('../Features/Referal/ReferalConnect')
  18. Monitor = require "./Monitor"
  19. Settings.editorIsOpen ||= true
  20. if Settings.cacheStaticAssets
  21. staticCacheAge = (oneDayInMilliseconds * 365)
  22. else
  23. staticCacheAge = 0
  24. app = express()
  25. cookieKey = "sharelatex.sid"
  26. cookieSessionLength = 5 * oneDayInMilliseconds
  27. csrf = express.csrf()
  28. ignoreCsrfRoutes = []
  29. app.ignoreCsrf = (method, route) ->
  30. ignoreCsrfRoutes.push new express.Route(method, route)
  31. app.configure ()->
  32. app.use express.static(__dirname + '/../../../public', {maxAge: staticCacheAge })
  33. app.set 'views', __dirname + '/../../views'
  34. app.set 'view engine', 'jade'
  35. app.use express.bodyParser(uploadDir: __dirname + "/../../../data/uploads")
  36. app.use cookieParser
  37. app.use express.session
  38. proxy: true
  39. cookie:
  40. maxAge: cookieSessionLength
  41. secure: Settings.secureCookie
  42. store: sessionStore
  43. key: cookieKey
  44. # Measure expiry from last request, not last login
  45. app.use (req, res, next) ->
  46. req.session.expires = Date.now() + cookieSessionLength
  47. next()
  48. app.use (req, res, next) ->
  49. for route in ignoreCsrfRoutes
  50. if route.method == req.method?.toLowerCase() and route.match(req.path)
  51. return next()
  52. csrf(req, res, next)
  53. app.use ReferalConnect.use
  54. app.use express.methodOverride()
  55. expressLocals(app)
  56. app.configure 'production', ->
  57. logger.info "Production Enviroment"
  58. app.enable('view cache')
  59. app.use Monitor.logger
  60. app.use (req, res, next)->
  61. metrics.inc "http-request"
  62. crawlerLogger.log(req)
  63. next()
  64. app.use (req, res, next) ->
  65. if !Settings.editorIsOpen
  66. res.status(503)
  67. res.render("general/closed", {title:"Maintenance"})
  68. else
  69. next()
  70. app.get "/status", (req, res)->
  71. res.send("web sharelatex is alive")
  72. req.session.destroy()
  73. logger.info ("creating HTTP server").yellow
  74. server = require('http').createServer(app)
  75. io = require('socket.io').listen(server)
  76. sessionSockets = new SessionSockets(io, sessionStore, cookieParser, cookieKey)
  77. router = new Router(app, io, sessionSockets)
  78. socketIoConfig.configure(io)
  79. module.exports =
  80. io: io
  81. app: app
  82. server: server