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