Mercurial > trustbridge
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