Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / cookie.py @ 469d0997

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