cryptui: Show cert chain in hierarchy page.
This commit is contained in:
parent
e958485fe2
commit
84a26e5c94
|
@ -3,7 +3,7 @@ TOPOBJDIR = ../..
|
||||||
SRCDIR = @srcdir@
|
SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = cryptui.dll
|
MODULE = cryptui.dll
|
||||||
IMPORTS = uuid crypt32 ole32 comctl32 user32 kernel32
|
IMPORTS = uuid crypt32 ole32 comctl32 user32 gdi32 kernel32
|
||||||
DELAYIMPORTS = wintrust urlmon
|
DELAYIMPORTS = wintrust urlmon
|
||||||
IMPORTLIB = cryptui
|
IMPORTLIB = cryptui
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
|
|
||||||
#include "cryptuires.h"
|
#include "cryptuires.h"
|
||||||
|
|
||||||
|
/* @makedep: smallicons.bmp */
|
||||||
|
IDB_SMALL_ICONS BITMAP LOADONCALL DISCARDABLE smallicons.bmp
|
||||||
|
|
||||||
/* @makedep: cert.bmp */
|
/* @makedep: cert.bmp */
|
||||||
IDB_CERT BITMAP LOADONCALL DISCARDABLE cert.bmp
|
IDB_CERT BITMAP LOADONCALL DISCARDABLE cert.bmp
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@
|
||||||
#define IDD_HIERARCHY 102
|
#define IDD_HIERARCHY 102
|
||||||
#define IDD_USERNOTICE 103
|
#define IDD_USERNOTICE 103
|
||||||
|
|
||||||
|
#define IDB_SMALL_ICONS 200
|
||||||
#define IDB_CERT 201
|
#define IDB_CERT 201
|
||||||
#define IDB_CERT_ERROR 202
|
#define IDB_CERT_ERROR 202
|
||||||
#define IDB_CERT_WARNING 203
|
#define IDB_CERT_WARNING 203
|
||||||
|
|
|
@ -1744,14 +1744,96 @@ static BOOL init_detail_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo,
|
||||||
struct hierarchy_data
|
struct hierarchy_data
|
||||||
{
|
{
|
||||||
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo;
|
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo;
|
||||||
|
HIMAGELIST imageList;
|
||||||
DWORD selectedCert;
|
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)
|
static void show_cert_hierarchy(HWND hwnd, struct hierarchy_data *data)
|
||||||
{
|
{
|
||||||
/* Disable view certificate button until a certificate is selected */
|
/* Disable view certificate button until a certificate is selected */
|
||||||
EnableWindow(GetDlgItem(hwnd, IDC_VIEWCERTIFICATE), FALSE);
|
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,
|
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:
|
case PSPCB_RELEASE:
|
||||||
data = (struct hierarchy_data *)page->lParam;
|
data = (struct hierarchy_data *)page->lParam;
|
||||||
|
ImageList_Destroy(data->imageList);
|
||||||
HeapFree(GetProcessHeap(), 0, data);
|
HeapFree(GetProcessHeap(), 0, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1797,18 +1880,32 @@ static BOOL init_hierarchy_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo,
|
||||||
|
|
||||||
if (data)
|
if (data)
|
||||||
{
|
{
|
||||||
data->pCertViewInfo = pCertViewInfo;
|
data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
|
||||||
data->selectedCert = 0xffffffff;
|
if (data->imageList)
|
||||||
|
{
|
||||||
|
HBITMAP bmp;
|
||||||
|
COLORREF backColor = RGB(255, 0, 255);
|
||||||
|
|
||||||
memset(page, 0, sizeof(PROPSHEETPAGEW));
|
data->pCertViewInfo = pCertViewInfo;
|
||||||
page->dwSize = sizeof(PROPSHEETPAGEW);
|
data->selectedCert = 0xffffffff;
|
||||||
page->dwFlags = PSP_USECALLBACK;
|
|
||||||
page->hInstance = hInstance;
|
bmp = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_SMALL_ICONS));
|
||||||
page->u.pszTemplate = MAKEINTRESOURCEW(IDD_HIERARCHY);
|
ImageList_AddMasked(data->imageList, bmp, backColor);
|
||||||
page->pfnDlgProc = hierarchy_dlg_proc;
|
DeleteObject(bmp);
|
||||||
page->lParam = (LPARAM)data;
|
ImageList_SetBkColor(data->imageList, CLR_NONE);
|
||||||
page->pfnCallback = hierarchy_callback;
|
|
||||||
ret = TRUE;
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
Loading…
Reference in New Issue