view cinst/windowsstore.c @ 185:ee37c085b9f7

Try to handle crypt32 errors. Print the error code as fallback
author Andre Heinecke <aheinecke@intevation.de>
date Tue, 25 Mar 2014 18:03:49 +0000
parents 8cfcd38a9bb3
children 292e2cb60ef0
line wrap: on
line source
#ifdef WIN32

#include <stdio.h>

#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 for code: %lx \n", err);
  return bufPtr;
}

int write_stores_win (char **to_install, char **to_remove, bool user_store)
{
  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 (!hStore)
    {
      return ERR_STORE_ACCESS_DENIED;
    }

  for (i=0; to_install[i]; i++)
    {
      size_t cert_len = strnlen (to_install[i], MAX_LINE_LENGTH),
             buf_size = 0;
      char *buf = NULL;

      ret = str_base64_decode (&buf, &buf_size, to_install[i], cert_len);

      if (ret != 0)
        {
          return ERR_INVALID_INSTRUCTIONS;
        }

      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);
            }
        }
      i++;
      free (buf);
    }

  for (i=0; to_remove[i]; i++)
    {
      // TODO
    }

  if (hStore)
    {
      CertCloseStore (hStore, 0);
    }
  return 0;
}
#endif // WIN32

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