|
@@ -1,18 +1,3 @@
|
|
|
-/* eslint-disable
|
|
|
|
|
- camelcase,
|
|
|
|
|
- handle-callback-err,
|
|
|
|
|
- max-len,
|
|
|
|
|
-*/
|
|
|
|
|
-// TODO: This file was created by bulk-decaffeinate.
|
|
|
|
|
-// Fix any style issues and re-enable lint.
|
|
|
|
|
-/*
|
|
|
|
|
- * decaffeinate suggestions:
|
|
|
|
|
- * DS101: Remove unnecessary use of Array.from
|
|
|
|
|
- * DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
|
- * DS103: Rewrite code to no longer use __guard__
|
|
|
|
|
- * DS207: Consider shorter variations of null checks
|
|
|
|
|
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
|
|
- */
|
|
|
|
|
let UserSessionsManager
|
|
let UserSessionsManager
|
|
|
const Settings = require('settings-sharelatex')
|
|
const Settings = require('settings-sharelatex')
|
|
|
const logger = require('logger-sharelatex')
|
|
const logger = require('logger-sharelatex')
|
|
@@ -28,26 +13,23 @@ module.exports = UserSessionsManager = {
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
trackSession(user, sessionId, callback) {
|
|
trackSession(user, sessionId, callback) {
|
|
|
- if (callback == null) {
|
|
|
|
|
- callback = function(err) {}
|
|
|
|
|
- }
|
|
|
|
|
- if (user == null) {
|
|
|
|
|
|
|
+ if (!user) {
|
|
|
logger.log({ sessionId }, 'no user to track, returning')
|
|
logger.log({ sessionId }, 'no user to track, returning')
|
|
|
return callback(null)
|
|
return callback(null)
|
|
|
}
|
|
}
|
|
|
- if (sessionId == null) {
|
|
|
|
|
|
|
+ if (!sessionId) {
|
|
|
logger.log({ user_id: user._id }, 'no sessionId to track, returning')
|
|
logger.log({ user_id: user._id }, 'no sessionId to track, returning')
|
|
|
return callback(null)
|
|
return callback(null)
|
|
|
}
|
|
}
|
|
|
logger.log({ user_id: user._id, sessionId }, 'onLogin handler')
|
|
logger.log({ user_id: user._id, sessionId }, 'onLogin handler')
|
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
|
const value = UserSessionsManager._sessionKey(sessionId)
|
|
const value = UserSessionsManager._sessionKey(sessionId)
|
|
|
- return rclient
|
|
|
|
|
|
|
+ rclient
|
|
|
.multi()
|
|
.multi()
|
|
|
.sadd(sessionSetKey, value)
|
|
.sadd(sessionSetKey, value)
|
|
|
.pexpire(sessionSetKey, `${Settings.cookieSessionLength}`) // in milliseconds
|
|
.pexpire(sessionSetKey, `${Settings.cookieSessionLength}`) // in milliseconds
|
|
|
.exec(function(err, response) {
|
|
.exec(function(err, response) {
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ if (err) {
|
|
|
logger.warn(
|
|
logger.warn(
|
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
|
'error while adding session key to UserSessions set'
|
|
'error while adding session key to UserSessions set'
|
|
@@ -55,31 +37,31 @@ module.exports = UserSessionsManager = {
|
|
|
return callback(err)
|
|
return callback(err)
|
|
|
}
|
|
}
|
|
|
UserSessionsManager._checkSessions(user, function() {})
|
|
UserSessionsManager._checkSessions(user, function() {})
|
|
|
- return callback()
|
|
|
|
|
|
|
+ callback()
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
untrackSession(user, sessionId, callback) {
|
|
untrackSession(user, sessionId, callback) {
|
|
|
- if (callback == null) {
|
|
|
|
|
- callback = function(err) {}
|
|
|
|
|
|
|
+ if (!callback) {
|
|
|
|
|
+ callback = function() {}
|
|
|
}
|
|
}
|
|
|
- if (user == null) {
|
|
|
|
|
|
|
+ if (!user) {
|
|
|
logger.log({ sessionId }, 'no user to untrack, returning')
|
|
logger.log({ sessionId }, 'no user to untrack, returning')
|
|
|
return callback(null)
|
|
return callback(null)
|
|
|
}
|
|
}
|
|
|
- if (sessionId == null) {
|
|
|
|
|
|
|
+ if (!sessionId) {
|
|
|
logger.log({ user_id: user._id }, 'no sessionId to untrack, returning')
|
|
logger.log({ user_id: user._id }, 'no sessionId to untrack, returning')
|
|
|
return callback(null)
|
|
return callback(null)
|
|
|
}
|
|
}
|
|
|
logger.log({ user_id: user._id, sessionId }, 'onLogout handler')
|
|
logger.log({ user_id: user._id, sessionId }, 'onLogout handler')
|
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
|
const value = UserSessionsManager._sessionKey(sessionId)
|
|
const value = UserSessionsManager._sessionKey(sessionId)
|
|
|
- return rclient
|
|
|
|
|
|
|
+ rclient
|
|
|
.multi()
|
|
.multi()
|
|
|
.srem(sessionSetKey, value)
|
|
.srem(sessionSetKey, value)
|
|
|
.pexpire(sessionSetKey, `${Settings.cookieSessionLength}`) // in milliseconds
|
|
.pexpire(sessionSetKey, `${Settings.cookieSessionLength}`) // in milliseconds
|
|
|
.exec(function(err, response) {
|
|
.exec(function(err, response) {
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ if (err) {
|
|
|
logger.warn(
|
|
logger.warn(
|
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
|
'error while removing session key from UserSessions set'
|
|
'error while removing session key from UserSessions set'
|
|
@@ -87,18 +69,15 @@ module.exports = UserSessionsManager = {
|
|
|
return callback(err)
|
|
return callback(err)
|
|
|
}
|
|
}
|
|
|
UserSessionsManager._checkSessions(user, function() {})
|
|
UserSessionsManager._checkSessions(user, function() {})
|
|
|
- return callback()
|
|
|
|
|
|
|
+ callback()
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
getAllUserSessions(user, exclude, callback) {
|
|
getAllUserSessions(user, exclude, callback) {
|
|
|
- if (callback == null) {
|
|
|
|
|
- callback = function(err, sessionKeys) {}
|
|
|
|
|
- }
|
|
|
|
|
exclude = _.map(exclude, UserSessionsManager._sessionKey)
|
|
exclude = _.map(exclude, UserSessionsManager._sessionKey)
|
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
|
- return rclient.smembers(sessionSetKey, function(err, sessionKeys) {
|
|
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ rclient.smembers(sessionSetKey, function(err, sessionKeys) {
|
|
|
|
|
+ if (err) {
|
|
|
logger.warn(
|
|
logger.warn(
|
|
|
{ user_id: user._id },
|
|
{ user_id: user._id },
|
|
|
'error getting all session keys for user from redis'
|
|
'error getting all session keys for user from redis'
|
|
@@ -111,58 +90,53 @@ module.exports = UserSessionsManager = {
|
|
|
return callback(null, [])
|
|
return callback(null, [])
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return Async.mapSeries(
|
|
|
|
|
- sessionKeys,
|
|
|
|
|
- (k, cb) => rclient.get(k, cb),
|
|
|
|
|
- function(err, sessions) {
|
|
|
|
|
- if (err != null) {
|
|
|
|
|
- logger.warn(
|
|
|
|
|
- { user_id: user._id },
|
|
|
|
|
- 'error getting all sessions for user from redis'
|
|
|
|
|
- )
|
|
|
|
|
- return callback(err)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ Async.mapSeries(sessionKeys, (k, cb) => rclient.get(k, cb), function(
|
|
|
|
|
+ err,
|
|
|
|
|
+ sessions
|
|
|
|
|
+ ) {
|
|
|
|
|
+ if (err) {
|
|
|
|
|
+ logger.warn(
|
|
|
|
|
+ { user_id: user._id },
|
|
|
|
|
+ 'error getting all sessions for user from redis'
|
|
|
|
|
+ )
|
|
|
|
|
+ return callback(err)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- const result = []
|
|
|
|
|
- for (let session of Array.from(sessions)) {
|
|
|
|
|
- if (session === null) {
|
|
|
|
|
- continue
|
|
|
|
|
- }
|
|
|
|
|
- session = JSON.parse(session)
|
|
|
|
|
- const session_user =
|
|
|
|
|
- (session != null ? session.user : undefined) ||
|
|
|
|
|
- __guard__(
|
|
|
|
|
- session != null ? session.passport : undefined,
|
|
|
|
|
- x => x.user
|
|
|
|
|
- )
|
|
|
|
|
- result.push({
|
|
|
|
|
- ip_address: session_user.ip_address,
|
|
|
|
|
- session_created: session_user.session_created
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ const result = []
|
|
|
|
|
+ for (let session of Array.from(sessions)) {
|
|
|
|
|
+ if (!session) {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ session = JSON.parse(session)
|
|
|
|
|
+ let sessionUser = session.passport && session.passport.user
|
|
|
|
|
+ if (!sessionUser) {
|
|
|
|
|
+ sessionUser = session.user
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return callback(null, result)
|
|
|
|
|
|
|
+ result.push({
|
|
|
|
|
+ ip_address: sessionUser.ip_address,
|
|
|
|
|
+ session_created: sessionUser.session_created
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
- )
|
|
|
|
|
|
|
+
|
|
|
|
|
+ callback(null, result)
|
|
|
|
|
+ })
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
revokeAllUserSessions(user, retain, callback) {
|
|
revokeAllUserSessions(user, retain, callback) {
|
|
|
- if (callback == null) {
|
|
|
|
|
- callback = function(err) {}
|
|
|
|
|
- }
|
|
|
|
|
- if (retain == null) {
|
|
|
|
|
|
|
+ if (!retain) {
|
|
|
retain = []
|
|
retain = []
|
|
|
}
|
|
}
|
|
|
retain = retain.map(i => UserSessionsManager._sessionKey(i))
|
|
retain = retain.map(i => UserSessionsManager._sessionKey(i))
|
|
|
- if (user == null) {
|
|
|
|
|
|
|
+ if (!user) {
|
|
|
logger.log({}, 'no user to revoke sessions for, returning')
|
|
logger.log({}, 'no user to revoke sessions for, returning')
|
|
|
return callback(null)
|
|
return callback(null)
|
|
|
}
|
|
}
|
|
|
logger.log({ user_id: user._id }, 'revoking all existing sessions for user')
|
|
logger.log({ user_id: user._id }, 'revoking all existing sessions for user')
|
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
|
- return rclient.smembers(sessionSetKey, function(err, sessionKeys) {
|
|
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ rclient.smembers(sessionSetKey, function(err, sessionKeys) {
|
|
|
|
|
+ if (err) {
|
|
|
logger.warn(
|
|
logger.warn(
|
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
|
'error getting contents of UserSessions set'
|
|
'error getting contents of UserSessions set'
|
|
@@ -187,65 +161,59 @@ module.exports = UserSessionsManager = {
|
|
|
|
|
|
|
|
const deletions = keysToDelete.map(k => cb => rclient.del(k, cb))
|
|
const deletions = keysToDelete.map(k => cb => rclient.del(k, cb))
|
|
|
|
|
|
|
|
- return Async.series(deletions, function(err, _result) {
|
|
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ Async.series(deletions, function(err, _result) {
|
|
|
|
|
+ if (err) {
|
|
|
logger.warn(
|
|
logger.warn(
|
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
|
'errror revoking all sessions for user'
|
|
'errror revoking all sessions for user'
|
|
|
)
|
|
)
|
|
|
return callback(err)
|
|
return callback(err)
|
|
|
}
|
|
}
|
|
|
- return rclient.srem(sessionSetKey, keysToDelete, function(err) {
|
|
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ rclient.srem(sessionSetKey, keysToDelete, function(err) {
|
|
|
|
|
+ if (err) {
|
|
|
logger.warn(
|
|
logger.warn(
|
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
|
'error removing session set for user'
|
|
'error removing session set for user'
|
|
|
)
|
|
)
|
|
|
return callback(err)
|
|
return callback(err)
|
|
|
}
|
|
}
|
|
|
- return callback(null)
|
|
|
|
|
|
|
+ callback(null)
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
touch(user, callback) {
|
|
touch(user, callback) {
|
|
|
- if (callback == null) {
|
|
|
|
|
- callback = function(err) {}
|
|
|
|
|
- }
|
|
|
|
|
- if (user == null) {
|
|
|
|
|
|
|
+ if (!user) {
|
|
|
logger.log({}, 'no user to touch sessions for, returning')
|
|
logger.log({}, 'no user to touch sessions for, returning')
|
|
|
return callback(null)
|
|
return callback(null)
|
|
|
}
|
|
}
|
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
|
- return rclient.pexpire(
|
|
|
|
|
|
|
+ rclient.pexpire(
|
|
|
sessionSetKey,
|
|
sessionSetKey,
|
|
|
`${Settings.cookieSessionLength}`, // in milliseconds
|
|
`${Settings.cookieSessionLength}`, // in milliseconds
|
|
|
function(err, response) {
|
|
function(err, response) {
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ if (err) {
|
|
|
logger.warn(
|
|
logger.warn(
|
|
|
{ err, user_id: user._id },
|
|
{ err, user_id: user._id },
|
|
|
'error while updating ttl on UserSessions set'
|
|
'error while updating ttl on UserSessions set'
|
|
|
)
|
|
)
|
|
|
return callback(err)
|
|
return callback(err)
|
|
|
}
|
|
}
|
|
|
- return callback(null)
|
|
|
|
|
|
|
+ callback(null)
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
_checkSessions(user, callback) {
|
|
_checkSessions(user, callback) {
|
|
|
- if (callback == null) {
|
|
|
|
|
- callback = function(err) {}
|
|
|
|
|
- }
|
|
|
|
|
- if (user == null) {
|
|
|
|
|
|
|
+ if (!user) {
|
|
|
logger.log({}, 'no user, returning')
|
|
logger.log({}, 'no user, returning')
|
|
|
return callback(null)
|
|
return callback(null)
|
|
|
}
|
|
}
|
|
|
logger.log({ user_id: user._id }, 'checking sessions for user')
|
|
logger.log({ user_id: user._id }, 'checking sessions for user')
|
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
const sessionSetKey = UserSessionsRedis.sessionSetKey(user)
|
|
|
- return rclient.smembers(sessionSetKey, function(err, sessionKeys) {
|
|
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ rclient.smembers(sessionSetKey, function(err, sessionKeys) {
|
|
|
|
|
+ if (err) {
|
|
|
logger.warn(
|
|
logger.warn(
|
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
{ err, user_id: user._id, sessionSetKey },
|
|
|
'error getting contents of UserSessions set'
|
|
'error getting contents of UserSessions set'
|
|
@@ -256,39 +224,30 @@ module.exports = UserSessionsManager = {
|
|
|
{ user_id: user._id, count: sessionKeys.length },
|
|
{ user_id: user._id, count: sessionKeys.length },
|
|
|
'checking sessions for user'
|
|
'checking sessions for user'
|
|
|
)
|
|
)
|
|
|
- return Async.series(
|
|
|
|
|
|
|
+ Async.series(
|
|
|
sessionKeys.map(key => next =>
|
|
sessionKeys.map(key => next =>
|
|
|
rclient.get(key, function(err, val) {
|
|
rclient.get(key, function(err, val) {
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ if (err) {
|
|
|
return next(err)
|
|
return next(err)
|
|
|
}
|
|
}
|
|
|
- if (val == null) {
|
|
|
|
|
|
|
+ if (!val) {
|
|
|
logger.log(
|
|
logger.log(
|
|
|
{ user_id: user._id, key },
|
|
{ user_id: user._id, key },
|
|
|
'>> removing key from UserSessions set'
|
|
'>> removing key from UserSessions set'
|
|
|
)
|
|
)
|
|
|
- return rclient.srem(sessionSetKey, key, function(err, result) {
|
|
|
|
|
- if (err != null) {
|
|
|
|
|
- return next(err)
|
|
|
|
|
- }
|
|
|
|
|
- return next(null)
|
|
|
|
|
|
|
+ rclient.srem(sessionSetKey, key, function(err, result) {
|
|
|
|
|
+ return next(err)
|
|
|
})
|
|
})
|
|
|
} else {
|
|
} else {
|
|
|
- return next()
|
|
|
|
|
|
|
+ next()
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
),
|
|
),
|
|
|
function(err, results) {
|
|
function(err, results) {
|
|
|
logger.log({ user_id: user._id }, 'done checking sessions for user')
|
|
logger.log({ user_id: user._id }, 'done checking sessions for user')
|
|
|
- return callback(err)
|
|
|
|
|
|
|
+ callback(err)
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-function __guard__(value, transform) {
|
|
|
|
|
- return typeof value !== 'undefined' && value !== null
|
|
|
|
|
- ? transform(value)
|
|
|
|
|
- : undefined
|
|
|
|
|
-}
|
|
|