88from saml2 .validate import NotValid
99from saml2 .response import IncorrectlySigned
1010from saml2 .sigver import verify_redirect_signature
11- from saml2 .sigver import SignatureError
1211
1312logger = logging .getLogger (__name__ )
1413
@@ -44,59 +43,34 @@ def _loads(self, xmldata, binding=None, origdoc=None, must=None,
4443 self .xmlstr = xmldata [:]
4544 logger .debug ("xmlstr: %s, relayState: %s, sigalg: %s, signature: %s" ,
4645 self .xmlstr , relayState , sigalg , signature )
47- try :
48- # If redirect binding, and provided SigAlg, Signature use that to verify
49- # and skip signatureCheck withing SAMLRequest/xmldata
50- _do_redirect_sig_check = False
51- _saml_msg = {}
52- if binding == BINDING_HTTP_REDIRECT and must \
53- and sigalg is not None and signature is not None :
54- logger .debug ("Request signature check will be done using query param,"
55- " instead of SAMLRequest content" )
56- _do_redirect_sig_check = True
57- must = False
58- _saml_msg = {
59- "SAMLRequest" : origdoc ,
60- "SigAlg" : sigalg ,
61- "Signature" : signature
62- }
63- # RelayState is optional so only add when available,
64- # signature validate fails if passed as None
65- if relayState is not None :
66- _saml_msg ["RelayState" ] = relayState
46+ # If redirect binding, and provided SigAlg, Signature use that to verify
47+ # and skip signatureCheck withing SAMLRequest/xmldata
48+ _need_redirect_sig_check , _saml_msg , must = self ._should_do_redirect_sig_check (
49+ binding , must , origdoc , relayState , sigalg , signature )
6750
51+ try :
6852 self .message = self .signature_check (xmldata , origdoc = origdoc ,
6953 must = must ,
7054 only_valid_cert = only_valid_cert )
71-
72- if _do_redirect_sig_check :
73- _issuer = self .message .issuer .text .strip ()
74- _certs = self .sec .metadata .certs (_issuer , "any" , "signing" )
75- logger .debug ("Certs: %s, _saml_msg: %s" , _certs , _saml_msg )
76- _verified_ok = False
77- for cert in _certs :
78- if verify_redirect_signature (_saml_msg , self .sec .sec_backend , cert ):
79- _verified_ok = True
80- break
81-
82- logger .info ("Redirect request signature check: %s" , _verified_ok )
83- # Set self.message to None, it shall raise error further down.
84- if not _verified_ok :
85- self .message = None
86- raise SignatureError ('Failed to verify signature' )
87-
8855 except TypeError :
8956 raise
9057 except Exception as excp :
9158 self .message = None
9259 logger .info ("EXCEPTION: %s" , excp )
9360
61+ if _need_redirect_sig_check and self .message is not None :
62+ _verified_ok = self ._do_redirect_sig_check (_saml_msg )
63+ # Set self.message to None, it shall raise error further down.
64+ if not _verified_ok :
65+ self .message = None
66+ logger .error ('Failed to verify signature' )
67+
9468 if not self .message :
95- logger .error ("Response was not correctly signed" )
96- logger .info ("Response : %s" , xmldata )
69+ logger .error ("Request was not correctly signed" )
70+ logger .info ("Request : %s" , xmldata )
9771 raise IncorrectlySigned ()
9872
99- logger .info ("request : %s" , self .message )
73+ logger .info ("Request : %s" , self .message )
10074
10175 try :
10276 valid_instance (self .message )
@@ -106,6 +80,39 @@ def _loads(self, xmldata, binding=None, origdoc=None, must=None,
10680
10781 return self
10882
83+ def _do_redirect_sig_check (self , _saml_msg ):
84+ _issuer = self .message .issuer .text .strip ()
85+ _certs = self .sec .metadata .certs (_issuer , "any" , "signing" )
86+ logger .debug ("Certs: %s, _saml_msg: %s" , _certs , _saml_msg )
87+ _verified_ok = False
88+ for cert in _certs :
89+ if verify_redirect_signature (_saml_msg , self .sec .sec_backend , cert ):
90+ _verified_ok = True
91+ break
92+ logger .info ("Redirect request signature check: %s" , _verified_ok )
93+ return _verified_ok
94+
95+ def _should_do_redirect_sig_check (self , binding , must , origdoc , relayState , sigalg ,
96+ signature ):
97+ _do_redirect_sig_check = False
98+ _saml_msg = {}
99+ if binding == BINDING_HTTP_REDIRECT and must \
100+ and sigalg is not None and signature is not None :
101+ logger .debug ("Request signature check will be done using query param,"
102+ " instead of SAMLRequest content" )
103+ _do_redirect_sig_check = True
104+ must = False
105+ _saml_msg = {
106+ "SAMLRequest" : origdoc ,
107+ "SigAlg" : sigalg ,
108+ "Signature" : signature
109+ }
110+ # RelayState is optional so only add when available,
111+ # signature validate fails if passed as None
112+ if relayState is not None :
113+ _saml_msg ["RelayState" ] = relayState
114+ return _do_redirect_sig_check , _saml_msg , must
115+
109116 def issue_instant_ok (self ):
110117 """ Check that the request was issued at a reasonable time """
111118 upper = time_util .shift_time (time_util .time_in_a_while (days = 1 ),
0 commit comments