diff cinst/windowsstore.c @ 188:a3bde2aaabd9

merged.
author Raimund Renkert <rrenkert@intevation.de>
date Wed, 26 Mar 2014 09:12:10 +0100
parents ee37c085b9f7
children 292e2cb60ef0
line wrap: on
line diff
--- a/cinst/windowsstore.c	Wed Mar 26 09:10:46 2014 +0100
+++ b/cinst/windowsstore.c	Wed Mar 26 09:12:10 2014 +0100
@@ -1,92 +1,101 @@
 #ifdef WIN32
 
-#include <polarssl/base64.h>
-#include "windowsstore.h"
+#include <stdio.h>
 
-static LPWSTR getLastErrorMsg() {
-    LPWSTR bufPtr = NULL;
-    DWORD err = GetLastError();
-    FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
-                   FORMAT_MESSAGE_FROM_SYSTEM |
-                   FORMAT_MESSAGE_IGNORE_INSERTS,
-                   NULL, err, 0, (LPWSTR)&bufPtr, 0, NULL);
-    if (!bufPtr) {
-        HMODULE hWinhttp = GetModuleHandleW(L"winhttp");
-        if (hWinhttp) {
-            FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
-                           FORMAT_MESSAGE_FROM_HMODULE |
-                           FORMAT_MESSAGE_IGNORE_INSERTS,
-                           hWinhttp, HRESULT_CODE(err), 0,
-                           (LPWSTR)&bufPtr, 0, NULL);
+#include "windowsstore.h"
+#include "errorcodes.h"
+#include "listutil.h"
+#include "strhelp.h"
+
+static LPWSTR getLastErrorMsg()
+{
+  LPWSTR bufPtr = NULL;
+  DWORD err = GetLastError();
+  FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                  FORMAT_MESSAGE_FROM_SYSTEM |
+                  FORMAT_MESSAGE_IGNORE_INSERTS,
+                  NULL, err, 0, (LPWSTR) &bufPtr, 0, NULL);
+  if (!bufPtr)
+    {
+      HMODULE hWinhttp = GetModuleHandleW (L"crypt32");
+      if (hWinhttp)
+        {
+          FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                          FORMAT_MESSAGE_FROM_HMODULE |
+                          FORMAT_MESSAGE_IGNORE_INSERTS,
+                          hWinhttp, HRESULT_CODE (err), 0,
+                          (LPWSTR) &bufPtr, 0, NULL);
         }
     }
-    if (!bufPtr)
-        printf("Error getting last error\n");
-    return bufPtr;
+  if (!bufPtr)
+    printf ("Error getting last error for code: %lx \n", err);
+  return bufPtr;
 }
 
-int install_certificates_win(const char **to_install, bool user_store)
+int write_stores_win (char **to_install, char **to_remove, bool user_store)
 {
-    int i = 0;
-    HCERTSTORE hStore = NULL;
+  int i = 0;
+  int ret = -1;
+  HCERTSTORE hStore = NULL;
 
-    if (user_store) {
-        hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0,
-                               0, CERT_SYSTEM_STORE_CURRENT_USER, L"Root");
-    } else {
-        hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0,
-                               0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"Root");
+  if (user_store)
+    {
+      hStore = CertOpenStore (CERT_STORE_PROV_SYSTEM, 0,
+                              0, CERT_SYSTEM_STORE_CURRENT_USER, L"Root");
     }
-
-    if (!hStore) {
-        return ERR_STORE_ACCESS_DENIED;
+  else
+    {
+      hStore = CertOpenStore (CERT_STORE_PROV_SYSTEM, 0,
+                              0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"Root");
     }
 
-    while (to_install[i]) {
-        size_t needed_len = 0;
-        size_t cert_len = strnlen(to_install[i], MAX_LINE_LENGTH);
-        int ret = -1;
-        unsigned char *buf;
-
-        /* Check the needed size for the buffer */
-        ret = base64_decode(NULL, &needed_len,
-                            (unsigned char *)to_install[i], cert_len);
+  if (!hStore)
+    {
+      return ERR_STORE_ACCESS_DENIED;
+    }
 
-        if (ret != 0 && ret != POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL) {
-            return ERR_INVALID_INSTRUCTIONS;
-        }
+  for (i=0; to_install[i]; i++)
+    {
+      size_t cert_len = strnlen (to_install[i], MAX_LINE_LENGTH),
+             buf_size = 0;
+      char *buf = NULL;
 
-        buf = xmalloc(needed_len);
-        memset (buf, 0, needed_len);
+      ret = str_base64_decode (&buf, &buf_size, to_install[i], cert_len);
 
-        ret = base64_decode(buf, &needed_len,
-                            (unsigned char *)to_install[i], cert_len);
-
-        if (ret != 0) {
-            return ERR_INVALID_INSTRUCTIONS;
+      if (ret != 0)
+        {
+          return ERR_INVALID_INSTRUCTIONS;
         }
 
-        ret = CertAddEncodedCertificateToStore (hStore,
-                                                X509_ASN_ENCODING,
-                                                (PBYTE)buf,
-                                                needed_len,
-                                                CERT_STORE_ADD_ALWAYS,
-                                                NULL);
+      ret = CertAddEncodedCertificateToStore (hStore,
+                                              X509_ASN_ENCODING,
+                                              (PBYTE) buf,
+                                              buf_size,
+                                              CERT_STORE_ADD_ALWAYS,
+                                              NULL);
 
-        if (ret == 0) {
-            LPWSTR error = getLastErrorMsg();
-            if (error) {
-                printf("Failed to add certificate: %S \n", error);
-                LocalFree(error);
+      if (ret == 0)
+        {
+          LPWSTR error = getLastErrorMsg();
+          if (error)
+            {
+              printf ("Failed to add certificate: %S \n", error);
+              LocalFree (error);
             }
         }
-        i++;
-        free(buf);
+      i++;
+      free (buf);
     }
 
-    if(hStore) {
-        CertCloseStore(hStore, 0);
+  for (i=0; to_remove[i]; i++)
+    {
+      // TODO
     }
-    return 0;
+
+  if (hStore)
+    {
+      CertCloseStore (hStore, 0);
+    }
+  return 0;
 }
 #endif // WIN32

http://wald.intevation.org/projects/trustbridge/