Revision 3a76cacb

b/docs/source/devguide.rst
117 117
======================  =========================
118 118
next                    The URI to redirect to when the process is finished
119 119
renew                   Force token renewal (no value parameter)
120
force                   Force logout current user (no value parameter)
120 121
======================  =========================
121 122

  
122 123
External systems outside the domain scope can acquire the user information by a cookie set identified by ASTAKOS_COOKIE_NAME setting.
b/snf-astakos-app/astakos/im/target/redirect.py
36 36
from django.utils.translation import ugettext as _
37 37
from django.contrib import messages
38 38
from django.utils.http import urlencode
39
from django.contrib.auth import login as auth_login, authenticate
40
from django.http import HttpResponse
39
from django.contrib.auth import login as auth_login, authenticate, logout
40
from django.http import HttpResponse, HttpResponseBadRequest
41 41

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

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

  
52 52
def login(request):
53 53
    """
54
    If the request user is authenticated, redirects to `next` request parameter
55
    if exists, otherwise redirects to astakos index page displaying an error
54
    If there is no `next` request parameter redirects to astakos index page displaying an error
56 55
    message.
57
    If the request user is not authenticated, redirects to login in order to
58
    return back here after successful login.
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.
59 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)
60 67
    if request.user.is_authenticated():
61
        next = request.GET.get('next')
62 68
        renew = request.GET.get('renew', None)
63
        if next:
64
            response = HttpResponse()
65
            if renew == '':
66
                request.user.renew_token()
67
                request.user.save()
68
                
69
                # authenticate before login
70
                user = authenticate(email=request.user.email, auth_token=request.user.auth_token)
71
                auth_login(request, user)
72
                set_cookie(response, user)
73
                logger.info('Token reset for %s' % request.user.email)
74
            parts = list(urlsplit(next))
75
            parts[3] = urlencode({'user': request.user.email, 'token': request.user.auth_token})
76
            url = urlunsplit(parts)
77
            response['Location'] = url
78
            response.status_code = 302
79
            return response
80
        else:
81
            msg = _('No next parameter')
82
            messages.add_message(request, messages.ERROR, msg)
83
            url = reverse('astakos.im.views.index')
84
            return redirect(url)
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
85 84
    else:
86 85
        # redirect to login with self as next
87
        url = reverse('astakos.im.views.index')
88
        url = '%s?next=%s' % (url, quote(request.build_absolute_uri()))
89
        return redirect(url)
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

Also available in: Unified diff