def parse_soap_enveloped_saml(text, body_class, header_class=None): """Parses a SOAP enveloped SAML thing and returns header parts and body :param text: The SOAP object as XML :return: header parts and body as saml.samlbase instances """ envelope = ElementTree.fromstring(text) assert envelope.tag == '{%s}Envelope' % NAMESPACE #print len(envelope) body = None header = {} for part in envelope: #print ">",part.tag if part.tag == '{%s}Body' % NAMESPACE: for sub in part: try: body = saml2.create_class_from_element_tree(body_class, sub) except Exception: raise Exception( "Wrong body type (%s) in SOAP envelope" % sub.tag) elif part.tag == '{%s}Header' % NAMESPACE: if not header_class: raise Exception("Header where I didn't expect one") #print "--- HEADER ---" for sub in part: #print ">>",sub.tag for klass in header_class: #print "?{%s}%s" % (klass.c_namespace,klass.c_tag) if sub.tag == "{%s}%s" % (klass.c_namespace, klass.c_tag): header[sub.tag] = \ saml2.create_class_from_element_tree(klass, sub) break return body, header
def parse_soap_enveloped_saml(text, body_class, header_class=None): """Parses a SOAP enveloped SAML thing and returns header parts and body :param text: The SOAP object as XML :return: header parts and body as saml.samlbase instances """ envelope = defusedxml.ElementTree.fromstring(text) envelope_tag = "{%s}Envelope" % NAMESPACE if envelope.tag != envelope_tag: raise ValueError( "Invalid envelope tag '{invalid}' should be '{valid}'".format( invalid=envelope.tag, valid=envelope_tag ) ) # print(len(envelope)) body = None header = {} for part in envelope: # print(">",part.tag) if part.tag == '{%s}Body' % NAMESPACE: for sub in part: try: body = saml2.create_class_from_element_tree( body_class, sub) except Exception: raise Exception( "Wrong body type (%s) in SOAP envelope" % sub.tag) elif part.tag == '{%s}Header' % NAMESPACE: if not header_class: raise Exception("Header where I didn't expect one") # print("--- HEADER ---") for sub in part: # print(">>",sub.tag) for klass in header_class: # print("?{%s}%s" % (klass.c_namespace,klass.c_tag)) if sub.tag == "{%s}%s" % (klass.c_namespace, klass.c_tag): header[sub.tag] = \ saml2.create_class_from_element_tree(klass, sub) break return body, header
def instanciate_class(item, modules): m = NS_AND_TAG.match(item.tag) ns, tag = m.groups() for module in modules: if module.NAMESPACE == ns: try: target = module.ELEMENT_BY_TAG[tag] return create_class_from_element_tree(target, item) except KeyError: continue raise Exception("Unknown class: ns='%s', tag='%s'" % (ns, tag))
raise XmlParseError("%s" % exc) assert envelope.tag == '{%s}Envelope' % soapenv.NAMESPACE assert len(envelope) >= 1 env = {"header":[], "body":None} for part in envelope: if part.tag == '{%s}Body' % soapenv.NAMESPACE: assert len(part) == 1 m = NS_AND_TAG.match(part[0].tag) ns,tag = m.groups() for module in modules: if module.NAMESPACE == ns: try: target = module.ELEMENT_BY_TAG[tag] env["body"] = create_class_from_element_tree(target, part[0]) except KeyError: continue elif part.tag == "{%s}Header" % soapenv.NAMESPACE: for item in part: m = NS_AND_TAG.match(item.tag) ns,tag = m.groups() for module in modules: if module.NAMESPACE == ns: try: target = module.ELEMENT_BY_TAG[tag] env["header"].append(create_class_from_element_tree( target, item)) except KeyError: continue
raise XmlParseError("%s" % exc) assert envelope.tag == '{%s}Envelope' % soapenv.NAMESPACE assert len(envelope) >= 1 env = {"header": [], "body": None} for part in envelope: if part.tag == '{%s}Body' % soapenv.NAMESPACE: assert len(part) == 1 m = NS_AND_TAG.match(part[0].tag) ns, tag = m.groups() for module in modules: if module.NAMESPACE == ns: try: target = module.ELEMENT_BY_TAG[tag] env["body"] = create_class_from_element_tree( target, part[0]) except KeyError: continue elif part.tag == "{%s}Header" % soapenv.NAMESPACE: for item in part: m = NS_AND_TAG.match(item.tag) ns, tag = m.groups() for module in modules: if module.NAMESPACE == ns: try: target = module.ELEMENT_BY_TAG[tag] env["header"].append( create_class_from_element_tree(target, item)) except KeyError: continue