Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.1 kB)

1
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from django.core.urlresolvers import reverse
35
from django.shortcuts import redirect
36
from django.utils.translation import ugettext as _
37
from django.contrib import messages
38
from django.utils.http import urlencode
39
from django.contrib.auth import login as auth_login, authenticate, logout
40
from django.http import HttpResponse, HttpResponseBadRequest
41

    
42
from urllib import quote
43
from urlparse import urlunsplit, urlsplit, urlparse, parse_qsl
44

    
45
from astakos.im.settings import COOKIE_NAME, COOKIE_DOMAIN
46
from astakos.im.util import set_cookie
47

    
48
import logging
49

    
50
logger = logging.getLogger(__name__)
51

    
52
def login(request):
53
    """
54
    If there is no `next` request parameter redirects to astakos index page displaying an error
55
    message.
56
    If the request user is authenticated, redirects to `next` request parameter.
57
    Otherwise, redirects to login in order to return back here after successful login.
58
    """
59
    next = request.GET.get('next')
60
    if not next:
61
        return HttpResponseBadRequest(_('No next parameter'))
62
    force = request.GET.get('force', None)
63
    response = HttpResponse()
64
    if force == '':
65
        logout(request)
66
        response.delete_cookie(COOKIE_NAME, path='/', domain=COOKIE_DOMAIN)
67
    if request.user.is_authenticated():
68
        renew = request.GET.get('renew', None)
69
        if renew == '':
70
            request.user.renew_token()
71
            request.user.save()
72
            
73
            # authenticate before login
74
            user = authenticate(email=request.user.email, auth_token=request.user.auth_token)
75
            auth_login(request, user)
76
            set_cookie(response, user)
77
            logger.info('Token reset for %s' % request.user.email)
78
        parts = list(urlsplit(next))
79
        parts[3] = urlencode({'user': request.user.email, 'token': request.user.auth_token})
80
        url = urlunsplit(parts)
81
        response['Location'] = url
82
        response.status_code = 302
83
        return response
84
    else:
85
        # redirect to login with self as next
86
        
87
        # first build next parameter
88
        parts = list(urlsplit(request.build_absolute_uri()))
89
        params = dict(parse_qsl(parts[3], keep_blank_values=True))
90
        # delete force parameter
91
        if 'force' in params:
92
            del params['force']
93
        parts[3] = urlencode(params)
94
        next = urlunsplit(parts)
95
        
96
        # build url location
97
        parts[2] = reverse('astakos.im.views.index')
98
        params = {'next':next}
99
        parts[3] = urlencode(params)
100
        url = urlunsplit(parts)
101
        response['Location'] = url
102
        response.status_code = 302
103
        return response