Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
350f98eb
Commit
350f98eb
authored
May 06, 2015
by
Braden MacDonald
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Changes for compatibility with latest python-social-auth (0.2.7)
parent
390e2c18
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
33 additions
and
102 deletions
+33
-102
common/djangoapps/auth_exchange/forms.py
+3
-2
common/djangoapps/auth_exchange/tests/test_forms.py
+4
-1
common/djangoapps/student/views.py
+7
-4
common/djangoapps/third_party_auth/pipeline.py
+5
-4
common/djangoapps/third_party_auth/provider.py
+6
-30
common/djangoapps/third_party_auth/tests/specs/base.py
+0
-0
common/djangoapps/third_party_auth/tests/test_change_enrollment.py
+3
-3
common/djangoapps/third_party_auth/tests/utils.py
+2
-2
common/test/db_cache/bok_choy_schema.sql
+0
-53
common/test/db_cache/lettuce.db
+0
-0
lms/envs/test.py
+2
-2
requirements/edx/base.txt
+1
-1
No files found.
common/djangoapps/auth_exchange/forms.py
View file @
350f98eb
...
...
@@ -10,6 +10,7 @@ from provider.oauth2.forms import ScopeChoiceField, ScopeMixin
from
provider.oauth2.models
import
Client
from
requests
import
HTTPError
from
social.backends
import
oauth
as
social_oauth
from
social.exceptions
import
AuthException
from
third_party_auth
import
pipeline
...
...
@@ -54,7 +55,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm):
if
self
.
_errors
:
return
{}
backend
=
self
.
request
.
social_strategy
.
backend
backend
=
self
.
request
.
backend
if
not
isinstance
(
backend
,
social_oauth
.
BaseOAuth2
):
raise
OAuthValidationError
(
{
...
...
@@ -89,7 +90,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm):
user
=
None
try
:
user
=
backend
.
do_auth
(
self
.
cleaned_data
.
get
(
"access_token"
))
except
HTTPError
:
except
(
HTTPError
,
AuthException
)
:
pass
if
user
and
isinstance
(
user
,
User
):
self
.
cleaned_data
[
"user"
]
=
user
...
...
common/djangoapps/auth_exchange/tests/test_forms.py
View file @
350f98eb
...
...
@@ -24,8 +24,11 @@ class AccessTokenExchangeFormTest(AccessTokenExchangeTestMixin):
def
setUp
(
self
):
super
(
AccessTokenExchangeFormTest
,
self
)
.
setUp
()
self
.
request
=
RequestFactory
()
.
post
(
"dummy_url"
)
redirect_uri
=
'dummy_redirect_url'
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
):
form
=
AccessTokenExchangeForm
(
request
=
self
.
request
,
data
=
data
)
...
...
common/djangoapps/student/views.py
View file @
350f98eb
...
...
@@ -1129,7 +1129,7 @@ def login_oauth_token(request, backend):
"""
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
"access_token"
in
request
.
POST
:
# Tell third party auth pipeline that this is an API call
...
...
@@ -1137,7 +1137,7 @@ def login_oauth_token(request, backend):
user
=
None
try
:
user
=
backend
.
do_auth
(
request
.
POST
[
"access_token"
])
except
HTTPError
:
except
(
HTTPError
,
AuthException
)
:
pass
# do_auth can return a non-User object if it fails
if
user
and
isinstance
(
user
,
User
):
...
...
@@ -1447,7 +1447,10 @@ def create_account_with_params(request, params):
# next, link the account with social auth, if provided
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'
)
if
not
social_access_token
:
raise
ValidationError
({
...
...
@@ -1461,7 +1464,7 @@ def create_account_with_params(request, params):
pipeline_user
=
None
error_message
=
""
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
:
error_message
=
_
(
"The provided access_token is already associated with another user."
)
except
(
HTTPError
,
AuthException
):
...
...
common/djangoapps/third_party_auth/pipeline.py
View file @
350f98eb
...
...
@@ -445,7 +445,7 @@ def parse_query_params(strategy, response, *args, **kwargs):
"""Reads whitelisted query params, transforms them into pipeline args."""
auth_entry
=
strategy
.
session
.
get
(
AUTH_ENTRY_KEY
)
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
}
...
...
@@ -526,7 +526,7 @@ def _create_redirect_url(url, strategy):
@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.
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,
"""
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
:
# Check that the cookie isn't already set.
# 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):
@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
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,
This association is done ONLY if the user entered the pipeline through a 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
(
association_response
and
association_response
.
get
(
'user'
)
and
...
...
common/djangoapps/third_party_auth/provider.py
View file @
350f98eb
...
...
@@ -36,7 +36,7 @@ class BaseProvider(object):
return
'
%
s.
%
s'
%
(
cls
.
BACKEND_CLASS
.
__module__
,
cls
.
BACKEND_CLASS
.
__name__
)
@classmethod
def
get_email
(
cls
,
unused_
provider_details
):
def
get_email
(
cls
,
provider_details
):
"""Gets user's email address.
Provider responses can contain arbitrary data. This method can be
...
...
@@ -44,16 +44,16 @@ class BaseProvider(object):
extracted by the social_details pipeline step.
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.
Returns:
String or None. The user's email address, if any.
"""
return
None
return
provider_details
.
get
(
'email'
)
@classmethod
def
get_name
(
cls
,
unused_
provider_details
):
def
get_name
(
cls
,
provider_details
):
"""Gets user's name.
Provider responses can contain arbitrary data. This method can be
...
...
@@ -61,13 +61,13 @@ class BaseProvider(object):
extracted by the social_details pipeline step.
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.
Returns:
String or None. The user's full name, if any.
"""
return
None
return
provider_details
.
get
(
'fullname'
)
@classmethod
def
get_register_form_data
(
cls
,
pipeline_kwargs
):
...
...
@@ -121,14 +121,6 @@ class GoogleOauth2(BaseProvider):
'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
):
"""Provider for LinkedIn's Oauth2 auth system."""
...
...
@@ -141,14 +133,6 @@ class LinkedInOauth2(BaseProvider):
'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
):
"""Provider for LinkedIn's Oauth2 auth system."""
...
...
@@ -161,14 +145,6 @@ class FacebookOauth2(BaseProvider):
'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
):
"""Singleton registry of third-party auth providers.
...
...
common/djangoapps/third_party_auth/tests/specs/base.py
View file @
350f98eb
This diff is collapsed.
Click to expand it.
common/djangoapps/third_party_auth/tests/test_change_enrollment.py
View file @
350f98eb
...
...
@@ -182,6 +182,6 @@ class PipelineEnrollmentTest(UrlResetMixin, ModuleStoreTestCase):
request
.
user
=
self
.
user
request
.
session
=
cache
.
SessionStore
()
re
turn
social_utils
.
load_strategy
(
backend
=
self
.
BACKEND_NAME
,
request
=
request
)
re
quest
.
social_strategy
=
social_utils
.
load_strategy
(
request
)
request
.
backend
=
social_utils
.
load_backend
(
request
.
social_strategy
,
self
.
BACKEND_NAME
,
redirect_uri
=
''
)
return
request
.
social_strategy
common/djangoapps/third_party_auth/tests/utils.py
View file @
350f98eb
...
...
@@ -66,7 +66,7 @@ class ThirdPartyOAuthTestMixin(object):
class
ThirdPartyOAuthTestMixinFacebook
(
object
):
"""Tests oauth with the Facebook backend"""
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
UID_FIELD
=
"id"
...
...
@@ -74,6 +74,6 @@ class ThirdPartyOAuthTestMixinFacebook(object):
class
ThirdPartyOAuthTestMixinGoogle
(
object
):
"""Tests oauth with the Google backend"""
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
UID_FIELD
=
"email"
common/test/db_cache/bok_choy_schema.sql
View file @
350f98eb
...
...
@@ -2236,59 +2236,6 @@ CREATE TABLE `shoppingcart_registrationcoderedemption` (
CONSTRAINT
`registration_code_id_refs_id_4d01e47b`
FOREIGN
KEY
(
`registration_code_id`
)
REFERENCES
`shoppingcart_courseregistrationcode`
(
`id`
)
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8
;
/*!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`
;
/*!40101 SET @saved_cs_client = @@character_set_client */
;
/*!40101 SET character_set_client = utf8 */
;
...
...
common/test/db_cache/lettuce.db
View file @
350f98eb
No preview for this file type
lms/envs/test.py
View file @
350f98eb
...
...
@@ -242,8 +242,8 @@ THIRD_PARTY_AUTH = {
"SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET"
:
"test"
,
},
"Facebook"
:
{
"SOCIAL_AUTH_
GOOGLE_OAUTH2
_KEY"
:
"test"
,
"SOCIAL_AUTH_
GOOGLE_OAUTH2
_SECRET"
:
"test"
,
"SOCIAL_AUTH_
FACEBOOK
_KEY"
:
"test"
,
"SOCIAL_AUTH_
FACEBOOK
_SECRET"
:
"test"
,
},
}
...
...
requirements/edx/base.txt
View file @
350f98eb
...
...
@@ -69,7 +69,7 @@ pyparsing==2.0.1
python-memcached==1.48
python-openid==2.2.5
python-dateutil==2.1
python-social-auth==0.
1.23
python-social-auth==0.
2.7
pytz==2015.2
pysrt==0.4.7
PyYAML==3.10
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment