Juan Lang : cryptui: Show cert chain in hierarchy page.
Alexandre Julliard
julliard at winehq.org
Thu Dec 18 08:08:43 CST 2008
Module: wine
Branch: master
Commit: 84a26e5c940bdd3b137450e06f4e2a6818f7c69e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=84a26e5c940bdd3b137450e06f4e2a6818f7c69e
Author: Juan Lang <juan.lang at gmail.com>
Date: Wed Dec 17 09:00:24 2008 -0800
cryptui: Show cert chain in hierarchy page.
---
dlls/cryptui/Makefile.in | 2 +-
dlls/cryptui/cryptui.rc | 3 +
dlls/cryptui/cryptuires.h | 1 +
dlls/cryptui/main.c | 123 ++++++++++++++++++++++++++++++++++++++-----
dlls/cryptui/smallicons.bmp | Bin 0 -> 2358 bytes
5 files changed, 115 insertions(+), 14 deletions(-)
diff --git a/dlls/cryptui/Makefile.in b/dlls/cryptui/Makefile.in
index d81a8e5..e268be6 100644
--- a/dlls/cryptui/Makefile.in
+++ b/dlls/cryptui/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = cryptui.dll
-IMPORTS = uuid crypt32 ole32 comctl32 user32 kernel32
+IMPORTS = uuid crypt32 ole32 comctl32 user32 gdi32 kernel32
DELAYIMPORTS = wintrust urlmon
IMPORTLIB = cryptui
diff --git a/dlls/cryptui/cryptui.rc b/dlls/cryptui/cryptui.rc
index 2a1f0e4..ce3a307 100644
--- a/dlls/cryptui/cryptui.rc
+++ b/dlls/cryptui/cryptui.rc
@@ -25,6 +25,9 @@
#include "cryptuires.h"
+/* @makedep: smallicons.bmp */
+IDB_SMALL_ICONS BITMAP LOADONCALL DISCARDABLE smallicons.bmp
+
/* @makedep: cert.bmp */
IDB_CERT BITMAP LOADONCALL DISCARDABLE cert.bmp
diff --git a/dlls/cryptui/cryptuires.h b/dlls/cryptui/cryptuires.h
index e853141..b8183ee 100644
--- a/dlls/cryptui/cryptuires.h
+++ b/dlls/cryptui/cryptuires.h
@@ -83,6 +83,7 @@
#define IDD_HIERARCHY 102
#define IDD_USERNOTICE 103
+#define IDB_SMALL_ICONS 200
#define IDB_CERT 201
#define IDB_CERT_ERROR 202
#define IDB_CERT_WARNING 203
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 9d44009..98ecad7 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -1744,14 +1744,96 @@ static BOOL init_detail_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo,
struct hierarchy_data
{
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo;
+ HIMAGELIST imageList;
DWORD selectedCert;
};
+static WCHAR *get_cert_property_as_string(PCCERT_CONTEXT cert, DWORD prop)
+{
+ WCHAR *name = NULL;
+ DWORD cb;
+
+ if (CertGetCertificateContextProperty(cert, prop, NULL, &cb))
+ {
+ name = HeapAlloc(GetProcessHeap(), 0, cb);
+ if (name)
+ {
+ if (!CertGetCertificateContextProperty(cert, prop, (LPBYTE)name,
+ &cb))
+ {
+ HeapFree(GetProcessHeap(), 0, name);
+ name = NULL;
+ }
+ }
+ }
+ return name;
+}
+
+static WCHAR *get_cert_display_name(PCCERT_CONTEXT cert)
+{
+ WCHAR *name = get_cert_property_as_string(cert, CERT_FRIENDLY_NAME_PROP_ID);
+
+ if (!name)
+ name = get_cert_name_string(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0);
+ return name;
+}
+
+static void show_cert_chain(HWND hwnd, struct hierarchy_data *data)
+{
+ HWND tree = GetDlgItem(hwnd, IDC_CERTPATH);
+ CRYPT_PROVIDER_SGNR *provSigner = WTHelperGetProvSignerFromChain(
+ (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
+ data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
+ data->pCertViewInfo->idxCounterSigner);
+ DWORD i;
+ HTREEITEM parent = NULL;
+
+ SendMessageW(tree, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)data->imageList);
+ for (i = provSigner->csCertChain; i; i--)
+ {
+ LPWSTR name;
+
+ name = get_cert_display_name(provSigner->pasCertChain[i - 1].pCert);
+ if (name)
+ {
+ TVINSERTSTRUCTW tvis;
+
+ tvis.hParent = parent;
+ tvis.hInsertAfter = TVI_LAST;
+ tvis.u.item.mask = TVIF_TEXT | TVIF_STATE | TVIF_IMAGE |
+ TVIF_SELECTEDIMAGE;
+ tvis.u.item.pszText = name;
+ tvis.u.item.state = TVIS_EXPANDED;
+ tvis.u.item.stateMask = TVIS_EXPANDED;
+ if (i == 1 &&
+ (provSigner->pChainContext->TrustStatus.dwErrorStatus &
+ CERT_TRUST_IS_PARTIAL_CHAIN))
+ {
+ /* The root of the chain has a special case: if the chain is
+ * a partial chain, the icon is a warning icon rather than an
+ * error icon.
+ */
+ tvis.u.item.iImage = 2;
+ }
+ else if (provSigner->pasCertChain[i - 1].pChainElement->TrustStatus.
+ dwErrorStatus == 0)
+ tvis.u.item.iImage = 0;
+ else
+ tvis.u.item.iImage = 1;
+ tvis.u.item.iSelectedImage = tvis.u.item.iImage;
+ parent = (HTREEITEM)SendMessageW(tree, TVM_INSERTITEMW, 0,
+ (LPARAM)&tvis);
+ HeapFree(GetProcessHeap(), 0, name);
+ }
+ }
+}
+
static void show_cert_hierarchy(HWND hwnd, struct hierarchy_data *data)
{
/* Disable view certificate button until a certificate is selected */
EnableWindow(GetDlgItem(hwnd, IDC_VIEWCERTIFICATE), FALSE);
- FIXME("show cert chain\n");
+ show_cert_chain(hwnd, data);
+ FIXME("show cert status\n");
}
static LRESULT CALLBACK hierarchy_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
@@ -1782,6 +1864,7 @@ static UINT CALLBACK hierarchy_callback(HWND hwnd, UINT msg,
{
case PSPCB_RELEASE:
data = (struct hierarchy_data *)page->lParam;
+ ImageList_Destroy(data->imageList);
HeapFree(GetProcessHeap(), 0, data);
break;
}
@@ -1797,18 +1880,32 @@ static BOOL init_hierarchy_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo,
if (data)
{
- data->pCertViewInfo = pCertViewInfo;
- data->selectedCert = 0xffffffff;
-
- memset(page, 0, sizeof(PROPSHEETPAGEW));
- page->dwSize = sizeof(PROPSHEETPAGEW);
- page->dwFlags = PSP_USECALLBACK;
- page->hInstance = hInstance;
- page->u.pszTemplate = MAKEINTRESOURCEW(IDD_HIERARCHY);
- page->pfnDlgProc = hierarchy_dlg_proc;
- page->lParam = (LPARAM)data;
- page->pfnCallback = hierarchy_callback;
- ret = TRUE;
+ data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
+ if (data->imageList)
+ {
+ HBITMAP bmp;
+ COLORREF backColor = RGB(255, 0, 255);
+
+ data->pCertViewInfo = pCertViewInfo;
+ data->selectedCert = 0xffffffff;
+
+ bmp = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_SMALL_ICONS));
+ ImageList_AddMasked(data->imageList, bmp, backColor);
+ DeleteObject(bmp);
+ ImageList_SetBkColor(data->imageList, CLR_NONE);
+
+ memset(page, 0, sizeof(PROPSHEETPAGEW));
+ page->dwSize = sizeof(PROPSHEETPAGEW);
+ page->dwFlags = PSP_USECALLBACK;
+ page->hInstance = hInstance;
+ page->u.pszTemplate = MAKEINTRESOURCEW(IDD_HIERARCHY);
+ page->pfnDlgProc = hierarchy_dlg_proc;
+ page->lParam = (LPARAM)data;
+ page->pfnCallback = hierarchy_callback;
+ ret = TRUE;
+ }
+ else
+ HeapFree(GetProcessHeap(), 0, data);
}
return ret;
}
diff --git a/dlls/cryptui/smallicons.bmp b/dlls/cryptui/smallicons.bmp
new file mode 100644
index 0000000..a936781
Binary files /dev/null and b/dlls/cryptui/smallicons.bmp differ
More information about the wine-cvs
mailing list