improved session data in cookie
This commit is contained in:
@@ -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
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user