Skip to content

Commit 627bf2b

Browse files
committed
added code to keep temporary certificate and xml files for xmlsec processing (controlled by setting ENV var PYSAML2_KEEP_XMLSEC_TMP)
1 parent d62dcd5 commit 627bf2b

File tree

1 file changed

+24
-10
lines changed

1 file changed

+24
-10
lines changed

src/saml2/sigver.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ def validate_signature(self, enctext, cert_file, cert_type, node_name,
720720

721721
class CryptoBackendXmlSec1(CryptoBackend):
722722
"""
723-
CryptoBackend implementation using external binary xmlsec1 to sign
723+
CryptoBackend implementation using external binary 1 to sign
724724
and verify XML documents.
725725
"""
726726

@@ -730,6 +730,10 @@ def __init__(self, xmlsec_binary, **kwargs):
730730
CryptoBackend.__init__(self, **kwargs)
731731
assert (isinstance(xmlsec_binary, basestring))
732732
self.xmlsec = xmlsec_binary
733+
if os.environ.get('PYSAML2_KEEP_XMLSEC_TMP', None):
734+
self._xmlsec_delete_tmpfiles = False
735+
else:
736+
self._xmlsec_delete_tmpfiles = True
733737

734738
def version(self):
735739
com_list = [self.xmlsec, "--version"]
@@ -831,7 +835,8 @@ def sign_statement(self, statement, node_name, key_file, node_id,
831835
:return: The signed statement
832836
"""
833837

834-
_, fil = make_temp("%s" % statement, decode=False)
838+
_, fil = make_temp("%s" % statement, suffix=".xml", decode=False,
839+
delete=self._xmlsec_delete_tmpfiles)
835840

836841
com_list = [self.xmlsec, "--sign",
837842
"--privkey-pem", key_file,
@@ -866,7 +871,8 @@ def validate_signature(self, signedtext, cert_file, cert_type, node_name,
866871
:param id_attr: Should normally be one of "id", "Id" or "ID"
867872
:return: Boolean True if the signature was correct otherwise False.
868873
"""
869-
_, fil = make_temp(signedtext, decode=False)
874+
_, fil = make_temp(signedtext, suffix=".xml",
875+
decode=False, delete=self._xmlsec_delete_tmpfiles)
870876

871877
com_list = [self.xmlsec, "--verify",
872878
"--pubkey-cert-%s" % cert_type, cert_file,
@@ -905,7 +911,7 @@ def _run_xmlsec(self, com_list, extra_args, validate_output=True,
905911
:param exception: The exception class to raise on errors
906912
:result: Whatever xmlsec wrote to an --output temporary file
907913
"""
908-
ntf = NamedTemporaryFile()
914+
ntf = NamedTemporaryFile(suffix=".xml", delete=self._xmlsec_delete_tmpfiles)
909915
com_list.extend(["--output", ntf.name])
910916
com_list += extra_args
911917

@@ -1242,6 +1248,11 @@ def __init__(self, crypto, key_file="", key_type="pem",
12421248
self.template = template
12431249

12441250
self.encrypt_key_type = encrypt_key_type
1251+
# keep certificate files to debug xmlsec invocations
1252+
if os.environ.get('PYSAML2_KEEP_XMLSEC_TMP', None):
1253+
self._xmlsec_delete_tmpfiles = False
1254+
else:
1255+
self._xmlsec_delete_tmpfiles = True
12451256

12461257
def correctly_signed(self, xml, must=False):
12471258
logger.debug("verify correct signature")
@@ -1333,16 +1344,19 @@ def _check_signature(self, decoded_xml, item, node_name=NODE_NAME,
13331344
certs = []
13341345
for cert in _certs:
13351346
if isinstance(cert, basestring):
1336-
certs.append(make_temp(pem_format(cert), ".pem", False))
1347+
certs.append(make_temp(pem_format(cert), suffix=".pem",
1348+
decode=False,
1349+
delete=self._xmlsec_delete_tmpfiles))
13371350
else:
13381351
certs.append(cert)
13391352
else:
13401353
certs = []
13411354

13421355
if not certs and not self.only_use_keys_in_metadata:
13431356
logger.debug("==== Certs from instance ====")
1344-
certs = [make_temp(pem_format(cert), ".pem",
1345-
False) for cert in cert_from_instance(item)]
1357+
certs = [make_temp(pem_format(cert), suffix=".pem",
1358+
decode=False, delete=self._xmlsec_delete_tmpfiles)
1359+
for cert in cert_from_instance(item)]
13461360
else:
13471361
logger.debug("==== Certs from metadata ==== %s: %s ====" % (issuer,
13481362
certs))
@@ -1416,8 +1430,8 @@ def correctly_signed_message(self, decoded_xml, msgtype, must=False,
14161430
the entity that sent the info use that, if not use the key that are in
14171431
the message if any.
14181432
1419-
:param decoded_xml: The SAML message as a XML string
1420-
:param msgtype:
1433+
:param decoded_xml: The SAML message as an XML infoset (a string)
1434+
:param msgtype: SAML protocol message type
14211435
:param must: Whether there must be a signature
14221436
:param origdoc:
14231437
:return:
@@ -1434,7 +1448,7 @@ def correctly_signed_message(self, decoded_xml, msgtype, must=False,
14341448

14351449
if not msg.signature:
14361450
if must:
1437-
raise SignatureError("Missing must signature")
1451+
raise SignatureError("Required signature missing on %s" % msgtype)
14381452
else:
14391453
return msg
14401454

0 commit comments

Comments
 (0)