improved session data in cookie

This commit is contained in:
mdipierro
2012-10-16 07:10:33 -05:00
parent 2afb8a5a96
commit 7119d53a86
2 changed files with 30 additions and 20 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.1.1 (2012-10-16 06:19:35) dev Version 2.1.1 (2012-10-16 07:10:29) dev
+29 -19
View File
@@ -481,27 +481,33 @@ class Session(Storage):
if not masterapp: if not masterapp:
masterapp = request.application masterapp = request.application
response.session_id_name = 'session_id_%s' % masterapp.lower() response.session_id_name = 'session_id_%s' % masterapp.lower()
response.session_data_name = 'session_data_%s' % masterapp.lower()
# Load session data from cookie # Load session data from cookie
cookies = request.cookies cookies = request.cookies
# check if there is a session_id in cookies
if response.session_id_name in cookies: if response.session_id_name in cookies:
response.session_id = \ response.session_id = \
cookies[response.session_id_name].value cookies[response.session_id_name].value
else: else:
response.session_id = None response.session_id = None
# check if there is session data in cookies
if response.session_data_name in cookies:
session_cookie_data = cookies[response.session_data_name].value
else:
session_cookie_data = None
# if we are supposed to use cookie based session data
if cookie_key: if cookie_key:
response.session_storage_type = 'cookie' response.session_storage_type = 'cookie'
response.session_cookie_key = cookie_key response.session_cookie_key = cookie_key
response.session_cookie_hkey = hashlib.md5(cookie_key).hexdigest() if session_cookie_data:
cookie_name = 'session_data_'+masterapp.lower() data = secure_loads(session_cookie_data,cookie_key)
response.session_cookie_name = cookie_name if data:
if cookie_name in cookies: self.update(data)
cookie_value = cookies[cookie_name].value # else if we are supposed to use file based sessions
session_data = secure_loads(cookie_value, cookie_key)
if session_data:
self.update(session_data)
elif not db: elif not db:
response.session_storage_type = 'file' response.session_storage_type = 'file'
if global_settings.db_sessions is True \ if global_settings.db_sessions is True \
@@ -516,7 +522,8 @@ class Session(Storage):
'sessions', response.session_id) 'sessions', response.session_id)
else: else:
response.session_id = None response.session_id = None
if response.session_id: # do not try load the data from file is these was data in cookie
if response.session_id and not session_cookie_data:
try: try:
response.session_file = \ response.session_file = \
open(response.session_filename, 'rb+') open(response.session_filename, 'rb+')
@@ -547,6 +554,7 @@ class Session(Storage):
os.path.join(up(request.folder), masterapp, os.path.join(up(request.folder), masterapp,
'sessions', response.session_id) 'sessions', response.session_id)
response.session_new = True response.session_new = True
# else the session goes in db
else: else:
response.session_storage_type = 'db' response.session_storage_type = 'db'
if global_settings.db_sessions is not True: if global_settings.db_sessions is not True:
@@ -583,14 +591,15 @@ class Session(Storage):
if record_id == '0': if record_id == '0':
raise Exception, 'record_id == 0' raise Exception, 'record_id == 0'
# Select from database # Select from database
rows = db(table.id == record_id).select() if not request.session_cookie_data:
# Make sure the session data exists in the database rows = db(table.id == record_id).select()
if len(rows) == 0 or rows[0].unique_key != unique_key: # Make sure the session data exists in the database
raise Exception, 'No record' if len(rows) == 0 or rows[0].unique_key != unique_key:
# rows[0].update_record(locked=True) raise Exception, 'No record'
# Unpickle the data # rows[0].update_record(locked=True)
session_data = cPickle.loads(rows[0].session_data) # Unpickle the data
self.update(session_data) session_data = cPickle.loads(rows[0].session_data)
self.update(session_data)
except Exception: except Exception:
record_id = None record_id = None
unique_key = web2py_uuid() unique_key = web2py_uuid()
@@ -602,6 +611,7 @@ class Session(Storage):
rcookies = response.cookies rcookies = response.cookies
rcookies[response.session_id_name] = response.session_id rcookies[response.session_id_name] = response.session_id
rcookies[response.session_id_name]['path'] = '/' rcookies[response.session_id_name]['path'] = '/'
# TODO: if not session data in cookie, delete seession_data_name cookie
if self.flash: if self.flash:
(response.flash, self.flash) = (self.flash, None) (response.flash, self.flash) = (self.flash, None)
@@ -631,8 +641,8 @@ class Session(Storage):
def _try_store_in_cookie(self, request, response): def _try_store_in_cookie(self, request, response):
if response.session_storage_type!='cookie': return False if response.session_storage_type!='cookie': return False
value = secure_dumps(dict(self),response.session_cookie_key) value = secure_dumps(dict(self),response.session_cookie_key)
response.cookies[response.session_cookie_name] = value response.cookies[response.session_data_name] = value
response.cookies[response.session_cookie_name]['path'] = '/' response.cookies[response.session_data_name]['path'] = '/'
return True return True
def _unchanged(self): def _unchanged(self):