ClsiCookieManager.coffee 2.8 KB

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