@@ -141,7 +141,7 @@ def validate_xml(xml, schema, debug=False):
141141
142142 # Switch to lxml for schema validation
143143 try :
144- dom = fromstring (xml .encode ('utf-8' ))
144+ dom = fromstring (xml .encode ('utf-8' ), forbid_dtd = True )
145145 except Exception :
146146 return 'unloaded_xml'
147147
@@ -160,7 +160,7 @@ def validate_xml(xml, schema, debug=False):
160160
161161 return 'invalid_xml'
162162
163- return parseString (tostring (dom , encoding = 'unicode' ).encode ('utf-8' ))
163+ return parseString (tostring (dom , encoding = 'unicode' ).encode ('utf-8' ), forbid_dtd = True )
164164
165165 @staticmethod
166166 def element_text (node ):
@@ -530,7 +530,7 @@ def get_expire_time(cache_duration=None, valid_until=None):
530530 return None
531531
532532 @staticmethod
533- def query (dom , query , context = None ):
533+ def query (dom , query , context = None , tagid = None ):
534534 """
535535 Extracts nodes that match the query from the Element
536536
@@ -543,13 +543,21 @@ def query(dom, query, context=None):
543543 :param context: Context Node
544544 :type: DOMElement
545545
546+ :param tagid: Tag ID
547+ :type: string
548+
546549 :returns: The queried nodes
547550 :rtype: list
548551 """
549552 if context is None :
550- return dom .xpath (query , namespaces = OneLogin_Saml2_Constants .NSMAP )
553+ source = dom
554+ else :
555+ source = context
556+
557+ if tagid is None :
558+ return source .xpath (query , namespaces = OneLogin_Saml2_Constants .NSMAP )
551559 else :
552- return context .xpath (query , namespaces = OneLogin_Saml2_Constants .NSMAP )
560+ return source .xpath (query , tagid = tagid , namespaces = OneLogin_Saml2_Constants .NSMAP )
553561
554562 @staticmethod
555563 def delete_local_session (callback = None ):
@@ -668,7 +676,7 @@ def generate_name_id(value, sp_nq, sp_format=None, cert=None, debug=False, nq=No
668676
669677 if cert is not None :
670678 xml = name_id_container .toxml ()
671- elem = fromstring (xml )
679+ elem = fromstring (xml , forbid_dtd = True )
672680
673681 error_callback_method = None
674682 if debug :
@@ -697,7 +705,7 @@ def generate_name_id(value, sp_nq, sp_format=None, cert=None, debug=False, nq=No
697705
698706 edata = enc_ctx .encryptXml (enc_data , elem [0 ])
699707
700- newdoc = parseString (tostring (edata , encoding = 'unicode' ).encode ('utf-8' ))
708+ newdoc = parseString (tostring (edata , encoding = 'unicode' ).encode ('utf-8' ), forbid_dtd = True )
701709
702710 if newdoc .hasChildNodes ():
703711 child = newdoc .firstChild
@@ -783,9 +791,9 @@ def decrypt_element(encrypted_data, key, debug=False, inplace=False):
783791 :rtype: lxml.etree.Element
784792 """
785793 if isinstance (encrypted_data , Element ):
786- encrypted_data = fromstring (str (encrypted_data .toxml ()))
794+ encrypted_data = fromstring (str (encrypted_data .toxml ()), forbid_dtd = True )
787795 elif isinstance (encrypted_data , basestring ):
788- encrypted_data = fromstring (str (encrypted_data ))
796+ encrypted_data = fromstring (str (encrypted_data ), forbid_dtd = True )
789797 elif not inplace and isinstance (encrypted_data , etree ._Element ):
790798 encrypted_data = deepcopy (encrypted_data )
791799
@@ -851,7 +859,7 @@ def add_sign(xml, key, cert, debug=False, sign_algorithm=OneLogin_Saml2_Constant
851859 elem = xml
852860 elif isinstance (xml , Document ):
853861 xml = xml .toxml ()
854- elem = fromstring (xml .encode ('utf-8' ))
862+ elem = fromstring (xml .encode ('utf-8' ), forbid_dtd = True )
855863 elif isinstance (xml , Element ):
856864 xml .setAttributeNS (
857865 unicode (OneLogin_Saml2_Constants .NS_SAMLP ),
@@ -864,9 +872,9 @@ def add_sign(xml, key, cert, debug=False, sign_algorithm=OneLogin_Saml2_Constant
864872 unicode (OneLogin_Saml2_Constants .NS_SAML )
865873 )
866874 xml = xml .toxml ()
867- elem = fromstring (xml .encode ('utf-8' ))
875+ elem = fromstring (xml .encode ('utf-8' ), forbid_dtd = True )
868876 elif isinstance (xml , basestring ):
869- elem = fromstring (xml .encode ('utf-8' ))
877+ elem = fromstring (xml .encode ('utf-8' ), forbid_dtd = True )
870878 else :
871879 raise Exception ('Error parsing xml string' )
872880
@@ -939,8 +947,6 @@ def add_sign(xml, key, cert, debug=False, sign_algorithm=OneLogin_Saml2_Constant
939947 dsig_ctx .sign (signature )
940948
941949 return tostring (elem , encoding = 'unicode' ).encode ('utf-8' )
942- newdoc = parseString (tostring (elem , encoding = 'unicode' ).encode ('utf-8' ))
943- return newdoc .saveXML (newdoc .firstChild )
944950
945951 @staticmethod
946952 @return_false_on_exception
@@ -981,7 +987,7 @@ def validate_sign(xml, cert=None, fingerprint=None, fingerprintalg='sha1', valid
981987 elem = xml
982988 elif isinstance (xml , Document ):
983989 xml = xml .toxml ()
984- elem = fromstring (str (xml ))
990+ elem = fromstring (str (xml ), forbid_dtd = True )
985991 elif isinstance (xml , Element ):
986992 xml .setAttributeNS (
987993 unicode (OneLogin_Saml2_Constants .NS_SAMLP ),
@@ -994,9 +1000,9 @@ def validate_sign(xml, cert=None, fingerprint=None, fingerprintalg='sha1', valid
9941000 unicode (OneLogin_Saml2_Constants .NS_SAML )
9951001 )
9961002 xml = xml .toxml ()
997- elem = fromstring (str (xml ))
1003+ elem = fromstring (str (xml ), forbid_dtd = True )
9981004 elif isinstance (xml , basestring ):
999- elem = fromstring (str (xml ))
1005+ elem = fromstring (str (xml ), forbid_dtd = True )
10001006 else :
10011007 raise Exception ('Error parsing xml string' )
10021008
@@ -1065,17 +1071,17 @@ def validate_metadata_sign(xml, cert=None, fingerprint=None, fingerprintalg='sha
10651071 elem = xml
10661072 elif isinstance (xml , Document ):
10671073 xml = xml .toxml ()
1068- elem = fromstring (str (xml ))
1074+ elem = fromstring (str (xml ), forbid_dtd = True )
10691075 elif isinstance (xml , Element ):
10701076 xml .setAttributeNS (
10711077 unicode (OneLogin_Saml2_Constants .NS_MD ),
10721078 'xmlns:md' ,
10731079 unicode (OneLogin_Saml2_Constants .NS_MD )
10741080 )
10751081 xml = xml .toxml ()
1076- elem = fromstring (str (xml ))
1082+ elem = fromstring (str (xml ), forbid_dtd = True )
10771083 elif isinstance (xml , basestring ):
1078- elem = fromstring (str (xml ))
1084+ elem = fromstring (str (xml ), forbid_dtd = True )
10791085 else :
10801086 raise Exception ('Error parsing xml string' )
10811087
0 commit comments