Skip to content

Commit 3d9245a

Browse files
committed
#194 Publish KeyDescriptor[use=encryption] only when required
1 parent a2fb87e commit 3d9245a

File tree

3 files changed

+41
-14
lines changed

3 files changed

+41
-14
lines changed

src/onelogin/saml2/metadata.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def sign_metadata(metadata, key, cert, sign_algorithm=OneLogin_Saml2_Constants.R
227227
return OneLogin_Saml2_Utils.add_sign(metadata, key, cert, False, sign_algorithm, digest_algorithm)
228228

229229
@staticmethod
230-
def add_x509_key_descriptors(metadata, cert=None):
230+
def add_x509_key_descriptors(metadata, cert=None, add_encryption=True):
231231
"""
232232
Adds the x509 descriptors (sign/encryption) to the metadata
233233
The same cert will be used for sign/encrypt
@@ -238,6 +238,9 @@ def add_x509_key_descriptors(metadata, cert=None):
238238
:param cert: x509 cert
239239
:type cert: string
240240
241+
:param add_encryption: Determines if the KeyDescriptor[use="encryption"] should be added.
242+
:type add_encryption: boolean
243+
241244
:returns: Metadata with KeyDescriptors
242245
:rtype: string
243246
"""
@@ -265,18 +268,18 @@ def add_x509_key_descriptors(metadata, cert=None):
265268

266269
sp_sso_descriptor = entity_descriptor.getElementsByTagName('md:SPSSODescriptor')[0]
267270
sp_sso_descriptor.insertBefore(key_descriptor.cloneNode(True), sp_sso_descriptor.firstChild)
268-
sp_sso_descriptor.insertBefore(key_descriptor.cloneNode(True), sp_sso_descriptor.firstChild)
271+
if add_encryption:
272+
sp_sso_descriptor.insertBefore(key_descriptor.cloneNode(True), sp_sso_descriptor.firstChild)
269273

270274
signing = xml.getElementsByTagName('md:KeyDescriptor')[0]
271275
signing.setAttribute('use', 'signing')
272-
273-
encryption = xml.getElementsByTagName('md:KeyDescriptor')[1]
274-
encryption.setAttribute('use', 'encryption')
275-
276276
signing.appendChild(key_info)
277-
encryption.appendChild(key_info.cloneNode(True))
278-
279277
signing.setAttribute('xmlns:ds', OneLogin_Saml2_Constants.NS_DS)
280-
encryption.setAttribute('xmlns:ds', OneLogin_Saml2_Constants.NS_DS)
278+
279+
if add_encryption:
280+
encryption = xml.getElementsByTagName('md:KeyDescriptor')[1]
281+
encryption.setAttribute('use', 'encryption')
282+
encryption.appendChild(key_info.cloneNode(True))
283+
encryption.setAttribute('xmlns:ds', OneLogin_Saml2_Constants.NS_DS)
281284

282285
return xml.toxml()

src/onelogin/saml2/settings.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -619,11 +619,13 @@ def get_sp_metadata(self):
619619
self.get_contacts(), self.get_organization()
620620
)
621621

622+
add_encryption = self.__security['wantNameIdEncrypted'] or self.__security['wantAssertionsEncrypted']
623+
622624
cert_new = self.get_sp_cert_new()
623-
metadata = OneLogin_Saml2_Metadata.add_x509_key_descriptors(metadata, cert_new)
625+
metadata = OneLogin_Saml2_Metadata.add_x509_key_descriptors(metadata, cert_new, add_encryption)
624626

625627
cert = self.get_sp_cert()
626-
metadata = OneLogin_Saml2_Metadata.add_x509_key_descriptors(metadata, cert)
628+
metadata = OneLogin_Saml2_Metadata.add_x509_key_descriptors(metadata, cert, add_encryption)
627629

628630
# Sign metadata
629631
if 'signMetadata' in self.__security and self.__security['signMetadata'] is not False:

tests/src/OneLogin/saml2_tests/settings_test.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,10 @@ def testGetSPMetadata(self):
341341
Tests the getSPMetadata method of the OneLogin_Saml2_Settings
342342
Case unsigned metadata
343343
"""
344-
settings = OneLogin_Saml2_Settings(self.loadSettingsJSON())
344+
settings_info = self.loadSettingsJSON()
345+
settings_info['security']['wantNameIdEncrypted'] = False
346+
settings_info['security']['wantAssertionsEncrypted'] = False
347+
settings = OneLogin_Saml2_Settings(settings_info)
345348
metadata = settings.get_sp_metadata()
346349

347350
self.assertNotEqual(len(metadata), 0)
@@ -352,20 +355,39 @@ def testGetSPMetadata(self):
352355
self.assertIn('<md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://stuff.com/endpoints/endpoints/acs.php" index="1"/>', metadata)
353356
self.assertIn('<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="http://stuff.com/endpoints/endpoints/sls.php"/>', metadata)
354357
self.assertIn('<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>', metadata)
358+
self.assertEquals(1, metadata.count('<md:KeyDescriptor'))
359+
self.assertEquals(1, metadata.count('<md:KeyDescriptor use="signing"'))
360+
self.assertEquals(0, metadata.count('<md:KeyDescriptor use="encryption"'))
361+
362+
settings_info['security']['wantNameIdEncrypted'] = False
363+
settings_info['security']['wantAssertionsEncrypted'] = True
364+
settings = OneLogin_Saml2_Settings(settings_info)
365+
metadata = settings.get_sp_metadata()
355366
self.assertEquals(2, metadata.count('<md:KeyDescriptor'))
356367
self.assertEquals(1, metadata.count('<md:KeyDescriptor use="signing"'))
357-
self.assertEquals(1, metadata.count('<md:KeyDescriptor use="encryption"'))
368+
self.assertEquals(1, metadata.count('<md:KeyDescriptor use="encryption"'))
358369

359370
def testGetSPMetadataWithx509certNew(self):
360371
"""
361372
Tests the getSPMetadata method of the OneLogin_Saml2_Settings
362373
Case with x509certNew
363374
"""
364-
settings = OneLogin_Saml2_Settings(self.loadSettingsJSON('settings7.json'))
375+
settings_info = self.loadSettingsJSON('settings7.json')
376+
settings_info['security']['wantNameIdEncrypted'] = False
377+
settings_info['security']['wantAssertionsEncrypted'] = False
378+
settings = OneLogin_Saml2_Settings(settings_info)
365379
metadata = settings.get_sp_metadata()
366380

367381
self.assertNotEqual(len(metadata), 0)
368382
self.assertIn('<md:SPSSODescriptor', metadata)
383+
self.assertEquals(2, metadata.count('<md:KeyDescriptor'))
384+
self.assertEquals(2, metadata.count('<md:KeyDescriptor use="signing"'))
385+
self.assertEquals(0, metadata.count('<md:KeyDescriptor use="encryption"'))
386+
387+
settings_info['security']['wantNameIdEncrypted'] = True
388+
settings_info['security']['wantAssertionsEncrypted'] = False
389+
settings = OneLogin_Saml2_Settings(settings_info)
390+
metadata = settings.get_sp_metadata()
369391
self.assertEquals(4, metadata.count('<md:KeyDescriptor'))
370392
self.assertEquals(2, metadata.count('<md:KeyDescriptor use="signing"'))
371393
self.assertEquals(2, metadata.count('<md:KeyDescriptor use="encryption"'))

0 commit comments

Comments
 (0)