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