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; }
/** * 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; }
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; }
/** * Duplicate an XML attribute * @param dstNode Destination XML node * @param srcNode Source Node */ void ws_xml_duplicate_attr(WsXmlNodeH dstNode, WsXmlNodeH srcNode) { int i; WsXmlAttrH attr; for (i = 0; (attr = ws_xml_get_node_attr(srcNode, i)) != NULL; i++) { ws_xml_add_node_attr(dstNode, ws_xml_get_attr_ns(attr), ws_xml_get_attr_name(attr), ws_xml_get_attr_value(attr)); } }
/** * Add QName attribute * @param node 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, itis caller's * responsibility to update QName fields accordingly */ WsXmlAttrH ws_xml_add_qname_attr(WsXmlNodeH node, const char *nameNs, const char *name, const char *valueNs, const char *value) { WsXmlAttrH attr = NULL; if (name && node && valueNs && value) { char *buf = make_qname(node, valueNs, value); if (buf != NULL) { attr = ws_xml_add_node_attr(node, nameNs, name, buf); u_free(buf); } } return attr; }
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; }
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; }
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); } }