Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / target / redirect.py @ c700f742

History | View | Annotate | Download (5.4 kB)

1 aba1e498 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 64cd4730 Antony Chazapis
#
3 64cd4730 Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 64cd4730 Antony Chazapis
# without modification, are permitted provided that the following
5 64cd4730 Antony Chazapis
# conditions are met:
6 64cd4730 Antony Chazapis
#
7 64cd4730 Antony Chazapis
#   1. Redistributions of source code must retain the above
8 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
9 64cd4730 Antony Chazapis
#      disclaimer.
10 64cd4730 Antony Chazapis
#
11 64cd4730 Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
13 64cd4730 Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 64cd4730 Antony Chazapis
#      provided with the distribution.
15 64cd4730 Antony Chazapis
#
16 64cd4730 Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 64cd4730 Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 64cd4730 Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 64cd4730 Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 64cd4730 Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 64cd4730 Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 64cd4730 Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 64cd4730 Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 64cd4730 Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 64cd4730 Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 64cd4730 Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 64cd4730 Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 64cd4730 Antony Chazapis
#
29 64cd4730 Antony Chazapis
# The views and conclusions contained in the software and
30 64cd4730 Antony Chazapis
# documentation are those of the authors and should not be
31 64cd4730 Antony Chazapis
# interpreted as representing official policies, either expressed
32 64cd4730 Antony Chazapis
# or implied, of GRNET S.A.
33 64cd4730 Antony Chazapis
34 148b0cde Sofia Papagiannaki
from django.core.urlresolvers import reverse
35 a196eb7e Sofia Papagiannaki
from django.utils.translation import ugettext as _
36 a196eb7e Sofia Papagiannaki
from django.utils.http import urlencode
37 111f3da6 Sofia Papagiannaki
from django.contrib.auth import authenticate
38 217994f8 Sofia Papagiannaki
from django.http import (
39 73fbaec4 Sofia Papagiannaki
    HttpResponse, HttpResponseBadRequest, HttpResponseForbidden)
40 27e26a41 Sofia Papagiannaki
from django.core.exceptions import ValidationError
41 9a06d96f Olga Brani
from django.views.decorators.http import require_http_methods
42 a196eb7e Sofia Papagiannaki
43 aab4d540 Sofia Papagiannaki
from urlparse import urlunsplit, urlsplit, parse_qsl
44 64cd4730 Antony Chazapis
45 b2ffa772 Sofia Papagiannaki
from astakos.im.settings import COOKIE_DOMAIN
46 b2ffa772 Sofia Papagiannaki
from astakos.im.util import restrict_next
47 111f3da6 Sofia Papagiannaki
from astakos.im.functions import login as auth_login, logout
48 860b37f0 Sofia Papagiannaki
49 ae497612 Olga Brani
import astakos.im.messages as astakos_messages
50 ae497612 Olga Brani
51 e015e9e6 Sofia Papagiannaki
import logging
52 e015e9e6 Sofia Papagiannaki
53 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
54 e015e9e6 Sofia Papagiannaki
55 5ce3ce4f Sofia Papagiannaki
56 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
57 64cd4730 Antony Chazapis
def login(request):
58 a196eb7e Sofia Papagiannaki
    """
59 09e7393c Sofia Papagiannaki
    If there is no ``next`` request parameter redirects to astakos index page
60 09e7393c Sofia Papagiannaki
    displaying an error message.
61 09e7393c Sofia Papagiannaki
    If the request user is authenticated and has signed the approval terms,
62 09e7393c Sofia Papagiannaki
    redirects to `next` request parameter. If not, redirects to approval terms
63 09e7393c Sofia Papagiannaki
    in order to return back here after agreeing with the terms.
64 ebd369d0 Sofia Papagiannaki
    Otherwise, redirects to login in order to return back here after successful login.
65 a196eb7e Sofia Papagiannaki
    """
66 ebd369d0 Sofia Papagiannaki
    next = request.GET.get('next')
67 ebd369d0 Sofia Papagiannaki
    if not next:
68 ae497612 Olga Brani
        return HttpResponseBadRequest(_(astakos_messages.MISSING_NEXT_PARAMETER))
69 217994f8 Sofia Papagiannaki
    if not restrict_next(
70 217994f8 Sofia Papagiannaki
        next, domain=COOKIE_DOMAIN, allowed_schemes=('pithos',)
71 217994f8 Sofia Papagiannaki
    ):
72 c0b26605 Sofia Papagiannaki
        return HttpResponseForbidden(_(astakos_messages.NOT_ALLOWED_NEXT_PARAM))
73 ebd369d0 Sofia Papagiannaki
    force = request.GET.get('force', None)
74 ebd369d0 Sofia Papagiannaki
    response = HttpResponse()
75 ebd369d0 Sofia Papagiannaki
    if force == '':
76 ebd369d0 Sofia Papagiannaki
        logout(request)
77 148b0cde Sofia Papagiannaki
    if request.user.is_authenticated():
78 e510fae4 Sofia Papagiannaki
        # if user has not signed the approval terms
