Cookie handling code refinement
authorSofia Papagiannaki <papagian@gmail.com>
Wed, 28 Nov 2012 14:02:12 +0000 (16:02 +0200)
committerSofia Papagiannaki <papagian@gmail.com>
Wed, 28 Nov 2012 14:02:12 +0000 (16:02 +0200)
snf-astakos-app/astakos/im/cookie.py
snf-astakos-app/astakos/im/middleware.py

index c7616cf..8dca8ff 100644 (file)
@@ -35,8 +35,9 @@ import logging
 
 from urllib import quote, unquote
 
-from django.http import HttpRequest
 from django.contrib.auth.models import AnonymousUser
+from django.http import HttpRequest
+from django.utils.translation import ugettext as _
 
 from astakos.im.settings import (
     COOKIE_NAME, COOKIE_DOMAIN, COOKIE_SECURE, LOGGING_LEVEL
@@ -45,7 +46,7 @@ from astakos.im.settings import (
 logger = logging.getLogger(__name__)
 
 class Cookie():
-    def __init__(self, request, response):
+    def __init__(self, request, response=None):
         cookies = getattr(request, 'COOKIES', {})
         cookie = unquote(cookies.get(COOKIE_NAME, ''))
         self.email, sep, self.auth_token = cookie.partition('|')
@@ -53,6 +54,14 @@ class Cookie():
         self.response = response
     
     @property
+    def email(self):
+        return getattr(self, 'email', '')
+    
+    @property
+    def auth_token(self):
+        return getattr(self, 'auth_token', '')
+    
+    @property
     def is_set(self):
         no_token = not self.auth_token 
         return not no_token
@@ -67,6 +76,8 @@ class Cookie():
         return getattr(self.request, 'user', AnonymousUser())
     
     def __set(self):
+        if not self.response:
+            raise ValueError(_('There is no response.'))
         user = self.user
         expire_fmt = user.auth_token_expires.strftime('%a, %d-%b-%Y %H:%M:%S %Z')
         cookie_value = quote(user.email + '|' + user.auth_token)
@@ -78,11 +89,14 @@ class Cookie():
         logger._log(LOGGING_LEVEL, msg, [])
     
     def __delete(self):
+        if not self.response:
+            raise ValueError(_('There is no response.'))
         self.response.delete_cookie(COOKIE_NAME, path='/', domain=COOKIE_DOMAIN)
         msg = 'Cookie deleted for %(email)s' % self.__dict__
         logger._log(LOGGING_LEVEL, msg, [])
     
-    def fix(self):
+    def fix(self, response=None):
+        self.response = response or self.response
         if self.user.is_authenticated():
             if not self.is_set or not self.is_valid:
                 self.__set()
index 6c68d52..24e5a93 100644 (file)
@@ -43,11 +43,8 @@ from astakos.im.util import get_query
 
 class CookieAuthenticationMiddleware(object):
     def process_request(self, request):
-        if request.user.is_authenticated():
-            return
-        
-        cookie = unquote(request.COOKIES.get(COOKIE_NAME, ''))
-        if not cookie:
+        cookie = Cookie(request)
+        if cookie.is_valid:
             return
         
         response = HttpResponse(status=302)
@@ -58,7 +55,7 @@ class CookieAuthenticationMiddleware(object):
         url = urlunsplit(parts)
         
         response['Location'] = url
-        Cookie(request, response).fix()
+        cookie.fix(response)
         return response
     
     def process_response(self, request, response):