diff options
Diffstat (limited to 'worker/xml_helper.c')
-rw-r--r-- | worker/xml_helper.c | 124 |
1 files changed, 65 insertions, 59 deletions
diff --git a/worker/xml_helper.c b/worker/xml_helper.c index 34a1514..6d91e13 100644 --- a/worker/xml_helper.c +++ b/worker/xml_helper.c @@ -25,6 +25,26 @@ */ xmlChar *default_namespace_prefix = (xmlChar *) "def"; +/** + * \brief Validate a XML policy file + * + * Call this function bedore any further processing of a XML policy file. It + * will extract the name of the RELAX NG schema file from the metadata section + * together with other information and validate the file accordingly. + * + * \param policy_file_name name of the XML policy file + * \param default_namespace will contain the default namespace of the XML + * policy file if the function returns successfully + * \param ipa_policy_type will contain the IPA policy type, i.e. action, + * config or role, if the function returns successfully + * \param xslt_file_name will contain the name of the XSLT file if the IPA + * policy is either config or role (action do not need an XSLT) and if the + * function returns successfully + * + * \return 0 on success, -1 if an error occured + * + */ + int validate_policy(const char *policy_file_name, xmlChar **default_namespace, char **ipa_policy_type, char **xslt_file_name) { xmlDocPtr doc; xmlNodePtr root_node; @@ -54,7 +74,7 @@ int validate_policy(const char *policy_file_name, xmlChar **default_namespace, c xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:ipa/*[2]", default_namespace_prefix); - *ipa_policy_type = find_name_by_xpath(doc, xpath_expr, default_namespace_prefix, *default_namespace); + *ipa_policy_type = find_by_xpath(doc, xpath_expr, FIND_NAME, default_namespace_prefix, *default_namespace); CHECK(*ipa_policy_type, NULL, ("Type of IPA policy not found.\n"), exit(1)); DEBUG(3, ("Found IPA policy type: %s\n", *ipa_policy_type)); if ( strncmp(*ipa_policy_type, "ipaconfig",9) != 0 && @@ -67,7 +87,7 @@ int validate_policy(const char *policy_file_name, xmlChar **default_namespace, c xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:RNGfile", default_namespace_prefix); rng_file_name = - find_value_by_xpath(doc, xpath_expr, default_namespace_prefix, + find_by_xpath(doc, xpath_expr, FIND_VALUE, default_namespace_prefix, *default_namespace); CHECK(rng_file_name, NULL, ("Name of RELANX NG schema file not found.\n"), exit(1)); DEBUG(3, ("Found name of RELAX NG schema file: %s\n", rng_file_name)); @@ -80,7 +100,7 @@ int validate_policy(const char *policy_file_name, xmlChar **default_namespace, c (xmlRelaxNGNewParserCtxt(rng_file_name))); CHECK(rng_context, NULL, ("Failed to create RNG context\n"), exit(1)); if (xmlRelaxNGValidateDoc(rng_context, doc) == 0) { - DEBUG(0, ("The document is valid.\n")); + DEBUG(3, ("The document is valid.\n")); } else { DEBUG(0, ("Error during validation.\n")); exit(1); @@ -93,7 +113,7 @@ int validate_policy(const char *policy_file_name, xmlChar **default_namespace, c if (strncmp(*ipa_policy_type, "ipaaction", 9)!=0) { xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:XSLTfile", default_namespace_prefix); *xslt_file_name = - find_value_by_xpath(doc, xpath_expr, default_namespace_prefix, *default_namespace); + find_by_xpath(doc, xpath_expr, FIND_VALUE, default_namespace_prefix, *default_namespace); CHECK(*xslt_file_name, NULL, ("Name of XSLT file not found.\n"), exit(1)); DEBUG(3, ("Found name of XSLT file: %s\n", *xslt_file_name)); } @@ -103,7 +123,18 @@ int validate_policy(const char *policy_file_name, xmlChar **default_namespace, c return 0; } -int print_all_attributes(xmlNode *node) { +/** + * \brief Show all attributes of an XML node + * + * This is a debung function to print all attribute of a XML node. + * + * \param node pointer to the XML node + * + * \return 0 + * + */ + +int print_all_attributes(const xmlNode *node) { xmlAttr *cur; cur=node->properties; @@ -114,58 +145,24 @@ int print_all_attributes(xmlNode *node) { return 0; } -char *find_name_by_xpath(xmlDocPtr doc, xmlChar * xpath_expr, xmlChar * prefix, - xmlChar * namespace) -{ - - xmlXPathContextPtr xpath_context; - xmlXPathObjectPtr xpath_obj; - char *result = NULL; - - /* Create xpath evaluation context */ - xpath_context = xmlXPathNewContext(doc); - CHECK_NULL_FATAL(xpath_context, - ("Error: unable to create new XPath context\n")); - /* Register a namespace */ - if (xmlXPathRegisterNs(xpath_context, prefix, namespace) != 0) { - DEBUG(0, - ("Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", - prefix , namespace)); - xmlXPathFreeContext(xpath_context); - return NULL; - } - /* Evaluate xpath expression */ - xpath_obj = xmlXPathEvalExpression(xpath_expr, xpath_context); - if (xpath_obj == NULL) { - DEBUG(0, - ("Error: unable to evaluate xpath expression \"%s\"\n", - xpath_expr)); - xmlXPathFreeContext(xpath_context); - return NULL; - } - - if (xmlXPathNodeSetIsEmpty(xpath_obj->nodesetval)) { - DEBUG(0, ("Nothing found for %s\n", xpath_expr)); - xmlXPathFreeObject(xpath_obj); - xmlXPathFreeContext(xpath_context); - return NULL; - } else if (xmlXPathNodeSetGetLength(xpath_obj->nodesetval) != 1) { - DEBUG(0, ("More than one node found for %s!", xpath_expr)); - xmlXPathFreeObject(xpath_obj); - xmlXPathFreeContext(xpath_context); - return NULL; - } else { - result = strdup((char *) xpath_obj->nodesetval->nodeTab[0]->name); - } - - - xmlXPathFreeObject(xpath_obj); - xmlXPathFreeContext(xpath_context); - return result; - -} - -char *find_value_by_xpath(const xmlDocPtr doc, const xmlChar * xpath_expr, const xmlChar * prefix, +/** + * \brief find a single name or value defined by a XPath expression + * + * This function will return the name or the value of a XML node which is + * selected by a XPath expression. if more than one value is found it is + * considered as an error and NULL is returned. + * + * \param doc pointer to the already parsed XML document + * \param xpath_expr a XPath expression describing the node to search for + * \param type use FIND_NAME to return the name and FIND_VALUE to return the + * value of the node + * \param prefix prefix of the namespace of the node to search for + * \param namespare namespace URI of the node to search for + * + * \return pointer to the found string or NULL in case of an error + * + */ +char *find_by_xpath(const xmlDocPtr doc, const xmlChar * xpath_expr, const int type, const xmlChar * prefix, const xmlChar * namespace) { @@ -206,10 +203,19 @@ char *find_value_by_xpath(const xmlDocPtr doc, const xmlChar * xpath_expr, const xmlXPathFreeContext(xpath_context); return NULL; } else { - result = - (char *) xmlNodeListGetString(doc, + switch (type) { + case FIND_NAME: + result = strdup((char *) xpath_obj->nodesetval->nodeTab[0]->name); + break; + case FIND_VALUE: + result = + (char *) xmlNodeListGetString(doc, xpath_obj->nodesetval->nodeTab[0]-> xmlChildrenNode, 1); + break; + default: + DEBUG(0,("Unknow search type %d\n")); + } } |