Files
tryton/trytond/security.py
T

134 lines
4.7 KiB
Python
Raw Normal View History

2014-12-02 12:54:01 +01:00
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
2018-03-07 00:34:09 +01:00
import logging
2009-08-25 19:15:50 +02:00
from trytond.pool import Pool
from trytond.config import config
2010-08-19 22:01:12 +02:00
from trytond.transaction import Transaction
2016-03-15 16:57:26 +01:00
from trytond import backend
from trytond.exceptions import LoginException, RateLimitException
2008-03-05 15:10:21 +01:00
2018-03-07 00:34:09 +01:00
logger = logging.getLogger(__name__)
2012-03-16 12:11:05 +01:00
def _get_pool(dbname):
database_list = Pool.database_list()
pool = Pool(dbname)
2014-12-02 12:54:01 +01:00
if dbname not in database_list:
2012-03-16 12:11:05 +01:00
pool.init()
return pool
2018-03-07 00:34:09 +01:00
def _get_remote_addr(context):
if context and '_request' in context:
return context['_request'].get('remote_addr')
def login(dbname, loginname, parameters, cache=True, context=None):
2016-09-22 11:31:18 +02:00
for count in range(config.getint('database', 'retry'), -1, -1):
with Transaction().start(dbname, 0, context=context) as transaction:
pool = _get_pool(dbname)
User = pool.get('res.user')
try:
user_id = User.get_login(loginname, parameters)
break
2019-12-06 17:33:47 +01:00
except backend.DatabaseOperationalError:
2016-09-22 11:31:18 +02:00
if count:
continue
raise
except (LoginException, RateLimitException):
2016-09-22 11:31:18 +02:00
# Let's store any changes done
transaction.commit()
raise
2018-03-07 00:34:09 +01:00
session = None
2009-08-25 19:15:50 +02:00
if user_id:
2012-01-11 20:30:27 +01:00
if not cache:
2018-03-07 00:34:09 +01:00
session = user_id
else:
with Transaction().start(dbname, user_id):
Session = pool.get('ir.session')
session = user_id, Session.new()
logger.info("login succeeded for '%s' from '%s' on database '%s'",
loginname, _get_remote_addr(context), dbname)
else:
logger.error("login failed for '%s' from '%s' on database '%s'",
loginname, _get_remote_addr(context), dbname)
return session
2007-12-10 01:04:13 +01:00
2012-01-11 20:30:27 +01:00
def logout(dbname, user, session, context=None):
2016-09-22 11:31:18 +02:00
for count in range(config.getint('database', 'retry'), -1, -1):
with Transaction().start(dbname, 0, context=context):
2016-09-22 11:31:18 +02:00
pool = _get_pool(dbname)
Session = pool.get('ir.session')
try:
2018-03-07 00:34:09 +01:00
name = Session.remove(session)
break
2019-12-06 17:33:47 +01:00
except backend.DatabaseOperationalError:
2016-09-22 11:31:18 +02:00
if count:
continue
raise
if name:
logger.info("logout for '%s' from '%s' on database '%s'",
name, _get_remote_addr(context), dbname)
else:
logger.error("logout failed for '%s' from '%s' on database '%s'",
user, _get_remote_addr(context), dbname)
2009-08-14 11:38:02 +02:00
2012-01-11 20:30:27 +01:00
def check(dbname, user, session, context=None):
2016-03-15 16:57:26 +01:00
for count in range(config.getint('database', 'retry'), -1, -1):
with Transaction().start(dbname, user, context=context) as transaction:
2016-03-15 16:57:26 +01:00
pool = _get_pool(dbname)
Session = pool.get('ir.session')
try:
2018-03-07 00:34:09 +01:00
find = Session.check(user, session)
break
2019-12-06 17:33:47 +01:00
except backend.DatabaseOperationalError:
2016-03-15 16:57:26 +01:00
if count:
continue
raise
finally:
transaction.commit()
2018-03-07 00:34:09 +01:00
if find is None:
logger.error("session failed for '%s' from '%s' on database '%s'",
user, _get_remote_addr(context), dbname)
return
elif not find:
logger.info("session expired for '%s' from '%s' on database '%s'",
user, _get_remote_addr(context), dbname)
return
else:
logger.debug("session valid for '%s' from '%s' on database '%s'",
user, _get_remote_addr(context), dbname)
return user
2018-08-26 18:04:05 +02:00
def check_timeout(dbname, user, session, context=None):
for count in range(config.getint('database', 'retry'), -1, -1):
with Transaction().start(dbname, user, context=context) as transaction:
pool = _get_pool(dbname)
Session = pool.get('ir.session')
try:
valid = Session.check_timeout(user, session)
break
2019-12-06 17:33:47 +01:00
except backend.DatabaseOperationalError:
2018-08-26 18:04:05 +02:00
if count:
continue
raise
finally:
transaction.commit()
if not valid:
logger.info("session timeout for '%s' from '%s' on database '%s'",
user, _get_remote_addr(context), dbname)
return valid
def reset(dbname, session, context):
try:
2020-07-25 07:59:07 +02:00
with Transaction().start(dbname, 0, context=context, autocommit=True):
2018-08-26 18:04:05 +02:00
pool = _get_pool(dbname)
Session = pool.get('ir.session')
Session.reset(session)
2019-12-06 17:33:47 +01:00
except backend.DatabaseOperationalError:
2018-08-26 18:04:05 +02:00
logger.debug('Reset session failed', exc_info=True)