Revision ebd369d0 snf-astakos-app/astakos/im/target/redirect.py
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