]> www.infradead.org Git - users/dwmw2/openconnect.git/commitdiff
consolidate GlobalProtect OS name translation
authorDaniel Lenski <dlenski@gmail.com>
Fri, 18 Jan 2019 03:15:33 +0000 (19:15 -0800)
committerDavid Woodhouse <dwmw2@infradead.org>
Sun, 9 Jun 2019 23:51:05 +0000 (00:51 +0100)
Suggested by David Woohouse:
    https://gitlab.com/openconnect/openconnect/merge_requests/17#note_124400905

Signed-off-by: Daniel Lenski <dlenski@gmail.com>
auth-globalprotect.c
gpst.c
openconnect-internal.h

index 4d79499523062267e0b3f8391ff71c1e72ccb48c..0b8f19f640f8a3b61ef914ce6706d501300fcb11 100644 (file)
@@ -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 c4578be673210188a7a205b66e43beafbc11ebfb..0148e7688a2e83b3dee5c0742c5fd0921d30a645 100644 (file)
--- 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");
index 46568db5b828278a3cb4d0c41ee9bd2a320376cd..6127310772d2b48fb5f51f4c90015e4b8cc95528 100644 (file)
@@ -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,