ExpressLocals.coffee 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. logger = require 'logger-sharelatex'
  2. fs = require 'fs'
  3. crypto = require 'crypto'
  4. Settings = require('settings-sharelatex')
  5. SubscriptionFormatters = require('../Features/Subscription/SubscriptionFormatters')
  6. querystring = require('querystring')
  7. SystemMessageManager = require("../Features/SystemMessages/SystemMessageManager")
  8. _ = require("underscore")
  9. Modules = require "./Modules"
  10. fingerprints = {}
  11. Path = require 'path'
  12. jsPath =
  13. if Settings.useMinifiedJs
  14. "/minjs/"
  15. else
  16. "/js/"
  17. logger.log "Generating file fingerprints..."
  18. for path in [
  19. "#{jsPath}libs/require.js",
  20. "#{jsPath}ide.js",
  21. "#{jsPath}main.js",
  22. "#{jsPath}libs.js",
  23. "#{jsPath}ace/ace.js",
  24. "#{jsPath}libs/pdfjs-1.3.91/pdf.js",
  25. "#{jsPath}libs/pdfjs-1.3.91/pdf.worker.js",
  26. "#{jsPath}libs/pdfjs-1.3.91/compatibility.js",
  27. "/stylesheets/style.css"
  28. ]
  29. filePath = Path.join __dirname, "../../../", "public#{path}"
  30. exists = fs.existsSync filePath
  31. if exists
  32. content = fs.readFileSync filePath
  33. hash = crypto.createHash("md5").update(content).digest("hex")
  34. logger.log "#{filePath}: #{hash}"
  35. fingerprints[path] = hash
  36. else
  37. logger.log filePath:filePath, "file does not exist for fingerprints"
  38. module.exports = (app, webRouter, apiRouter)->
  39. webRouter.use (req, res, next)->
  40. res.locals.session = req.session
  41. next()
  42. webRouter.use (req, res, next)->
  43. res.locals.jsPath = jsPath
  44. next()
  45. webRouter.use (req, res, next)->
  46. res.locals.settings = Settings
  47. next()
  48. webRouter.use (req, res, next)->
  49. res.locals.translate = (key, vars = {}) ->
  50. vars.appName = Settings.appName
  51. req.i18n.translate(key, vars)
  52. res.locals.currentUrl = req.originalUrl
  53. next()
  54. webRouter.use (req, res, next)->
  55. res.locals.getSiteHost = ->
  56. Settings.siteUrl.substring(Settings.siteUrl.indexOf("//")+2)
  57. next()
  58. webRouter.use (req, res, next)->
  59. res.locals.getUserEmail = ->
  60. email = req?.session?.user?.email or ""
  61. return email
  62. next()
  63. webRouter.use (req, res, next)->
  64. res.locals.formatProjectPublicAccessLevel = (privilegeLevel)->
  65. formatedPrivileges = private:"Private", readOnly:"Public: Read Only", readAndWrite:"Public: Read and Write"
  66. return formatedPrivileges[privilegeLevel] || "Private"
  67. next()
  68. webRouter.use (req, res, next)->
  69. res.locals.buildReferalUrl = (referal_medium) ->
  70. url = Settings.siteUrl
  71. if req.session? and req.session.user? and req.session.user.referal_id?
  72. url+="?r=#{req.session.user.referal_id}&rm=#{referal_medium}&rs=b" # Referal source = bonus
  73. return url
  74. res.locals.getReferalId = ->
  75. if req.session? and req.session.user? and req.session.user.referal_id
  76. return req.session.user.referal_id
  77. res.locals.getReferalTagLine = ->
  78. tagLines = [
  79. "Roar!"
  80. "Shout about us!"
  81. "Please recommend us"
  82. "Tell the world!"
  83. "Thanks for using ShareLaTeX"
  84. ]
  85. return tagLines[Math.floor(Math.random()*tagLines.length)]
  86. res.locals.getRedirAsQueryString = ->
  87. if req.query.redir?
  88. return "?#{querystring.stringify({redir:req.query.redir})}"
  89. return ""
  90. res.locals.getLoggedInUserId = ->
  91. return req.session.user?._id
  92. next()
  93. webRouter.use (req, res, next) ->
  94. res.locals.csrfToken = req?.csrfToken()
  95. next()
  96. webRouter.use (req, res, next) ->
  97. res.locals.getReqQueryParam = (field)->
  98. return req.query?[field]
  99. next()
  100. webRouter.use (req, res, next)->
  101. res.locals.fingerprint = (path) ->
  102. if fingerprints[path]?
  103. return fingerprints[path]
  104. else
  105. logger.err "No fingerprint for file: #{path}"
  106. return ""
  107. next()
  108. webRouter.use (req, res, next)->
  109. res.locals.formatPrice = SubscriptionFormatters.formatPrice
  110. next()
  111. webRouter.use (req, res, next)->
  112. res.locals.externalAuthenticationSystemUsed = ->
  113. Settings.ldap?
  114. next()
  115. webRouter.use (req, res, next)->
  116. if req.session.user?
  117. res.locals.user =
  118. email: req.session.user.email
  119. first_name: req.session.user.first_name
  120. last_name: req.session.user.last_name
  121. if req.session.justRegistered
  122. res.locals.justRegistered = true
  123. delete req.session.justRegistered
  124. if req.session.justLoggedIn
  125. res.locals.justLoggedIn = true
  126. delete req.session.justLoggedIn
  127. res.locals.gaToken = Settings.analytics?.ga?.token
  128. res.locals.tenderUrl = Settings.tenderUrl
  129. res.locals.sentrySrc = Settings.sentry?.src
  130. res.locals.sentryPublicDSN = Settings.sentry?.publicDSN
  131. next()
  132. webRouter.use (req, res, next) ->
  133. if req.query? and req.query.scribtex_path?
  134. res.locals.lookingForScribtex = true
  135. res.locals.scribtexPath = req.query.scribtex_path
  136. next()
  137. webRouter.use (req, res, next) ->
  138. # Clone the nav settings so they can be modified for each request
  139. res.locals.nav = {}
  140. for key, value of Settings.nav
  141. res.locals.nav[key] = _.clone(Settings.nav[key])
  142. res.locals.templates = Settings.templateLinks
  143. next()
  144. webRouter.use (req, res, next) ->
  145. SystemMessageManager.getMessages (error, messages = []) ->
  146. res.locals.systemMessages = messages
  147. next()
  148. webRouter.use (req, res, next)->
  149. res.locals.query = req.query
  150. next()
  151. webRouter.use (req, res, next)->
  152. subdomain = _.find Settings.i18n.subdomainLang, (subdomain)->
  153. subdomain.lngCode == req.showUserOtherLng and !subdomain.hide
  154. res.locals.recomendSubdomain = subdomain
  155. res.locals.currentLngCode = req.lng
  156. next()
  157. webRouter.use (req, res, next) ->
  158. if Settings.reloadModuleViewsOnEachRequest
  159. Modules.loadViewIncludes()
  160. res.locals.moduleIncludes = Modules.moduleIncludes
  161. res.locals.moduleIncludesAvailable = Modules.moduleIncludesAvailable
  162. next()