Skip to content

Commit a108c98

Browse files
author
Rebecka Gulliksson
committed
Don't assume KeyDescriptor exists in metadata, since it is optional.
1 parent 122cb9c commit a108c98

File tree

2 files changed

+52
-13
lines changed

2 files changed

+52
-13
lines changed

src/saml2/mdstore.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -319,19 +319,20 @@ def certs(self, entity_id, descriptor, use="signing"):
319319
def extract_certs(srvs):
320320
res = []
321321
for srv in srvs:
322-
for key in srv["key_descriptor"]:
323-
if "use" in key and key["use"] == use:
324-
for dat in key["key_info"]["x509_data"]:
325-
cert = repack_cert(
326-
dat["x509_certificate"]["text"])
327-
if cert not in res:
328-
res.append(cert)
329-
elif not "use" in key:
330-
for dat in key["key_info"]["x509_data"]:
331-
cert = repack_cert(
332-
dat["x509_certificate"]["text"])
333-
if cert not in res:
334-
res.append(cert)
322+
if "key_descriptor" in srv:
323+
for key in srv["key_descriptor"]:
324+
if "use" in key and key["use"] == use:
325+
for dat in key["key_info"]["x509_data"]:
326+
cert = repack_cert(
327+
dat["x509_certificate"]["text"])
328+
if cert not in res:
329+
res.append(cert)
330+
elif not "use" in key:
331+
for dat in key["key_info"]["x509_data"]:
332+
cert = repack_cert(
333+
dat["x509_certificate"]["text"])
334+
if cert not in res:
335+
res.append(cert)
335336

336337
return res
337338

tests/test_30_mdstore.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,5 +392,43 @@ def test_get_certs_from_metadata():
392392
assert certs1[0] == certs2[0] == TEST_CERT
393393

394394

395+
def test_get_certs_from_metadata_without_keydescriptor():
396+
mds = MetadataStore(ONTS.values(), ATTRCONV, None)
397+
mds.imp([{
398+
"class": "saml2.mdstore.InMemoryMetaData",
399+
"metadata": [("""
400+
<EntitiesDescriptor
401+
xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
402+
xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
403+
xmlns:shibmeta="urn:mace:shibboleth:metadata:1.0"
404+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
405+
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
406+
Name="urn:mace:example.com:test-1.0">
407+
<EntityDescriptor
408+
entityID="http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php"
409+
xml:base="swamid-1.0/idp.umu.se-saml2.xml">
410+
<IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
411+
<NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
412+
<SingleSignOnService
413+
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
414+
Location="http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php"/>
415+
</IDPSSODescriptor>
416+
<Organization>
417+
<OrganizationName xml:lang="en">Catalogix</OrganizationName>
418+
<OrganizationDisplayName xml:lang="en">Catalogix</OrganizationDisplayName>
419+
<OrganizationURL xml:lang="en">http://www.catalogix.se</OrganizationURL>
420+
</Organization>
421+
<ContactPerson contactType="technical">
422+
<SurName>Hedberg</SurName>
423+
<EmailAddress>[email protected]</EmailAddress>
424+
</ContactPerson>
425+
</EntityDescriptor>
426+
</EntitiesDescriptor>""",)]
427+
}])
428+
certs = mds.certs("http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php", "idpsso")
429+
430+
assert len(certs) == 0
431+
432+
395433
if __name__ == "__main__":
396434
test_get_certs_from_metadata()

0 commit comments

Comments
 (0)