Files
tryton/trytond/security.py
T

88 lines
2.8 KiB
Python
Raw Normal View History

#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
2009-02-11 14:52:22 +01:00
from trytond.backend import Database
from trytond.session import Session
2009-08-25 19:15:50 +02:00
from trytond.pool import Pool
2010-02-18 18:50:35 +01:00
from trytond.config import CONFIG
2008-03-05 15:10:21 +01:00
import time
2007-12-10 01:04:13 +01:00
_USER_CACHE = {}
_USER_TRY = {}
2007-12-10 01:04:13 +01:00
2008-03-11 17:14:52 +01:00
def login(dbname, loginname, password, cache=True):
_USER_TRY.setdefault(dbname, {})
2009-08-25 19:15:50 +02:00
_USER_TRY[dbname].setdefault(loginname, 0)
2009-02-11 14:52:22 +01:00
database = Database(dbname).connect()
cursor = database.cursor()
2009-08-25 19:15:50 +02:00
database_list = Pool.database_list()
pool = Pool(dbname)
if not dbname in database_list:
pool.init()
user_obj = pool.get('res.user')
2009-09-23 18:42:27 +02:00
password = password.decode('utf-8')
2009-08-25 19:15:50 +02:00
user_id = user_obj.get_login(cursor, 0, loginname, password)
2009-09-10 16:39:39 +02:00
cursor.commit()
cursor.close()
2009-08-25 19:15:50 +02:00
if user_id:
_USER_TRY[dbname][loginname] = 0
if cache:
_USER_CACHE.setdefault(dbname, {})
_USER_CACHE[dbname].setdefault(user_id, [])
session = Session(user_id)
session.name = loginname
_USER_CACHE[dbname][user_id].append(session)
return (user_id, session.session)
else:
return user_id
time.sleep(2 ** _USER_TRY[dbname][loginname])
_USER_TRY[dbname][loginname] += 1
return False
2007-12-10 01:04:13 +01:00
2009-08-14 11:38:02 +02:00
def logout(dbname, user, session):
name = ''
if _USER_CACHE.get(dbname, {}).has_key(user):
for i, real_session \
in enumerate(_USER_CACHE[dbname][user]):
if real_session.session == session:
name = real_session.name
del _USER_CACHE[dbname][user][i]
break
return name
2007-12-10 01:04:13 +01:00
def check_super(passwd):
if passwd == CONFIG['admin_passwd']:
return True
else:
raise Exception('AccessDenied')
def check(dbname, user, session):
2008-10-20 10:16:18 +02:00
if user == 0:
raise Exception('AccessDenied')
2010-02-18 18:50:35 +01:00
result = None
now = time.time()
timeout = int(CONFIG['session_timeout'])
2008-03-05 15:10:21 +01:00
if _USER_CACHE.get(dbname, {}).has_key(user):
to_del = []
for i, real_session \
in enumerate(_USER_CACHE[dbname][user]):
if abs(real_session.timestamp - now) < timeout:
if real_session.session == session:
result = real_session
else:
to_del.insert(0, i)
for i in to_del:
del _USER_CACHE[dbname][user][i]
if result:
return result
2008-10-20 10:16:18 +02:00
raise Exception('NotLogged')
2009-08-14 11:38:02 +02:00
def get_connections(dbname, user):
res = 0
now = time.time()
timeout = int(CONFIG['session_timeout'])
if _USER_CACHE.get(dbname, {}).has_key(int(user)):
2010-02-18 18:50:35 +01:00
for _, session in enumerate(_USER_CACHE[dbname][int(user)]):
2009-08-14 11:38:02 +02:00
if abs(session.timestamp - now) < timeout:
res += 1
return res