[flashproxy/master] Limit the rate of IMAP login attempts.
commit 4ae836265ba67337d95a9baba152704d6dcbe0da Author: David Fifield <david@bamsoftware.com> Date: Thu Sep 20 08:41:10 2012 -0700 Limit the rate of IMAP login attempts. --- facilitator/facilitator-email-poller | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) diff --git a/facilitator/facilitator-email-poller b/facilitator/facilitator-email-poller index 1d42823..4b94460 100755 --- a/facilitator/facilitator-email-poller +++ b/facilitator/facilitator-email-poller @@ -3,6 +3,7 @@ import email import getopt import imaplib +import math import os import socket import ssl @@ -293,6 +294,26 @@ def imap_login(): return imap +class RateLimit(object): + INITIAL_INTERVAL = 1.0 + # These constants are chosen to reach a steady state of one attempt every + # ten minutes, assuming a new failing attempt after each penalty interval. + MAX_INTERVAL = 10 * 60 + MULTIPLIER = 2.0 + DECAY = math.log(MULTIPLIER) / MAX_INTERVAL + def __init__(self): + self.time_last = time.time() + self.interval = self.INITIAL_INTERVAL + def time_to_wait(self): + now = time.time() + delta = now - self.time_last + # Discount time already served. + wait = max(self.interval - delta, 0) + self.time_last = now + self.interval = self.interval * math.exp(-self.DECAY * delta) * self.MULTIPLIER + return wait + +login_limit = RateLimit() while True: imap = imap_login() try: @@ -300,6 +321,11 @@ while True: except imaplib.IMAP4.abort, e: # Try again after a disconnection. log(u"lost server connection: %s" % str(e)) + # Don't reconnect too fast. + t = login_limit.time_to_wait() + if t > 0: + log(u"waiting %.2f seconds before logging in again" % t) + time.sleep(t) else: break
participants (1)
-
dcf@torproject.org