purge_non_logged_in_sessions.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. const RedisWrapper = require('@overleaf/redis-wrapper')
  2. const Settings = require('@overleaf/settings')
  3. const SessionManager = require('../app/src/Features/Authentication/SessionManager')
  4. const async = require('async')
  5. const _ = require('lodash')
  6. const redis = RedisWrapper.createClient(Settings.redis.websessions)
  7. let totalDeletedSessions = 0
  8. const queue = async.queue(function (sessKey, callback) {
  9. const cb = _.once(callback)
  10. redis.get(sessKey, (_err, session) => {
  11. try {
  12. if (SessionManager.isUserLoggedIn(JSON.parse(session))) {
  13. cb()
  14. } else {
  15. redis.del(sessKey, () => {
  16. totalDeletedSessions++
  17. if (totalDeletedSessions % 1000 === 0) {
  18. console.log(`Keys deleted so far: ${totalDeletedSessions}`)
  19. }
  20. cb()
  21. })
  22. }
  23. } catch (err) {
  24. console.log(`${sessKey} couldn't parse`)
  25. cb()
  26. }
  27. })
  28. }, 20)
  29. function scanAndPurge(cb) {
  30. const stream = redis.scanStream({
  31. match: 'sess:*',
  32. count: 1000,
  33. })
  34. console.log('starting scan')
  35. stream.on('data', resultKeys => {
  36. console.log(`Keys found, count:${resultKeys.length}`)
  37. queue.push(resultKeys)
  38. })
  39. stream.on('end', () => {
  40. queue.drain(() => {
  41. console.log(
  42. `All sessions have been checked, ${totalDeletedSessions} deleted`
  43. )
  44. cb()
  45. })
  46. })
  47. stream.on('error', err => {
  48. console.log(err)
  49. })
  50. }
  51. scanAndPurge(err => {
  52. console.error(err)
  53. process.exit()
  54. })