UserSessionsManager.coffee 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. Settings = require('settings-sharelatex')
  2. redis = require('redis-sharelatex')
  3. rclient = redis.createClient(Settings.redis.web)
  4. logger = require("logger-sharelatex")
  5. module.exports = UserSessionsManager =
  6. _sessionSetKey: (user) ->
  7. return "UserSessions:#{user._id}"
  8. # mimic the key used by the express sessions
  9. _sessionKey: (sessionId) ->
  10. return "sess:#{sessionId}"
  11. trackSession: (user, sessionId, callback=(err)-> ) ->
  12. logger.log {user_id: user._id, sessionId}, "onLogin handler"
  13. sessionSetKey = UserSessionsManager._sessionSetKey(user)
  14. value = UserSessionsManager._sessionKey sessionId
  15. rclient.multi()
  16. .sadd(sessionSetKey, value)
  17. .expire(sessionSetKey, "#{Settings.cookieSessionLength}")
  18. .exec (err, response) ->
  19. if err
  20. logger.err {err, user_id: user._id, sessionSetKey}, "error while adding session key to UserSessions set"
  21. return callback(err)
  22. callback()
  23. untrackSession: (user, sessionId, callback=(err)-> ) ->
  24. logger.log {user_id: user._id, sessionId}, "onLogout handler"
  25. if !user
  26. logger.log {sessionId}, "no user, for some reason"
  27. return callback()
  28. sessionSetKey = UserSessionsManager._sessionSetKey(user)
  29. value = UserSessionsManager._sessionKey sessionId
  30. rclient.multi()
  31. .srem(sessionSetKey, value)
  32. .expire(sessionSetKey, "#{Settings.cookieSessionLength}")
  33. .exec (err, response) ->
  34. if err
  35. logger.err {err, user_id: user._id, sessionSetKey}, "error while removing session key from UserSessions set"
  36. return callback(err)
  37. callback()
  38. revokeAllUserSessions: (user, callback=(err)->) ->
  39. logger.log {user_id: user._id}, "revoking all existing sessions for user"
  40. sessionSetKey = UserSessionsManager._sessionSetKey(user)
  41. rclient.smembers sessionSetKey, (err, sessionKeys) ->
  42. if err
  43. logger.err {err, user_id: user._id, sessionSetKey}, "error getting contents of UserSessions set"
  44. return callback(err)
  45. logger.log {user_id: user._id, count: sessionKeys.length}, "deleting sessions for user"
  46. rclient.multi()
  47. .del(sessionKeys)
  48. .srem(sessionSetKey, sessionKeys)
  49. .exec (err, result) ->
  50. if err
  51. logger.err {err, user_id: user._id, sessionSetKey}, "error revoking all sessions for user"
  52. return callback(err)
  53. callback(null)
  54. touch: (user, callback=(err)->) ->
  55. if !user
  56. return callback(null)
  57. sessionSetKey = UserSessionsManager._sessionSetKey(user)
  58. rclient.expire sessionSetKey, "#{Settings.cookieSessionLength}", (err, response) ->
  59. if err
  60. logger.err {err, user_id: user._id}, "error while updating ttl on UserSessions set"
  61. return callback(err)