ClsiCookieManager.coffee 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. Settings = require "settings-sharelatex"
  2. request = require('request')
  3. redis = require("redis-sharelatex")
  4. rclient = redis.createClient(Settings.redis.web)
  5. Cookie = require('cookie')
  6. logger = require "logger-sharelatex"
  7. buildKey = (project_id)->
  8. return "clsiserver:#{project_id}"
  9. clsiCookiesEnabled = Settings.clsiCookie?.key? and Settings.clsiCookie.key.length != 0
  10. module.exports = ClsiCookieManager =
  11. _getServerId : (project_id, callback = (err, serverId)->)->
  12. rclient.get buildKey(project_id), (err, serverId)->
  13. if err?
  14. return callback(err)
  15. if serverId?
  16. return callback(null, serverId)
  17. else
  18. return ClsiCookieManager._populateServerIdViaRequest project_id, callback
  19. _populateServerIdViaRequest :(project_id, callback = (err, serverId)->)->
  20. url = "#{Settings.apis.clsi.url}/project/#{project_id}/status"
  21. request.get url, (err, res, body)->
  22. if err?
  23. logger.err err:err, project_id:project_id, "error getting initial server id for project"
  24. return callback(err)
  25. ClsiCookieManager.setServerId project_id, res, (err, serverId)->
  26. if err?
  27. logger.err err:err, project_id:project_id, "error setting server id via populate request"
  28. callback(err, serverId)
  29. _parseServerIdFromResponse : (response)->
  30. cookies = Cookie.parse(response.headers["set-cookie"]?[0] or "")
  31. return cookies?[Settings.clsiCookie.key]
  32. setServerId: (project_id, response, callback = (err, serverId)->)->
  33. if !clsiCookiesEnabled
  34. return callback()
  35. serverId = ClsiCookieManager._parseServerIdFromResponse(response)
  36. multi = rclient.multi()
  37. multi.set buildKey(project_id), serverId
  38. multi.expire buildKey(project_id), Settings.clsiCookie.ttl
  39. multi.exec (err)->
  40. callback(err, serverId)
  41. getCookieJar: (project_id, callback = (err, jar)->)->
  42. if !clsiCookiesEnabled
  43. return callback(null, request.jar())
  44. ClsiCookieManager._getServerId project_id, (err, serverId)=>
  45. if err?
  46. logger.err err:err, project_id:project_id, "error getting server id"
  47. return callback(err)
  48. serverCookie = request.cookie("#{Settings.clsiCookie.key}=#{serverId}")
  49. jar = request.jar()
  50. jar.setCookie serverCookie, Settings.apis.clsi.url
  51. callback(null, jar)