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
|
2014-09-03 23:32:01 +02:00
|
|
|
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
|
2017-02-02 11:55:44 +01:00
|
|
|
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__)
|
|
|
|
|
|
2008-12-11 17:05:52 +01:00
|
|
|
|
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')
|
|
|
|
|
|
|
|
|
|
|
2018-02-14 19:22:03 +01:00
|
|
|
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)
|
2018-11-18 12:07:17 +01:00
|
|
|
break
|
2019-12-06 17:33:47 +01:00
|
|
|
except backend.DatabaseOperationalError:
|
2016-09-22 11:31:18 +02:00
|
|
|
if count:
|
|
|
|
|
continue
|
|
|
|
|
raise
|
2017-02-02 11:55:44 +01:00
|
|
|
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
|
|
|
|
2018-02-14 19:22:03 +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):
|
2018-02-14 19:22:03 +01:00
|
|
|
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)
|
2018-11-18 12:07:17 +01:00
|
|
|
break
|
2019-12-06 17:33:47 +01:00
|
|
|
except backend.DatabaseOperationalError:
|
2016-09-22 11:31:18 +02:00
|
|
|
if count:
|
|
|
|
|
continue
|
|
|
|
|
raise
|
2018-11-18 12:07:17 +01:00
|
|
|
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
|
|
|
|
2018-02-14 19:22:03 +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):
|
2018-02-14 19:22:03 +01:00
|
|
|
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)
|