From 7663cc596c1fff107ea216527bee8ea11d4d29b0 Mon Sep 17 00:00:00 2001 From: Vincent Pelletier <vincent@nexedi.com> Date: Tue, 7 Jun 2016 10:32:49 +0200 Subject: [PATCH] erp5_auto_logout: Do not depend on __ac_name cookie presence. --- .../Base_getAutoLogoutSessionKey.py | 2 +- .../Base_getAutoLogoutSessionKey.xml | 2 +- ...ase_getUsernameFromAuthenticationCookie.py | 2 + ...se_getUsernameFromAuthenticationCookie.xml | 62 +++++++++++++++++++ .../portal_skins/erp5_auto_logout/logout.py | 7 ++- .../erp5_auto_logout/setAuthCookie.py | 8 ++- .../erp5_auto_logout/twiddleAuthCookie.py | 8 ++- 7 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getUsernameFromAuthenticationCookie.py create mode 100644 product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getUsernameFromAuthenticationCookie.xml diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getAutoLogoutSessionKey.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getAutoLogoutSessionKey.py index 563108e9c5..de5a5a947b 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getAutoLogoutSessionKey.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getAutoLogoutSessionKey.py @@ -2,4 +2,4 @@ from AccessControl import getSecurityManager from zExceptions import Unauthorized if REQUEST is not None: # Cheap "do not call from URL" protection - not that the session key is secret raise Unauthorized -return 'ac_cookie_%s' % context.REQUEST.get('__ac_name', 'Anonymous User') +return 'ac_cookie_' + username diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getAutoLogoutSessionKey.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getAutoLogoutSessionKey.xml index 0530478adb..f589aec1bc 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getAutoLogoutSessionKey.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getAutoLogoutSessionKey.xml @@ -50,7 +50,7 @@ </item> <item> <key> <string>_params</string> </key> - <value> <string>REQUEST=None</string> </value> + <value> <string>username, REQUEST=None</string> </value> </item> <item> <key> <string>id</string> </key> diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getUsernameFromAuthenticationCookie.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getUsernameFromAuthenticationCookie.py new file mode 100644 index 0000000000..4628e29c5c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getUsernameFromAuthenticationCookie.py @@ -0,0 +1,2 @@ +from urllib import unquote +return unquote(value).decode('base64').split(':', 1)[0] diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getUsernameFromAuthenticationCookie.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getUsernameFromAuthenticationCookie.xml new file mode 100644 index 0000000000..d50869a4e3 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/Base_getUsernameFromAuthenticationCookie.xml @@ -0,0 +1,62 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string>value</string> </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>Base_getUsernameFromAuthenticationCookie</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/logout.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/logout.py index 383c203468..562258fbf9 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/logout.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/logout.py @@ -1,5 +1,10 @@ +from AccessControl import getSecurityManager portal = context.getPortalObject() -portal.portal_sessions.manage_delObjects(portal.Base_getAutoLogoutSessionKey()) +portal.portal_sessions.manage_delObjects( + portal.Base_getAutoLogoutSessionKey( + username=getSecurityManager().getUser().getUserName(), + ) +) REQUEST = portal.REQUEST if REQUEST.has_key('portal_skin'): portal.portal_skins.clearSkinCookie() diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/setAuthCookie.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/setAuthCookie.py index 53e8abc671..8e0d73867e 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/setAuthCookie.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/setAuthCookie.py @@ -8,7 +8,13 @@ else: now = DateTime() kw['expires'] = (now + expire_interval).toZone('GMT').rfc822() ac_renew = (now + expire_interval / 2).millis() -portal.portal_sessions[portal.Base_getAutoLogoutSessionKey()]['ac_renew'] = ac_renew +portal.portal_sessions[ + portal.Base_getAutoLogoutSessionKey( + username=portal.Base_getUsernameFromAuthenticationCookie( + cookie_value, + ) + ) +]['ac_renew'] = ac_renew resp.setCookie( name=cookie_name, value=cookie_value, diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/twiddleAuthCookie.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/twiddleAuthCookie.py index 696eddee4f..6cc18e8a51 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/twiddleAuthCookie.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_auto_logout/twiddleAuthCookie.py @@ -1,3 +1,9 @@ portal = context.getPortalObject() -if DateTime().millis() >= portal.portal_sessions[portal.Base_getAutoLogoutSessionKey()].get('ac_renew', 0): +if DateTime().millis() >= portal.portal_sessions[ + portal.Base_getAutoLogoutSessionKey( + username=portal.Base_getUsernameFromAuthenticationCookie( + cookie_value, + ) + ) + ].get('ac_renew', 0): portal.setAuthCookie(resp, cookie_name, cookie_value) -- 2.30.9