Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / cookie.py @ 53764fd9

History | View | Annotate | Download (3.4 kB)

1 b2ffa772 Sofia Papagiannaki
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 b2ffa772 Sofia Papagiannaki
# 
3 b2ffa772 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 b2ffa772 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 b2ffa772 Sofia Papagiannaki
# conditions are met:
6 b2ffa772 Sofia Papagiannaki
# 
7 b2ffa772 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 b2ffa772 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 b2ffa772 Sofia Papagiannaki
#      disclaimer.
10 b2ffa772 Sofia Papagiannaki
# 
11 b2ffa772 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 b2ffa772 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 b2ffa772 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 b2ffa772 Sofia Papagiannaki
#      provided with the distribution.
15 b2ffa772 Sofia Papagiannaki
# 
16 b2ffa772 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 b2ffa772 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 b2ffa772 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 b2ffa772 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 b2ffa772 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 b2ffa772 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 b2ffa772 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 b2ffa772 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 b2ffa772 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 b2ffa772 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 b2ffa772 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 b2ffa772 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 b2ffa772 Sofia Papagiannaki
# 
29 b2ffa772 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 b2ffa772 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 b2ffa772 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 b2ffa772 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 b2ffa772 Sofia Papagiannaki
34 b2ffa772 Sofia Papagiannaki
import logging
35 b2ffa772 Sofia Papagiannaki
36 b2ffa772 Sofia Papagiannaki
from urllib import quote, unquote
37 b2ffa772 Sofia Papagiannaki
38 b2ffa772 Sofia Papagiannaki
from django.http import HttpRequest
39 b2ffa772 Sofia Papagiannaki
from django.contrib.auth.models import AnonymousUser
40 b2ffa772 Sofia Papagiannaki
41 b2ffa772 Sofia Papagiannaki
from astakos.im.settings import (
42 b2ffa772 Sofia Papagiannaki
    COOKIE_NAME, COOKIE_DOMAIN, COOKIE_SECURE, LOGGING_LEVEL
43 b2ffa772 Sofia Papagiannaki
)
44 b2ffa772 Sofia Papagiannaki
45 b2ffa772 Sofia Papagiannaki
logger = logging.getLogger(__name__)
46 b2ffa772 Sofia Papagiannaki
47 b2ffa772 Sofia Papagiannaki
class Cookie():
48 47097c8a Sofia Papagiannaki
    def __init__(self, request, response):
49 b2ffa772 Sofia Papagiannaki
        cookies = getattr(request, 'COOKIES', {})
50 b2ffa772 Sofia Papagiannaki
        cookie = unquote(cookies.get(COOKIE_NAME, ''))
51 b2ffa772 Sofia Papagiannaki
        self.email, sep, self.auth_token = cookie.partition('|')
52 b2ffa772 Sofia Papagiannaki
        self.request = request
53 47097c8a Sofia Papagiannaki
        self.response = response
54 b2ffa772 Sofia Papagiannaki
    
55 b2ffa772 Sofia Papagiannaki
    @property
56 b2ffa772 Sofia Papagiannaki
    def is_set(self):
57 b2ffa772 Sofia Papagiannaki
        no_token = not self.auth_token 
58 b2ffa772 Sofia Papagiannaki
        return not no_token
59 b2ffa772 Sofia Papagiannaki
    
60 b2ffa772 Sofia Papagiannaki
    @property
61 b2ffa772 Sofia Papagiannaki
    def is_valid(self):
62 b2ffa772 Sofia Papagiannaki
        return self.email == getattr(self.user, 'email', '') and \
63 b2ffa772 Sofia Papagiannaki
            self.auth_token == getattr(self.user, 'auth_token', '')
64 b2ffa772 Sofia Papagiannaki
    
65 b2ffa772 Sofia Papagiannaki
    @property
66 b2ffa772 Sofia Papagiannaki
    def user(self):
67 b2ffa772 Sofia Papagiannaki
        return getattr(self.request, 'user', AnonymousUser())
68 b2ffa772 Sofia Papagiannaki
    
69 53764fd9 Sofia Papagiannaki
    def __set(self):
70 b2ffa772 Sofia Papagiannaki
        user = self.user
71 b2ffa772 Sofia Papagiannaki
        expire_fmt = user.auth_token_expires.strftime('%a, %d-%b-%Y %H:%M:%S %Z')
72 b2ffa772 Sofia Papagiannaki
        cookie_value = quote(user.email + '|' + user.auth_token)
73 53764fd9 Sofia Papagiannaki
        self.response.set_cookie(
74 53764fd9 Sofia Papagiannaki
            COOKIE_NAME, value=cookie_value, expires=expire_fmt, path='/',
75 53764fd9 Sofia Papagiannaki
            domain=COOKIE_DOMAIN, secure=COOKIE_SECURE
76 53764fd9 Sofia Papagiannaki
        )
77 b2ffa772 Sofia Papagiannaki
        msg = 'Cookie [expiring %(auth_token_expires)s] set for %(email)s' % user.__dict__
78 b2ffa772 Sofia Papagiannaki
        logger._log(LOGGING_LEVEL, msg, [])
79 b2ffa772 Sofia Papagiannaki
    
80 53764fd9 Sofia Papagiannaki
    def __delete(self):
81 53764fd9 Sofia Papagiannaki
        self.response.delete_cookie(COOKIE_NAME, path='/', domain=COOKIE_DOMAIN)
82 b2ffa772 Sofia Papagiannaki
        msg = 'Cookie deleted for %(email)s' % self.__dict__
83 b2ffa772 Sofia Papagiannaki
        logger._log(LOGGING_LEVEL, msg, [])
84 b2ffa772 Sofia Papagiannaki
    
85 47097c8a Sofia Papagiannaki
    def fix(self):
86 b2ffa772 Sofia Papagiannaki
        if self.user.is_authenticated():
87 b2ffa772 Sofia Papagiannaki
            if not self.is_set or not self.is_valid:
88 53764fd9 Sofia Papagiannaki
                self.__set()
89 b2ffa772 Sofia Papagiannaki
        else:
90 b2ffa772 Sofia Papagiannaki
            if self.is_set:
91 53764fd9 Sofia Papagiannaki
                self.__delete()