2016-04-19 15:48:51 +00:00
|
|
|
Settings = require "settings-sharelatex"
|
|
|
|
request = require('request')
|
|
|
|
redis = require("redis-sharelatex")
|
|
|
|
rclient = redis.createClient(Settings.redis.web)
|
2016-04-20 14:06:39 +00:00
|
|
|
Cookie = require('cookie')
|
|
|
|
logger = require "logger-sharelatex"
|
2016-04-19 15:48:51 +00:00
|
|
|
|
|
|
|
buildKey = (project_id)->
|
|
|
|
return "clsiserver:#{project_id}"
|
|
|
|
|
2016-05-19 15:55:58 +00:00
|
|
|
clsiCookiesEnabled = Settings.clsiCookie?.key? and Settings.clsiCookie.key.length != 0
|
2016-04-27 15:56:21 +00:00
|
|
|
|
2016-04-19 15:48:51 +00:00
|
|
|
|
2016-04-20 14:06:39 +00:00
|
|
|
module.exports = ClsiCookieManager =
|
2016-04-19 15:48:51 +00:00
|
|
|
|
|
|
|
_getServerId : (project_id, callback = (err, serverId)->)->
|
2016-04-27 15:56:21 +00:00
|
|
|
rclient.get buildKey(project_id), (err, serverId)->
|
2016-04-19 15:48:51 +00:00
|
|
|
if err?
|
|
|
|
return callback(err)
|
|
|
|
if serverId?
|
|
|
|
return callback(null, serverId)
|
|
|
|
else
|
2016-04-20 14:06:39 +00:00
|
|
|
return ClsiCookieManager._populateServerIdViaRequest project_id, callback
|
2016-04-19 15:48:51 +00:00
|
|
|
|
|
|
|
|
2016-04-20 14:06:39 +00:00
|
|
|
_populateServerIdViaRequest :(project_id, callback = (err, serverId)->)->
|
2016-04-19 15:48:51 +00:00
|
|
|
url = "#{Settings.apis.clsi.url}/project/#{project_id}/status"
|
|
|
|
request.get url, (err, res, body)->
|
|
|
|
if err?
|
|
|
|
logger.err err:err, project_id:project_id, "error getting initial server id for project"
|
|
|
|
return callback(err)
|
2016-04-27 15:20:10 +00:00
|
|
|
ClsiCookieManager.setServerId project_id, res, (err, serverId)->
|
2016-04-20 14:06:39 +00:00
|
|
|
if err?
|
|
|
|
logger.err err:err, project_id:project_id, "error setting server id via populate request"
|
2016-04-27 15:20:10 +00:00
|
|
|
callback(err, serverId)
|
2016-04-19 15:48:51 +00:00
|
|
|
|
|
|
|
_parseServerIdFromResponse : (response)->
|
2016-04-20 14:06:39 +00:00
|
|
|
cookies = Cookie.parse(response.headers["set-cookie"]?[0] or "")
|
2016-05-19 15:55:58 +00:00
|
|
|
return cookies?[Settings.clsiCookie.key]
|
2016-04-19 15:48:51 +00:00
|
|
|
|
2016-04-27 15:20:10 +00:00
|
|
|
setServerId: (project_id, response, callback = (err, serverId)->)->
|
2016-04-27 16:05:12 +00:00
|
|
|
if !clsiCookiesEnabled
|
|
|
|
return callback()
|
2016-04-20 14:06:39 +00:00
|
|
|
serverId = ClsiCookieManager._parseServerIdFromResponse(response)
|
2016-04-19 15:48:51 +00:00
|
|
|
multi = rclient.multi()
|
|
|
|
multi.set buildKey(project_id), serverId
|
2016-05-19 15:55:58 +00:00
|
|
|
multi.expire buildKey(project_id), Settings.clsiCookie.ttl
|
2016-04-27 15:20:10 +00:00
|
|
|
multi.exec (err)->
|
|
|
|
callback(err, serverId)
|
2016-04-19 15:48:51 +00:00
|
|
|
|
2016-08-31 15:10:24 +00:00
|
|
|
clearServerId: (project_id, callback = (err)->)->
|
|
|
|
if !clsiCookiesEnabled
|
|
|
|
return callback()
|
|
|
|
rclient.del buildKey(project_id), callback
|
2016-04-19 15:48:51 +00:00
|
|
|
|
2016-04-20 14:06:39 +00:00
|
|
|
getCookieJar: (project_id, callback = (err, jar)->)->
|
2016-04-27 16:05:12 +00:00
|
|
|
if !clsiCookiesEnabled
|
|
|
|
return callback(null, request.jar())
|
2016-04-20 14:06:39 +00:00
|
|
|
ClsiCookieManager._getServerId project_id, (err, serverId)=>
|
2016-04-19 15:48:51 +00:00
|
|
|
if err?
|
|
|
|
logger.err err:err, project_id:project_id, "error getting server id"
|
|
|
|
return callback(err)
|
2016-05-19 15:55:58 +00:00
|
|
|
serverCookie = request.cookie("#{Settings.clsiCookie.key}=#{serverId}")
|
2016-04-19 15:48:51 +00:00
|
|
|
jar = request.jar()
|
2016-04-20 14:06:39 +00:00
|
|
|
jar.setCookie serverCookie, Settings.apis.clsi.url
|
2016-04-19 15:48:51 +00:00
|
|
|
callback(null, jar)
|
|
|
|
|
|
|
|
|