From: Dmitry Timoshkov dmitry@baikal.ru
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- configure | 1 + configure.ac | 1 + dlls/cryptext/Makefile.in | 3 +- dlls/cryptext/cryptext.spec | 4 +-- dlls/cryptext/cryptext_main.c | 63 +++++++++++++++++++++++++++++++++ dlls/cryptext/tests/Makefile.in | 4 +++ dlls/cryptext/tests/cryptext.c | 61 +++++++++++++++++++++++++++++++ 7 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 dlls/cryptext/tests/Makefile.in create mode 100644 dlls/cryptext/tests/cryptext.c
diff --git a/configure b/configure index 4597282deee..a55753d99e3 100755 --- a/configure +++ b/configure @@ -22219,6 +22219,7 @@ wine_fn_config_makefile dlls/cryptbase enable_cryptbase wine_fn_config_makefile dlls/cryptdlg enable_cryptdlg wine_fn_config_makefile dlls/cryptdll enable_cryptdll wine_fn_config_makefile dlls/cryptext enable_cryptext +wine_fn_config_makefile dlls/cryptext/tests enable_tests wine_fn_config_makefile dlls/cryptnet enable_cryptnet wine_fn_config_makefile dlls/cryptnet/tests enable_tests wine_fn_config_makefile dlls/cryptowinrt enable_cryptowinrt diff --git a/configure.ac b/configure.ac index 2a1c91c8479..e7a3eb9d08a 100644 --- a/configure.ac +++ b/configure.ac @@ -2499,6 +2499,7 @@ WINE_CONFIG_MAKEFILE(dlls/cryptbase) WINE_CONFIG_MAKEFILE(dlls/cryptdlg) WINE_CONFIG_MAKEFILE(dlls/cryptdll) WINE_CONFIG_MAKEFILE(dlls/cryptext) +WINE_CONFIG_MAKEFILE(dlls/cryptext/tests) WINE_CONFIG_MAKEFILE(dlls/cryptnet) WINE_CONFIG_MAKEFILE(dlls/cryptnet/tests) WINE_CONFIG_MAKEFILE(dlls/cryptowinrt) diff --git a/dlls/cryptext/Makefile.in b/dlls/cryptext/Makefile.in index 5598bfb78e0..acda4e4ac6d 100644 --- a/dlls/cryptext/Makefile.in +++ b/dlls/cryptext/Makefile.in @@ -1,4 +1,5 @@ -MODULE = cryptext.dll +MODULE = cryptext.dll +IMPORTS = crypt32 cryptui user32
EXTRADLLFLAGS = -Wb,--prefer-native
diff --git a/dlls/cryptext/cryptext.spec b/dlls/cryptext/cryptext.spec index ee3e155f457..24b4794c198 100644 --- a/dlls/cryptext/cryptext.spec +++ b/dlls/cryptext/cryptext.spec @@ -12,8 +12,8 @@ @ stub CryptExtAddSPCW @ stub CryptExtOpenCAT @ stub CryptExtOpenCATW -@ stub CryptExtOpenCER -@ stub CryptExtOpenCERW +@ stdcall CryptExtOpenCER(long ptr str long) +@ stdcall CryptExtOpenCERW(long ptr wstr long) @ stub CryptExtOpenCRL @ stub CryptExtOpenCRLW @ stub CryptExtOpenCTL diff --git a/dlls/cryptext/cryptext_main.c b/dlls/cryptext/cryptext_main.c index 537ba66cd3b..a35ca1e02e1 100644 --- a/dlls/cryptext/cryptext_main.c +++ b/dlls/cryptext/cryptext_main.c @@ -22,10 +22,27 @@
#include "windef.h" #include "winbase.h" +#include "winnls.h" +#include "wincrypt.h" +#include "winuser.h" +#include "cryptuiapi.h" + #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(cryptext);
+static inline WCHAR *strdupAW(const char *src) +{ + WCHAR *dst = NULL; + if (src) + { + int len = MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, 0); + dst = malloc(len * sizeof(WCHAR)); + if (dst) MultiByteToWideChar(CP_ACP, 0, src, -1, dst, len); + } + return dst; +} + /*********************************************************************** * CryptExtAddPFX (CRYPTEXT.@) */ @@ -43,3 +60,49 @@ HRESULT WINAPI CryptExtAddPFXW(LPCWSTR filename) FIXME("stub: %s\n", debugstr_w(filename)); return E_NOTIMPL; } + +/*********************************************************************** + * CryptExtOpenCERW (CRYPTEXT.@) + */ +HRESULT WINAPI CryptExtOpenCERW(HWND hwnd, HINSTANCE hinst, LPCWSTR filename, DWORD showcmd) +{ + PCCERT_CONTEXT ctx; + CRYPTUI_VIEWCERTIFICATE_STRUCTW info; + + TRACE("(%p, %p, %s, %lu)\n", hwnd, hinst, debugstr_w(filename), showcmd); + if (hinst) FIXME("hinst %p ignored\n", hinst); + + if (!CryptQueryObject(CERT_QUERY_OBJECT_FILE, filename, CERT_QUERY_CONTENT_FLAG_CERT, + CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, NULL, NULL, NULL, + (const void **)&ctx)) + { + /* FIXME: move to the resources */ + MessageBoxW(NULL, L"This is not a valid certificate", filename, MB_OK | MB_ICONERROR); + return S_OK; /* according to the tests */ + } + + memset(&info, 0, sizeof(info)); + info.dwSize = sizeof(info); + info.hwndParent = hwnd; + info.pCertContext = ctx; + CryptUIDlgViewCertificateW(&info, NULL); + CertFreeCertificateContext(ctx); + + return S_OK; +} + +/*********************************************************************** + * CryptExtOpenCER (CRYPTEXT.@) + */ +HRESULT WINAPI CryptExtOpenCER(HWND hwnd, HINSTANCE hinst, LPCSTR filename, DWORD showcmd) +{ + HRESULT hr; + LPWSTR filenameW; + + TRACE("(%p, %p, %s, %lu)\n", hwnd, hinst, debugstr_a(filename), showcmd); + + filenameW = strdupAW(filename); + hr = CryptExtOpenCERW(hwnd, hinst, filenameW, showcmd); + free(filenameW); + return hr; +} diff --git a/dlls/cryptext/tests/Makefile.in b/dlls/cryptext/tests/Makefile.in new file mode 100644 index 00000000000..c3f4551fc00 --- /dev/null +++ b/dlls/cryptext/tests/Makefile.in @@ -0,0 +1,4 @@ +TESTDLL = cryptext.dll + +SOURCES = \ + cryptext.c diff --git a/dlls/cryptext/tests/cryptext.c b/dlls/cryptext/tests/cryptext.c new file mode 100644 index 00000000000..ab1007dbd82 --- /dev/null +++ b/dlls/cryptext/tests/cryptext.c @@ -0,0 +1,61 @@ +/* + * Copyright 2019 Dmitry Timoshkov + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdarg.h> +#include <assert.h> +#include <windef.h> +#include <winbase.h> +#include <winuser.h> +#include <winerror.h> + +#include "wine/test.h" + +static HRESULT (WINAPI *pCryptExtOpenCER)(HWND,HINSTANCE,LPCSTR,DWORD); + +static void test_CryptExtOpenCER(void) +{ + HRESULT hr; + + if (!pCryptExtOpenCER) + { + win_skip("CryptExtOpenCER is not available on this platform\n"); + return; + } + + if (!winetest_interactive) + { + skip("CryptExtOpenCER test needs user interaction\n"); + return; + } + + SetLastError(0xdeadbeef); + hr = pCryptExtOpenCER(0, 0, "dead.beef", SW_HIDE); + ok(hr == S_OK, "got %#lx\n", hr); + + hr = pCryptExtOpenCER(0, 0, "VeriSign Class 3 Public Primary Certification Authority - G4.txt", SW_SHOW); + ok(hr == S_OK, "got %#lx\n", hr); +} + +START_TEST(cryptext) +{ + HMODULE hmod = LoadLibraryA("cryptext.dll"); + + pCryptExtOpenCER = (void *)GetProcAddress(hmod, "CryptExtOpenCER"); + + test_CryptExtOpenCER(); +}