Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / cookie.py @ d558ca0b

History | View | Annotate | Download (4.2 kB)

1 b2ffa772 Sofia Papagiannaki
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 6a6ceeb0 Kostas Papadimitriou
#
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 6a6ceeb0 Kostas Papadimitriou
#
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 6a6ceeb0 Kostas Papadimitriou
#
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 6a6ceeb0 Kostas Papadimitriou
#
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 6a6ceeb0 Kostas Papadimitriou
#
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.contrib.auth.models import AnonymousUser
39 e0cc1c4a Sofia Papagiannaki
from django.utils.translation import ugettext as _
40 b2ffa772 Sofia Papagiannaki
41 8998f09a Sofia Papagiannaki
from astakos.im import settings
42 c0b26605 Sofia Papagiannaki
import astakos.im.messages as astakos_messages
43 c0b26605 Sofia Papagiannaki
44 b2ffa772 Sofia Papagiannaki
logger = logging.getLogger(__name__)
45 b2ffa772 Sofia Papagiannaki
46 1439d638 Sofia Papagiannaki
47 222305b7 Sofia Papagiannaki
class CookieHandler():
48 e0cc1c4a Sofia Papagiannaki
    def __init__(self, request, response=None):
49 b2ffa772 Sofia Papagiannaki
        cookies = getattr(request, 'COOKIES', {})
50 8998f09a Sofia Papagiannaki
        cookie = unquote(cookies.get(settings.COOKIE_NAME, ''))
51 8954c8e8 Sofia Papagiannaki
        self.uuid, sep, self.auth_token = cookie.partition('|')
52 b2ffa772 Sofia Papagiannaki
        self.request = request
53 47097c8a Sofia Papagiannaki
        self.response = response
54 6a6ceeb0 Kostas Papadimitriou
55 b2ffa772 Sofia Papagiannaki
    @property
56 f201d5b9 Sofia Papagiannaki
    def uuid(self):
57 f201d5b9 Sofia Papagiannaki
        return getattr(self, 'uuid', '')
58 6a6ceeb0 Kostas Papadimitriou
59 e0cc1c4a Sofia Papagiannaki
    @property
60 e0cc1c4a Sofia Papagiannaki
    def auth_token(self):
61 e0cc1c4a Sofia Papagiannaki
        return getattr(self, 'auth_token', '')
62 6a6ceeb0 Kostas Papadimitriou
63 e0cc1c4a Sofia Papagiannaki
    @property
64 b2ffa772 Sofia Papagiannaki
    def is_set(self):
65 c0b26605 Sofia Papagiannaki
        no_token = not self.auth_token
66 b2ffa772 Sofia Papagiannaki
        return not no_token
67 6a6ceeb0 Kostas Papadimitriou
68 b2ffa772 Sofia Papagiannaki
    @property
69 b2ffa772 Sofia Papagiannaki
    def is_valid(self):
70 8998f09a Sofia Papagiannaki
        cookie_attribute = 'uuid' if not settings.TRANSLATE_UUIDS else 'username'
71 469d0997 Georgios D. Tsoukalas
        return (self.uuid == getattr(self.user, cookie_attribute, '') and
72 469d0997 Georgios D. Tsoukalas
                self.auth_token == getattr(self.user, 'auth_token', ''))
73 6a6ceeb0 Kostas Papadimitriou
74 b2ffa772 Sofia Papagiannaki
    @property
75 b2ffa772 Sofia Papagiannaki
    def user(self):
76 b2ffa772 Sofia Papagiannaki
        return getattr(self.request, 'user', AnonymousUser())
77 6a6ceeb0 Kostas Papadimitriou
78 53764fd9 Sofia Papagiannaki
    def __set(self):
79 e0cc1c4a Sofia Papagiannaki
        if not self.response:
80 c0b26605 Sofia Papagiannaki
            raise ValueError(_(astakos_messages.NO_RESPONSE))
81 b2ffa772 Sofia Papagiannaki
        user = self.user
82 1439d638 Sofia Papagiannaki
        expire_fmt = user.auth_token_expires.strftime(
83 1439d638 Sofia Papagiannaki
            '%a, %d-%b-%Y %H:%M:%S %Z')
84 8998f09a Sofia Papagiannaki
        if settings.TRANSLATE_UUIDS:
85 469d0997 Georgios D. Tsoukalas
            cookie_value = quote(user.username + '|' + user.auth_token)
86 469d0997 Georgios D. Tsoukalas
        else:
87 469d0997 Georgios D. Tsoukalas
            cookie_value = quote(user.uuid + '|' + user.auth_token)
88 53764fd9 Sofia Papagiannaki
        self.response.set_cookie(
89 8998f09a Sofia Papagiannaki
            settings.COOKIE_NAME, value=cookie_value, expires=expire_fmt, path='/',
90 8998f09a Sofia Papagiannaki
            domain=settings.COOKIE_DOMAIN, secure=settings.COOKIE_SECURE
91 53764fd9 Sofia Papagiannaki
        )
92 ab30f5f1 Sofia Papagiannaki
        msg = str(('Cookie [expiring %(auth_token_expires)s]',
93 ab30f5f1 Sofia Papagiannaki
                   'set for %(uuid)s')) % user.__dict__
94 8998f09a Sofia Papagiannaki
        logger._log(settings.LOGGING_LEVEL, msg, [])
95 6a6ceeb0 Kostas Papadimitriou
96 53764fd9 Sofia Papagiannaki
    def __delete(self):
97 e0cc1c4a Sofia Papagiannaki
        if not self.response:
98 c0b26605 Sofia Papagiannaki
            raise ValueError(_(astakos_messages.NO_RESPONSE))
99 ab30f5f1 Sofia Papagiannaki
        self.response.delete_cookie(
100 8998f09a Sofia Papagiannaki
            settings.COOKIE_NAME, path='/', domain=settings.COOKIE_DOMAIN)
101 a6b6d810 Giorgos Korfiatis
        msg = 'Cookie deleted for %(uuid)s' % self.__dict__
102 8998f09a Sofia Papagiannaki
        logger._log(settings.LOGGING_LEVEL, msg, [])
103 6a6ceeb0 Kostas Papadimitriou
104 e0cc1c4a Sofia Papagiannaki
    def fix(self, response=None):
105 e0cc1c4a Sofia Papagiannaki
        self.response = response or self.response
106 e13fae3d root
        try:
107 ab30f5f1 Sofia Papagiannaki
            if self.user.is_authenticated():
108 e13fae3d root
                if not self.is_set or not self.is_valid:
109 e13fae3d root
                    self.__set()
110 e13fae3d root
            else:
111 e13fae3d root
                if self.is_set:
112 e13fae3d root
                    self.__delete()
113 c6f0df35 Georgios D. Tsoukalas
        except AttributeError:
114 c6f0df35 Georgios D. Tsoukalas
            pass