"""Views"""
from django.conf import settings
-from django.http import HttpResponseRedirect, HttpResponse, \
- HttpResponseServerError
+from django.http import HttpResponseRedirect, HttpResponse, HttpResponseServerError
from django.core.urlresolvers import reverse
from django.db import transaction
from django.contrib.auth import login, REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import login_required
from social_auth.backends import get_backend
+from social_auth.utils import sanitize_redirect
+
+
+DEFAULT_REDIRECT = getattr(settings, 'LOGIN_REDIRECT_URL', '')
def auth(request, backend):
"""Start authentication process"""
complete_url = getattr(settings, 'SOCIAL_AUTH_COMPLETE_URL_NAME',
'complete')
- redirect = getattr(settings, 'LOGIN_REDIRECT_URL', '')
- return auth_process(request, backend, complete_url, redirect)
+ return auth_process(request, backend, complete_url)
@transaction.commit_on_success
social_user = user.social_auth.get(provider=backend_name)
if social_user.expiration_delta():
request.session.set_expiry(social_user.expiration_delta())
- url = request.session.pop(REDIRECT_FIELD_NAME, '') or \
- getattr(settings, 'LOGIN_REDIRECT_URL', '')
+ url = request.session.pop(REDIRECT_FIELD_NAME, '') or DEFAULT_REDIRECT
else:
url = getattr(settings, 'LOGIN_ERROR_URL', settings.LOGIN_URL)
return HttpResponseRedirect(url)
"""Authentication starting process"""
complete_url = getattr(settings, 'SOCIAL_AUTH_ASSOCIATE_URL_NAME',
'associate_complete')
- redirect = getattr(settings, 'LOGIN_REDIRECT_URL', '')
- return auth_process(request, backend, complete_url, redirect)
+ return auth_process(request, backend, complete_url)
@login_required
if not backend:
return HttpResponseServerError('Incorrect authentication service')
backend.auth_complete(user=request.user)
- url = request.session.pop(REDIRECT_FIELD_NAME, '') or \
- getattr(settings, 'LOGIN_REDIRECT_URL', '')
+ url = request.session.pop(REDIRECT_FIELD_NAME, '') or DEFAULT_REDIRECT
return HttpResponseRedirect(url)
if not backend:
return HttpResponseServerError('Incorrect authentication service')
backend.disconnect(request.user)
- url = request.REQUEST.get(REDIRECT_FIELD_NAME, '') or \
- getattr(settings, 'LOGIN_REDIRECT_URL', '')
+ url = request.REQUEST.get(REDIRECT_FIELD_NAME, '') or DEFAULT_REDIRECT
return HttpResponseRedirect(url)
-def auth_process(request, backend, complete_url_name, default_final_url):
+def auth_process(request, backend, complete_url_name,
+ default_redirect=DEFAULT_REDIRECT):
"""Authenticate using social backend"""
redirect = reverse(complete_url_name, args=(backend,))
backend = get_backend(backend, request, redirect)
if not backend:
return HttpResponseServerError('Incorrect authentication service')
data = request.REQUEST
- request.session[REDIRECT_FIELD_NAME] = data.get(REDIRECT_FIELD_NAME,
- default_final_url)
+ # Check and sanitize a user-defined GET/POST redirect_to field value.
+ redirect = sanitize_redirect(request.get_host(), data.get(REDIRECT_FIELD_NAME))
+ request.session[REDIRECT_FIELD_NAME] = redirect or DEFAULT_REDIRECT
if backend.uses_redirect:
return HttpResponseRedirect(backend.auth_url())
else: