LoginRateLimiter.coffee 667 B

123456789101112131415161718192021222324
  1. Settings = require('settings-sharelatex')
  2. redis = require('redis')
  3. rclient = redis.createClient(Settings.redis.web.port, Settings.redis.web.host)
  4. rclient.auth(Settings.redis.web.password)
  5. buildKey = (k)->
  6. return "LoginRateLimit:#{k}"
  7. ONE_MIN = 60
  8. ATTEMPT_LIMIT = 10
  9. module.exports =
  10. processLoginRequest: (email, callback)->
  11. multi = rclient.multi()
  12. multi.incr(buildKey(email))
  13. multi.get(buildKey(email))
  14. multi.expire(buildKey(email), ONE_MIN * 2)
  15. multi.exec (err, results)->
  16. loginCount = results[1]
  17. allow = loginCount <= ATTEMPT_LIMIT
  18. callback err, allow
  19. recordSuccessfulLogin: (email, callback = ->)->
  20. rclient.del buildKey(email), callback