Skip to content

Commit ccca527

Browse files
committed
Improved user session and reverted file to previous state
1 parent bbd0fab commit ccca527

6 files changed

Lines changed: 105 additions & 106 deletions

File tree

g2p_security/models/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Part of OpenG2P. See LICENSE file for full copyright and licensing details.
22

33
from . import hide_db_param
4-
from . import ir_config_parameter
5-
from . import ir_http
6-
from . import res_users
4+
from . import user_debug_restriction
5+
from . import user_session

g2p_security/models/ir_config_parameter.py

Lines changed: 0 additions & 29 deletions
This file was deleted.

g2p_security/models/ir_http.py

Lines changed: 0 additions & 39 deletions
This file was deleted.

g2p_security/models/res_users.py

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# pylint: disable=consider-merging-classes-inherited
2+
3+
from odoo import models
4+
from odoo.http import request
5+
6+
7+
def is_user_debug_restricted(user=None):
8+
"""Utility function to check if the user is restricted from using Debug Mode."""
9+
if not user:
10+
user_id = request.session.uid
11+
user = request.env["res.users"].sudo().browse(user_id)
12+
return user.has_group("g2p_security.group_restrict_debug_mode")
13+
14+
15+
class IrHttp(models.AbstractModel):
16+
_inherit = "ir.http"
17+
18+
@classmethod
19+
def _handle_debug(cls):
20+
if is_user_debug_restricted(request.env.user):
21+
request.session.debug = ""
22+
else:
23+
return super()._handle_debug()
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import logging
2+
3+
from odoo import api, fields, models
4+
from odoo.http import request
5+
6+
_logger = logging.getLogger(__name__)
7+
8+
SESSION_TIMEOUT_DELAY = "inactive_session_timeout_seconds"
9+
SESSION_TIMEOUT_ACTIVE = "inactive_session_timeout_active"
10+
11+
12+
class IrConfigParameter(models.Model):
13+
_inherit = "ir.config_parameter"
14+
15+
def write(self, values):
16+
result = super().write(values)
17+
if SESSION_TIMEOUT_DELAY in values or SESSION_TIMEOUT_ACTIVE in values:
18+
self.env.registry.clear_cache()
19+
_logger.info("Session config cache cleared due to session timeout setting update.")
20+
return result
21+
22+
@api.model
23+
def _get_session_config(self):
24+
config = self.sudo()
25+
timeout = int(config.get_param(SESSION_TIMEOUT_DELAY, default="7200"))
26+
active = config.get_param(SESSION_TIMEOUT_ACTIVE, default="False") == "True"
27+
return {
28+
SESSION_TIMEOUT_DELAY: timeout,
29+
SESSION_TIMEOUT_ACTIVE: active,
30+
}
31+
32+
33+
class IrHttp(models.AbstractModel):
34+
_inherit = "ir.http"
35+
36+
@classmethod
37+
def _authenticate(cls, endpoint):
38+
result = super()._authenticate(endpoint=endpoint)
39+
if (
40+
request
41+
and request.session
42+
and request.session.uid
43+
and not request.env["res.users"].browse(request.session.uid)._is_public()
44+
):
45+
if request.httprequest.path:
46+
last_activity = request.session.get("last_activity")
47+
current_time = fields.Datetime.now()
48+
if last_activity and last_activity < current_time:
49+
request.env.user._handle_session_timeout(last_activity, current_time)
50+
else:
51+
request.session["last_activity"] = current_time
52+
53+
return result
54+
55+
56+
class ResUsers(models.Model):
57+
_inherit = "res.users"
58+
59+
def _is_session_expired(self, last_activity, current_time, timeout_duration):
60+
elapsed_seconds = (current_time - last_activity).total_seconds()
61+
return elapsed_seconds > timeout_duration
62+
63+
def _logout_user_session(self):
64+
if request.session.db and request.session.uid:
65+
request.session.logout(keep_db=True)
66+
return True
67+
68+
def _handle_session_timeout(self, last_activity, current_time):
69+
session_config = self.env["ir.config_parameter"].sudo()._get_session_config()
70+
is_timeout_active = session_config.get("inactive_session_timeout_active", False)
71+
72+
if not is_timeout_active:
73+
request.session["last_activity"] = current_time
74+
return
75+
76+
timeout_duration = session_config.get("inactive_session_timeout_seconds", 7200)
77+
if self._is_session_expired(last_activity, current_time, timeout_duration):
78+
self._logout_user_session()
79+
else:
80+
request.session["last_activity"] = current_time

0 commit comments

Comments
 (0)