@@ -471,14 +471,14 @@ def import_rsa_key_from_file(filename):
471
471
return key
472
472
473
473
474
- def parse_xmlsec_verify_output (xmlsec_vsn , output ):
474
+ def parse_xmlsec_verify_output (output , version = None ):
475
475
"""Parse the output from xmlsec to try to find out if the
476
476
command was successfull or not.
477
477
478
478
:param output: The output from Popen
479
479
:return: A boolean; True if the command was a success otherwise False
480
480
"""
481
- if xmlsec_vsn < (1 , 3 ):
481
+ if version is None or version < (1 , 3 ):
482
482
for line in output .splitlines ():
483
483
if line == "OK" :
484
484
return True
@@ -600,9 +600,18 @@ def verify_redirect_signature(saml_msg, crypto, cert=None, sigkey=None):
600
600
601
601
602
602
class CryptoBackend :
603
+ @property
603
604
def version (self ):
604
605
raise NotImplementedError ()
605
606
607
+ @property
608
+ def version_nums (self ):
609
+ try :
610
+ vns = tuple (int (t ) for t in self .version )
611
+ except ValueError :
612
+ vns = (0 , 0 , 0 )
613
+ return vns
614
+
606
615
def encrypt (self , text , recv_key , template , key_type ):
607
616
raise NotImplementedError ()
608
617
@@ -636,14 +645,12 @@ def __init__(self, xmlsec_binary, delete_tmpfiles=True, **kwargs):
636
645
raise ValueError ("xmlsec_binary should be of type string" )
637
646
self .xmlsec = xmlsec_binary
638
647
self .delete_tmpfiles = delete_tmpfiles
639
- vsn = self .version ()
640
- [maj_num_str , min_num_str ] = vsn .split ('.' )[0 :2 ]
641
- self .vsn = (int (maj_num_str ), int (min_num_str ))
642
648
try :
643
649
self .non_xml_crypto = RSACrypto (kwargs ["rsa_key" ])
644
650
except KeyError :
645
651
pass
646
652
653
+ @property
647
654
def version (self ):
648
655
com_list = [self .xmlsec , "--version" ]
649
656
pof = Popen (com_list , stderr = PIPE , stdout = PIPE )
@@ -652,7 +659,7 @@ def version(self):
652
659
try :
653
660
return content .split (" " )[1 ]
654
661
except IndexError :
655
- return ""
662
+ return "0.0.0 "
656
663
657
664
def encrypt (self , text , recv_key , template , session_key_type , xpath = "" ):
658
665
"""
@@ -834,7 +841,7 @@ def validate_signature(self, signedtext, cert_file, cert_type, node_name, node_i
834
841
except XmlsecError as e :
835
842
raise SignatureError (com_list ) from e
836
843
837
- return parse_xmlsec_verify_output (self . vsn , stderr )
844
+ return parse_xmlsec_verify_output (stderr , self . version_nums )
838
845
839
846
def _run_xmlsec (self , com_list , extra_args ):
840
847
"""
@@ -846,7 +853,7 @@ def _run_xmlsec(self, com_list, extra_args):
846
853
"""
847
854
with NamedTemporaryFile (suffix = ".xml" ) as ntf :
848
855
com_list .extend (["--output" , ntf .name ])
849
- if self .vsn >= (1 , 3 ):
856
+ if self .version_nums >= (1 , 3 ):
850
857
com_list .extend (['--lax-key-search' ])
851
858
com_list += extra_args
852
859
@@ -882,10 +889,13 @@ class CryptoBackendXMLSecurity(CryptoBackend):
882
889
def __init__ (self ):
883
890
CryptoBackend .__init__ (self )
884
891
892
+ @property
885
893
def version (self ):
886
- # XXX if XMLSecurity.__init__ included a __version__, that would be
887
- # better than static 0.0 here.
888
- return "XMLSecurity 0.0"
894
+ try :
895
+ import xmlsec
896
+ return xmlsec .__version__
897
+ except (ImportError , AttributeError ):
898
+ return "0.0.0"
889
899
890
900
def sign_statement (self , statement , node_name , key_file , node_id ):
891
901
"""
0 commit comments