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
|