static void accept_events_call(WsmanMessage *wsman_msg,char* ip_addr) { char *buf = NULL; char *messageid; int len; WsXmlDocH ackdoc = NULL; WsXmlDocH in_doc = wsman_build_inbound_envelope(wsman_msg); WsXmlNodeH header = ws_xml_get_soap_header(in_doc); WsXmlNodeH acknode = ws_xml_get_child(header, 0, XML_NS_WS_MAN, WSM_ACKREQUESTED); if(acknode) { ackdoc = ws_xml_create_envelope(); messageid = ws_xml_get_node_text(ws_xml_get_child(header, 0, XML_NS_ADDRESSING, WSA_MESSAGE_ID)); header = ws_xml_get_soap_header(ackdoc); ws_xml_add_child(header, XML_NS_ADDRESSING, WSA_TO, WSA_TO_ANONYMOUS); ws_xml_add_child(header, XML_NS_ADDRESSING, WSA_RELATES_TO, messageid); ws_xml_add_child(header, XML_NS_ADDRESSING, WSA_ACTION, WSMAN_ACTION_ACK); ws_xml_dump_memory_enc(ackdoc, &buf, &len, wsman_msg->charset); u_buf_set(wsman_msg->response, buf, len); ws_xml_destroy_doc(ackdoc); u_free(buf); } if(listener->eventf) listener->eventf(in_doc, listener->data,ip_addr); ws_xml_destroy_doc(in_doc); }
int outbound_addressing_filter(SoapOpH opHandle, void *data, void *opaqueData) { WsXmlDocH in_doc = soap_get_op_doc(opHandle, 1); WsXmlDocH out_doc = soap_get_op_doc(opHandle, 0); WsXmlNodeH outHeaders = wsman_get_soap_header_element(out_doc, NULL, NULL); if (!outHeaders) { return 0; } if (ws_xml_get_child(outHeaders, 0, XML_NS_ADDRESSING, WSA_MESSAGE_ID) == NULL && !wsman_is_identify_request(in_doc)) { char uuidBuf[100]; generate_uuid(uuidBuf, sizeof(uuidBuf), 0); ws_xml_add_child(outHeaders, XML_NS_ADDRESSING, WSA_MESSAGE_ID, uuidBuf); debug("Adding message id: %s", uuidBuf); } if (in_doc != NULL) { WsXmlNodeH inMsgIdNode; inMsgIdNode = wsman_get_soap_header_element(in_doc,XML_NS_ADDRESSING, WSA_MESSAGE_ID); if (inMsgIdNode != NULL && !ws_xml_get_child(outHeaders, 0, XML_NS_ADDRESSING, WSA_RELATES_TO)) { ws_xml_add_child(outHeaders, XML_NS_ADDRESSING, WSA_RELATES_TO, ws_xml_get_node_text(inMsgIdNode)); } } return 0; }
void wsman_add_selector(WsXmlNodeH baseNode, const char *name, const char *val) { WsXmlNodeH selector = NULL; WsXmlDocH epr = NULL; WsXmlNodeH set = ws_xml_get_child(baseNode, 0, XML_NS_WS_MAN, WSM_SELECTOR_SET); if (val && strstr(val, WSA_EPR)) { epr = ws_xml_read_memory(val, strlen(val), NULL, 0); } if (set || (set = ws_xml_add_child(baseNode, XML_NS_WS_MAN, WSM_SELECTOR_SET, NULL))) { if (epr) { if ((selector = ws_xml_add_child(set, XML_NS_WS_MAN, WSM_SELECTOR, NULL))) { ws_xml_duplicate_tree(selector, ws_xml_get_doc_root(epr)); ws_xml_add_node_attr(selector, NULL, WSM_NAME, name); } } else { if ((selector = ws_xml_add_child(set, XML_NS_WS_MAN, WSM_SELECTOR, val))) { ws_xml_add_node_attr(selector, NULL, WSM_NAME, name); } } } return; }
static void generate_notunderstood_fault(op_t * op, WsXmlNodeH notUnderstoodHeader) { WsXmlNodeH child; WsXmlNodeH header; if (op->in_doc == NULL) return; generate_op_fault(op, SOAP_FAULT_MUSTUNDERSTAND, 0); if (op->out_doc != NULL) { header = ws_xml_get_soap_header(op->out_doc); if (header) { child = ws_xml_add_child(header, XML_NS_SOAP_1_2, "NotUnderstood", NULL); ws_xml_add_qname_attr(child, NULL, "qname", ws_xml_get_node_name_ns (notUnderstoodHeader), ws_xml_get_node_local_name (notUnderstoodHeader)); } } else { error("cant generate fault"); } return; }
/** * Change Endpoint Reference from request to response format * @param dstHeader Destination header * @param epr The Endpoint Reference */ static void wsman_epr_from_request_to_response(WsXmlNodeH dstHeader, WsXmlNodeH epr) { int i; WsXmlNodeH child; WsXmlNodeH node = !epr ? NULL : ws_xml_get_child(epr, 0, XML_NS_ADDRESSING, WSA_ADDRESS); ws_xml_add_child(dstHeader, XML_NS_ADDRESSING, WSA_TO, !node ? WSA_TO_ANONYMOUS : ws_xml_get_node_text(node)); if (!epr) goto cleanup; if ((node = ws_xml_get_child(epr, 0, XML_NS_ADDRESSING, WSA_REFERENCE_PROPERTIES))) { for (i = 0; (child = ws_xml_get_child(node, i, NULL, NULL)) != NULL; i++) { ws_xml_duplicate_tree(dstHeader, child); } } if ((node = ws_xml_get_child(epr, 0, XML_NS_ADDRESSING, WSA_REFERENCE_PARAMETERS))) { for (i = 0; (child = ws_xml_get_child(node, i, NULL, NULL)) != NULL; i++) { ws_xml_duplicate_tree(dstHeader, child); } } cleanup: return; }
/** * Create an empty envelope with a <b>Header</b> and a <b>Body</b> * @param soap Soap handler * @param soapVersion The SOAP version to be used for creating the envelope * @return An XMl document */ WsXmlDocH ws_xml_create_envelope( void ) { WsXmlDocH doc = NULL; if ((doc = ws_xml_create_doc(XML_NS_SOAP_1_2, SOAP_ENVELOPE)) != NULL) { WsXmlNodeH root = ws_xml_get_doc_root(doc); if (root == NULL || ws_xml_add_child(root, XML_NS_SOAP_1_2, "Header", NULL) == NULL || ws_xml_add_child(root, XML_NS_SOAP_1_2, "Body", NULL) == NULL) { ws_xml_destroy_doc(doc); doc = NULL; } } return doc; }
/** * Create a response SOAP envelope * @param rqstDoc The XML document of the request * @param action the Response action * @return Response envelope */ WsXmlDocH wsman_create_response_envelope(WsXmlDocH rqstDoc, const char *action) { WsXmlDocH doc = ws_xml_create_envelope(); WsXmlNodeH dstHeader, srcHeader, srcNode; if (wsman_is_identify_request(rqstDoc)) return doc; if (!doc) return NULL; dstHeader = ws_xml_get_soap_header(doc); srcHeader = ws_xml_get_soap_header(rqstDoc); srcNode = ws_xml_get_child(srcHeader, 0, XML_NS_ADDRESSING, WSA_REPLY_TO); wsman_epr_from_request_to_response(dstHeader, srcNode); if (action != NULL) { ws_xml_add_child(dstHeader, XML_NS_ADDRESSING, WSA_ACTION, action); } else { if ((srcNode = ws_xml_get_child(srcHeader, 0, XML_NS_ADDRESSING, WSA_ACTION)) != NULL) { if ((action = ws_xml_get_node_text(srcNode)) != NULL) { size_t len = strlen(action) + sizeof(WSFW_RESPONSE_STR) + 2; char *tmp = (char *) u_malloc(sizeof(char) * len); if (tmp && action) { sprintf(tmp, "%s%s", action, WSFW_RESPONSE_STR); ws_xml_add_child(dstHeader, XML_NS_ADDRESSING, WSA_ACTION, tmp); u_free(tmp); } } } } if ((srcNode = ws_xml_get_child(srcHeader, 0, XML_NS_ADDRESSING, WSA_MESSAGE_ID)) != NULL) { ws_xml_add_child(dstHeader, XML_NS_ADDRESSING, WSA_RELATES_TO, ws_xml_get_node_text(srcNode)); } return doc; }
/** * Build SOAP Fault * @param soapNsUri SOAP Namespace URI * @param faultNsUri Fault Namespace URI * @param code Fault code * @param subCode Fault Subcode * @param reason Fault Reson * @param detail Fault Details * @return Fault XML document */ WsXmlDocH wsman_build_soap_fault(const char *soapNsUri, const char *faultNsUri, const char *code, const char *subCode, const char *reason, const char *detail) { WsXmlDocH doc; if (faultNsUri == NULL) faultNsUri = soapNsUri; if ((doc = ws_xml_create_doc( soapNsUri, SOAP_ENVELOPE)) != NULL) { WsXmlNodeH node, root, fault, body; root = ws_xml_get_doc_root(doc); body = ws_xml_add_child(root, soapNsUri, SOAP_BODY, NULL); ws_xml_define_ns(root, soapNsUri, NULL, 0); ws_xml_define_ns(root, XML_NS_ADDRESSING, NULL, 0); ws_xml_define_ns(root, XML_NS_XML_NAMESPACES, NULL, 0); if (strcmp(soapNsUri, faultNsUri) != 0) ws_xml_define_ns(root, faultNsUri, NULL, 0); if (body && (fault = ws_xml_add_child(body, soapNsUri, SOAP_FAULT, NULL))) { if (code != NULL && (node = ws_xml_add_child(fault, soapNsUri, SOAP_CODE, NULL)) != NULL) { ws_xml_add_qname_child(node, soapNsUri, SOAP_VALUE, soapNsUri, code); if (subCode != NULL && (node = ws_xml_add_child(node, soapNsUri, SOAP_SUBCODE, NULL)) != NULL) { ws_xml_add_qname_child(node, soapNsUri, SOAP_VALUE, faultNsUri, subCode); } } if (reason && (node = ws_xml_add_child(fault, soapNsUri, SOAP_REASON, NULL))) { node = ws_xml_add_child(node, soapNsUri, SOAP_TEXT, reason); ws_xml_add_node_attr(node, XML_NS_XML_NAMESPACES, SOAP_LANG, "en"); } if (detail) { ws_xml_add_child(fault, soapNsUri, SOAP_DETAIL, detail); } } } return doc; }
/** * Add QName child * @param parent Parent XML node * @param nameNs Child Namespace * @param name Child Name * @param valueNs Namespace for value * @param value Child Value * @return Child XML node * @note if namespaces has been changed after this function is called, it is caller's * responsibility to update QName fields accordingly * */ WsXmlNodeH ws_xml_add_qname_child(WsXmlNodeH parent, const char *nameNs, const char *name, const char *valueNs, const char *value) { WsXmlNodeH node = ws_xml_add_child(parent, nameNs, name, NULL); if (node == NULL) { ws_xml_set_node_qname_val(node, valueNs, value); } return node; }
void wsman_add_properties (WsXmlNodeH baseNode, const char* uri, const char *name, void* val) { WsXmlNodeH node = NULL; WsXmlDocH doc = NULL; int i; property_t* properties = (property_t*)val; for (i = 0; i < properties->count; i++) { char* val = properties->p_value [i]; /* try constructing xml node from the value, if success, value is XML object, if not its a string */ doc = ws_xml_read_memory(val, strlen(val), NULL, 0); if (doc != NULL) { int prefixindex; node = ws_xml_get_doc_root(doc); /* since xml doc is constructed from string it does not have the default prefix index, so scan for default prefix index and set it */ for (prefixindex = 1; prefixindex < 256; prefixindex++) { char prefix [12]; WsXmlNodeH pnode; sprintf(prefix, "n%d", prefixindex); pnode = (WsXmlNodeH)ws_xml_find_ns (node, NULL, prefix, 1); if (pnode == NULL) { break; } } doc->prefixIndex = prefixindex - 1; ws_xml_set_node_name (node, uri, name); ws_xml_duplicate_tree(baseNode, node); ws_xml_destroy_doc (doc); } else { ws_xml_add_child(baseNode, uri, name, val); } } free (properties->p_value); free (properties); return; }
int epr_serialize(WsXmlNodeH node, const char *ns, const char *epr_node_name, epr_t *epr, int embedded) { int i; WsXmlNodeH eprnode = NULL; WsXmlNodeH refparamnode = NULL; WsXmlNodeH selectorsetnode = NULL; Selector *p = NULL; if(epr == NULL) return 0; if(epr_node_name) { eprnode = ws_xml_add_child(node, ns, epr_node_name, NULL); } else eprnode = node; if(embedded) ws_xml_add_child(eprnode, XML_NS_ADDRESSING, WSA_ADDRESS, epr->address); else ws_xml_add_child(eprnode, XML_NS_ADDRESSING, WSA_TO, epr->address); if(embedded) refparamnode = ws_xml_add_child(eprnode, XML_NS_ADDRESSING, WSA_REFERENCE_PARAMETERS, NULL); else refparamnode = node; ws_xml_add_child(refparamnode, XML_NS_WS_MAN, WSM_RESOURCE_URI, epr->refparams.uri); selectorsetnode = ws_xml_add_child(refparamnode, XML_NS_WS_MAN, WSM_SELECTOR_SET, NULL); p = epr->refparams.selectorset.selectors; for(i = 0; i < epr->refparams.selectorset.count; i++) { WsXmlNodeH temp = NULL; if(p->type == 0) temp = ws_xml_add_child(selectorsetnode, XML_NS_WS_MAN, WSM_SELECTOR, p->value); else { temp = ws_xml_add_child(selectorsetnode, XML_NS_WS_MAN, WSM_SELECTOR, NULL); epr_serialize(temp, XML_NS_ADDRESSING, WSA_EPR, (epr_t *)p->value, 1); } ws_xml_add_node_attr(temp, NULL, WSM_NAME, p->name); p++; } return 0; }
static void cimxml_build_response_msg(WsXmlDocH indoc, WsXmlDocH *outdoc) { WsXmlDocH doc = NULL; WsXmlNodeH outnode = NULL; WsXmlNodeH innode = NULL; WsXmlNodeH temp = NULL; WsXmlNodeH temp2 = NULL; doc = ws_xml_create_doc(NULL, CIMXML_CIM); outnode = ws_xml_get_doc_root(doc); innode = ws_xml_get_doc_root(indoc); // char *value = ws_xml_get_node_attr(WsXmlNodeH node, int index) ws_xml_add_node_attr(outnode, NULL, CIMXML_CIMVERSION, "2.0"); ws_xml_add_node_attr(outnode, NULL, CIMXML_DTDVERSION, "2.0"); outnode = ws_xml_add_child(outnode, NULL, CIMXML_MESSAGE, NULL); innode = ws_xml_get_child(innode, 0, NULL, CIMXML_MESSAGE); int n = ws_xml_get_node_attr_count(innode); int i = 0; while(i < n) { WsXmlAttrH attr = ws_xml_get_node_attr(innode, i); char *name = ws_xml_get_attr_name(attr); char *value = ws_xml_get_attr_value(attr); ws_xml_add_node_attr(outnode, NULL, name, value); i++; } temp = ws_xml_get_child(innode, 0, NULL, CIMXML_SIMPLEEXPREQ); if(temp) { outnode = ws_xml_add_child(outnode, NULL, CIMXML_SIMPLEEXPRSP, NULL); outnode = ws_xml_add_child(outnode, NULL, CIMXML_EXPMETHODRESPONSE, NULL); ws_xml_add_node_attr(outnode, NULL, CIMXML_NAME, "ExportIndication"); ws_xml_add_child(outnode, NULL, CIMXML_IRETURNVALUE, NULL); } else { temp = ws_xml_get_child(innode, 0, NULL, CIMXML_MULTIEXPREQ); outnode = ws_xml_add_child(outnode, NULL, CIMXML_MULTIEXPRSQ, NULL); n = ws_xml_get_child_count(temp); i = 0; while(i < n) { innode = ws_xml_get_child(temp, i, NULL, CIMXML_SIMPLEEXPREQ); temp2 = ws_xml_add_child(outnode, NULL, CIMXML_EXPMETHODRESPONSE, NULL); ws_xml_add_node_attr(temp2, NULL, CIMXML_NAME, "ExportIndication"); ws_xml_add_child(temp2, NULL, CIMXML_IRETURNVALUE, NULL); i++; } } *outdoc = doc; }
/** * Duplication complete XML tree * @param dstNode Destination XML node * @param srcNode Source XML node */ void ws_xml_duplicate_tree(WsXmlNodeH dstNode, WsXmlNodeH srcNode) { WsXmlNodeH node; if (!srcNode || !dstNode) { error("NULL arguments: dst = %p; src = %p", dstNode, srcNode); return; } node = ws_xml_add_child(dstNode, ws_xml_get_node_name_ns(srcNode), ws_xml_get_node_local_name(srcNode), NULL); if (!node) { error("could not add node"); return; } ws_xml_duplicate_attr(node, srcNode); if (ws_xml_duplicate_children(node, srcNode) == 0) { // no children ws_xml_set_node_text(node, ws_xml_get_node_text(srcNode)); } }
static void wsman_set_enumeration_options(WsManClient * cl, WsXmlNodeH body, const char* resource_uri, client_opt_t *options, filter_t *filter) { WsXmlNodeH node = ws_xml_get_child(body, 0, NULL, NULL); if ((options->flags & FLAG_ENUMERATION_OPTIMIZATION) == FLAG_ENUMERATION_OPTIMIZATION) { ws_xml_add_child(node, XML_NS_WS_MAN, WSM_OPTIMIZE_ENUM, NULL); } if ((options->flags & FLAG_ENUMERATION_ENUM_EPR) == FLAG_ENUMERATION_ENUM_EPR) { ws_xml_add_child(node, XML_NS_WS_MAN, WSM_ENUM_MODE, WSM_ENUM_EPR); } else if ((options->flags & FLAG_ENUMERATION_ENUM_OBJ_AND_EPR) == FLAG_ENUMERATION_ENUM_OBJ_AND_EPR) { ws_xml_add_child(node, XML_NS_WS_MAN, WSM_ENUM_MODE, WSM_ENUM_OBJ_AND_EPR); } // Polymorphism if ((options->flags & FLAG_IncludeSubClassProperties) == FLAG_IncludeSubClassProperties) { ws_xml_add_child(node, XML_NS_CIM_BINDING, WSMB_POLYMORPHISM_MODE, WSMB_INCLUDE_SUBCLASS_PROP); } else if ((options->flags & FLAG_ExcludeSubClassProperties) == FLAG_ExcludeSubClassProperties) { ws_xml_add_child(node, XML_NS_CIM_BINDING, WSMB_POLYMORPHISM_MODE, WSMB_EXCLUDE_SUBCLASS_PROP); } else if ((options->flags & FLAG_POLYMORPHISM_NONE) == FLAG_POLYMORPHISM_NONE) { ws_xml_add_child(node, XML_NS_CIM_BINDING, WSMB_POLYMORPHISM_MODE, "None"); } if (filter != NULL) { filter_serialize(node, filter, XML_NS_WS_MAN); } return; }
static void wsman_set_subscribe_options(WsManClient * cl, WsXmlDocH request, const char* resource_uri, client_opt_t *options, filter_t *filter) { WsXmlNodeH body = ws_xml_get_soap_body(request); WsXmlNodeH header = ws_xml_get_soap_header(request); WsXmlNodeH node = NULL, temp = NULL, node2 = NULL, node3 = NULL; char buf[32]; if(options->delivery_certificatethumbprint ||options->delivery_password || options->delivery_password) { node = ws_xml_add_child(header, XML_NS_TRUST, WST_ISSUEDTOKENS, NULL); ws_xml_add_node_attr(node, XML_NS_SOAP_1_2, SOAP_MUST_UNDERSTAND, "true"); if(options->delivery_certificatethumbprint) { node2 = ws_xml_add_child(node, XML_NS_TRUST, WST_REQUESTSECURITYTOKENRESPONSE, NULL); ws_xml_add_child(node2, XML_NS_TRUST, WST_TOKENTYPE,WST_CERTIFICATETHUMBPRINT ); node3 = ws_xml_add_child(node2, XML_NS_TRUST, WST_REQUESTEDSECURITYTOKEN, NULL); ws_xml_add_child(node3, XML_NS_WS_MAN, WSM_CERTIFICATETHUMBPRINT, options->delivery_certificatethumbprint); node3 = ws_xml_add_child(node2, XML_NS_POLICY, WSP_APPLIESTO, NULL); node3 = ws_xml_add_child(node3, XML_NS_ADDRESSING, WSA_EPR, NULL); ws_xml_add_child(node3, XML_NS_ADDRESSING, WSA_ADDRESS, options->delivery_uri); } if(options->delivery_username || options->delivery_password) { node2 = ws_xml_add_child(node, XML_NS_TRUST, WST_REQUESTSECURITYTOKENRESPONSE, NULL); ws_xml_add_child(node2, XML_NS_TRUST, WST_TOKENTYPE,WST_USERNAMETOKEN); node3 = ws_xml_add_child(node2, XML_NS_TRUST, WST_REQUESTEDSECURITYTOKEN, NULL); node3 = ws_xml_add_child(node3, XML_NS_SE, WSSE_USERNAMETOKEN, NULL); if(options->delivery_username) ws_xml_add_child(node3, XML_NS_SE, WSSE_USERNAME, options->delivery_username); if(options->delivery_password) ws_xml_add_child(node3, XML_NS_SE, WSSE_PASSWORD, options->delivery_password); node3 = ws_xml_add_child(node2, XML_NS_POLICY, WSP_APPLIESTO, NULL); node3 = ws_xml_add_child(node3, XML_NS_ADDRESSING, WSA_EPR, NULL); ws_xml_add_child(node3, XML_NS_ADDRESSING, WSA_ADDRESS, options->delivery_uri); } } node = ws_xml_add_child(body, XML_NS_EVENTING, WSEVENT_SUBSCRIBE,NULL); temp = ws_xml_add_child(node, XML_NS_EVENTING, WSEVENT_DELIVERY, NULL); if(temp) { ws_xml_add_node_attr(temp, NULL, WSEVENT_DELIVERY_MODE, wsmc_create_delivery_mode_str(options->delivery_mode)); if(options->delivery_uri) { node2 = ws_xml_add_child(temp, XML_NS_EVENTING, WSEVENT_NOTIFY_TO, NULL); ws_xml_add_child(node2, XML_NS_ADDRESSING, WSA_ADDRESS, options->delivery_uri); } if(options->delivery_sec_mode) { temp = ws_xml_add_child(temp, XML_NS_WS_MAN, WSM_AUTH, NULL); ws_xml_add_node_attr(temp, NULL, WSM_PROFILE, wsmc_create_delivery_sec_mode_str(options->delivery_sec_mode)); } if(options->heartbeat_interval) { snprintf(buf, 32, "PT%fS", options->heartbeat_interval); ws_xml_add_child(temp, XML_NS_WS_MAN, WSM_HEARTBEATS, buf); } if(options->reference) { WsXmlDocH doc = ws_xml_read_memory( options->reference, strlen(options->reference), "UTF-8", 0); node3 = ws_xml_get_doc_root(doc); temp = ws_xml_add_child(node2, XML_NS_ADDRESSING, WSA_REFERENCE_PROPERTIES, NULL); if(temp) ws_xml_duplicate_tree(temp, node3); } } if (options->expires) { snprintf(buf, 32, "PT%fS", options->expires); ws_xml_add_child(node, XML_NS_EVENTING, WSEVENT_EXPIRES, buf); } if (filter) { filter_serialize(node, filter, XML_NS_WS_MAN); } if (options->flags & FLAG_EVENT_SENDBOOKMARK) { ws_xml_add_child(node, XML_NS_WS_MAN, WSM_SENDBOOKMARKS, NULL); } }
/** * Create a Fault * @param rqstDoc Request document (Envelope) * @param code Fault code * @param subCodeNs Namespace of sub code * @param subCode Sub code * @param lang Language for Reason section * @param reason Fault Reason * @param addDetailProc Callback for details * @param addDetailProcData Pointer to callback data * @return XML document of the fault */ WsXmlDocH wsman_create_fault_envelope(WsXmlDocH rqstDoc, const char *code, const char *subCodeNs, const char *subCode, const char *fault_action, const char *lang, const char *reason, const char *faultDetail) { WsXmlDocH doc = NULL; WsXmlNodeH header, body, fault, codeNode, node; char uuidBuf[50]; char *soapNs; if (rqstDoc) { doc = wsman_create_response_envelope(rqstDoc, fault_action); } else { /* FIXME */ doc = ws_xml_create_envelope(); } if (doc == NULL) { return NULL; } header = ws_xml_get_soap_header(doc); body = ws_xml_get_soap_body(doc); soapNs = ws_xml_get_node_name_ns(body); fault = ws_xml_add_child(body, soapNs, SOAP_FAULT, NULL); codeNode = ws_xml_add_child(fault, soapNs, SOAP_CODE, NULL); node = ws_xml_add_child(codeNode, soapNs, SOAP_VALUE, NULL); ws_xml_set_node_qname_val(node, soapNs, code); if (subCode && subCode[0] != 0 ) { node = ws_xml_add_child(codeNode, soapNs, SOAP_SUBCODE, NULL); node = ws_xml_add_child(node, soapNs, SOAP_VALUE, NULL); if (subCodeNs) ws_xml_set_node_qname_val(node, subCodeNs, subCode); else ws_xml_set_node_text(node, subCode); } if (reason) { node = ws_xml_add_child(fault, soapNs, SOAP_REASON, NULL); node = ws_xml_add_child(node, soapNs, SOAP_TEXT, NULL); ws_xml_set_node_text(node, reason); ws_xml_set_node_lang(node, !lang ? "en" : lang); } if (faultDetail) { WsXmlNodeH d = ws_xml_add_child(fault, soapNs, SOAP_DETAIL, NULL); node = ws_xml_add_child_format(d, XML_NS_WS_MAN, SOAP_FAULT_DETAIL, "%s/%s", XML_NS_WSMAN_FAULT_DETAIL, faultDetail); } generate_uuid(uuidBuf, sizeof(uuidBuf), 0); ws_xml_add_child(header, XML_NS_ADDRESSING, WSA_MESSAGE_ID, uuidBuf); return doc; }
static WsXmlDocH wsmc_build_envelope(WsSerializerContextH serctx, const char *action, const char *reply_to_uri, const char *resource_uri, const char *to_uri, client_opt_t *options) { WsXmlNodeH node; char uuidBuf[100]; WsXmlNodeH header; WsXmlDocH doc = ws_xml_create_envelope(); if (!doc) { error("Error while creating envelope"); return NULL; } header = ws_xml_get_soap_header(doc); generate_uuid(uuidBuf, sizeof(uuidBuf), 0); if (reply_to_uri == NULL) { reply_to_uri = WSA_TO_ANONYMOUS; } if (to_uri == NULL) { to_uri = WSA_TO_ANONYMOUS; } if (action != NULL) { ws_serialize_str(serctx, header, (char *)action, XML_NS_ADDRESSING, WSA_ACTION, 1); } if (to_uri) { ws_serialize_str(serctx, header, (char *)to_uri, XML_NS_ADDRESSING, WSA_TO, 1); } if (resource_uri) { ws_serialize_str(serctx, header, (char *)resource_uri, XML_NS_WS_MAN, WSM_RESOURCE_URI, 1); } if (uuidBuf[0] != 0) { ws_serialize_str(serctx, header, uuidBuf, XML_NS_ADDRESSING, WSA_MESSAGE_ID, 1); } if (options->timeout) { /* FIXME: see wsman-xml-serialize.c */ char buf[20]; sprintf(buf, "PT%u.%uS", (unsigned int) options->timeout / 1000, (unsigned int) options->timeout % 1000); ws_serialize_str(serctx, header, buf, XML_NS_WS_MAN, WSM_OPERATION_TIMEOUT, 0); } if (options->max_envelope_size) { ws_serialize_uint32(serctx, header, options->max_envelope_size, XML_NS_WS_MAN, WSM_MAX_ENVELOPE_SIZE, options->flags & FLAG_MUND_MAX_ESIZE); } if (options->fragment) { int mu = 0; if ((options->flags & FLAG_MUND_FRAGMENT) == FLAG_MUND_FRAGMENT) mu = 1; ws_serialize_str(serctx, header, options->fragment, XML_NS_WS_MAN, WSM_FRAGMENT_TRANSFER, 1); } node = ws_xml_add_child(header, XML_NS_ADDRESSING, WSA_REPLY_TO, NULL); ws_xml_add_child(node, XML_NS_ADDRESSING, WSA_ADDRESS, (char *)reply_to_uri); /* Do not add the selectors to the header for reference instances */ if ((options->flags & FLAG_CIM_REFERENCES) != FLAG_CIM_REFERENCES) { wsmc_add_selector_from_options(doc, options); if (options->cim_ns) { wsman_add_selector(header, CIM_NAMESPACE_SELECTOR, options->cim_ns); } } return doc; }
int Redirect_Enumerate_EP(WsContextH cntx, WsEnumerateInfo* enumInfo, WsmanStatus *status, void *opaqueData) { WsXmlNodeH r_header=NULL, r_node=NULL, r_body=NULL, r_opt=NULL; WsXmlDocH r_response=NULL; char *resource_uri, *remote_enumContext; int op; WsManClient *cl=NULL; //The redirected Enumeration request must have RequestTotalItemsCountEstimate enabled r_header = ws_xml_get_soap_header(cntx->indoc); if ( (r_node = ws_xml_get_child(r_header,0,XML_NS_WS_MAN, WSM_REQUEST_TOTAL )) == NULL ) ws_xml_add_child(r_header, XML_NS_WS_MAN, WSM_REQUEST_TOTAL, NULL); cl = setup_redirect_client(cntx, enumInfo->auth_data.username, enumInfo->auth_data.password); //Set the enumInfo flags based on the indoc. This is required while handling the response in wsenum_eunmerate_stub r_body=ws_xml_get_soap_body(cntx->indoc); if ( ( r_node = ws_xml_get_child(r_body ,0, XML_NS_ENUMERATION, WSENUM_ENUMERATE )) != NULL ) { if ( (r_opt = ws_xml_get_child(r_node,0,XML_NS_WS_MAN,WSM_OPTIMIZE_ENUM )) != NULL ) enumInfo->flags |= WSMAN_ENUMINFO_OPT ; } wsman_send_request(cl,cntx->indoc); if (wsmc_get_last_error(cl) != WS_LASTERR_OK ){ //CURL or HTTP errors enumInfo->pullResultPtr = NULL; status->fault_code = WSMAN_INTERNAL_ERROR; status->fault_detail_code = 0; status->fault_msg = redirect_fault_msg( wsman_transport_get_last_error_string( wsmc_get_last_error(cl) ) ); return 1; } r_response = ws_xml_duplicate_doc(wsmc_build_envelope_from_response(cl)); if ( wsman_is_fault_envelope(r_response)){ enumInfo->pullResultPtr = NULL; wsman_get_fault_status_from_doc(r_response, status); return 1; } //Get the Estimated Total No.of Items from the response. r_header=ws_xml_get_soap_header(r_response); r_node=ws_xml_get_child(r_header,0,XML_NS_WS_MAN, WSM_TOTAL_ESTIMATE ); enumInfo->totalItems=(!r_node) ? 0: atoi(ws_xml_get_node_text(r_node)); //Get the remote context remote_enumContext = wsmc_get_enum_context(r_response); //Set the pullResultPtr only if some Enum Items are returned, in optimized mode. r_body= ws_xml_get_soap_body(r_response); if ( (r_node = ws_xml_get_child(r_body,0,XML_NS_ENUMERATION, WSENUM_ENUMERATE_RESP )) != NULL && ( ws_xml_get_child(r_node,0,XML_NS_WS_MAN,WSENUM_ITEMS) != NULL) ) { enumInfo->pullResultPtr = r_response; if( strlen(remote_enumContext) != 0 ) strncpy(enumInfo->enumId, remote_enumContext, strlen(remote_enumContext)+1); else // If all the instances are returned, the context will be NULL enumInfo->enumId[0]='\0'; } else{ //If not items are returned, set the context and return. strncpy(enumInfo->enumId, remote_enumContext, strlen(remote_enumContext)+1); ws_xml_destroy_doc(r_response); } wsmc_release(cl); return 0; }
static WsNotificationInfoH create_notification_entity(WsSubscribeInfo *subsInfo, WsXmlNodeH node) { char *classname = NULL; char *class_namespace = NULL; WsXmlNodeH indicationnode = NULL; WsNotificationInfoH notificationinfo = NULL; notificationinfo = u_zalloc(sizeof(*notificationinfo)); if (notificationinfo == NULL) { return NULL; } WsXmlNodeH instance = ws_xml_get_child(node, 0, NULL, CIMXML_EXPMETHODCALL); if (instance == NULL) { u_free(notificationinfo); return NULL; } instance = ws_xml_get_child(instance, 0, NULL, CIMXML_EXPPARAMVALUE); if (instance == NULL) { u_free(notificationinfo); return NULL; } instance = ws_xml_get_child(instance, 0, NULL, CIMXML_INSTANCE); if (instance == NULL) { u_free(notificationinfo); return NULL; } WsXmlAttrH attr = ws_xml_find_node_attr(instance, NULL, CIMXML_CLASSNAME); if (attr) { classname = ws_xml_get_attr_value(attr); class_namespace = get_cim_indication_namespace(subsInfo, classname); notificationinfo->EventAction = u_strdup_printf("%s/%s", class_namespace, classname); } notificationinfo->EventContent = ws_xml_create_doc(notificationinfo->EventAction, classname); indicationnode = ws_xml_get_doc_root(notificationinfo->EventContent); //Parse "PROPERTY" int n = 0; while ( (node = ws_xml_get_child(instance, n++, NULL, CIMXML_PROPERTY)) ) { attr = ws_xml_find_node_attr(node, NULL, CIMXML_NAME); char *property = NULL; char *value = NULL; if ( attr ) { property = ws_xml_get_attr_value(attr); } value = ws_xml_get_node_text(node); ws_xml_add_child(indicationnode, notificationinfo->EventAction, property, value); } //Parse "PROPERTY.ARRAY" n = 0; while ( (node = ws_xml_get_child(instance, n++, NULL, CIMXML_PROPERTYARRAY)) ) { attr = ws_xml_find_node_attr(node, NULL, CIMXML_NAME); char *property = NULL; if ( attr ) { property = ws_xml_get_attr_value(attr); WsXmlNodeH valarraynode = ws_xml_get_child(node, 0, NULL, CIMXML_VALUEARRAY); if ( valarraynode ) { int m = 0; WsXmlNodeH valnode = NULL; while ( (valnode = ws_xml_get_child(valarraynode, m++, NULL, CIMXML_VALUE)) ) { char *value = ws_xml_get_node_text(valnode); ws_xml_add_child(indicationnode, notificationinfo->EventAction, property, value); } } } } if (class_namespace) u_free(class_namespace); return notificationinfo; }
WsXmlDocH wsmc_create_request(WsManClient * cl, const char *resource_uri, client_opt_t *options, filter_t *filter, WsmanAction action, char *method, void *data) { WsXmlDocH request; WsXmlNodeH body; WsXmlNodeH header; WsXmlNodeH node; char *_action = NULL; char buf[20]; if (action == WSMAN_ACTION_IDENTIFY) { request = ws_xml_create_envelope(); } else { if (method) { if (strchr(method, '/')) _action = u_strdup(method); else _action = wsman_make_action((char *)resource_uri, method); } else { _action = wsmc_create_action_str(action); } if (_action) { request = wsmc_build_envelope(cl->serctx, _action, WSA_TO_ANONYMOUS, (char *)resource_uri, cl->data.endpoint, options); } else { return NULL; } u_free(_action); } body = ws_xml_get_soap_body(request); header = ws_xml_get_soap_header(request); if (!body || !header ) return NULL; /* * flags to be passed as <w:OptionSet ...> <w:Option Name="..." ...> > */ if (options && (options->flags & (FLAG_CIM_EXTENSIONS|FLAG_EXCLUDE_NIL_PROPS))) { WsXmlNodeH opset = ws_xml_add_child(header, XML_NS_WS_MAN, WSM_OPTION_SET, NULL); if ((options->flags & FLAG_CIM_EXTENSIONS) == FLAG_CIM_EXTENSIONS) { WsXmlNodeH op = ws_xml_add_child(opset, XML_NS_WS_MAN, WSM_OPTION, NULL); ws_xml_add_node_attr(op, NULL, WSM_NAME, WSMB_SHOW_EXTENSION); } if ((options->flags & FLAG_EXCLUDE_NIL_PROPS) == FLAG_EXCLUDE_NIL_PROPS) { /* ExcludeNilProperties is non-standard, so put it under an openwsman namespace */ WsXmlNodeH op = ws_xml_add_child(opset, XML_NS_OPENWSMAN, WSM_OPTION, NULL); ws_xml_add_node_attr(op, NULL, WSM_NAME, WSMB_EXCLUDE_NIL_PROPS); } } switch (action) { case WSMAN_ACTION_IDENTIFY: case WSMAN_ACTION_ANON_IDENTIFY: ws_xml_add_child(body, XML_NS_WSMAN_ID, WSMID_IDENTIFY, NULL); break; case WSMAN_ACTION_CUSTOM: break; case WSMAN_ACTION_ENUMERATION: case WSMAN_ACTION_ASSOCIATORS: case WSMAN_ACTION_REFERENCES: node = ws_xml_add_child(body, XML_NS_ENUMERATION, WSENUM_ENUMERATE, NULL); wsman_set_enumeration_options(cl, body, resource_uri, options, filter); break; case WSMAN_ACTION_PULL: node = ws_xml_add_child(body, XML_NS_ENUMERATION, WSENUM_PULL, NULL); if (data) { ws_xml_add_child(node, XML_NS_ENUMERATION, WSENUM_ENUMERATION_CONTEXT, (char *) data); } break; case WSMAN_ACTION_RELEASE: node = ws_xml_add_child(body, XML_NS_ENUMERATION, WSENUM_RELEASE, NULL); if (data) { ws_xml_add_child(node, XML_NS_ENUMERATION, WSENUM_ENUMERATION_CONTEXT, (char *) data); } break; case WSMAN_ACTION_SUBSCRIBE: wsman_set_subscribe_options(cl, request, resource_uri, options, filter); break; case WSMAN_ACTION_UNSUBSCRIBE: node = ws_xml_add_child(body, XML_NS_EVENTING, WSEVENT_UNSUBSCRIBE,NULL); if(data) { if(((char *)data)[0] != 0) add_subscription_context(ws_xml_get_soap_header(request), (char *)data); } break; case WSMAN_ACTION_RENEW: node = ws_xml_add_child(body, XML_NS_EVENTING, WSEVENT_RENEW, NULL); sprintf(buf, "PT%fS", options->expires); ws_xml_add_child(node, XML_NS_EVENTING, WSEVENT_EXPIRES, buf); if(data) { if(((char *)data)[0] != 0) add_subscription_context(ws_xml_get_soap_header(request), (char *)data); } break; case WSMAN_ACTION_NONE: case WSMAN_ACTION_TRANSFER_CREATE: case WSMAN_ACTION_TEST: case WSMAN_ACTION_TRANSFER_GET: case WSMAN_ACTION_TRANSFER_PUT: case WSMAN_ACTION_TRANSFER_DELETE: break; } if (action == WSMAN_ACTION_PULL || action == WSMAN_ACTION_ENUMERATION) { if (options->max_elements > 0 ) { node = ws_xml_get_child(body, 0, NULL, NULL); if (action == WSMAN_ACTION_ENUMERATION) { if ((options->flags & FLAG_ENUMERATION_OPTIMIZATION) == FLAG_ENUMERATION_OPTIMIZATION ) { /* wsman:MaxElements is for Enumerate */ ws_xml_add_child_format(node, XML_NS_WS_MAN, WSENUM_MAX_ELEMENTS, "%d", options->max_elements); } } else { /* wsen:MaxElements is for Pull */ ws_xml_add_child_format(node, XML_NS_ENUMERATION, WSENUM_MAX_ELEMENTS, "%d", options->max_elements); } } if ((options->flags & FLAG_ENUMERATION_COUNT_ESTIMATION) == FLAG_ENUMERATION_COUNT_ESTIMATION) { ws_xml_add_child(header, XML_NS_WS_MAN, WSM_REQUEST_TOTAL, NULL); } } if (action != WSMAN_ACTION_TRANSFER_CREATE && action != WSMAN_ACTION_TRANSFER_PUT && action != WSMAN_ACTION_CUSTOM) { if ((options->flags & FLAG_DUMP_REQUEST) == FLAG_DUMP_REQUEST) { ws_xml_dump_node_tree(cl->dumpfile, ws_xml_get_doc_root(request)); } } return request; }