Code

Ticket #2548: session_middleware.2.diff

File session_middleware.2.diff, 2.5 KB (added by upadhyay@…, 7 years ago)

previous patch broke things when SESSION_EXPIRE_AT_BROWSER_CLOSE is set to True

Line 
1Index: contrib/sessions/middleware.py
2===================================================================
3--- contrib/sessions/middleware.py      (revision 426)
4+++ contrib/sessions/middleware.py      (working copy)
5@@ -12,6 +12,7 @@
6         self.session_key = session_key
7         self.accessed = False
8         self.modified = False
9+        self.expires_time = False
10 
11     def __contains__(self, key):
12         return key in self._session
13@@ -48,6 +49,14 @@
14     def delete_test_cookie(self):
15         del self[TEST_COOKIE_NAME]
16 
17+    def set_expires(self, val):
18+        self.expires_time = val
19+        self.modified = True
20+
21+    def get_expires(self):
22+        return self.expires_time or settings.SESSION_COOKIE_AGE
23+
24+
25     def _get_session(self):
26         # Lazily loads session from storage.
27         self.accessed = True
28@@ -69,6 +78,7 @@
29             return self._session_cache
30 
31     _session = property(_get_session)
32+    expires = property(get_expires, set_expires)
33 
34 class SessionMiddleware(object):
35     def process_request(self, request):
36@@ -92,14 +102,16 @@
37                     obj = Session.objects.get_new_session_object()
38                     session_key = obj.session_key
39 
40-                if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE:
41+                if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE and not request.session.expires_time:
42                     max_age = None
43+                    delta_yield = datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE)
44                     expires = None
45                 else:
46-                    max_age = settings.SESSION_COOKIE_AGE
47-                    expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT")
48+                    max_age = request.session.expires
49+                    delta_yield = datetime.datetime.now() + datetime.timedelta(seconds=max_age)
50+                    expires = datetime.datetime.strftime(delta_yield, "%a, %d-%b-%Y %H:%M:%S GMT")
51                 new_session = Session.objects.save(session_key, request.session._session,
52-                    datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
53+                    delta_yield)
54                 response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
55                     max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
56                     secure=settings.SESSION_COOKIE_SECURE or None)