@@ -471,14 +471,14 @@ def import_rsa_key_from_file(filename):
471471 return key
472472
473473
474- def parse_xmlsec_verify_output (xmlsec_vsn , output ):
474+ def parse_xmlsec_verify_output (output , version = None ):
475475 """Parse the output from xmlsec to try to find out if the
476476 command was successfull or not.
477477
478478 :param output: The output from Popen
479479 :return: A boolean; True if the command was a success otherwise False
480480 """
481- if xmlsec_vsn < (1 , 3 ):
481+ if version is None or version < (1 , 3 ):
482482 for line in output .splitlines ():
483483 if line == "OK" :
484484 return True
@@ -600,9 +600,18 @@ def verify_redirect_signature(saml_msg, crypto, cert=None, sigkey=None):
600600
601601
602602class CryptoBackend :
603+ @property
603604 def version (self ):
604605 raise NotImplementedError ()
605606
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+
606615 def encrypt (self , text , recv_key , template , key_type ):
607616 raise NotImplementedError ()
608617
@@ -636,14 +645,12 @@ def __init__(self, xmlsec_binary, delete_tmpfiles=True, **kwargs):
636645 raise ValueError ("xmlsec_binary should be of type string" )
637646 self .xmlsec = xmlsec_binary
638647 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 ))
642648 try :
643649 self .non_xml_crypto = RSACrypto (kwargs ["rsa_key" ])
644650 except KeyError :
645651 pass
646652
653+ @property
647654 def version (self ):
648655 com_list = [self .xmlsec , "--version" ]
649656 pof = Popen (com_list , stderr = PIPE , stdout = PIPE )
@@ -652,7 +659,7 @@ def version(self):
652659 try :
653660 return content .split (" " )[1 ]
654661 except IndexError :
655- return ""
662+ return "0.0.0 "
656663
657664 def encrypt (self , text , recv_key , template , session_key_type , xpath = "" ):
658665 """
@@ -834,7 +841,7 @@ def validate_signature(self, signedtext, cert_file, cert_type, node_name, node_i
834841 except XmlsecError as e :
835842 raise SignatureError (com_list ) from e
836843
837- return parse_xmlsec_verify_output (self . vsn , stderr )
844+ return parse_xmlsec_verify_output (stderr , self . version_nums )
838845
839846 def _run_xmlsec (self , com_list , extra_args ):
840847 """
@@ -846,7 +853,7 @@ def _run_xmlsec(self, com_list, extra_args):
846853 """
847854 with NamedTemporaryFile (suffix = ".xml" ) as ntf :
848855 com_list .extend (["--output" , ntf .name ])
849- if self .vsn >= (1 , 3 ):
856+ if self .version_nums >= (1 , 3 ):
850857 com_list .extend (['--lax-key-search' ])
851858 com_list += extra_args
852859
@@ -882,10 +889,13 @@ class CryptoBackendXMLSecurity(CryptoBackend):
882889 def __init__ (self ):
883890 CryptoBackend .__init__ (self )
884891
892+ @property
885893 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"
889899
890900 def sign_statement (self , statement , node_name , key_file , node_id ):
891901 """
0 commit comments