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
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('|')
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
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)
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()
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)
url = urlunsplit(parts)
response['Location'] = url
- Cookie(request, response).fix()
+ cookie.fix(response)
return response
def process_response(self, request, response):