From 0c53ca91199dc0f223ef7dc784c8fd630172b9c9 Mon Sep 17 00:00:00 2001 From: Daniel Lenski Date: Sun, 3 May 2020 21:12:12 -0700 Subject: [PATCH] CSD XML tag and nostub are entirely protocol-specific and used in only one place This patch replaces them with inline functions (modeled after gpst_os_name), instead of storing them in the global `struct openconnect_info` object. TODO: further clarify, separate, and consolidate protocol-specific data in `struct openconnect_info`. Signed-off-by: Daniel Lenski --- auth.c | 27 +++++++++++++++++++++++++-- library.c | 12 ------------ openconnect-internal.h | 4 +--- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/auth.c b/auth.c index 9756018b..643cfc61 100644 --- a/auth.c +++ b/auth.c @@ -386,6 +386,29 @@ static int xmlnode_get_text(xmlNode *xml_node, const char *name, char **var) * 2) The new
tag tends to omit the method/action properties. */ +/* Translate platform names (derived from AnyConnect) into the relevant + * CSD tag names + */ +static inline const char *csd_tag_name(struct openconnect_info *vpninfo) +{ + if (!strcmp(vpninfo->platname, "mac-intel")) + return "csdMac"; + else if (!strcmp(vpninfo->platname, "win")) + return "csd"; + else + /* linux, linux-64, android, apple-ios */ + return "csdLinux"; +} + +/* Ignore stubs on mobile platforms */ +static inline int csd_use_stub(struct openconnect_info *vpninfo) +{ + if (!strcmp(vpninfo->platname, "android") || !strcmp(vpninfo->platname, "apple-ios")) + return 0; + else + return 1; +} + static int parse_auth_node(struct openconnect_info *vpninfo, xmlNode *xml_node, struct oc_auth_form *form) { @@ -434,9 +457,9 @@ static int parse_auth_node(struct openconnect_info *vpninfo, xmlNode *xml_node, nodes; one with token/ticket and one with the URLs. Process them both the same and rely on the fact that xmlnode_get_prop() will not *clear* the variable if no such property is found. */ - if (!vpninfo->csd_scriptname && xmlnode_is_named(xml_node, vpninfo->csd_xmltag)) { + if (!vpninfo->csd_scriptname && xmlnode_is_named(xml_node, csd_tag_name(vpninfo))) { /* ignore the CSD trojan binary on mobile platforms */ - if (!vpninfo->csd_nostub) + if (csd_use_stub(vpninfo)) 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); diff --git a/library.c b/library.c index 4146e8f1..bf8402d3 100644 --- a/library.c +++ b/library.c @@ -305,18 +305,6 @@ int openconnect_set_reported_os(struct openconnect_info *vpninfo, #endif } - if (!strcmp(os, "mac-intel")) - vpninfo->csd_xmltag = "csdMac"; - else if (!strcmp(os, "linux") || !strcmp(os, "linux-64")) - vpninfo->csd_xmltag = "csdLinux"; - else if (!strcmp(os, "android") || !strcmp(os, "apple-ios")) { - vpninfo->csd_xmltag = "csdLinux"; - vpninfo->csd_nostub = 1; - } else if (!strcmp(os, "win")) - vpninfo->csd_xmltag = "csd"; - else - return -EINVAL; - STRDUP(vpninfo->platname, os); return 0; } diff --git a/openconnect-internal.h b/openconnect-internal.h index 0db75b27..e67ac26c 100644 --- a/openconnect-internal.h +++ b/openconnect-internal.h @@ -393,8 +393,6 @@ struct openconnect_info { uint32_t esp_magic; /* GlobalProtect magic ping address (network-endian) */ int tncc_fd; /* For Juniper TNCC */ - const char *csd_xmltag; - int csd_nostub; char *platname; char *mobile_platform_version; char *mobile_device_type; @@ -1065,7 +1063,7 @@ int do_gen_hotp_code(struct openconnect_info *vpninfo, struct oc_auth_form *form, struct oc_form_opt *opt); -int set_oidc_token(struct openconnect_info *vpninfo, +int set_oidc_token(struct openconnect_info *vpninfo, const char *token_str); /* stoken.c */