From 3bb1c3a97d7b0325b05723358c64f2eb85074ca2 Mon Sep 17 00:00:00 2001 From: Daniel Lenski Date: Thu, 17 Jan 2019 19:15:33 -0800 Subject: [PATCH] consolidate GlobalProtect OS name translation Suggested by David Woohouse: https://gitlab.com/openconnect/openconnect/merge_requests/17#note_124400905 Signed-off-by: Daniel Lenski --- auth-globalprotect.c | 31 ++++++++++++++++--------------- gpst.c | 7 +------ openconnect-internal.h | 1 + 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/auth-globalprotect.c b/auth-globalprotect.c index 4d794995..0b8f19f6 100644 --- a/auth-globalprotect.c +++ b/auth-globalprotect.c @@ -43,6 +43,20 @@ void gpst_common_headers(struct openconnect_info *vpninfo, vpninfo->useragent = orig_ua; } +/* Translate platform names (derived from AnyConnect) into the values + * known to be emitted by GlobalProtect clients. + */ +const char *gpst_os_name(struct openconnect_info *vpninfo) +{ + if (!strcmp(vpninfo->platname, "mac-intel") || !strcmp(vpninfo->platname, "apple-ios")) + return "Mac"; + else if (!strcmp(vpninfo->platname, "linux-64") || !strcmp(vpninfo->platname, "linux") || !strcmp(vpninfo->platname, "android")) + return "Linux"; + else + return "Windows"; +} + + /* Parse pre-login response ({POST,GET} /{global-protect,ssl-vpn}/pre-login.esp) * * Extracts the relevant arguments from the XML (username-label, password-label) @@ -449,18 +463,10 @@ static int gpst_login(struct openconnect_info *vpninfo, int portal, struct login /* Ask the user to fill in the auth form; repeat as necessary */ for (;;) { - const char *clientos; - if (!strcmp(vpninfo->platname, "mac-intel") || !strcmp(vpninfo->platname, "apple-ios")) - clientos = "Mac"; - else if (!strcmp(vpninfo->platname, "linux-64") || !strcmp(vpninfo->platname, "android")) - clientos = "Linux"; - else - clientos = "Windows"; - /* submit prelogin request to get form */ orig_path = vpninfo->urlpath; if (asprintf(&vpninfo->urlpath, "%s/prelogin.esp?tmp=tmp&clientVer=4100&clientos=%s", - portal ? "global-protect" : "ssl-vpn", clientos) < 0) { + portal ? "global-protect" : "ssl-vpn", gpst_os_name(vpninfo)) < 0) { result = -ENOMEM; goto out; } @@ -492,12 +498,7 @@ static int gpst_login(struct openconnect_info *vpninfo, int portal, struct login buf_truncate(request_body); buf_append(request_body, "jnlpReady=jnlpReady&ok=Login&direct=yes&clientVer=4100&prot=https:"); append_opt(request_body, "ipv6-support", vpninfo->disable_ipv6 ? "no" : "yes"); - if (!strcmp(vpninfo->platname, "mac-intel") || !strcmp(vpninfo->platname, "apple-ios")) - append_opt(request_body, "clientos", "Mac"); - else if (!strcmp(vpninfo->platname, "linux-64") || !strcmp(vpninfo->platname, "android")) - append_opt(request_body, "clientos", "Linux"); - else - append_opt(request_body, "clientos", "Windows"); + append_opt(request_body, "clientos", gpst_os_name(vpninfo)); append_opt(request_body, "os-version", vpninfo->platname); append_opt(request_body, "server", vpninfo->hostname); append_opt(request_body, "computer", vpninfo->localname); diff --git a/gpst.c b/gpst.c index c4578be6..0148e768 100644 --- a/gpst.c +++ b/gpst.c @@ -620,12 +620,7 @@ static int gpst_get_config(struct openconnect_info *vpninfo) /* submit getconfig request */ buf_append(request_body, "client-type=1&protocol-version=p1&app-version=4.0.5-8"); - if (!strcmp(vpninfo->platname, "mac-intel") || !strcmp(vpninfo->platname, "apple-ios")) - append_opt(request_body, "clientos", "Mac"); - else if (!strcmp(vpninfo->platname, "linux-64") || !strcmp(vpninfo->platname, "android")) - append_opt(request_body, "clientos", "Linux"); - else - append_opt(request_body, "clientos", "Windows"); + append_opt(request_body, "clientos", gpst_os_name(vpninfo)); append_opt(request_body, "os-version", vpninfo->platname); append_opt(request_body, "hmac-algo", "sha1,md5"); append_opt(request_body, "enc-algo", "aes-128-cbc,aes-256-cbc"); diff --git a/openconnect-internal.h b/openconnect-internal.h index 46568db5..61273107 100644 --- a/openconnect-internal.h +++ b/openconnect-internal.h @@ -903,6 +903,7 @@ int pulse_eap_ttls_recv(struct openconnect_info *vpninfo, void *data, int len); int gpst_obtain_cookie(struct openconnect_info *vpninfo); void gpst_common_headers(struct openconnect_info *vpninfo, struct oc_text_buf *buf); int gpst_bye(struct openconnect_info *vpninfo, const char *reason); +const char *gpst_os_name(struct openconnect_info *vpninfo); /* gpst.c */ int gpst_xml_or_error(struct openconnect_info *vpninfo, char *response, -- 2.49.0