Statistics
| Branch: | Tag: | Revision:

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

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 8fb8d0cf Giorgos Korfiatis
        cookie_attribute = ('uuid' if not settings.TRANSLATE_UUIDS
71 8fb8d0cf Giorgos Korfiatis
                            else 'username')
72 469d0997 Georgios D. Tsoukalas
        return (self.uuid == getattr(self.user, cookie_attribute, '') and
73 469d0997 Georgios D. Tsoukalas
                self.auth_token == getattr(self.user, 'auth_token', ''))
74 6a6ceeb0 Kostas Papadimitriou
75 b2ffa772 Sofia Papagiannaki
    @property
76 b2ffa772 Sofia Papagiannaki
    def user(self):
77 b2ffa772 Sofia Papagiannaki
        return getattr(self.request, 'user', AnonymousUser())
78 6a6ceeb0 Kostas Papadimitriou
79 53764fd9 Sofia Papagiannaki
    def __set(self):
80 e0cc1c4a Sofia Papagiannaki
        if not self.response:
81 c0b26605 Sofia Papagiannaki
            raise ValueError(_(astakos_messages.NO_RESPONSE))
82 b2ffa772 Sofia Papagiannaki
        user = self.user
83 1439d638 Sofia Papagiannaki
        expire_fmt = user.auth_token_expires.strftime(
84 1439d638 Sofia Papagiannaki
            '%a, %d-%b-%Y %H:%M:%S %Z')
85 8998f09a Sofia Papagiannaki
        if settings.TRANSLATE_UUIDS:
86 469d0997 Georgios D. Tsoukalas
            cookie_value = quote(user.username + '|' + user.auth_token)
87 469d0997 Georgios D. Tsoukalas
        else:
88 469d0997 Georgios D. Tsoukalas
            cookie_value = quote(user.uuid + '|' + user.auth_token)
89 53764fd9 Sofia Papagiannaki
        self.response.set_cookie(
90 8fb8d0cf Giorgos Korfiatis
            settings.COOKIE_NAME, value=cookie_value, expires=expire_fmt,
91 d59f5608 Sofia Papagiannaki
            path='/', domain=settings.COOKIE_DOMAIN,
92 d59f5608 Sofia Papagiannaki
            secure=settings.COOKIE_SECURE)
93 d59f5608 Sofia Papagiannaki
        msg = 'Cookie [expiring %s] set for %s'
94 d59f5608 Sofia Papagiannaki
        logger.log(settings.LOGGING_LEVEL, msg, user.auth_token_expires,
95 d59f5608 Sofia Papagiannaki
                   user.uuid)
96 6a6ceeb0 Kostas Papadimitriou
97 53764fd9 Sofia Papagiannaki
    def __delete(self):
98 e0cc1c4a Sofia Papagiannaki
        if not self.response:
99 c0b26605 Sofia Papagiannaki
            raise ValueError(_(astakos_messages.NO_RESPONSE))
100 ab30f5f1 Sofia Papagiannaki
        self.response.delete_cookie(
101 8998f09a Sofia Papagiannaki
            settings.COOKIE_NAME, path='/', domain=settings.COOKIE_DOMAIN)
102 d59f5608 Sofia Papagiannaki
        msg = 'Cookie deleted for %s'
103 d59f5608 Sofia Papagiannaki
        logger.log(settings.LOGGING_LEVEL, msg, self.uuid)
104 6a6ceeb0 Kostas Papadimitriou
105 e0cc1c4a Sofia Papagiannaki
    def fix(self, response=None):
106 e0cc1c4a Sofia Papagiannaki
        self.response = response or self.response
107 e13fae3d root
        try:
108 ab30f5f1 Sofia Papagiannaki
            if self.user.is_authenticated():
109 e13fae3d root
                if not self.is_set or not self.is_valid:
110 e13fae3d root
                    self.__set()
111 e13fae3d root
            else:
112 e13fae3d root
                if self.is_set:
113 e13fae3d root
                    self.__delete()
114 c6f0df35 Georgios D. Tsoukalas
        except AttributeError:
115 c6f0df35 Georgios D. Tsoukalas
            pass