overleaf/services/web/app/coffee/Features/Compile/ClsiCookieManager.coffee

82 lines
2.8 KiB
CoffeeScript
Raw Normal View History

2016-04-19 11:48:51 -04:00
Settings = require "settings-sharelatex"
request = require('request')
RedisWrapper = require("../../infrastructure/RedisWrapper")
rclient = RedisWrapper.client("clsi_cookie")
if Settings.redis.clsi_cookie_secondary?
rclient_secondary = RedisWrapper.client("clsi_cookie_secondary")
Cookie = require('cookie')
logger = require "logger-sharelatex"
2016-04-19 11:48:51 -04:00
clsiCookiesEnabled = Settings.clsiCookie?.key? and Settings.clsiCookie.key.length != 0
2016-04-19 11:48:51 -04:00
2018-06-14 12:41:30 -04:00
module.exports = (backendGroup)->
buildKey : (project_id)->
if backendGroup?
return "clsiserver:#{backendGroup}:#{project_id}"
else
return "clsiserver:#{project_id}"
2016-04-19 11:48:51 -04:00
_getServerId : (project_id, callback = (err, serverId)->)->
2018-06-14 12:41:30 -04:00
rclient.get @buildKey(project_id), (err, serverId)=>
2016-04-19 11:48:51 -04:00
if err?
return callback(err)
if !serverId? or serverId == ""
2018-06-14 12:41:30 -04:00
return @_populateServerIdViaRequest project_id, callback
else
return callback(null, serverId)
2016-04-19 11:48:51 -04:00
_populateServerIdViaRequest :(project_id, callback = (err, serverId)->)->
2016-04-19 11:48:51 -04:00
url = "#{Settings.apis.clsi.url}/project/#{project_id}/status"
2018-06-14 12:41:30 -04:00
request.get url, (err, res, body)=>
2016-04-19 11:48:51 -04:00
if err?
logger.err err:err, project_id:project_id, "error getting initial server id for project"
return callback(err)
2018-06-14 12:41:30 -04:00
@setServerId project_id, res, (err, serverId)->
if err?
logger.err err:err, project_id:project_id, "error setting server id via populate request"
callback(err, serverId)
2016-04-19 11:48:51 -04:00
_parseServerIdFromResponse : (response)->
cookies = Cookie.parse(response.headers["set-cookie"]?[0] or "")
return cookies?[Settings.clsiCookie.key]
2016-04-19 11:48:51 -04:00
setServerId: (project_id, response, callback = (err, serverId)->)->
if !clsiCookiesEnabled
return callback()
2018-06-14 12:41:30 -04:00
serverId = @_parseServerIdFromResponse(response)
if !serverId? # We don't get a cookie back if it hasn't changed
return callback()
if rclient_secondary?
@_setServerIdInRedis rclient_secondary, project_id, serverId
@_setServerIdInRedis rclient, project_id, serverId, (err) ->
callback(err, serverId)
_setServerIdInRedis: (rclient, project_id, serverId, callback = (err) ->) ->
2016-04-19 11:48:51 -04:00
multi = rclient.multi()
2018-06-14 12:41:30 -04:00
multi.set @buildKey(project_id), serverId
multi.expire @buildKey(project_id), Settings.clsiCookie.ttl
multi.exec callback
2016-04-19 11:48:51 -04:00
2016-08-31 11:10:24 -04:00
clearServerId: (project_id, callback = (err)->)->
if !clsiCookiesEnabled
return callback()
2018-06-14 12:41:30 -04:00
rclient.del @buildKey(project_id), callback
2016-04-19 11:48:51 -04:00
getCookieJar: (project_id, callback = (err, jar)->)->
if !clsiCookiesEnabled
return callback(null, request.jar())
2018-06-14 12:41:30 -04:00
@_getServerId project_id, (err, serverId)=>
2016-04-19 11:48:51 -04:00
if err?
logger.err err:err, project_id:project_id, "error getting server id"
return callback(err)
serverCookie = request.cookie("#{Settings.clsiCookie.key}=#{serverId}")
2016-04-19 11:48:51 -04:00
jar = request.jar()
jar.setCookie serverCookie, Settings.apis.clsi.url
2016-04-19 11:48:51 -04:00
callback(null, jar)