79 e510fae4 Sofia Papagiannaki
        # redirect to approval terms with next the request path
80 fcf90160 Sofia Papagiannaki
        if not request.user.signed_terms:
81 e510fae4 Sofia Papagiannaki
            # first build next parameter
82 e510fae4 Sofia Papagiannaki
            parts = list(urlsplit(request.build_absolute_uri()))
83 e510fae4 Sofia Papagiannaki
            params = dict(parse_qsl(parts[3], keep_blank_values=True))
84 e510fae4 Sofia Papagiannaki
            # delete force parameter
85 e510fae4 Sofia Papagiannaki
            parts[3] = urlencode(params)
86 e510fae4 Sofia Papagiannaki
            next = urlunsplit(parts)
87 5ce3ce4f Sofia Papagiannaki
88 e510fae4 Sofia Papagiannaki
            # build url location
89 e510fae4 Sofia Papagiannaki
            parts[2] = reverse('latest_terms')
90 5ce3ce4f Sofia Papagiannaki
            params = {'next': next}
91 e510fae4 Sofia Papagiannaki
            parts[3] = urlencode(params)
92 e510fae4 Sofia Papagiannaki
            url = urlunsplit(parts)
93 e510fae4 Sofia Papagiannaki
            response['Location'] = url
94 e510fae4 Sofia Papagiannaki
            response.status_code = 302
95 e510fae4 Sofia Papagiannaki
            return response
96 860b37f0 Sofia Papagiannaki
        renew = request.GET.get('renew', None)
97 ebd369d0 Sofia Papagiannaki
        if renew == '':
98 bf0c6de5 Sofia Papagiannaki
            request.user.renew_token(
99 bf0c6de5 Sofia Papagiannaki
                flush_sessions=True,
100 bf0c6de5 Sofia Papagiannaki
                current_key=request.session.session_key
101 bf0c6de5 Sofia Papagiannaki
            )
102 27e26a41 Sofia Papagiannaki
            try:
103 27e26a41 Sofia Papagiannaki
                request.user.save()
104 27e26a41 Sofia Papagiannaki
            except ValidationError, e:
105 27e26a41 Sofia Papagiannaki
                return HttpResponseBadRequest(e)
106 ebd369d0 Sofia Papagiannaki
            # authenticate before login
107 c700f742 Sofia Papagiannaki
            user = authenticate(
108 c700f742 Sofia Papagiannaki
                username=request.user.username,
109 c700f742 Sofia Papagiannaki
                auth_token=request.user.auth_token
110 c700f742 Sofia Papagiannaki
            )
111 ebd369d0 Sofia Papagiannaki
            auth_login(request, user)
112 c700f742 Sofia Papagiannaki
            logger.info('Token reset for %s' % user.username)
113 ebd369d0 Sofia Papagiannaki
        parts = list(urlsplit(next))
114 c700f742 Sofia Papagiannaki
        parts[3] = urlencode({
115 c700f742 Sofia Papagiannaki
            'user': request.user.uuid,
116 c700f742 Sofia Papagiannaki
            'token': request.user.auth_token
117 c700f742 Sofia Papagiannaki
        })
118 ebd369d0 Sofia Papagiannaki
        url = urlunsplit(parts)
119 ebd369d0 Sofia Papagiannaki
        response['Location'] = url
120 ebd369d0 Sofia Papagiannaki
        response.status_code = 302
121 ebd369d0 Sofia Papagiannaki
        return response
122 148b0cde Sofia Papagiannaki
    else:
123 e510fae4 Sofia Papagiannaki
        # redirect to login with next the request path
124 5ce3ce4f Sofia Papagiannaki
125 ebd369d0 Sofia Papagiannaki
        # first build next parameter
126 ebd369d0 Sofia Papagiannaki
        parts = list(urlsplit(request.build_absolute_uri()))
127 ebd369d0 Sofia Papagiannaki
        params = dict(parse_qsl(parts[3], keep_blank_values=True))
128 ebd369d0 Sofia Papagiannaki
        # delete force parameter
129 ebd369d0 Sofia Papagiannaki
        if 'force' in params:
130 ebd369d0 Sofia Papagiannaki
            del params['force']
131 ebd369d0 Sofia Papagiannaki
        parts[3] = urlencode(params)
132 ebd369d0 Sofia Papagiannaki
        next = urlunsplit(parts)
133 5ce3ce4f Sofia Papagiannaki
134 ebd369d0 Sofia Papagiannaki
        # build url location
135 6ff7a7ca Sofia Papagiannaki
        parts[2] = reverse('index')
136 5ce3ce4f Sofia Papagiannaki
        params = {'next': next}
137 ebd369d0 Sofia Papagiannaki
        parts[3] = urlencode(params)
138 ebd369d0 Sofia Papagiannaki
        url = urlunsplit(parts)
139 ebd369d0 Sofia Papagiannaki
        response['Location'] = url
140 ebd369d0 Sofia Papagiannaki
        response.status_code = 302
141 5ce3ce4f Sofia Papagiannaki
        return response