tProvide local copy of TLS CA certs on Windows - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 8da737ea0755185abfcb3d7e4ff95f06deed3a1c
 (DIR) parent 75f503a26a4b9c3327347e9127223d7b54bcdf2c
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Wed, 11 Nov 2020 12:20:08 -0800
       
       Provide local copy of TLS CA certs on Windows
       
       Without this, curl connections to the metaserver may fail
       on Windows as it cannot verify the certificate.
       
       Diffstat:
         M src/network.c                       |      25 +++++++++++++++++++++++++
         M src/winmain.h                       |       2 ++
       
       2 files changed, 27 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/src/network.c b/src/network.c
       t@@ -29,6 +29,7 @@
        #ifdef CYGWIN
        #include <winsock2.h>           /* For network functions */
        #include <windows.h>            /* For datatypes such as BOOL */
       +#include "winmain.h"
        #else
        #include <sys/types.h>          /* For size_t etc. */
        #include <sys/socket.h>         /* For struct sockaddr etc. */
       t@@ -1188,6 +1189,27 @@ gboolean CurlEasySetopt1(CURL *curl, CURLoption option, void *arg, GError **err)
          }
        }
        
       +#ifdef CYGWIN
       +/* Set the path to TLS CA certificates. Without this, curl connections
       +   to the metaserver may fail on Windows as it cannot verify the
       +   certificate.
       + */
       +static gboolean SetCaInfo(CurlConnection *conn, GError **err)
       +{
       +  gchar *bindir, *cainfo;
       +  gboolean ret;
       +
       +  /* Point to a .crt file in the same directory as dopewars.exe */
       +  bindir = GetBinaryDir();
       +  cainfo = g_strdup_printf("%s\\ca-bundle.crt", bindir);
       +  g_free(bindir);
       +
       +  ret = CurlEasySetopt1(conn->h, CURLOPT_CAINFO, cainfo, err);
       +  g_free(cainfo);
       +  return ret;
       +}
       +#endif
       +
        gboolean OpenCurlConnection(CurlConnection *conn, char *URL, char *body,
                                    GError **err)
        {
       t@@ -1210,6 +1232,9 @@ gboolean OpenCurlConnection(CurlConnection *conn, char *URL, char *body,
                || !CurlEasySetopt1(conn->h, CURLOPT_WRITEDATA, conn, err)
                || !CurlEasySetopt1(conn->h, CURLOPT_HEADERFUNCTION,
                                    MetaConnHeaderFunc, err)
       +#ifdef CYGWIN
       +        || !SetCaInfo(conn, err)
       +#endif
                || !CurlEasySetopt1(conn->h, CURLOPT_HEADERDATA, conn, err)) {
              return FALSE;
            }
 (DIR) diff --git a/src/winmain.h b/src/winmain.h
       t@@ -25,6 +25,8 @@
        
        #ifdef CYGWIN
        
       +#include <glib.h>
       +
        gchar *GetBinaryDir(void);
        
        #endif /* CYGWIN */