@@ -67,7 +67,13 @@ def __init__(self, settings, request=None, name_id=None, session_index=None, nq=
6767
6868 cert = None
6969 if 'nameIdEncrypted' in security and security ['nameIdEncrypted' ]:
70- cert = idp_data ['x509cert' ]
70+ exists_multix509enc = 'x509certMulti' in idp_data and \
71+ 'encryption' in idp_data ['x509certMulti' ] and \
72+ idp_data ['x509certMulti' ]['encryption' ]
73+ if exists_multix509enc :
74+ cert = idp_data ['x509certMulti' ]['encryption' ][0 ]
75+ else :
76+ cert = idp_data ['x509cert' ]
7177
7278 if name_id is not None :
7379 if name_id_format is not None :
@@ -380,19 +386,32 @@ def is_valid(self, request_data, raise_exceptions=False):
380386 signed_query = '%s&RelayState=%s' % (signed_query , OneLogin_Saml2_Utils .get_encoded_parameter (get_data , 'RelayState' , lowercase_urlencoding = lowercase_urlencoding ))
381387 signed_query = '%s&SigAlg=%s' % (signed_query , OneLogin_Saml2_Utils .get_encoded_parameter (get_data , 'SigAlg' , OneLogin_Saml2_Constants .RSA_SHA1 , lowercase_urlencoding = lowercase_urlencoding ))
382388
383- if 'x509cert' not in idp_data or not idp_data ['x509cert' ]:
389+ exists_x509cert = 'x509cert' in idp_data and idp_data ['x509cert' ]
390+ exists_multix509sign = 'x509certMulti' in idp_data and \
391+ 'signing' in idp_data ['x509certMulti' ] and \
392+ idp_data ['x509certMulti' ]['signing' ]
393+
394+ if not (exists_x509cert or exists_multix509sign ):
384395 raise OneLogin_Saml2_Error (
385396 'In order to validate the sign on the Logout Request, the x509cert of the IdP is required' ,
386397 OneLogin_Saml2_Error .CERT_NOT_FOUND
387398 )
388- cert = idp_data ['x509cert' ]
389-
390- if not OneLogin_Saml2_Utils .validate_binary_sign (signed_query , b64decode (get_data ['Signature' ]), cert , sign_alg ):
399+ if exists_multix509sign :
400+ for cert in idp_data ['x509certMulti' ]['signing' ]:
401+ if OneLogin_Saml2_Utils .validate_binary_sign (signed_query , b64decode (get_data ['Signature' ]), cert , sign_alg ):
402+ return True
391403 raise OneLogin_Saml2_ValidationError (
392404 'Signature validation failed. Logout Request rejected' ,
393405 OneLogin_Saml2_ValidationError .INVALID_SIGNATURE
394406 )
407+ else :
408+ cert = idp_data ['x509cert' ]
395409
410+ if not OneLogin_Saml2_Utils .validate_binary_sign (signed_query , b64decode (get_data ['Signature' ]), cert , sign_alg ):
411+ raise OneLogin_Saml2_ValidationError (
412+ 'Signature validation failed. Logout Request rejected' ,
413+ OneLogin_Saml2_ValidationError .INVALID_SIGNATURE
414+ )
396415 return True
397416 except Exception as err :
398417 # pylint: disable=R0801sign_alg
0 commit comments