cryptui: Add a partial implementation of CryptUIWizImport.
Hans Leidekker
hans at codeweavers.com
Mon Oct 20 03:16:45 CDT 2008
This is just enough to make importing a certificate in Outlook 2007 work.
-Hans
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;
+}
More information about the wine-patches
mailing list