Module: wine Branch: master Commit: d0baa50681263d5a03eb2d67cf07a0a79eaa170c URL: http://source.winehq.org/git/wine.git/?a=commit;h=d0baa50681263d5a03eb2d67cf...
Author: Hans Leidekker hans@codeweavers.com Date: Mon Oct 20 10:16:45 2008 +0200
cryptui: Add a partial implementation of CryptUIWizImport.
This is just enough to make importing a certificate in Outlook 2007 work.
---
dlls/cryptui/Makefile.in | 2 +- dlls/cryptui/cryptui.spec | 2 +- dlls/cryptui/main.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-)
diff --git a/dlls/cryptui/Makefile.in b/dlls/cryptui/Makefile.in index 996711a..abb0b27 100644 --- a/dlls/cryptui/Makefile.in +++ b/dlls/cryptui/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = cryptui.dll -IMPORTS = kernel32 +IMPORTS = crypt32 kernel32 IMPORTLIB = cryptui
C_SRCS = \ diff --git a/dlls/cryptui/cryptui.spec b/dlls/cryptui/cryptui.spec index 088d087..201282f 100644 --- a/dlls/cryptui/cryptui.spec +++ b/dlls/cryptui/cryptui.spec @@ -34,7 +34,7 @@ 34 stub CryptUIWizExport 35 stub CryptUIWizFreeCertRequestNoDS 36 stub CryptUIWizFreeDigitalSignContext -37 stub CryptUIWizImport +37 stdcall CryptUIWizImport(long ptr wstr ptr ptr) 38 stub CryptUIWizQueryCertRequestNoDS 39 stub CryptUIWizSubmitCertRequestNoDS 40 stub DllRegisterServer diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c index 00e8683..0aab87e 100644 --- a/dlls/cryptui/main.c +++ b/dlls/cryptui/main.c @@ -98,3 +98,76 @@ BOOL WINAPI CryptUIDlgViewCertificateW(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertVi if (pfPropertiesChanged) *pfPropertiesChanged = FALSE; return TRUE; } + +BOOL WINAPI CryptUIWizImport(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, + PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, HCERTSTORE hDestCertStore) +{ + static const WCHAR Root[] = {'R','o','o','t',0}; + BOOL ret; + HANDLE file; + HCERTSTORE store; + BYTE *buffer; + DWORD size, encoding = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; + const CERT_CONTEXT *cert; + + TRACE("(0x%08x, %p, %s, %p, %p)\n", dwFlags, hwndParent, debugstr_w(pwszWizardTitle), + pImportSrc, hDestCertStore); + + FIXME("only certificate files are supported\n"); + + if (!(dwFlags & CRYPTUI_WIZ_NO_UI)) FIXME("UI not implemented\n"); + + if (pImportSrc->dwSubjectChoice != CRYPTUI_WIZ_IMPORT_SUBJECT_FILE) + { + FIXME("source type not implemented: %u\n", pImportSrc->dwSubjectChoice); + return FALSE; + } + file = CreateFileW(pImportSrc->pwszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, 0, NULL); + if (file == INVALID_HANDLE_VALUE) + { + WARN("can't open certificate file %s\n", debugstr_w(pImportSrc->pwszFileName)); + return FALSE; + } + if ((size = GetFileSize(file, NULL))) + { + if ((buffer = HeapAlloc(GetProcessHeap(), 0, size))) + { + DWORD read; + if (!ReadFile(file, buffer, size, &read, NULL) || read != size) + { + WARN("can't read certificate file %s\n", debugstr_w(pImportSrc->pwszFileName)); + HeapFree(GetProcessHeap(), 0, buffer); + CloseHandle(file); + return FALSE; + } + } + } + else + { + WARN("empty file %s\n", debugstr_w(pImportSrc->pwszFileName)); + CloseHandle(file); + return FALSE; + } + CloseHandle(file); + if (!(cert = CertCreateCertificateContext(encoding, buffer, size))) + { + WARN("unable to create certificate context\n"); + HeapFree(GetProcessHeap(), 0, buffer); + return FALSE; + } + /* FIXME: verify certificate and determine store name dynamically */ + if (!(store = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, Root))) + { + WARN("unable to open certificate store\n"); + CertFreeCertificateContext(cert); + HeapFree(GetProcessHeap(), 0, buffer); + return FALSE; + } + ret = CertAddCertificateContextToStore(store, cert, CERT_STORE_ADD_REPLACE_EXISTING, NULL); + + CertCloseStore(store, 0); + CertFreeCertificateContext(cert); + HeapFree(GetProcessHeap(), 0, buffer); + return ret; +}