[PATCH 06/24] auth: Move <auth> node parsing into a separate function
Kevin Cernekee
cernekee at gmail.com
Sat Nov 3 13:22:48 EDT 2012
Signed-off-by: Kevin Cernekee <cernekee at gmail.com>
---
auth.c | 106 ++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 60 insertions(+), 46 deletions(-)
diff --git a/auth.c b/auth.c
index 45507ce..e7b0057 100644
--- a/auth.c
+++ b/auth.c
@@ -315,6 +315,63 @@ static char *xmlnode_msg(xmlNode *xml_node)
return result;
}
+static int parse_auth_node(struct openconnect_info *vpninfo, xmlNode *xml_node,
+ struct oc_auth_form *form)
+{
+ int ret = 0;
+
+ for (xml_node = xml_node->children; xml_node; xml_node = xml_node->next) {
+ 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");
+ if (!form->method || !form->action ||
+ strcasecmp(form->method, "POST") || !form->action[0]) {
+ vpn_progress(vpninfo, PRG_ERR,
+ _("Cannot handle form method='%s', action='%s'\n"),
+ form->method, form->action);
+ ret = -EINVAL;
+ goto out;
+ }
+ vpninfo->redirect_url = strdup(form->action);
+
+ 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");
+ vpninfo->csd_preurl = strdup(vpninfo->urlpath);
+ }
+ }
+
+out:
+ return ret;
+}
+
/* Return value:
* < 0, on error
* = 0, when form parsed and POST required
@@ -366,53 +423,10 @@ int parse_xml_response(struct openconnect_info *vpninfo, char *response,
goto out;
}
- for (xml_node = xml_node->children; xml_node; xml_node = xml_node->next) {
- 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");
- if (!form->method || !form->action ||
- strcasecmp(form->method, "POST") || !form->action[0]) {
- vpn_progress(vpninfo, PRG_ERR,
- _("Cannot handle form method='%s', action='%s'\n"),
- form->method, form->action);
- ret = -EINVAL;
- goto out;
- }
- vpninfo->redirect_url = strdup(form->action);
+ ret = parse_auth_node(vpninfo, xml_node, form);
+ if (ret)
+ goto out;
- 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");
- vpninfo->csd_preurl = strdup(vpninfo->urlpath);
- }
- }
if (vpninfo->csd_token && vpninfo->csd_ticket && vpninfo->csd_starturl && vpninfo->csd_waiturl) {
/* First, redirect to the stuburl -- we'll need to fetch and run that */
vpninfo->redirect_url = strdup(vpninfo->csd_stuburl);
--
1.7.10.4
More information about the openconnect-devel
mailing list