@@ -336,31 +336,31 @@ def signed_instance_factory(instance, seccont, elements_to_sign=None):
336
336
return instance
337
337
338
338
339
- def make_temp (string , suffix = '' , decode = True , delete = True ):
340
- """ xmlsec needs files in some cases where only strings exist, hence the
341
- need for this function. It creates a temporary file with the
342
- string as only content.
339
+ def make_temp (content , suffix = "" , decode = True , delete = True ):
340
+ """
341
+ Create a temporary file with the given content.
342
+
343
+ This is needed by xmlsec in some cases where only strings exist when files
344
+ are expected.
343
345
344
- :param string : The information to be placed in the file
346
+ :param content : The information to be placed in the file
345
347
:param suffix: The temporary file might have to have a specific
346
348
suffix in certain circumstances.
347
- :param decode: The input string might be base64 coded. If so it
349
+ :param decode: The input content might be base64 coded. If so it
348
350
must, in some cases, be decoded before being placed in the file.
349
351
:return: 2-tuple with file pointer ( so the calling function can
350
352
close the file) and filename (which is for instance needed by the
351
353
xmlsec function).
352
354
"""
353
- ntf = NamedTemporaryFile (suffix = suffix , delete = delete )
354
- # Python3 tempfile requires byte-like object
355
- if not isinstance (string , six .binary_type ):
356
- string = string .encode ('utf-8' )
357
-
358
- if decode :
359
- ntf .write (base64 .b64decode (string ))
360
- else :
361
- ntf .write (string )
355
+ content_encoded = (
356
+ content .encode ("utf-8" ) if not isinstance (content , six .binary_type ) else content
357
+ )
358
+ content_raw = base64 .b64decode (content_encoded ) if decode else content_encoded
359
+ delete_tmpfiles = delete
360
+ ntf = NamedTemporaryFile (suffix = suffix , delete = delete_tmpfiles )
361
+ ntf .write (content_raw )
362
362
ntf .seek (0 )
363
- return ntf , ntf . name
363
+ return ntf
364
364
365
365
366
366
def split_len (seq , length ):
@@ -722,13 +722,13 @@ def encrypt(self, text, recv_key, template, session_key_type, xpath=''):
722
722
:return:
723
723
"""
724
724
logger .debug ('Encryption input len: %d' , len (text ))
725
- f , fil = make_temp (text , decode = False )
725
+ tmp = make_temp (text , decode = False )
726
726
com_list = [
727
727
self .xmlsec ,
728
728
'--encrypt' ,
729
729
'--pubkey-cert-pem' , recv_key ,
730
730
'--session-key' , session_key_type ,
731
- '--xml-data' , fil ,
731
+ '--xml-data' , tmp . name ,
732
732
]
733
733
734
734
if xpath :
@@ -759,9 +759,8 @@ def encrypt_assertion(self, statement, enc_key, template, key_type='des-192', no
759
759
if isinstance (statement , SamlBase ):
760
760
statement = pre_encrypt_assertion (statement )
761
761
762
- f , fil = make_temp (
763
- _str (statement ), decode = False )
764
- t , tmpl = make_temp (_str (template ), decode = False )
762
+ tmp = make_temp (_str (statement ), decode = False )
763
+ tmp2 = make_temp (_str (template ), decode = False )
765
764
766
765
if not node_xpath :
767
766
node_xpath = ASSERT_XPATH
@@ -771,15 +770,15 @@ def encrypt_assertion(self, statement, enc_key, template, key_type='des-192', no
771
770
'--encrypt' ,
772
771
'--pubkey-cert-pem' , enc_key ,
773
772
'--session-key' , key_type ,
774
- '--xml-data' , fil ,
773
+ '--xml-data' , tmp . name ,
775
774
'--node-xpath' , node_xpath ,
776
775
]
777
776
778
777
if node_id :
779
778
com_list .extend (['--node-id' , node_id ])
780
779
781
780
try :
782
- (_stdout , _stderr , output ) = self ._run_xmlsec (com_list , [tmpl ])
781
+ (_stdout , _stderr , output ) = self ._run_xmlsec (com_list , [tmp2 . name ])
783
782
except XmlsecError as e :
784
783
six .raise_from (EncryptError (com_list ), e )
785
784
@@ -794,7 +793,7 @@ def decrypt(self, enctext, key_file, id_attr):
794
793
"""
795
794
796
795
logger .debug ('Decrypt input len: %d' , len (enctext ))
797
- _ , fil = make_temp (enctext , decode = False )
796
+ tmp = make_temp (enctext , decode = False )
798
797
799
798
com_list = [
800
799
self .xmlsec ,
@@ -805,7 +804,7 @@ def decrypt(self, enctext, key_file, id_attr):
805
804
]
806
805
807
806
try :
808
- (_stdout , _stderr , output ) = self ._run_xmlsec (com_list , [fil ])
807
+ (_stdout , _stderr , output ) = self ._run_xmlsec (com_list , [tmp . name ])
809
808
except XmlsecError as e :
810
809
six .raise_from (DecryptError (com_list ), e )
811
810
@@ -826,12 +825,7 @@ def sign_statement(self, statement, node_name, key_file, node_id, id_attr):
826
825
if isinstance (statement , SamlBase ):
827
826
statement = str (statement )
828
827
829
- _ , fil = make_temp (
830
- statement ,
831
- suffix = '.xml' ,
832
- decode = False ,
833
- delete = self ._xmlsec_delete_tmpfiles ,
834
- )
828
+ tmp = make_temp (statement , suffix = ".xml" , decode = False , delete = self ._xmlsec_delete_tmpfiles )
835
829
836
830
com_list = [
837
831
self .xmlsec ,
@@ -845,7 +839,7 @@ def sign_statement(self, statement, node_name, key_file, node_id, id_attr):
845
839
com_list .extend (['--node-id' , node_id ])
846
840
847
841
try :
848
- (stdout , stderr , output ) = self ._run_xmlsec (com_list , [fil ])
842
+ (stdout , stderr , output ) = self ._run_xmlsec (com_list , [tmp . name ])
849
843
except XmlsecError as e :
850
844
raise SignatureError (com_list )
851
845
@@ -872,12 +866,7 @@ def validate_signature(self, signedtext, cert_file, cert_type, node_name, node_i
872
866
if not isinstance (signedtext , six .binary_type ):
873
867
signedtext = signedtext .encode ('utf-8' )
874
868
875
- _ , fil = make_temp (
876
- signedtext ,
877
- suffix = '.xml' ,
878
- decode = False ,
879
- delete = self ._xmlsec_delete_tmpfiles ,
880
- )
869
+ tmp = make_temp (signedtext , suffix = ".xml" , decode = False , delete = self ._xmlsec_delete_tmpfiles )
881
870
882
871
com_list = [
883
872
self .xmlsec ,
@@ -892,7 +881,7 @@ def validate_signature(self, signedtext, cert_file, cert_type, node_name, node_i
892
881
com_list .extend (['--node-id' , node_id ])
893
882
894
883
try :
895
- (_stdout , stderr , _output ) = self ._run_xmlsec (com_list , [fil ])
884
+ (_stdout , stderr , _output ) = self ._run_xmlsec (com_list , [tmp . name ])
896
885
except XmlsecError as e :
897
886
six .raise_from (SignatureError (com_list ), e )
898
887
@@ -1369,15 +1358,16 @@ def decrypt_keys(self, enctext, keys=None, id_attr=''):
1369
1358
if not isinstance (keys , list ):
1370
1359
keys = [keys ]
1371
1360
1372
- keys = [key for key in keys if key ]
1373
- for key in keys :
1374
- if not isinstance (key , six .binary_type ):
1375
- key = key .encode ("ascii" )
1376
- key_file , _ = make_temp (key , decode = False )
1377
- key_files .append (key_file )
1361
+ keys_filtered = (key for key in keys if key )
1362
+ keys_encoded = (
1363
+ key .encode ("ascii" ) if not isinstance (key , six .binary_type ) else key
1364
+ for key in keys_filtered
1365
+ )
1366
+ key_files = list (make_temp (key , decode = False ) for key in keys_encoded )
1367
+ key_file_names = list (tmp .name for tmp in key_files )
1378
1368
1379
1369
try :
1380
- dectext = self .decrypt (enctext , key_file = [ x . name for x in key_files ] , id_attr = id_attr )
1370
+ dectext = self .decrypt (enctext , key_file = key_file_names , id_attr = id_attr )
1381
1371
except DecryptError as e :
1382
1372
raise
1383
1373
else :
@@ -1462,14 +1452,9 @@ def _check_signature(self, decoded_xml, item, node_name=NODE_NAME, origdoc=None,
1462
1452
1463
1453
for cert in _certs :
1464
1454
if isinstance (cert , six .string_types ):
1465
- certs .append (
1466
- make_temp (
1467
- pem_format (cert ),
1468
- suffix = '.pem' ,
1469
- decode = False ,
1470
- delete = self ._xmlsec_delete_tmpfiles ,
1471
- )
1472
- )
1455
+ content = pem_format (cert )
1456
+ tmp = make_temp (content , suffix = ".pem" , decode = False , delete = self ._xmlsec_delete_tmpfiles )
1457
+ certs .append (tmp )
1473
1458
else :
1474
1459
certs .append (cert )
1475
1460
else :
@@ -1478,12 +1463,7 @@ def _check_signature(self, decoded_xml, item, node_name=NODE_NAME, origdoc=None,
1478
1463
if not certs and not self .only_use_keys_in_metadata :
1479
1464
logger .debug ('==== Certs from instance ====' )
1480
1465
certs = [
1481
- make_temp (
1482
- pem_format (cert ),
1483
- suffix = '.pem' ,
1484
- decode = False ,
1485
- delete = self ._xmlsec_delete_tmpfiles ,
1486
- )
1466
+ make_temp (content = pem_format (cert ), suffix = ".pem" , decode = False , delete = self ._xmlsec_delete_tmpfiles )
1487
1467
for cert in cert_from_instance (item )
1488
1468
]
1489
1469
else :
@@ -1495,12 +1475,12 @@ def _check_signature(self, decoded_xml, item, node_name=NODE_NAME, origdoc=None,
1495
1475
verified = False
1496
1476
last_pem_file = None
1497
1477
1498
- for _ , pem_file in certs :
1478
+ for pem_fd in certs :
1499
1479
try :
1500
- last_pem_file = pem_file
1480
+ last_pem_file = pem_fd . name
1501
1481
if self .verify_signature (
1502
1482
decoded_xml ,
1503
- pem_file ,
1483
+ pem_fd . name ,
1504
1484
node_name = node_name ,
1505
1485
node_id = item .id ,
1506
1486
id_attr = id_attr ):
@@ -1670,7 +1650,9 @@ def sign_statement(self, statement, node_name, key=None, key_file=None, node_id=
1670
1650
id_attr = self .id_attr
1671
1651
1672
1652
if not key_file and key :
1673
- _ , key_file = make_temp (str (key ).encode (), '.pem' )
1653
+ content = str (key ).encode ()
1654
+ tmp = make_temp (content , suffix = ".pem" )
1655
+ key_file = tmp .name
1674
1656
1675
1657
if not key and not key_file :
1676
1658
key_file = self .key_file
0 commit comments