From 3fae63ec2771f0975e55d94af5e4df85e9d4e0bf Mon Sep 17 00:00:00 2001 From: Kevin Cernekee Date: Thu, 25 Oct 2012 21:42:09 -0700 Subject: [PATCH] auth: Introduce new XML helper functions for parse_auth_node() Try to clean up some of the c&p casting and long lines. Signed-off-by: Kevin Cernekee --- auth.c | 76 ++++++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/auth.c b/auth.c index e7b0057..039c939 100644 --- a/auth.c +++ b/auth.c @@ -315,6 +315,39 @@ static char *xmlnode_msg(xmlNode *xml_node) return result; } +static int xmlnode_is_named(xmlNode *xml_node, const char *name) +{ + return !strcmp((char *)xml_node->name, name); +} + +static int xmlnode_get_prop(xmlNode *xml_node, const char *name, char **var) +{ + char *str = (char *)xmlGetProp(xml_node, (unsigned char *)name); + + if (!str) + return -ENOENT; + + free(*var); + *var = str; + return 0; +} + +static int xmlnode_get_text(xmlNode *xml_node, const char *name, char **var) +{ + char *str; + + if (name && !xmlnode_is_named(xml_node, name)) + return -EINVAL; + + str = xmlnode_msg(xml_node); + if (!str) + return -ENOENT; + + free(*var); + *var = str; + return 0; +} + static int parse_auth_node(struct openconnect_info *vpninfo, xmlNode *xml_node, struct oc_auth_form *form) { @@ -324,19 +357,15 @@ static int parse_auth_node(struct openconnect_info *vpninfo, xmlNode *xml_node, if (xml_node->type != XML_ELEMENT_NODE) continue; - if (!strcmp((char *)xml_node->name, "banner")) { - free(form->banner); - form->banner = xmlnode_msg(xml_node); - } else if (!strcmp((char *)xml_node->name, "message")) { - free(form->message); - form->message = xmlnode_msg(xml_node); - } else if (!strcmp((char *)xml_node->name, "error")) { - free(form->error); - form->error = xmlnode_msg(xml_node); - } else if (!strcmp((char *)xml_node->name, "form")) { - - form->method = (char *)xmlGetProp(xml_node, (unsigned char *)"method"); - form->action = (char *)xmlGetProp(xml_node, (unsigned char *)"action"); + xmlnode_get_text(xml_node, "banner", &form->banner); + xmlnode_get_text(xml_node, "message", &form->message); + xmlnode_get_text(xml_node, "error", &form->error); + + if (xmlnode_is_named(xml_node, "form")) { + + xmlnode_get_prop(xml_node, "method", &form->method); + xmlnode_get_prop(xml_node, "action", &form->action); + if (!form->method || !form->action || strcasecmp(form->method, "POST") || !form->action[0]) { vpn_progress(vpninfo, PRG_ERR, @@ -350,20 +379,13 @@ static int parse_auth_node(struct openconnect_info *vpninfo, xmlNode *xml_node, ret = parse_form(vpninfo, form, xml_node); if (ret < 0) goto out; - } else if (!vpninfo->csd_scriptname && !strcmp((char *)xml_node->name, "csd")) { - if (!vpninfo->csd_token) - vpninfo->csd_token = (char *)xmlGetProp(xml_node, - (unsigned char *)"token"); - if (!vpninfo->csd_ticket) - vpninfo->csd_ticket = (char *)xmlGetProp(xml_node, - (unsigned char *)"ticket"); - } else if (!vpninfo->csd_scriptname && !strcmp((char *)xml_node->name, vpninfo->csd_xmltag)) { - vpninfo->csd_stuburl = (char *)xmlGetProp(xml_node, - (unsigned char *)"stuburl"); - vpninfo->csd_starturl = (char *)xmlGetProp(xml_node, - (unsigned char *)"starturl"); - vpninfo->csd_waiturl = (char *)xmlGetProp(xml_node, - (unsigned char *)"waiturl"); + } else if (!vpninfo->csd_scriptname && xmlnode_is_named(xml_node, "csd")) { + xmlnode_get_prop(xml_node, "token", &vpninfo->csd_token); + xmlnode_get_prop(xml_node, "ticket", &vpninfo->csd_ticket); + } else if (!vpninfo->csd_scriptname && xmlnode_is_named(xml_node, vpninfo->csd_xmltag)) { + xmlnode_get_prop(xml_node, "stuburl", &vpninfo->csd_stuburl); + xmlnode_get_prop(xml_node, "starturl", &vpninfo->csd_starturl); + xmlnode_get_prop(xml_node, "waiturl", &vpninfo->csd_waiturl); vpninfo->csd_preurl = strdup(vpninfo->urlpath); } } -- 2.7.4