summaryrefslogtreecommitdiffstats
path: root/worker/xml_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'worker/xml_helper.c')
-rw-r--r--worker/xml_helper.c124
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"));
+ }
}