8
8
import itertools
9
9
import logging
10
10
import os
11
- import ssl
12
11
import six
13
12
14
13
from time import mktime
15
- from binascii import hexlify
16
14
17
15
from six .moves .urllib import parse
18
16
43
41
from saml2 .s_utils import Unsupported
44
42
45
43
from saml2 .time_util import instant
46
- from saml2 .time_util import utc_now
47
44
from saml2 .time_util import str_to_time
48
45
49
46
from saml2 .xmldsig import SIG_RSA_SHA1
@@ -195,36 +192,22 @@ def get_xmlsec_binary(paths=None):
195
192
raise SigverError ('Cannot find {binary}' .format (binary = bin_name ))
196
193
197
194
198
- def _get_xmlsec_cryptobackend (path = None , search_paths = None ):
195
+ def _get_xmlsec_cryptobackend (path = None , search_paths = None , delete_tmpfiles = True ):
199
196
"""
200
197
Initialize a CryptoBackendXmlSec1 crypto backend.
201
198
202
199
This function is now internal to this module.
203
200
"""
204
201
if path is None :
205
202
path = get_xmlsec_binary (paths = search_paths )
206
- return CryptoBackendXmlSec1 (path )
203
+ return CryptoBackendXmlSec1 (path , delete_tmpfiles = delete_tmpfiles )
207
204
208
205
209
206
NODE_NAME = 'urn:oasis:names:tc:SAML:2.0:assertion:Assertion'
210
207
ENC_NODE_NAME = 'urn:oasis:names:tc:SAML:2.0:assertion:EncryptedAssertion'
211
208
ENC_KEY_CLASS = 'EncryptedKey'
212
209
213
210
214
- def get_environ_delete_tmpfiles ():
215
- default = "true"
216
- value = os .environ .get ("PYSAML2_DELETE_TMPFILES" , default )
217
- result = value .lower () == default
218
-
219
- if not result :
220
- logger .warning (
221
- "PYSAML2_DELETE_TMPFILES set to False, "
222
- "temporary xml files will not be deleted."
223
- )
224
-
225
- return result
226
-
227
-
228
211
def _make_vals (val , klass , seccont , klass_inst = None , prop = None , part = False ,
229
212
base64encode = False , elements_to_sign = None ):
230
213
"""
@@ -336,7 +319,7 @@ def signed_instance_factory(instance, seccont, elements_to_sign=None):
336
319
return instance
337
320
338
321
339
- def make_temp (content , suffix = "" , decode = True ):
322
+ def make_temp (content , suffix = "" , decode = True , delete_tmpfiles = True ):
340
323
"""
341
324
Create a temporary file with the given content.
342
325
@@ -348,6 +331,8 @@ def make_temp(content, suffix="", decode=True):
348
331
suffix in certain circumstances.
349
332
:param decode: The input content might be base64 coded. If so it
350
333
must, in some cases, be decoded before being placed in the file.
334
+ :param delete_tmpfiles: Whether to keep the tmp files or delete them when they are
335
+ no longer in use
351
336
:return: 2-tuple with file pointer ( so the calling function can
352
337
close the file) and filename (which is for instance needed by the
353
338
xmlsec function).
@@ -356,7 +341,6 @@ def make_temp(content, suffix="", decode=True):
356
341
content .encode ("utf-8" ) if not isinstance (content , six .binary_type ) else content
357
342
)
358
343
content_raw = base64 .b64decode (content_encoded ) if decode else content_encoded
359
- delete_tmpfiles = get_environ_delete_tmpfiles ()
360
344
ntf = NamedTemporaryFile (suffix = suffix , delete = delete_tmpfiles )
361
345
ntf .write (content_raw )
362
346
ntf .seek (0 )
@@ -689,11 +673,11 @@ class CryptoBackendXmlSec1(CryptoBackend):
689
673
690
674
__DEBUG = 0
691
675
692
- def __init__ (self , xmlsec_binary , ** kwargs ):
676
+ def __init__ (self , xmlsec_binary , delete_tmpfiles = True , ** kwargs ):
693
677
CryptoBackend .__init__ (self , ** kwargs )
694
678
assert (isinstance (xmlsec_binary , six .string_types ))
695
679
self .xmlsec = xmlsec_binary
696
-
680
+ self . delete_tmpfiles = delete_tmpfiles
697
681
try :
698
682
self .non_xml_crypto = RSACrypto (kwargs ['rsa_key' ])
699
683
except KeyError :
@@ -721,7 +705,7 @@ def encrypt(self, text, recv_key, template, session_key_type, xpath=''):
721
705
:return:
722
706
"""
723
707
logger .debug ('Encryption input len: %d' , len (text ))
724
- tmp = make_temp (text , decode = False )
708
+ tmp = make_temp (text , decode = False , delete_tmpfiles = self . delete_tmpfiles )
725
709
com_list = [
726
710
self .xmlsec ,
727
711
'--encrypt' ,
@@ -758,8 +742,12 @@ def encrypt_assertion(self, statement, enc_key, template, key_type='des-192', no
758
742
if isinstance (statement , SamlBase ):
759
743
statement = pre_encrypt_assertion (statement )
760
744
761
- tmp = make_temp (_str (statement ), decode = False )
762
- tmp2 = make_temp (_str (template ), decode = False )
745
+ tmp = make_temp (_str (statement ),
746
+ decode = False ,
747
+ delete_tmpfiles = self .delete_tmpfiles )
748
+ tmp2 = make_temp (_str (template ),
749
+ decode = False ,
750
+ delete_tmpfiles = self .delete_tmpfiles )
763
751
764
752
if not node_xpath :
765
753
node_xpath = ASSERT_XPATH
@@ -792,7 +780,7 @@ def decrypt(self, enctext, key_file, id_attr):
792
780
"""
793
781
794
782
logger .debug ('Decrypt input len: %d' , len (enctext ))
795
- tmp = make_temp (enctext , decode = False )
783
+ tmp = make_temp (enctext , decode = False , delete_tmpfiles = self . delete_tmpfiles )
796
784
797
785
com_list = [
798
786
self .xmlsec ,
@@ -824,7 +812,10 @@ def sign_statement(self, statement, node_name, key_file, node_id, id_attr):
824
812
if isinstance (statement , SamlBase ):
825
813
statement = str (statement )
826
814
827
- tmp = make_temp (statement , suffix = ".xml" , decode = False )
815
+ tmp = make_temp (statement ,
816
+ suffix = ".xml" ,
817
+ decode = False ,
818
+ delete_tmpfiles = self .delete_tmpfiles )
828
819
829
820
com_list = [
830
821
self .xmlsec ,
@@ -865,7 +856,10 @@ def validate_signature(self, signedtext, cert_file, cert_type, node_name, node_i
865
856
if not isinstance (signedtext , six .binary_type ):
866
857
signedtext = signedtext .encode ('utf-8' )
867
858
868
- tmp = make_temp (signedtext , suffix = ".xml" , decode = False )
859
+ tmp = make_temp (signedtext ,
860
+ suffix = ".xml" ,
861
+ decode = False ,
862
+ delete_tmpfiles = self .delete_tmpfiles )
869
863
870
864
com_list = [
871
865
self .xmlsec ,
@@ -1023,7 +1017,8 @@ def security_context(conf):
1023
1017
err_msg = err_msg .format (binary = xmlsec_binary )
1024
1018
raise SigverError (err_msg )
1025
1019
1026
- crypto = _get_xmlsec_cryptobackend (xmlsec_binary )
1020
+ crypto = _get_xmlsec_cryptobackend (xmlsec_binary ,
1021
+ delete_tmpfiles = conf .delete_tmpfiles )
1027
1022
1028
1023
_file_name = conf .getattr ('key_file' , '' )
1029
1024
if _file_name :
@@ -1063,7 +1058,8 @@ def security_context(conf):
1063
1058
enc_key_files = enc_key_files ,
1064
1059
encryption_keypairs = conf .encryption_keypairs ,
1065
1060
sec_backend = sec_backend ,
1066
- id_attr = id_attr )
1061
+ id_attr = id_attr ,
1062
+ delete_tmpfiles = conf .delete_tmpfiles )
1067
1063
1068
1064
1069
1065
def encrypt_cert_from_item (item ):
@@ -1253,7 +1249,8 @@ def __init__(
1253
1249
encryption_keypairs = None ,
1254
1250
enc_cert_type = 'pem' ,
1255
1251
sec_backend = None ,
1256
- id_attr = '' ):
1252
+ id_attr = '' ,
1253
+ delete_tmpfiles = True ):
1257
1254
1258
1255
self .id_attr = id_attr or SecurityContext .DEFAULT_ID_ATTR_NAME
1259
1256
@@ -1304,6 +1301,7 @@ def __init__(
1304
1301
self .template = template
1305
1302
1306
1303
self .encrypt_key_type = encrypt_key_type
1304
+ self .delete_tmpfiles = delete_tmpfiles
1307
1305
1308
1306
def correctly_signed (self , xml , must = False ):
1309
1307
logger .debug ('verify correct signature' )
@@ -1360,7 +1358,10 @@ def decrypt_keys(self, enctext, keys=None, id_attr=''):
1360
1358
key .encode ("ascii" ) if not isinstance (key , six .binary_type ) else key
1361
1359
for key in keys_filtered
1362
1360
)
1363
- key_files = list (make_temp (key , decode = False ) for key in keys_encoded )
1361
+ key_files = list (
1362
+ make_temp (key , decode = False , delete_tmpfiles = self .delete_tmpfiles )
1363
+ for key in keys_encoded
1364
+ )
1364
1365
key_file_names = list (tmp .name for tmp in key_files )
1365
1366
1366
1367
try :
@@ -1450,7 +1451,10 @@ def _check_signature(self, decoded_xml, item, node_name=NODE_NAME, origdoc=None,
1450
1451
for cert in _certs :
1451
1452
if isinstance (cert , six .string_types ):
1452
1453
content = pem_format (cert )
1453
- tmp = make_temp (content , suffix = ".pem" , decode = False )
1454
+ tmp = make_temp (content ,
1455
+ suffix = ".pem" ,
1456
+ decode = False ,
1457
+ delete_tmpfiles = self .delete_tmpfiles )
1454
1458
certs .append (tmp )
1455
1459
else :
1456
1460
certs .append (cert )
@@ -1460,7 +1464,10 @@ def _check_signature(self, decoded_xml, item, node_name=NODE_NAME, origdoc=None,
1460
1464
if not certs and not self .only_use_keys_in_metadata :
1461
1465
logger .debug ('==== Certs from instance ====' )
1462
1466
certs = [
1463
- make_temp (content = pem_format (cert ), suffix = ".pem" , decode = False )
1467
+ make_temp (content = pem_format (cert ),
1468
+ suffix = ".pem" ,
1469
+ decode = False ,
1470
+ delete_tmpfiles = self .delete_tmpfiles )
1464
1471
for cert in cert_from_instance (item )
1465
1472
]
1466
1473
else :
@@ -1648,7 +1655,7 @@ def sign_statement(self, statement, node_name, key=None, key_file=None, node_id=
1648
1655
1649
1656
if not key_file and key :
1650
1657
content = str (key ).encode ()
1651
- tmp = make_temp (content , suffix = ".pem" )
1658
+ tmp = make_temp (content , suffix = ".pem" , delete_tmpfiles = self . delete_tmpfiles )
1652
1659
key_file = tmp .name
1653
1660
1654
1661
if not key and not key_file :
0 commit comments