Commit 350f98eb by Braden MacDonald

Changes for compatibility with latest python-social-auth (0.2.7)

parent 390e2c18
...@@ -10,6 +10,7 @@ from provider.oauth2.forms import ScopeChoiceField, ScopeMixin ...@@ -10,6 +10,7 @@ from provider.oauth2.forms import ScopeChoiceField, ScopeMixin
from provider.oauth2.models import Client from provider.oauth2.models import Client
from requests import HTTPError from requests import HTTPError
from social.backends import oauth as social_oauth from social.backends import oauth as social_oauth
from social.exceptions import AuthException
from third_party_auth import pipeline from third_party_auth import pipeline
...@@ -54,7 +55,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm): ...@@ -54,7 +55,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm):
if self._errors: if self._errors:
return {} return {}
backend = self.request.social_strategy.backend backend = self.request.backend
if not isinstance(backend, social_oauth.BaseOAuth2): if not isinstance(backend, social_oauth.BaseOAuth2):
raise OAuthValidationError( raise OAuthValidationError(
{ {
...@@ -89,7 +90,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm): ...@@ -89,7 +90,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm):
user = None user = None
try: try:
user = backend.do_auth(self.cleaned_data.get("access_token")) user = backend.do_auth(self.cleaned_data.get("access_token"))
except HTTPError: except (HTTPError, AuthException):
pass pass
if user and isinstance(user, User): if user and isinstance(user, User):
self.cleaned_data["user"] = user self.cleaned_data["user"] = user
......
...@@ -24,8 +24,11 @@ class AccessTokenExchangeFormTest(AccessTokenExchangeTestMixin): ...@@ -24,8 +24,11 @@ class AccessTokenExchangeFormTest(AccessTokenExchangeTestMixin):
def setUp(self): def setUp(self):
super(AccessTokenExchangeFormTest, self).setUp() super(AccessTokenExchangeFormTest, self).setUp()
self.request = RequestFactory().post("dummy_url") self.request = RequestFactory().post("dummy_url")
redirect_uri = 'dummy_redirect_url'
SessionMiddleware().process_request(self.request) SessionMiddleware().process_request(self.request)
self.request.social_strategy = social_utils.load_strategy(self.request, self.BACKEND) self.request.social_strategy = social_utils.load_strategy(self.request)
# pylint: disable=no-member
self.request.backend = social_utils.load_backend(self.request.social_strategy, self.BACKEND, redirect_uri)
def _assert_error(self, data, expected_error, expected_error_description): def _assert_error(self, data, expected_error, expected_error_description):
form = AccessTokenExchangeForm(request=self.request, data=data) form = AccessTokenExchangeForm(request=self.request, data=data)
......
...@@ -1129,7 +1129,7 @@ def login_oauth_token(request, backend): ...@@ -1129,7 +1129,7 @@ def login_oauth_token(request, backend):
""" """
warnings.warn("Please use AccessTokenExchangeView instead.", DeprecationWarning) warnings.warn("Please use AccessTokenExchangeView instead.", DeprecationWarning)
backend = request.social_strategy.backend backend = request.backend
if isinstance(backend, social_oauth.BaseOAuth1) or isinstance(backend, social_oauth.BaseOAuth2): if isinstance(backend, social_oauth.BaseOAuth1) or isinstance(backend, social_oauth.BaseOAuth2):
if "access_token" in request.POST: if "access_token" in request.POST:
# Tell third party auth pipeline that this is an API call # Tell third party auth pipeline that this is an API call
...@@ -1137,7 +1137,7 @@ def login_oauth_token(request, backend): ...@@ -1137,7 +1137,7 @@ def login_oauth_token(request, backend):
user = None user = None
try: try:
user = backend.do_auth(request.POST["access_token"]) user = backend.do_auth(request.POST["access_token"])
except HTTPError: except (HTTPError, AuthException):
pass pass
# do_auth can return a non-User object if it fails # do_auth can return a non-User object if it fails
if user and isinstance(user, User): if user and isinstance(user, User):
...@@ -1447,7 +1447,10 @@ def create_account_with_params(request, params): ...@@ -1447,7 +1447,10 @@ def create_account_with_params(request, params):
# next, link the account with social auth, if provided # next, link the account with social auth, if provided
if should_link_with_social_auth: if should_link_with_social_auth:
request.social_strategy = social_utils.load_strategy(backend=params['provider'], request=request) backend_name = params['provider']
request.social_strategy = social_utils.load_strategy(request)
redirect_uri = reverse('social:complete', args=(backend_name, ))
request.backend = social_utils.load_backend(request.social_strategy, backend_name, redirect_uri)
social_access_token = params.get('access_token') social_access_token = params.get('access_token')
if not social_access_token: if not social_access_token:
raise ValidationError({ raise ValidationError({
...@@ -1461,7 +1464,7 @@ def create_account_with_params(request, params): ...@@ -1461,7 +1464,7 @@ def create_account_with_params(request, params):
pipeline_user = None pipeline_user = None
error_message = "" error_message = ""
try: try:
pipeline_user = request.social_strategy.backend.do_auth(social_access_token, user=user) pipeline_user = request.backend.do_auth(social_access_token, user=user)
except AuthAlreadyAssociated: except AuthAlreadyAssociated:
error_message = _("The provided access_token is already associated with another user.") error_message = _("The provided access_token is already associated with another user.")
except (HTTPError, AuthException): except (HTTPError, AuthException):
......
...@@ -445,7 +445,7 @@ def parse_query_params(strategy, response, *args, **kwargs): ...@@ -445,7 +445,7 @@ def parse_query_params(strategy, response, *args, **kwargs):
"""Reads whitelisted query params, transforms them into pipeline args.""" """Reads whitelisted query params, transforms them into pipeline args."""
auth_entry = strategy.session.get(AUTH_ENTRY_KEY) auth_entry = strategy.session.get(AUTH_ENTRY_KEY)
if not (auth_entry and auth_entry in _AUTH_ENTRY_CHOICES): if not (auth_entry and auth_entry in _AUTH_ENTRY_CHOICES):
raise AuthEntryError(strategy.backend, 'auth_entry missing or invalid') raise AuthEntryError(strategy.request.backend, 'auth_entry missing or invalid')
return {'auth_entry': auth_entry} return {'auth_entry': auth_entry}
...@@ -526,7 +526,7 @@ def _create_redirect_url(url, strategy): ...@@ -526,7 +526,7 @@ def _create_redirect_url(url, strategy):
@partial.partial @partial.partial
def set_logged_in_cookie(backend=None, user=None, request=None, auth_entry=None, *args, **kwargs): def set_logged_in_cookie(backend=None, user=None, strategy=None, auth_entry=None, *args, **kwargs):
"""This pipeline step sets the "logged in" cookie for authenticated users. """This pipeline step sets the "logged in" cookie for authenticated users.
Some installations have a marketing site front-end separate from Some installations have a marketing site front-end separate from
...@@ -552,6 +552,7 @@ def set_logged_in_cookie(backend=None, user=None, request=None, auth_entry=None, ...@@ -552,6 +552,7 @@ def set_logged_in_cookie(backend=None, user=None, request=None, auth_entry=None,
""" """
if not is_api(auth_entry) and user is not None and user.is_authenticated(): if not is_api(auth_entry) and user is not None and user.is_authenticated():
request = strategy.request if strategy else None
if request is not None: if request is not None:
# Check that the cookie isn't already set. # Check that the cookie isn't already set.
# This ensures that we allow the user to continue to the next # This ensures that we allow the user to continue to the next
...@@ -692,7 +693,7 @@ def change_enrollment(strategy, auth_entry=None, user=None, *args, **kwargs): ...@@ -692,7 +693,7 @@ def change_enrollment(strategy, auth_entry=None, user=None, *args, **kwargs):
@partial.partial @partial.partial
def associate_by_email_if_login_api(auth_entry, strategy, details, user, *args, **kwargs): def associate_by_email_if_login_api(auth_entry, backend, details, user, *args, **kwargs):
""" """
This pipeline step associates the current social auth with the user with the This pipeline step associates the current social auth with the user with the
same email address in the database. It defers to the social library's associate_by_email same email address in the database. It defers to the social library's associate_by_email
...@@ -701,7 +702,7 @@ def associate_by_email_if_login_api(auth_entry, strategy, details, user, *args, ...@@ -701,7 +702,7 @@ def associate_by_email_if_login_api(auth_entry, strategy, details, user, *args,
This association is done ONLY if the user entered the pipeline through a LOGIN API. This association is done ONLY if the user entered the pipeline through a LOGIN API.
""" """
if auth_entry == AUTH_ENTRY_LOGIN_API: if auth_entry == AUTH_ENTRY_LOGIN_API:
association_response = associate_by_email(strategy, details, user, *args, **kwargs) association_response = associate_by_email(backend, details, user, *args, **kwargs)
if ( if (
association_response and association_response and
association_response.get('user') and association_response.get('user') and
......
...@@ -36,7 +36,7 @@ class BaseProvider(object): ...@@ -36,7 +36,7 @@ class BaseProvider(object):
return '%s.%s' % (cls.BACKEND_CLASS.__module__, cls.BACKEND_CLASS.__name__) return '%s.%s' % (cls.BACKEND_CLASS.__module__, cls.BACKEND_CLASS.__name__)
@classmethod @classmethod
def get_email(cls, unused_provider_details): def get_email(cls, provider_details):
"""Gets user's email address. """Gets user's email address.
Provider responses can contain arbitrary data. This method can be Provider responses can contain arbitrary data. This method can be
...@@ -44,16 +44,16 @@ class BaseProvider(object): ...@@ -44,16 +44,16 @@ class BaseProvider(object):
extracted by the social_details pipeline step. extracted by the social_details pipeline step.
Args: Args:
unused_provider_details: dict of string -> string. Data about the provider_details: dict of string -> string. Data about the
user passed back by the provider. user passed back by the provider.
Returns: Returns:
String or None. The user's email address, if any. String or None. The user's email address, if any.
""" """
return None return provider_details.get('email')
@classmethod @classmethod
def get_name(cls, unused_provider_details): def get_name(cls, provider_details):
"""Gets user's name. """Gets user's name.
Provider responses can contain arbitrary data. This method can be Provider responses can contain arbitrary data. This method can be
...@@ -61,13 +61,13 @@ class BaseProvider(object): ...@@ -61,13 +61,13 @@ class BaseProvider(object):
extracted by the social_details pipeline step. extracted by the social_details pipeline step.
Args: Args:
unused_provider_details: dict of string -> string. Data about the provider_details: dict of string -> string. Data about the
user passed back by the provider. user passed back by the provider.
Returns: Returns:
String or None. The user's full name, if any. String or None. The user's full name, if any.
""" """
return None return provider_details.get('fullname')
@classmethod @classmethod
def get_register_form_data(cls, pipeline_kwargs): def get_register_form_data(cls, pipeline_kwargs):
...@@ -121,14 +121,6 @@ class GoogleOauth2(BaseProvider): ...@@ -121,14 +121,6 @@ class GoogleOauth2(BaseProvider):
'SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET': None, 'SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET': None,
} }
@classmethod
def get_email(cls, provider_details):
return provider_details.get('email')
@classmethod
def get_name(cls, provider_details):
return provider_details.get('fullname')
class LinkedInOauth2(BaseProvider): class LinkedInOauth2(BaseProvider):
"""Provider for LinkedIn's Oauth2 auth system.""" """Provider for LinkedIn's Oauth2 auth system."""
...@@ -141,14 +133,6 @@ class LinkedInOauth2(BaseProvider): ...@@ -141,14 +133,6 @@ class LinkedInOauth2(BaseProvider):
'SOCIAL_AUTH_LINKEDIN_OAUTH2_SECRET': None, 'SOCIAL_AUTH_LINKEDIN_OAUTH2_SECRET': None,
} }
@classmethod
def get_email(cls, provider_details):
return provider_details.get('email')
@classmethod
def get_name(cls, provider_details):
return provider_details.get('fullname')
class FacebookOauth2(BaseProvider): class FacebookOauth2(BaseProvider):
"""Provider for LinkedIn's Oauth2 auth system.""" """Provider for LinkedIn's Oauth2 auth system."""
...@@ -161,14 +145,6 @@ class FacebookOauth2(BaseProvider): ...@@ -161,14 +145,6 @@ class FacebookOauth2(BaseProvider):
'SOCIAL_AUTH_FACEBOOK_SECRET': None, 'SOCIAL_AUTH_FACEBOOK_SECRET': None,
} }
@classmethod
def get_email(cls, provider_details):
return provider_details.get('email')
@classmethod
def get_name(cls, provider_details):
return provider_details.get('fullname')
class Registry(object): class Registry(object):
"""Singleton registry of third-party auth providers. """Singleton registry of third-party auth providers.
......
...@@ -182,6 +182,6 @@ class PipelineEnrollmentTest(UrlResetMixin, ModuleStoreTestCase): ...@@ -182,6 +182,6 @@ class PipelineEnrollmentTest(UrlResetMixin, ModuleStoreTestCase):
request.user = self.user request.user = self.user
request.session = cache.SessionStore() request.session = cache.SessionStore()
return social_utils.load_strategy( request.social_strategy = social_utils.load_strategy(request)
backend=self.BACKEND_NAME, request=request request.backend = social_utils.load_backend(request.social_strategy, self.BACKEND_NAME, redirect_uri='')
) return request.social_strategy
...@@ -66,7 +66,7 @@ class ThirdPartyOAuthTestMixin(object): ...@@ -66,7 +66,7 @@ class ThirdPartyOAuthTestMixin(object):
class ThirdPartyOAuthTestMixinFacebook(object): class ThirdPartyOAuthTestMixinFacebook(object):
"""Tests oauth with the Facebook backend""" """Tests oauth with the Facebook backend"""
BACKEND = "facebook" BACKEND = "facebook"
USER_URL = "https://graph.facebook.com/me" USER_URL = "https://graph.facebook.com/v2.3/me"
# In facebook responses, the "id" field is used as the user's identifier # In facebook responses, the "id" field is used as the user's identifier
UID_FIELD = "id" UID_FIELD = "id"
...@@ -74,6 +74,6 @@ class ThirdPartyOAuthTestMixinFacebook(object): ...@@ -74,6 +74,6 @@ class ThirdPartyOAuthTestMixinFacebook(object):
class ThirdPartyOAuthTestMixinGoogle(object): class ThirdPartyOAuthTestMixinGoogle(object):
"""Tests oauth with the Google backend""" """Tests oauth with the Google backend"""
BACKEND = "google-oauth2" BACKEND = "google-oauth2"
USER_URL = "https://www.googleapis.com/oauth2/v1/userinfo" USER_URL = "https://www.googleapis.com/plus/v1/people/me"
# In google-oauth2 responses, the "email" field is used as the user's identifier # In google-oauth2 responses, the "email" field is used as the user's identifier
UID_FIELD = "email" UID_FIELD = "email"
...@@ -2236,59 +2236,6 @@ CREATE TABLE `shoppingcart_registrationcoderedemption` ( ...@@ -2236,59 +2236,6 @@ CREATE TABLE `shoppingcart_registrationcoderedemption` (
CONSTRAINT `registration_code_id_refs_id_4d01e47b` FOREIGN KEY (`registration_code_id`) REFERENCES `shoppingcart_courseregistrationcode` (`id`) CONSTRAINT `registration_code_id_refs_id_4d01e47b` FOREIGN KEY (`registration_code_id`) REFERENCES `shoppingcart_courseregistrationcode` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `social_auth_association`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `social_auth_association` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`server_url` varchar(255) NOT NULL,
`handle` varchar(255) NOT NULL,
`secret` varchar(255) NOT NULL,
`issued` int(11) NOT NULL,
`lifetime` int(11) NOT NULL,
`assoc_type` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `social_auth_code`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `social_auth_code` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(75) NOT NULL,
`code` varchar(32) NOT NULL,
`verified` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`,`code`),
KEY `social_auth_code_65da3d2c` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `social_auth_nonce`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `social_auth_nonce` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`server_url` varchar(255) NOT NULL,
`timestamp` int(11) NOT NULL,
`salt` varchar(65) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `social_auth_usersocialauth`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `social_auth_usersocialauth` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`provider` varchar(32) NOT NULL,
`uid` varchar(255) NOT NULL,
`extra_data` longtext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `provider` (`provider`,`uid`),
KEY `social_auth_usersocialauth_fbfc09f1` (`user_id`),
CONSTRAINT `user_id_refs_id_60fa311b` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `south_migrationhistory`; DROP TABLE IF EXISTS `south_migrationhistory`;
/*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */; /*!40101 SET character_set_client = utf8 */;
......
...@@ -242,8 +242,8 @@ THIRD_PARTY_AUTH = { ...@@ -242,8 +242,8 @@ THIRD_PARTY_AUTH = {
"SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET": "test", "SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET": "test",
}, },
"Facebook": { "Facebook": {
"SOCIAL_AUTH_GOOGLE_OAUTH2_KEY": "test", "SOCIAL_AUTH_FACEBOOK_KEY": "test",
"SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET": "test", "SOCIAL_AUTH_FACEBOOK_SECRET": "test",
}, },
} }
......
...@@ -69,7 +69,7 @@ pyparsing==2.0.1 ...@@ -69,7 +69,7 @@ pyparsing==2.0.1
python-memcached==1.48 python-memcached==1.48
python-openid==2.2.5 python-openid==2.2.5
python-dateutil==2.1 python-dateutil==2.1
python-social-auth==0.1.23 python-social-auth==0.2.7
pytz==2015.2 pytz==2015.2
pysrt==0.4.7 pysrt==0.4.7
PyYAML==3.10 PyYAML==3.10
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment