8
8
from saml2 .validate import NotValid
9
9
from saml2 .response import IncorrectlySigned
10
10
from saml2 .sigver import verify_redirect_signature
11
- from saml2 .sigver import SignatureError
12
11
13
12
logger = logging .getLogger (__name__ )
14
13
@@ -44,59 +43,34 @@ def _loads(self, xmldata, binding=None, origdoc=None, must=None,
44
43
self .xmlstr = xmldata [:]
45
44
logger .debug ("xmlstr: %s, relayState: %s, sigalg: %s, signature: %s" ,
46
45
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 )
67
50
51
+ try :
68
52
self .message = self .signature_check (xmldata , origdoc = origdoc ,
69
53
must = must ,
70
54
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
-
88
55
except TypeError :
89
56
raise
90
57
except Exception as excp :
91
58
self .message = None
92
59
logger .info ("EXCEPTION: %s" , excp )
93
60
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
+
94
68
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 )
97
71
raise IncorrectlySigned ()
98
72
99
- logger .info ("request : %s" , self .message )
73
+ logger .info ("Request : %s" , self .message )
100
74
101
75
try :
102
76
valid_instance (self .message )
@@ -106,6 +80,39 @@ def _loads(self, xmldata, binding=None, origdoc=None, must=None,
106
80
107
81
return self
108
82
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
+
109
116
def issue_instant_ok (self ):
110
117
""" Check that the request was issued at a reasonable time """
111
118
upper = time_util .shift_time (time_util .time_in_a_while (days = 1 ),
0 commit comments