Skip to content

Commit db25532

Browse files
committed
Handle valid but uncommon dsig block with no URI in the reference
1 parent 47278a5 commit db25532

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

src/onelogin/saml2/utils.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ def add_sign(xml, key, cert, debug=False):
806806
if debug:
807807
xmlsec.set_error_callback(print_xmlsec_errors)
808808

809-
# Sign the metadacta with our private key.
809+
# Sign the metadata with our private key.
810810
signature = Signature(xmlsec.TransformExclC14N, xmlsec.TransformRsaSha1)
811811

812812
issuer = OneLogin_Saml2_Utils.query(elem, '//saml:Issuer')
@@ -922,6 +922,12 @@ def validate_sign(xml, cert=None, fingerprint=None, fingerprintalg='sha1', valid
922922
if cert is None or cert == '':
923923
return False
924924

925+
# Check if Reference URI is empty
926+
reference_elem = OneLogin_Saml2_Utils.query(signature_node, '//ds:Reference')
927+
if len(reference_elem) > 0:
928+
if reference_elem[0].get('URI') == '':
929+
reference_elem[0].set('URI', '#%s' % signature_node.getparent().get('ID'))
930+
925931
dsig_ctx = xmlsec.DSigCtx()
926932

927933
file_cert = OneLogin_Saml2_Utils.write_temp_file(cert)

tests/src/OneLogin/saml2_tests/response_test.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,3 +1097,12 @@ def testIsValidSign(self):
10971097
response_9 = OneLogin_Saml2_Response(settings, xml_9)
10981098
# Modified message
10991099
self.assertFalse(response_9.is_valid(self.get_request_data()))
1100+
1101+
def testIsValidSignWithEmptyReferenceURI(self):
1102+
settings_info = self.loadSettingsJSON()
1103+
del settings_info['idp']['x509cert']
1104+
settings_info['idp']['certFingerprint'] = "194d97e4d8c9c8cfa4b721e5ee497fd9660e5213"
1105+
settings = OneLogin_Saml2_Settings(settings_info)
1106+
xml = self.file_contents(join(self.data_path, 'responses', 'response_without_reference_uri.xml.base64'))
1107+
response = OneLogin_Saml2_Response(settings, xml)
1108+
self.assertTrue(response.is_valid(self.get_request_data()))

0 commit comments

Comments
 (0)