Module: wine Branch: master Commit: 84a26e5c940bdd3b137450e06f4e2a6818f7c69e URL: http://source.winehq.org/git/wine.git/?a=commit;h=84a26e5c940bdd3b137450e06f...
Author: Juan Lang juan.lang@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