ClsiCookieManager.coffee 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. Settings = require "settings-sharelatex"
  2. request = require('request')
  3. RedisWrapper = require("../../infrastructure/RedisWrapper")
  4. rclient = RedisWrapper.client("clsi_cookie")
  5. if Settings.redis.clsi_cookie_secondary?
  6. rclient_secondary = RedisWrapper.client("clsi_cookie_secondary")
  7. Cookie = require('cookie')
  8. logger = require "logger-sharelatex"
  9. buildKey = (project_id)->
  10. return "clsiserver:#{project_id}"
  11. clsiCookiesEnabled = Settings.clsiCookie?.key? and Settings.clsiCookie.key.length != 0
  12. module.exports = ClsiCookieManager =
  13. _getServerId : (project_id, callback = (err, serverId)->)->
  14. rclient.get buildKey(project_id), (err, serverId)->
  15. if err?
  16. return callback(err)
  17. if !serverId? or serverId == ""
  18. return ClsiCookieManager._populateServerIdViaRequest project_id, callback
  19. else
  20. return callback(null, serverId)
  21. _populateServerIdViaRequest :(project_id, callback = (err, serverId)->)->
  22. url = "#{Settings.apis.clsi.url}/project/#{project_id}/status"
  23. request.get url, (err, res, body)->
  24. if err?
  25. logger.err err:err, project_id:project_id, "error getting initial server id for project"
  26. return callback(err)
  27. ClsiCookieManager.setServerId project_id, res, (err, serverId)->
  28. if err?
  29. logger.err err:err, project_id:project_id, "error setting server id via populate request"
  30. callback(err, serverId)
  31. _parseServerIdFromResponse : (response)->
  32. cookies = Cookie.parse(response.headers["set-cookie"]?[0] or "")
  33. return cookies?[Settings.clsiCookie.key]
  34. setServerId: (project_id, response, callback = (err, serverId)->)->
  35. if !clsiCookiesEnabled
  36. return callback()
  37. serverId = ClsiCookieManager._parseServerIdFromResponse(response)
  38. if !serverId? # We don't get a cookie back if it hasn't changed
  39. return callback()
  40. if rclient_secondary?
  41. @_setServerIdInRedis rclient_secondary, project_id, serverId
  42. @_setServerIdInRedis rclient, project_id, serverId, (err) ->
  43. callback(err, serverId)
  44. _setServerIdInRedis: (rclient, project_id, serverId, callback = (err) ->) ->
  45. multi = rclient.multi()
  46. multi.set buildKey(project_id), serverId
  47. multi.expire buildKey(project_id), Settings.clsiCookie.ttl
  48. multi.exec callback
  49. clearServerId: (project_id, callback = (err)->)->
  50. if !clsiCookiesEnabled
  51. return callback()
  52. rclient.del buildKey(project_id), callback
  53. getCookieJar: (project_id, callback = (err, jar)->)->
  54. if !clsiCookiesEnabled
  55. return callback(null, request.jar())
  56. ClsiCookieManager._getServerId project_id, (err, serverId)=>
  57. if err?
  58. logger.err err:err, project_id:project_id, "error getting server id"
  59. return callback(err)
  60. serverCookie = request.cookie("#{Settings.clsiCookie.key}=#{serverId}")
  61. jar = request.jar()
  62. jar.setCookie serverCookie, Settings.apis.clsi.url
  63. callback(null, jar)