ExpressLocals.coffee 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. Url = require "url"
  11. fingerprints = {}
  12. Path = require 'path'
  13. jsPath =
  14. if Settings.useMinifiedJs
  15. "/minjs/"
  16. else
  17. "/js/"
  18. logger.log "Generating file fingerprints..."
  19. for path in [
  20. "#{jsPath}libs/require.js",
  21. "#{jsPath}ide.js",
  22. "#{jsPath}main.js",
  23. "#{jsPath}libs.js",
  24. "#{jsPath}ace/ace.js",
  25. "#{jsPath}libs/pdfjs-1.3.91/pdf.js",
  26. "#{jsPath}libs/pdfjs-1.3.91/pdf.worker.js",
  27. "#{jsPath}libs/pdfjs-1.3.91/compatibility.js",
  28. "/stylesheets/style.css"
  29. ]
  30. filePath = Path.join __dirname, "../../../", "public#{path}"
  31. exists = fs.existsSync filePath
  32. if exists
  33. content = fs.readFileSync filePath
  34. hash = crypto.createHash("md5").update(content).digest("hex")
  35. logger.log "#{filePath}: #{hash}"
  36. fingerprints[path] = hash
  37. else
  38. logger.log filePath:filePath, "file does not exist for fingerprints"
  39. getFingerprint = (path) ->
  40. if fingerprints[path]?
  41. return fingerprints[path]
  42. else
  43. logger.err "No fingerprint for file: #{path}"
  44. return ""
  45. logger.log "Finished generating file fingerprints"
  46. cdnAvailable = Settings.cdn?.web?.host?
  47. darkCdnAvailable = Settings.cdn?.web?.darkHost?
  48. module.exports = (app, webRouter, apiRouter)->
  49. webRouter.use (req, res, next)->
  50. res.locals.session = req.session
  51. next()
  52. webRouter.use (req, res, next)->
  53. cdnBlocked = req.query.nocdn == 'true' or req.session.cdnBlocked
  54. if cdnBlocked and !req.session.cdnBlocked?
  55. logger.log user_id:req?.session?.user?._id, ip:req?.ip, "cdnBlocked for user, not using it and turning it off for future requets"
  56. req.session.cdnBlocked = true
  57. isDark = req.headers?.host?.slice(0,4)?.toLowerCase() == "dark"
  58. isSmoke = req.headers?.host?.slice(0,5)?.toLowerCase() == "smoke"
  59. isLive = !isDark and !isSmoke
  60. if cdnAvailable and isLive and !cdnBlocked
  61. staticFilesBase = Settings.cdn?.web?.host
  62. else if darkCdnAvailable and isDark
  63. staticFilesBase = Settings.cdn?.web?.darkHost
  64. else
  65. staticFilesBase = ""
  66. res.locals.jsPath = jsPath
  67. res.locals.fullJsPath = Url.resolve(staticFilesBase, jsPath)
  68. res.locals.buildJsPath = (jsFile, opts = {})->
  69. path = Path.join(jsPath, jsFile)
  70. doFingerPrint = opts.fingerprint != false
  71. if !opts.qs?
  72. opts.qs = {}
  73. if !opts.qs?.fingerprint? and doFingerPrint
  74. opts.qs.fingerprint = getFingerprint(path)
  75. if opts.cdn != false
  76. path = Url.resolve(staticFilesBase, path)
  77. qs = querystring.stringify(opts.qs)
  78. if qs? and qs.length > 0
  79. path = path + "?" + qs
  80. return path
  81. res.locals.buildCssPath = (cssFile)->
  82. path = Path.join("/stylesheets/", cssFile)
  83. return Url.resolve(staticFilesBase, path) + "?fingerprint=" + getFingerprint(path)
  84. res.locals.buildImgPath = (imgFile)->
  85. path = Path.join("/img/", imgFile)
  86. return Url.resolve(staticFilesBase, path)
  87. next()
  88. webRouter.use (req, res, next)->
  89. res.locals.settings = Settings
  90. next()
  91. webRouter.use (req, res, next)->
  92. res.locals.translate = (key, vars = {}) ->
  93. vars.appName = Settings.appName
  94. req.i18n.translate(key, vars)
  95. res.locals.currentUrl = req.originalUrl
  96. next()
  97. webRouter.use (req, res, next)->
  98. res.locals.getSiteHost = ->
  99. Settings.siteUrl.substring(Settings.siteUrl.indexOf("//")+2)
  100. next()
  101. webRouter.use (req, res, next)->
  102. res.locals.getUserEmail = ->
  103. email = req?.session?.user?.email or ""
  104. return email
  105. next()
  106. webRouter.use (req, res, next)->
  107. res.locals.formatProjectPublicAccessLevel = (privilegeLevel)->
  108. formatedPrivileges = private:"Private", readOnly:"Public: Read Only", readAndWrite:"Public: Read and Write"
  109. return formatedPrivileges[privilegeLevel] || "Private"
  110. next()
  111. webRouter.use (req, res, next)->
  112. res.locals.buildReferalUrl = (referal_medium) ->
  113. url = Settings.siteUrl
  114. if req.session? and req.session.user? and req.session.user.referal_id?
  115. url+="?r=#{req.session.user.referal_id}&rm=#{referal_medium}&rs=b" # Referal source = bonus
  116. return url
  117. res.locals.getReferalId = ->
  118. if req.session? and req.session.user? and req.session.user.referal_id
  119. return req.session.user.referal_id
  120. res.locals.getReferalTagLine = ->
  121. tagLines = [
  122. "Roar!"
  123. "Shout about us!"
  124. "Please recommend us"
  125. "Tell the world!"
  126. "Thanks for using ShareLaTeX"
  127. ]
  128. return tagLines[Math.floor(Math.random()*tagLines.length)]
  129. res.locals.getRedirAsQueryString = ->
  130. if req.query.redir?
  131. return "?#{querystring.stringify({redir:req.query.redir})}"
  132. return ""
  133. res.locals.getLoggedInUserId = ->
  134. return req.session.user?._id
  135. next()
  136. webRouter.use (req, res, next) ->
  137. res.locals.csrfToken = req?.csrfToken()
  138. next()
  139. webRouter.use (req, res, next) ->
  140. res.locals.getReqQueryParam = (field)->
  141. return req.query?[field]
  142. next()
  143. webRouter.use (req, res, next)->
  144. res.locals.fingerprint = getFingerprint
  145. next()
  146. webRouter.use (req, res, next)->
  147. res.locals.formatPrice = SubscriptionFormatters.formatPrice
  148. next()
  149. webRouter.use (req, res, next)->
  150. res.locals.externalAuthenticationSystemUsed = ->
  151. Settings.ldap?
  152. next()
  153. webRouter.use (req, res, next)->
  154. if req.session.user?
  155. res.locals.user =
  156. email: req.session.user.email
  157. first_name: req.session.user.first_name
  158. last_name: req.session.user.last_name
  159. if req.session.justRegistered
  160. res.locals.justRegistered = true
  161. delete req.session.justRegistered
  162. if req.session.justLoggedIn
  163. res.locals.justLoggedIn = true
  164. delete req.session.justLoggedIn
  165. res.locals.gaToken = Settings.analytics?.ga?.token
  166. res.locals.tenderUrl = Settings.tenderUrl
  167. res.locals.sentrySrc = Settings.sentry?.src
  168. res.locals.sentryPublicDSN = Settings.sentry?.publicDSN
  169. next()
  170. webRouter.use (req, res, next) ->
  171. if req.query? and req.query.scribtex_path?
  172. res.locals.lookingForScribtex = true
  173. res.locals.scribtexPath = req.query.scribtex_path
  174. next()
  175. webRouter.use (req, res, next) ->
  176. # Clone the nav settings so they can be modified for each request
  177. res.locals.nav = {}
  178. for key, value of Settings.nav
  179. res.locals.nav[key] = _.clone(Settings.nav[key])
  180. res.locals.templates = Settings.templateLinks
  181. next()
  182. webRouter.use (req, res, next) ->
  183. SystemMessageManager.getMessages (error, messages = []) ->
  184. res.locals.systemMessages = messages
  185. next()
  186. webRouter.use (req, res, next)->
  187. res.locals.query = req.query
  188. next()
  189. webRouter.use (req, res, next)->
  190. subdomain = _.find Settings.i18n.subdomainLang, (subdomain)->
  191. subdomain.lngCode == req.showUserOtherLng and !subdomain.hide
  192. res.locals.recomendSubdomain = subdomain
  193. res.locals.currentLngCode = req.lng
  194. next()
  195. webRouter.use (req, res, next) ->
  196. if Settings.reloadModuleViewsOnEachRequest
  197. Modules.loadViewIncludes()
  198. res.locals.moduleIncludes = Modules.moduleIncludes
  199. res.locals.moduleIncludesAvailable = Modules.moduleIncludesAvailable
  200. next()