Add exponential timeout on failed login attempts.
Thanks to Bruce's comment about the Twitter issue.
This commit is contained in:
1 parent
6878d461cf
commit
7b87d07dc8
1 file changed
+25
-15
+25
-15
@@ -26,29 +26,39 @@ class Session(int):
|
||||
self.__data['timestamp'] = time.time()
|
||||
|
||||
_USER_CACHE = {}
|
||||
_USER_TRY = {}
|
||||
|
||||
def login(dbname, loginname, password, cache=True):
|
||||
_USER_TRY.setdefault(dbname, {})
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
password_sha = sha.new(password).hexdigest()
|
||||
cursor.execute('SELECT id FROM res_user '
|
||||
'WHERE login = %s and password = %s and active',
|
||||
(loginname, password_sha))
|
||||
res = cursor.fetchone()
|
||||
cursor.close()
|
||||
if res:
|
||||
cursor.execute('SELECT id, password, active FROM res_user '
|
||||
'WHERE login = %s', (loginname,))
|
||||
if cursor.rowcount:
|
||||
res = cursor.fetchone()
|
||||
cursor.close()
|
||||
user_id = res[0]
|
||||
if user_id == 0:
|
||||
return False
|
||||
if cache:
|
||||
_USER_CACHE.setdefault(dbname, {})
|
||||
_USER_CACHE[dbname].setdefault(user_id, [])
|
||||
session = Session(user_id)
|
||||
_USER_CACHE[dbname][user_id].append(session)
|
||||
return (user_id, session.session)
|
||||
else:
|
||||
return user_id
|
||||
else:
|
||||
_USER_TRY[dbname].setdefault(user_id, 0)
|
||||
if res[1] == password_sha and res[2]:
|
||||
_USER_TRY[dbname][user_id] = 0
|
||||
if cache:
|
||||
_USER_CACHE.setdefault(dbname, {})
|
||||
_USER_CACHE[dbname].setdefault(user_id, [])
|
||||
session = Session(user_id)
|
||||
_USER_CACHE[dbname][user_id].append(session)
|
||||
return (user_id, session.session)
|
||||
else:
|
||||
return user_id
|
||||
time.sleep(2 ** _USER_TRY[dbname][user_id])
|
||||
_USER_TRY[dbname][user_id] += 1
|
||||
return False
|
||||
cursor.close()
|
||||
_USER_TRY[dbname].setdefault(0, 0)
|
||||
time.sleep(2 ** _USER_TRY[dbname][0])
|
||||
_USER_TRY[dbname][0] += 1
|
||||
return False
|
||||
|
||||
def check_super(passwd):
|
||||
if passwd == CONFIG['admin_passwd']:
|
||||
|
||||
Reference in new issue
Block a user