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
45bca67f
Commit
45bca67f
authored
Sep 22, 2016
by
Jesse Shapiro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Set up type conversion in third_party_auth to allow cacheDuration attribute to work
parent
5b7f48c5
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
189 additions
and
0 deletions
+189
-0
common/djangoapps/third_party_auth/tasks.py
+2
-0
common/djangoapps/third_party_auth/tests/data/testshib_metadata_with_cache_duration.xml
+156
-0
common/djangoapps/third_party_auth/tests/specs/test_testshib.py
+31
-0
No files found.
common/djangoapps/third_party_auth/tasks.py
View file @
45bca67f
...
@@ -6,6 +6,7 @@ Code to manage fetching and storing the metadata of IdPs.
...
@@ -6,6 +6,7 @@ Code to manage fetching and storing the metadata of IdPs.
from
celery.task
import
task
from
celery.task
import
task
import
datetime
import
datetime
import
dateutil.parser
import
dateutil.parser
import
pytz
import
logging
import
logging
from
lxml
import
etree
from
lxml
import
etree
import
requests
import
requests
...
@@ -106,6 +107,7 @@ def _parse_metadata_xml(xml, entity_id):
...
@@ -106,6 +107,7 @@ def _parse_metadata_xml(xml, entity_id):
expires_at
=
dateutil
.
parser
.
parse
(
xml
.
attrib
[
"validUntil"
])
expires_at
=
dateutil
.
parser
.
parse
(
xml
.
attrib
[
"validUntil"
])
if
"cacheDuration"
in
xml
.
attrib
:
if
"cacheDuration"
in
xml
.
attrib
:
cache_expires
=
OneLogin_Saml2_Utils
.
parse_duration
(
xml
.
attrib
[
"cacheDuration"
])
cache_expires
=
OneLogin_Saml2_Utils
.
parse_duration
(
xml
.
attrib
[
"cacheDuration"
])
cache_expires
=
datetime
.
datetime
.
fromtimestamp
(
cache_expires
,
tz
=
pytz
.
utc
)
if
expires_at
is
None
or
cache_expires
<
expires_at
:
if
expires_at
is
None
or
cache_expires
<
expires_at
:
expires_at
=
cache_expires
expires_at
=
cache_expires
...
...
common/djangoapps/third_party_auth/tests/data/testshib_metadata_with_cache_duration.xml
0 → 100644
View file @
45bca67f
<?xml version="1.0" encoding="UTF-8"?>
<!-- Cached and simplified copy of https://www.testshib.org/metadata/testshib-providers.xml -->
<EntitiesDescriptor
Name=
"urn:mace:shibboleth:testshib:two"
xmlns=
"urn:oasis:names:tc:SAML:2.0:metadata"
xmlns:ds=
"http://www.w3.org/2000/09/xmldsig#"
xmlns:mdalg=
"urn:oasis:names:tc:SAML:metadata:algsupport"
xmlns:mdui=
"urn:oasis:names:tc:SAML:metadata:ui"
xmlns:shibmd=
"urn:mace:shibboleth:metadata:1.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
>
<EntityDescriptor
entityID=
"https://idp.testshib.org/idp/shibboleth"
cacheDuration=
"PT1468324860S"
>
<Extensions>
<mdalg:DigestMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#sha512"
/>
<mdalg:DigestMethod
Algorithm=
"http://www.w3.org/2001/04/xmldsig-more#sha384"
/>
<mdalg:DigestMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#sha256"
/>
<mdalg:DigestMethod
Algorithm=
"http://www.w3.org/2000/09/xmldsig#sha1"
/>
<mdalg:SigningMethod
Algorithm=
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"
/>
<mdalg:SigningMethod
Algorithm=
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"
/>
<mdalg:SigningMethod
Algorithm=
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
/>
<mdalg:SigningMethod
Algorithm=
"http://www.w3.org/2000/09/xmldsig#rsa-sha1"
/>
</Extensions>
<IDPSSODescriptor
protocolSupportEnumeration=
"urn:oasis:names:tc:SAML:1.1:protocol urn:mace:shibboleth:1.0 urn:oasis:names:tc:SAML:2.0:protocol"
>
<Extensions>
<shibmd:Scope
regexp=
"false"
>
testshib.org
</shibmd:Scope>
<mdui:UIInfo>
<mdui:DisplayName
xml:lang=
"en"
>
TestShib Test IdP
</mdui:DisplayName>
<mdui:Description
xml:lang=
"en"
>
TestShib IdP. Use this as a source of attributes
for your test SP.
</mdui:Description>
<mdui:Logo
height=
"88"
width=
"253"
>
https://www.testshib.org/testshibtwo.jpg
</mdui:Logo>
</mdui:UIInfo>
</Extensions>
<KeyDescriptor>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIIEDjCCAvagAwIBAgIBADANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzEV
MBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMREwDwYD
VQQKEwhUZXN0U2hpYjEZMBcGA1UEAxMQaWRwLnRlc3RzaGliLm9yZzAeFw0wNjA4
MzAyMTEyMjVaFw0xNjA4MjcyMTEyMjVaMGcxCzAJBgNVBAYTAlVTMRUwEwYDVQQI
EwxQZW5uc3lsdmFuaWExEzARBgNVBAcTClBpdHRzYnVyZ2gxETAPBgNVBAoTCFRl
c3RTaGliMRkwFwYDVQQDExBpZHAudGVzdHNoaWIub3JnMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEArYkCGuTmJp9eAOSGHwRJo1SNatB5ZOKqDM9ysg7C
yVTDClcpu93gSP10nH4gkCZOlnESNgttg0r+MqL8tfJC6ybddEFB3YBo8PZajKSe
3OQ01Ow3yT4I+Wdg1tsTpSge9gEz7SrC07EkYmHuPtd71CHiUaCWDv+xVfUQX0aT
NPFmDixzUjoYzbGDrtAyCqA8f9CN2txIfJnpHE6q6CmKcoLADS4UrNPlhHSzd614
kR/JYiks0K4kbRqCQF0Dv0P5Di+rEfefC6glV8ysC8dB5/9nb0yh/ojRuJGmgMWH
gWk6h0ihjihqiu4jACovUZ7vVOCgSE5Ipn7OIwqd93zp2wIDAQABo4HEMIHBMB0G
A1UdDgQWBBSsBQ869nh83KqZr5jArr4/7b+QazCBkQYDVR0jBIGJMIGGgBSsBQ86
9nh83KqZr5jArr4/7b+Qa6FrpGkwZzELMAkGA1UEBhMCVVMxFTATBgNVBAgTDFBl
bm5zeWx2YW5pYTETMBEGA1UEBxMKUGl0dHNidXJnaDERMA8GA1UEChMIVGVzdFNo
aWIxGTAXBgNVBAMTEGlkcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zAN
BgkqhkiG9w0BAQUFAAOCAQEAjR29PhrCbk8qLN5MFfSVk98t3CT9jHZoYxd8QMRL
I4j7iYQxXiGJTT1FXs1nd4Rha9un+LqTfeMMYqISdDDI6tv8iNpkOAvZZUosVkUo
93pv1T0RPz35hcHHYq2yee59HJOco2bFlcsH8JBXRSRrJ3Q7Eut+z9uo80JdGNJ4
/SJy5UorZ8KazGj16lfJhOBXldgrhppQBb0Nq6HKHguqmwRfJ+WkxemZXzhediAj
Geka8nz8JjwxpUjAiSWYKLtJhGEaTqCYxCCX2Dw+dOTqUzHOZ7WKv4JXPK5G/Uhr
8K/qhmFT2nIQi538n6rVYLeWj8Bbnl+ev0peYzxFyF5sQA==
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#aes256-cbc"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#aes192-cbc"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#aes128-cbc"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#rsa-1_5"
/>
</KeyDescriptor>
<ArtifactResolutionService
Binding=
"urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding"
Location=
"https://idp.testshib.org:8443/idp/profile/SAML1/SOAP/ArtifactResolution"
index=
"1"
/>
<ArtifactResolutionService
Binding=
"urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
Location=
"https://idp.testshib.org:8443/idp/profile/SAML2/SOAP/ArtifactResolution"
index=
"2"
/>
<NameIDFormat>
urn:mace:shibboleth:1.0:nameIdentifier
</NameIDFormat>
<NameIDFormat>
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
</NameIDFormat>
<SingleSignOnService
Binding=
"urn:mace:shibboleth:1.0:profiles:AuthnRequest"
Location=
"https://idp.testshib.org/idp/profile/Shibboleth/SSO"
/>
<SingleSignOnService
Binding=
"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location=
"https://idp.testshib.org/idp/profile/SAML2/POST/SSO"
/>
<SingleSignOnService
Binding=
"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
Location=
"https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO"
/>
<SingleSignOnService
Binding=
"urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
Location=
"https://idp.testshib.org/idp/profile/SAML2/SOAP/ECP"
/>
</IDPSSODescriptor>
<AttributeAuthorityDescriptor
protocolSupportEnumeration=
"urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol"
>
<KeyDescriptor>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIIEDjCCAvagAwIBAgIBADANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzEV
MBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMREwDwYD
VQQKEwhUZXN0U2hpYjEZMBcGA1UEAxMQaWRwLnRlc3RzaGliLm9yZzAeFw0wNjA4
MzAyMTEyMjVaFw0xNjA4MjcyMTEyMjVaMGcxCzAJBgNVBAYTAlVTMRUwEwYDVQQI
EwxQZW5uc3lsdmFuaWExEzARBgNVBAcTClBpdHRzYnVyZ2gxETAPBgNVBAoTCFRl
c3RTaGliMRkwFwYDVQQDExBpZHAudGVzdHNoaWIub3JnMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEArYkCGuTmJp9eAOSGHwRJo1SNatB5ZOKqDM9ysg7C
yVTDClcpu93gSP10nH4gkCZOlnESNgttg0r+MqL8tfJC6ybddEFB3YBo8PZajKSe
3OQ01Ow3yT4I+Wdg1tsTpSge9gEz7SrC07EkYmHuPtd71CHiUaCWDv+xVfUQX0aT
NPFmDixzUjoYzbGDrtAyCqA8f9CN2txIfJnpHE6q6CmKcoLADS4UrNPlhHSzd614
kR/JYiks0K4kbRqCQF0Dv0P5Di+rEfefC6glV8ysC8dB5/9nb0yh/ojRuJGmgMWH
gWk6h0ihjihqiu4jACovUZ7vVOCgSE5Ipn7OIwqd93zp2wIDAQABo4HEMIHBMB0G
A1UdDgQWBBSsBQ869nh83KqZr5jArr4/7b+QazCBkQYDVR0jBIGJMIGGgBSsBQ86
9nh83KqZr5jArr4/7b+Qa6FrpGkwZzELMAkGA1UEBhMCVVMxFTATBgNVBAgTDFBl
bm5zeWx2YW5pYTETMBEGA1UEBxMKUGl0dHNidXJnaDERMA8GA1UEChMIVGVzdFNo
aWIxGTAXBgNVBAMTEGlkcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zAN
BgkqhkiG9w0BAQUFAAOCAQEAjR29PhrCbk8qLN5MFfSVk98t3CT9jHZoYxd8QMRL
I4j7iYQxXiGJTT1FXs1nd4Rha9un+LqTfeMMYqISdDDI6tv8iNpkOAvZZUosVkUo
93pv1T0RPz35hcHHYq2yee59HJOco2bFlcsH8JBXRSRrJ3Q7Eut+z9uo80JdGNJ4
/SJy5UorZ8KazGj16lfJhOBXldgrhppQBb0Nq6HKHguqmwRfJ+WkxemZXzhediAj
Geka8nz8JjwxpUjAiSWYKLtJhGEaTqCYxCCX2Dw+dOTqUzHOZ7WKv4JXPK5G/Uhr
8K/qhmFT2nIQi538n6rVYLeWj8Bbnl+ev0peYzxFyF5sQA==
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#aes256-cbc"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#aes192-cbc"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#aes128-cbc"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"
/>
<EncryptionMethod
Algorithm=
"http://www.w3.org/2001/04/xmlenc#rsa-1_5"
/>
</KeyDescriptor>
<AttributeService
Binding=
"urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding"
Location=
"https://idp.testshib.org:8443/idp/profile/SAML1/SOAP/AttributeQuery"
/>
<AttributeService
Binding=
"urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
Location=
"https://idp.testshib.org:8443/idp/profile/SAML2/SOAP/AttributeQuery"
/>
<NameIDFormat>
urn:mace:shibboleth:1.0:nameIdentifier
</NameIDFormat>
<NameIDFormat>
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
</NameIDFormat>
</AttributeAuthorityDescriptor>
<Organization>
<OrganizationName
xml:lang=
"en"
>
TestShib Two Identity Provider
</OrganizationName>
<OrganizationDisplayName
xml:lang=
"en"
>
TestShib Two
</OrganizationDisplayName>
<OrganizationURL
xml:lang=
"en"
>
http://www.testshib.org/testshib-two/
</OrganizationURL>
</Organization>
<ContactPerson
contactType=
"technical"
>
<GivenName>
Nate
</GivenName>
<SurName>
Klingenstein
</SurName>
<EmailAddress>
ndk@internet2.edu
</EmailAddress>
</ContactPerson>
</EntityDescriptor>
</EntitiesDescriptor>
common/djangoapps/third_party_auth/tests/specs/test_testshib.py
View file @
45bca67f
...
@@ -16,6 +16,7 @@ from .base import IntegrationTestMixin
...
@@ -16,6 +16,7 @@ from .base import IntegrationTestMixin
TESTSHIB_ENTITY_ID
=
'https://idp.testshib.org/idp/shibboleth'
TESTSHIB_ENTITY_ID
=
'https://idp.testshib.org/idp/shibboleth'
TESTSHIB_METADATA_URL
=
'https://mock.testshib.org/metadata/testshib-providers.xml'
TESTSHIB_METADATA_URL
=
'https://mock.testshib.org/metadata/testshib-providers.xml'
TESTSHIB_METADATA_URL_WITH_CACHE_DURATION
=
'https://mock.testshib.org/metadata/testshib-providers-cache.xml'
TESTSHIB_SSO_URL
=
'https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO'
TESTSHIB_SSO_URL
=
'https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO'
...
@@ -47,7 +48,19 @@ class TestShibIntegrationTest(IntegrationTestMixin, testutil.SAMLTestCase):
...
@@ -47,7 +48,19 @@ class TestShibIntegrationTest(IntegrationTestMixin, testutil.SAMLTestCase):
def
metadata_callback
(
_request
,
_uri
,
headers
):
def
metadata_callback
(
_request
,
_uri
,
headers
):
""" Return a cached copy of TestShib's metadata by reading it from disk """
""" Return a cached copy of TestShib's metadata by reading it from disk """
return
(
200
,
headers
,
self
.
read_data_file
(
'testshib_metadata.xml'
))
return
(
200
,
headers
,
self
.
read_data_file
(
'testshib_metadata.xml'
))
httpretty
.
register_uri
(
httpretty
.
GET
,
TESTSHIB_METADATA_URL
,
content_type
=
'text/xml'
,
body
=
metadata_callback
)
httpretty
.
register_uri
(
httpretty
.
GET
,
TESTSHIB_METADATA_URL
,
content_type
=
'text/xml'
,
body
=
metadata_callback
)
def
cache_duration_metadata_callback
(
_request
,
_uri
,
headers
):
"""Return a cached copy of TestShib's metadata with a cacheDuration attribute"""
return
(
200
,
headers
,
self
.
read_data_file
(
'testshib_metadata_with_cache_duration.xml'
))
httpretty
.
register_uri
(
httpretty
.
GET
,
TESTSHIB_METADATA_URL_WITH_CACHE_DURATION
,
content_type
=
'text/xml'
,
body
=
cache_duration_metadata_callback
)
self
.
addCleanup
(
httpretty
.
disable
)
self
.
addCleanup
(
httpretty
.
disable
)
self
.
addCleanup
(
httpretty
.
reset
)
self
.
addCleanup
(
httpretty
.
reset
)
...
@@ -123,6 +136,24 @@ class TestShibIntegrationTest(IntegrationTestMixin, testutil.SAMLTestCase):
...
@@ -123,6 +136,24 @@ class TestShibIntegrationTest(IntegrationTestMixin, testutil.SAMLTestCase):
else
:
else
:
self
.
assertFalse
(
mock_log
.
called
)
self
.
assertFalse
(
mock_log
.
called
)
def
test_configure_testshib_provider_with_cache_duration
(
self
):
""" Enable and configure the TestShib SAML IdP as a third_party_auth provider """
kwargs
=
{}
kwargs
.
setdefault
(
'name'
,
self
.
PROVIDER_NAME
)
kwargs
.
setdefault
(
'enabled'
,
True
)
kwargs
.
setdefault
(
'visible'
,
True
)
kwargs
.
setdefault
(
'idp_slug'
,
self
.
PROVIDER_IDP_SLUG
)
kwargs
.
setdefault
(
'entity_id'
,
TESTSHIB_ENTITY_ID
)
kwargs
.
setdefault
(
'metadata_source'
,
TESTSHIB_METADATA_URL_WITH_CACHE_DURATION
)
kwargs
.
setdefault
(
'icon_class'
,
'fa-university'
)
kwargs
.
setdefault
(
'attr_email'
,
'urn:oid:1.3.6.1.4.1.5923.1.1.1.6'
)
# eduPersonPrincipalName
self
.
configure_saml_provider
(
**
kwargs
)
self
.
assertTrue
(
httpretty
.
is_enabled
())
num_changed
,
num_failed
,
num_total
=
fetch_saml_metadata
()
self
.
assertEqual
(
num_failed
,
0
)
self
.
assertEqual
(
num_changed
,
1
)
self
.
assertEqual
(
num_total
,
1
)
def
_freeze_time
(
self
,
timestamp
):
def
_freeze_time
(
self
,
timestamp
):
""" Mock the current time for SAML, so we can replay canned requests/responses """
""" Mock the current time for SAML, so we can replay canned requests/responses """
now_patch
=
patch
(
'onelogin.saml2.utils.OneLogin_Saml2_Utils.now'
,
return_value
=
timestamp
)
now_patch
=
patch
(
'onelogin.saml2.utils.OneLogin_Saml2_Utils.now'
,
return_value
=
timestamp
)
...
...
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