From 0470e54d1d630cbe602f071f3c7f4316e0a437a3 Mon Sep 17 00:00:00 2001 From: Patrick Tombez Date: Mon, 27 Jan 2020 15:46:48 +0100 Subject: [PATCH] Add anonymous redis session expiration configuration --- session_redis/README.rst | 2 ++ session_redis/http.py | 2 ++ session_redis/session.py | 12 ++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/session_redis/README.rst b/session_redis/README.rst index 6203123..949f8b4 100644 --- a/session_redis/README.rst +++ b/session_redis/README.rst @@ -16,6 +16,8 @@ The storage of sessions in Redis is activated using environment variables. * ``ODOO_SESSION_REDIS_PREFIX`` is the prefix for the session keys (optional) * ``ODOO_SESSION_REDIS_EXPIRATION`` is the time in seconds before expiration of the sessions (default is 7 days) +* ``ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS`` is the time in seconds before expiration of + the anonymous sessions (default is 3 hours) The keys are set to ``session:``. diff --git a/session_redis/http.py b/session_redis/http.py index 6c1fafe..a4b5c17 100644 --- a/session_redis/http.py +++ b/session_redis/http.py @@ -42,6 +42,7 @@ port = int(os.environ.get('ODOO_SESSION_REDIS_PORT', 6379)) prefix = os.environ.get('ODOO_SESSION_REDIS_PREFIX') password = os.environ.get('ODOO_SESSION_REDIS_PASSWORD') expiration = os.environ.get('ODOO_SESSION_REDIS_EXPIRATION') +anon_expiration = os.environ.get('ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS') @lazy_property @@ -54,6 +55,7 @@ def session_store(self): redis_client = redis.Redis(host=host, port=port, password=password) return RedisSessionStore(redis=redis_client, prefix=prefix, expiration=expiration, + anon_expiration=anon_expiration, session_class=http.OpenERPSession) diff --git a/session_redis/session.py b/session_redis/session.py index 01ff69a..00e4433 100644 --- a/session_redis/session.py +++ b/session_redis/session.py @@ -10,6 +10,7 @@ from werkzeug.contrib.sessions import SessionStore # this is equal to the duration of the session garbage collector in # odoo.http.session_gc() DEFAULT_SESSION_TIMEOUT = 60 * 60 * 24 * 7 # 7 days in seconds +DEFAULT_SESSION_TIMEOUT_ANONYMOUS = 60 * 60 * 3 # 3 hours in seconds _logger = logging.getLogger(__name__) @@ -18,13 +19,17 @@ class RedisSessionStore(SessionStore): """ SessionStore that saves session to redis """ def __init__(self, redis, session_class=None, - prefix='', expiration=None): + prefix='', expiration=None, anon_expiration=None): super(RedisSessionStore, self).__init__(session_class=session_class) self.redis = redis if expiration is None: self.expiration = DEFAULT_SESSION_TIMEOUT else: self.expiration = expiration + if anon_expiration is None: + self.anon_expiration = DEFAULT_SESSION_TIMEOUT_ANONYMOUS + else: + self.anon_expiration = anon_expiration self.prefix = 'session:' if prefix: self.prefix = '%s:%s:' % ( @@ -39,7 +44,10 @@ class RedisSessionStore(SessionStore): # allow to set a custom expiration for a session # such as a very short one for monitoring requests - expiration = session.expiration or self.expiration + if session.uid: + expiration = session.expiration or self.expiration + else: + expiration = session.expiration or self.anon_expiration if _logger.isEnabledFor(logging.DEBUG): if session.uid: user_msg = "user '%s' (id: %s)" % (