Skip to content

Commit 5b07161

Browse files
vkadamc00kiemon5ter
authored andcommitted
Refactored redirect signature check into separate method
1 parent 058cc80 commit 5b07161

File tree

1 file changed

+48
-41
lines changed

1 file changed

+48
-41
lines changed

src/saml2/request.py

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from saml2.validate import NotValid
99
from saml2.response import IncorrectlySigned
1010
from saml2.sigver import verify_redirect_signature
11-
from saml2.sigver import SignatureError
1211

1312
logger = 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

Comments
 (0)