@@ -721,7 +721,7 @@ def validate_signature(self, enctext, cert_file, cert_type, node_name,
721
721
722
722
class CryptoBackendXmlSec1 (CryptoBackend ):
723
723
"""
724
- CryptoBackend implementation using external binary xmlsec1 to sign
724
+ CryptoBackend implementation using external binary 1 to sign
725
725
and verify XML documents.
726
726
"""
727
727
@@ -731,6 +731,10 @@ def __init__(self, xmlsec_binary, **kwargs):
731
731
CryptoBackend .__init__ (self , ** kwargs )
732
732
assert (isinstance (xmlsec_binary , basestring ))
733
733
self .xmlsec = xmlsec_binary
734
+ if os .environ .get ('PYSAML2_KEEP_XMLSEC_TMP' , None ):
735
+ self ._xmlsec_delete_tmpfiles = False
736
+ else :
737
+ self ._xmlsec_delete_tmpfiles = True
734
738
735
739
def version (self ):
736
740
com_list = [self .xmlsec , "--version" ]
@@ -832,7 +836,8 @@ def sign_statement(self, statement, node_name, key_file, node_id,
832
836
:return: The signed statement
833
837
"""
834
838
835
- _ , fil = make_temp ("%s" % statement , decode = False )
839
+ _ , fil = make_temp ("%s" % statement , suffix = ".xml" , decode = False ,
840
+ delete = self ._xmlsec_delete_tmpfiles )
836
841
837
842
com_list = [self .xmlsec , "--sign" ,
838
843
"--privkey-pem" , key_file ,
@@ -867,7 +872,8 @@ def validate_signature(self, signedtext, cert_file, cert_type, node_name,
867
872
:param id_attr: Should normally be one of "id", "Id" or "ID"
868
873
:return: Boolean True if the signature was correct otherwise False.
869
874
"""
870
- _ , fil = make_temp (signedtext , decode = False )
875
+ _ , fil = make_temp (signedtext , suffix = ".xml" ,
876
+ decode = False , delete = self ._xmlsec_delete_tmpfiles )
871
877
872
878
com_list = [self .xmlsec , "--verify" ,
873
879
"--pubkey-cert-%s" % cert_type , cert_file ,
@@ -906,7 +912,7 @@ def _run_xmlsec(self, com_list, extra_args, validate_output=True,
906
912
:param exception: The exception class to raise on errors
907
913
:result: Whatever xmlsec wrote to an --output temporary file
908
914
"""
909
- ntf = NamedTemporaryFile ()
915
+ ntf = NamedTemporaryFile (suffix = ".xml" , delete = self . _xmlsec_delete_tmpfiles )
910
916
com_list .extend (["--output" , ntf .name ])
911
917
com_list += extra_args
912
918
@@ -1243,6 +1249,11 @@ def __init__(self, crypto, key_file="", key_type="pem",
1243
1249
self .template = template
1244
1250
1245
1251
self .encrypt_key_type = encrypt_key_type
1252
+ # keep certificate files to debug xmlsec invocations
1253
+ if os .environ .get ('PYSAML2_KEEP_XMLSEC_TMP' , None ):
1254
+ self ._xmlsec_delete_tmpfiles = False
1255
+ else :
1256
+ self ._xmlsec_delete_tmpfiles = True
1246
1257
1247
1258
def correctly_signed (self , xml , must = False ):
1248
1259
logger .debug ("verify correct signature" )
@@ -1334,16 +1345,19 @@ def _check_signature(self, decoded_xml, item, node_name=NODE_NAME,
1334
1345
certs = []
1335
1346
for cert in _certs :
1336
1347
if isinstance (cert , basestring ):
1337
- certs .append (make_temp (pem_format (cert ), ".pem" , False ))
1348
+ certs .append (make_temp (pem_format (cert ), suffix = ".pem" ,
1349
+ decode = False ,
1350
+ delete = self ._xmlsec_delete_tmpfiles ))
1338
1351
else :
1339
1352
certs .append (cert )
1340
1353
else :
1341
1354
certs = []
1342
1355
1343
1356
if not certs and not self .only_use_keys_in_metadata :
1344
1357
logger .debug ("==== Certs from instance ====" )
1345
- certs = [make_temp (pem_format (cert ), ".pem" ,
1346
- False ) for cert in cert_from_instance (item )]
1358
+ certs = [make_temp (pem_format (cert ), suffix = ".pem" ,
1359
+ decode = False , delete = self ._xmlsec_delete_tmpfiles )
1360
+ for cert in cert_from_instance (item )]
1347
1361
else :
1348
1362
logger .debug ("==== Certs from metadata ==== %s: %s ====" % (issuer ,
1349
1363
certs ))
@@ -1417,8 +1431,8 @@ def correctly_signed_message(self, decoded_xml, msgtype, must=False,
1417
1431
the entity that sent the info use that, if not use the key that are in
1418
1432
the message if any.
1419
1433
1420
- :param decoded_xml: The SAML message as a XML string
1421
- :param msgtype:
1434
+ :param decoded_xml: The SAML message as an XML infoset (a string)
1435
+ :param msgtype: SAML protocol message type
1422
1436
:param must: Whether there must be a signature
1423
1437
:param origdoc:
1424
1438
:return:
@@ -1435,7 +1449,7 @@ def correctly_signed_message(self, decoded_xml, msgtype, must=False,
1435
1449
1436
1450
if not msg .signature :
1437
1451
if must :
1438
- raise SignatureError ("Missing must signature" )
1452
+ raise SignatureError ("Required signature missing on %s" % msgtype )
1439
1453
else :
1440
1454
return msg
1441
1455
0 commit comments