Juan Lang : cryptui: Display contents of certificate store in certificate manager dialog.
Alexandre Julliard
julliard at winehq.org
Fri Jan 9 09:52:29 CST 2009
Module: wine
Branch: master
Commit: 29dcd605870bbe26bac277999b436191cd8222a4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=29dcd605870bbe26bac277999b436191cd8222a4
Author: Juan Lang <juan.lang at gmail.com>
Date: Wed Jan 7 16:20:25 2009 -0800
cryptui: Display contents of certificate store in certificate manager dialog.
---
dlls/cryptui/main.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 127 insertions(+), 0 deletions(-)
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 52d1bda..8a84c34 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -109,6 +109,99 @@ static void initialize_purpose_selection(HWND hwnd)
SendMessageW(cb, CB_SETCURSEL, 0, 0);
}
+static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen,
+ LPWSTR *str)
+{
+ DWORD len;
+ LVITEMW item;
+ WCHAR dateFmt[80]; /* sufficient for LOCALE_SSHORTDATE */
+ WCHAR date[80];
+ SYSTEMTIME sysTime;
+
+ item.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_TEXT;
+ item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
+ item.iSubItem = 0;
+ item.iImage = 0;
+ item.lParam = (LPARAM)CertDuplicateCertificateContext(cert);
+ len = CertGetNameStringW(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL,
+ NULL, 0);
+ if (len > *allocatedLen)
+ {
+ HeapFree(GetProcessHeap(), 0, *str);
+ *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (*str)
+ *allocatedLen = len;
+ }
+ if (*str)
+ {
+ CertGetNameStringW(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL,
+ *str, len);
+ item.pszText = *str;
+ SendMessageW(lv, LVM_INSERTITEMW, 0, (LPARAM)&item);
+ }
+
+ item.mask = LVIF_TEXT;
+ len = CertGetNameStringW(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE,
+ CERT_NAME_ISSUER_FLAG, NULL, NULL, 0);
+ if (len > *allocatedLen)
+ {
+ HeapFree(GetProcessHeap(), 0, *str);
+ *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (*str)
+ *allocatedLen = len;
+ }
+ if (*str)
+ {
+ CertGetNameStringW(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE,
+ CERT_NAME_ISSUER_FLAG, NULL, *str, len);
+ item.pszText = *str;
+ item.iSubItem = 1;
+ SendMessageW(lv, LVM_SETITEMTEXTW, item.iItem, (LPARAM)&item);
+ }
+
+ GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, dateFmt,
+ sizeof(dateFmt) / sizeof(dateFmt[0]));
+ FileTimeToSystemTime(&cert->pCertInfo->NotAfter, &sysTime);
+ GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date,
+ sizeof(date) / sizeof(date[0]));
+ item.pszText = date;
+ item.iSubItem = 2;
+ SendMessageW(lv, LVM_SETITEMTEXTW, item.iItem, (LPARAM)&item);
+
+ len = CertGetNameStringW(cert, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL,
+ NULL, 0);
+ if (len > *allocatedLen)
+ {
+ HeapFree(GetProcessHeap(), 0, *str);
+ *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (*str)
+ *allocatedLen = len;
+ }
+ if (*str)
+ {
+ CertGetNameStringW(cert, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL,
+ *str, len);
+ item.pszText = *str;
+ item.iSubItem = 3;
+ SendMessageW(lv, LVM_SETITEMTEXTW, item.iItem, (LPARAM)&item);
+ }
+}
+
+static void show_store_certs(HWND hwnd, HCERTSTORE store)
+{
+ HWND lv = GetDlgItem(hwnd, IDC_MGR_CERTS);
+ PCCERT_CONTEXT cert = NULL;
+ DWORD allocatedLen = 0;
+ LPWSTR str = NULL;
+
+ do {
+ cert = CertEnumCertificatesInStore(store, cert);
+ if (cert)
+ add_cert_to_view(lv, cert, &allocatedLen, &str);
+ } while (cert);
+ HeapFree(GetProcessHeap(), 0, str);
+}
+
static const WCHAR my[] = { 'M','y',0 };
static const WCHAR addressBook[] = {
'A','d','d','r','e','s','s','B','o','o','k',0 };
@@ -157,6 +250,21 @@ static void show_cert_stores(HWND hwnd, DWORD dwFlags)
}
}
+static void free_certs(HWND lv)
+{
+ LVITEMW item;
+ int items = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0), i;
+
+ for (i = 0; i < items; i++)
+ {
+ item.mask = LVIF_PARAM;
+ item.iItem = i;
+ item.iSubItem = 0;
+ SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item);
+ CertFreeCertificateContext((PCCERT_CONTEXT)item.lParam);
+ }
+}
+
static HCERTSTORE cert_mgr_index_to_store(HWND tab, int index)
{
TCITEMW item;
@@ -183,20 +291,39 @@ static LRESULT CALLBACK cert_mgr_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
{
PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr =
(PCCRYPTUI_CERT_MGR_STRUCT)lp;
+ HIMAGELIST imageList;
+ HWND tab = GetDlgItem(hwnd, IDC_MGR_STORES);
+ imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
+ if (imageList)
+ {
+ HBITMAP bmp;
+ COLORREF backColor = RGB(255, 0, 255);
+
+ bmp = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_SMALL_ICONS));
+ ImageList_AddMasked(imageList, bmp, backColor);
+ DeleteObject(bmp);
+ ImageList_SetBkColor(imageList, CLR_NONE);
+ SendMessageW(GetDlgItem(hwnd, IDC_MGR_CERTS), LVM_SETIMAGELIST,
+ LVSIL_SMALL, (LPARAM)imageList);
+ SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)imageList);
+ }
initialize_purpose_selection(hwnd);
add_cert_columns(hwnd);
if (pCryptUICertMgr->pwszTitle)
SendMessageW(hwnd, WM_SETTEXT, 0,
(LPARAM)pCryptUICertMgr->pwszTitle);
show_cert_stores(hwnd, pCryptUICertMgr->dwFlags);
+ show_store_certs(hwnd, cert_mgr_index_to_store(tab, 0));
break;
}
case WM_COMMAND:
switch (wp)
{
case IDCANCEL:
+ free_certs(GetDlgItem(hwnd, IDC_MGR_CERTS));
close_stores(GetDlgItem(hwnd, IDC_MGR_STORES));
+ ImageList_Destroy((HIMAGELIST)GetWindowLongPtrW(hwnd, DWLP_USER));
EndDialog(hwnd, IDCANCEL);
break;
}
More information about the wine-cvs
mailing list