Mercurial > trustbridge
view cinst/windowsstore.c @ 161:a4b1c77f3e6a
Change install_certificates_win to generic write_stores_win
This function will also handle the removal to avoid
redundancies in store handling
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Tue, 25 Mar 2014 10:08:31 +0000 |
parents | bd5a5d3e5674 |
children | 8cfcd38a9bb3 |
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"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); } } if (!bufPtr) printf("Error getting last error\n"); 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