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
Hide 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.
from
celery.task
import
task
import
datetime
import
dateutil.parser
import
pytz
import
logging
from
lxml
import
etree
import
requests
...
...
@@ -106,6 +107,7 @@ def _parse_metadata_xml(xml, entity_id):
expires_at
=
dateutil
.
parser
.
parse
(
xml
.
attrib
[
"validUntil"
])
if
"cacheDuration"
in
xml
.
attrib
:
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
:
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
TESTSHIB_ENTITY_ID
=
'https://idp.testshib.org/idp/shibboleth'
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'
...
...
@@ -47,7 +48,19 @@ class TestShibIntegrationTest(IntegrationTestMixin, testutil.SAMLTestCase):
def
metadata_callback
(
_request
,
_uri
,
headers
):
""" Return a cached copy of TestShib's metadata by reading it from disk """
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
)
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
.
reset
)
...
...
@@ -123,6 +136,24 @@ class TestShibIntegrationTest(IntegrationTestMixin, testutil.SAMLTestCase):
else
:
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
):
""" 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
)
...
...
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