Commit 0c53ca91 authored by Daniel Lenski's avatar Daniel Lenski

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: default avatarDaniel Lenski <>
parent 73410320
......@@ -386,6 +386,29 @@ static int xmlnode_get_text(xmlNode *xml_node, const char *name, char **var)
* 2) The new <form> 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";
/* 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;
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);
......@@ -305,18 +305,6 @@ int openconnect_set_reported_os(struct openconnect_info *vpninfo,
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";
return -EINVAL;
STRDUP(vpninfo->platname, os);
return 0;
......@@ -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 */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment