Juan Lang : cryptui: Show icon and text representing trust state of certificate.
Alexandre Julliard
julliard at winehq.org
Thu Dec 18 08:08:41 CST 2008
Module: wine
Branch: master
Commit: 71472a2a2099f03813abf0c21e46566adbdbb358
URL: http://source.winehq.org/git/wine.git/?a=commit;h=71472a2a2099f03813abf0c21e46566adbdbb358
Author: Juan Lang <juan.lang at gmail.com>
Date: Tue Dec 16 09:52:20 2008 -0800
cryptui: Show icon and text representing trust state of certificate.
---
dlls/cryptui/Makefile.in | 2 +-
dlls/cryptui/cert.bmp | Bin 0 -> 630 bytes
dlls/cryptui/certerror.bmp | Bin 0 -> 630 bytes
dlls/cryptui/certwarning.bmp | Bin 0 -> 630 bytes
dlls/cryptui/cryptui.rc | 9 +++
dlls/cryptui/cryptui_En.rc | 5 ++
dlls/cryptui/cryptuires.h | 10 +++
dlls/cryptui/main.c | 141 +++++++++++++++++++++++++++++++++++++++++-
8 files changed, 165 insertions(+), 2 deletions(-)
diff --git a/dlls/cryptui/Makefile.in b/dlls/cryptui/Makefile.in
index bc4cd1c..078cb33 100644
--- a/dlls/cryptui/Makefile.in
+++ b/dlls/cryptui/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = cryptui.dll
-IMPORTS = crypt32 comctl32 user32 kernel32
+IMPORTS = uuid crypt32 ole32 comctl32 user32 kernel32
DELAYIMPORTS = wintrust
IMPORTLIB = cryptui
diff --git a/dlls/cryptui/cert.bmp b/dlls/cryptui/cert.bmp
new file mode 100644
index 0000000..1f44f36
Binary files /dev/null and b/dlls/cryptui/cert.bmp differ
diff --git a/dlls/cryptui/certerror.bmp b/dlls/cryptui/certerror.bmp
new file mode 100644
index 0000000..98bce50
Binary files /dev/null and b/dlls/cryptui/certerror.bmp differ
diff --git a/dlls/cryptui/certwarning.bmp b/dlls/cryptui/certwarning.bmp
new file mode 100644
index 0000000..5961d9f
Binary files /dev/null and b/dlls/cryptui/certwarning.bmp differ
diff --git a/dlls/cryptui/cryptui.rc b/dlls/cryptui/cryptui.rc
index d18034d..2a1f0e4 100644
--- a/dlls/cryptui/cryptui.rc
+++ b/dlls/cryptui/cryptui.rc
@@ -25,4 +25,13 @@
#include "cryptuires.h"
+/* @makedep: cert.bmp */
+IDB_CERT BITMAP LOADONCALL DISCARDABLE cert.bmp
+
+/* @makedep: certerror.bmp */
+IDB_CERT_ERROR BITMAP LOADONCALL DISCARDABLE certerror.bmp
+
+/* @makedep: certwarning.bmp */
+IDB_CERT_WARNING BITMAP LOADONCALL DISCARDABLE certwarning.bmp
+
#include "cryptui_En.rc"
diff --git a/dlls/cryptui/cryptui_En.rc b/dlls/cryptui/cryptui_En.rc
index 3f718cc..99f18ec 100644
--- a/dlls/cryptui/cryptui_En.rc
+++ b/dlls/cryptui/cryptui_En.rc
@@ -23,6 +23,11 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
IDS_CERTIFICATE "Certificate"
+ IDS_CERTIFICATEINFORMATION "Certificate Information"
+ IDS_CERT_INFO_BAD_SIG "This certificate has an invalid signature. The certificate may have been altered or corrupted."
+ IDS_CERT_INFO_UNTRUSTED_CA "This root certificate is not trusted. To trust it, add it to your system's trusted root certificate store."
+ IDS_CERT_INFO_UNTRUSTED_ROOT "This certificate could not be validated to a trusted root certificate."
+ IDS_CERT_INFO_PARTIAL_CHAIN "This certificate's issuer could not be found."
IDS_SUBJECT_HEADING "Issued to: "
IDS_ISSUER_HEADING "Issued by: "
IDS_VALID_FROM "Valid from "
diff --git a/dlls/cryptui/cryptuires.h b/dlls/cryptui/cryptuires.h
index 8c99b8e..dcc1b7a 100644
--- a/dlls/cryptui/cryptuires.h
+++ b/dlls/cryptui/cryptuires.h
@@ -19,6 +19,11 @@
#define __CRYPTUIRES_H_
#define IDS_CERTIFICATE 1000
+#define IDS_CERTIFICATEINFORMATION 1001
+#define IDS_CERT_INFO_BAD_SIG 1002
+#define IDS_CERT_INFO_UNTRUSTED_CA 1003
+#define IDS_CERT_INFO_UNTRUSTED_ROOT 1004
+#define IDS_CERT_INFO_PARTIAL_CHAIN 1005
#define IDS_SUBJECT_HEADING 1010
#define IDS_ISSUER_HEADING 1011
@@ -27,6 +32,11 @@
#define IDD_GENERAL 100
+#define IDB_CERT 201
+#define IDB_CERT_ERROR 202
+#define IDB_CERT_WARNING 203
+#define IDB_CHECKS 204
+
#define IDC_STATIC 2000
#define IDC_CERTIFICATE_ICON 2001
#define IDC_CERTIFICATE_INFO 2002
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 6ec6aa3..234ccd7 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -20,6 +20,7 @@
#include <stdarg.h>
+#define COBJMACROS
#define NONAMELESSUNION
#include "windef.h"
@@ -29,6 +30,8 @@
#include "softpub.h"
#include "wingdi.h"
#include "richedit.h"
+#include "ole2.h"
+#include "richole.h"
#include "cryptuiapi.h"
#include "cryptuires.h"
#include "wine/debug.h"
@@ -203,8 +206,144 @@ static void add_cert_string_to_control(HWND hwnd, PCCERT_CONTEXT pCertContext,
}
}
+static void add_icon_to_control(HWND hwnd, int id)
+{
+ HRESULT hr;
+ LPRICHEDITOLE richEditOle = NULL;
+ LPOLEOBJECT object = NULL;
+ CLSID clsid;
+ LPOLECACHE oleCache = NULL;
+ FORMATETC formatEtc;
+ DWORD conn;
+ LPDATAOBJECT dataObject = NULL;
+ HBITMAP bitmap = NULL;
+ RECT rect;
+ STGMEDIUM stgm;
+ REOBJECT reObject;
+
+ TRACE("(%p, %d)\n", hwnd, id);
+
+ SendMessageW(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&richEditOle);
+ if (!richEditOle)
+ goto end;
+ hr = OleCreateDefaultHandler(&CLSID_NULL, NULL, &IID_IOleObject,
+ (void**)&object);
+ if (FAILED(hr))
+ goto end;
+ hr = IOleObject_GetUserClassID(object, &clsid);
+ if (FAILED(hr))
+ goto end;
+ hr = IOleObject_QueryInterface(object, &IID_IOleCache, (void**)&oleCache);
+ if (FAILED(hr))
+ goto end;
+ formatEtc.cfFormat = CF_BITMAP;
+ formatEtc.ptd = NULL;
+ formatEtc.dwAspect = DVASPECT_CONTENT;
+ formatEtc.lindex = -1;
+ formatEtc.tymed = TYMED_GDI;
+ hr = IOleCache_Cache(oleCache, &formatEtc, 0, &conn);
+ if (FAILED(hr))
+ goto end;
+ hr = IOleObject_QueryInterface(object, &IID_IDataObject,
+ (void**)&dataObject);
+ if (FAILED(hr))
+ goto end;
+ bitmap = LoadImageW(hInstance, MAKEINTRESOURCEW(id), IMAGE_BITMAP, 0, 0,
+ LR_DEFAULTSIZE | LR_LOADTRANSPARENT);
+ if (!bitmap)
+ goto end;
+ rect.left = rect.top = 0;
+ rect.right = GetSystemMetrics(SM_CXICON);
+ rect.bottom = GetSystemMetrics(SM_CYICON);
+ stgm.tymed = TYMED_GDI;
+ stgm.u.hBitmap = bitmap;
+ stgm.pUnkForRelease = NULL;
+ hr = IDataObject_SetData(dataObject, &formatEtc, &stgm, TRUE);
+ if (FAILED(hr))
+ goto end;
+
+ reObject.cbStruct = sizeof(reObject);
+ reObject.cp = REO_CP_SELECTION;
+ reObject.clsid = clsid;
+ reObject.poleobj = object;
+ reObject.pstg = NULL;
+ reObject.polesite = NULL;
+ reObject.sizel.cx = reObject.sizel.cy = 0;
+ reObject.dvaspect = DVASPECT_CONTENT;
+ reObject.dwFlags = 0;
+ reObject.dwUser = 0;
+
+ IRichEditOle_InsertObject(richEditOle, &reObject);
+
+end:
+ if (dataObject)
+ IDataObject_Release(dataObject);
+ if (oleCache)
+ IOleCache_Release(oleCache);
+ if (object)
+ IOleObject_Release(object);
+ if (richEditOle)
+ IRichEditOle_Release(richEditOle);
+}
+
#define MY_INDENT 200
+static void set_cert_info(HWND hwnd,
+ PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
+{
+ CHARFORMATW charFmt;
+ PARAFORMAT2 parFmt;
+ HWND icon = GetDlgItem(hwnd, IDC_CERTIFICATE_ICON);
+ HWND text = GetDlgItem(hwnd, IDC_CERTIFICATE_INFO);
+ CRYPT_PROVIDER_SGNR *provSigner = WTHelperGetProvSignerFromChain(
+ (CRYPT_PROVIDER_DATA *)pCertViewInfo->u.pCryptProviderData,
+ pCertViewInfo->idxSigner, pCertViewInfo->fCounterSigner,
+ pCertViewInfo->idxCounterSigner);
+ CRYPT_PROVIDER_CERT *root =
+ &provSigner->pasCertChain[provSigner->csCertChain - 1];
+
+ if (provSigner->pChainContext->TrustStatus.dwErrorStatus &
+ CERT_TRUST_IS_PARTIAL_CHAIN)
+ add_icon_to_control(icon, IDB_CERT_WARNING);
+ else if (!root->fTrustedRoot)
+ add_icon_to_control(icon, IDB_CERT_ERROR);
+ else
+ add_icon_to_control(icon, IDB_CERT);
+
+ memset(&charFmt, 0, sizeof(charFmt));
+ charFmt.cbSize = sizeof(charFmt);
+ charFmt.dwMask = CFM_BOLD;
+ charFmt.dwEffects = CFE_BOLD;
+ SendMessageW(text, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFmt);
+ /* FIXME: vertically center text */
+ parFmt.cbSize = sizeof(parFmt);
+ parFmt.dwMask = PFM_STARTINDENT;
+ parFmt.dxStartIndent = MY_INDENT;
+ add_string_resource_with_paraformat_to_control(text,
+ IDS_CERTIFICATEINFORMATION, &parFmt);
+
+ text = GetDlgItem(hwnd, IDC_CERTIFICATE_STATUS);
+ SendMessageW(text, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFmt);
+ if (provSigner->dwError == TRUST_E_CERT_SIGNATURE)
+ add_string_resource_with_paraformat_to_control(text,
+ IDS_CERT_INFO_BAD_SIG, &parFmt);
+ else if (provSigner->pChainContext->TrustStatus.dwErrorStatus &
+ CERT_TRUST_IS_PARTIAL_CHAIN)
+ add_string_resource_with_paraformat_to_control(text,
+ IDS_CERT_INFO_PARTIAL_CHAIN, &parFmt);
+ else if (!root->fTrustedRoot)
+ {
+ if (provSigner->csCertChain == 1 && root->fSelfSigned)
+ add_string_resource_with_paraformat_to_control(text,
+ IDS_CERT_INFO_UNTRUSTED_CA, &parFmt);
+ else
+ add_string_resource_with_paraformat_to_control(text,
+ IDS_CERT_INFO_UNTRUSTED_ROOT, &parFmt);
+ }
+ else
+ FIXME("show policies and issuer statement\n");
+}
+
static void set_cert_name_string(HWND hwnd, PCCERT_CONTEXT cert,
DWORD nameFlags, int heading)
{
@@ -278,7 +417,7 @@ static void set_cert_validity_period(HWND hwnd, PCCERT_CONTEXT cert)
static void set_general_info(HWND hwnd,
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
{
- FIXME("set cert general info\n");
+ set_cert_info(hwnd, pCertViewInfo);
set_cert_name_string(hwnd, pCertViewInfo->pCertContext, 0,
IDS_SUBJECT_HEADING);
set_cert_name_string(hwnd, pCertViewInfo->pCertContext,
More information about the wine-cvs
mailing list