ClsiCookieManager.coffee 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. clearServerId: (project_id, callback = (err)->)->
  42. if !clsiCookiesEnabled
  43. return callback()
  44. rclient.del buildKey(project_id), callback
  45. getCookieJar: (project_id, callback = (err, jar)->)->
  46. if !clsiCookiesEnabled
  47. return callback(null, request.jar())
  48. ClsiCookieManager._getServerId project_id, (err, serverId)=>
  49. if err?
  50. logger.err err:err, project_id:project_id, "error getting server id"
  51. return callback(err)
  52. serverCookie = request.cookie("#{Settings.clsiCookie.key}=#{serverId}")
  53. jar = request.jar()
  54. jar.setCookie serverCookie, Settings.apis.clsi.url
  55. callback(null, jar)