Juan Lang : cryptui: Recall usage state from registry in certificate manager dialog' s advanced dialog.
Alexandre Julliard
julliard at winehq.org
Fri Jan 9 09:52:31 CST 2009
Module: wine
Branch: master
Commit: 0c17a5d61cabfd3ad3bf6466b2ae65cc246d4cad
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0c17a5d61cabfd3ad3bf6466b2ae65cc246d4cad
Author: Juan Lang <juan.lang at gmail.com>
Date: Wed Jan 7 16:32:45 2009 -0800
cryptui: Recall usage state from registry in certificate manager dialog's advanced dialog.
---
dlls/cryptui/Makefile.in | 2 +-
dlls/cryptui/main.c | 105 +++++++++++++++++++++++++++++++++++----------
2 files changed, 82 insertions(+), 25 deletions(-)
diff --git a/dlls/cryptui/Makefile.in b/dlls/cryptui/Makefile.in
index d70d0ea..ca01d35 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 comdlg32 user32 gdi32 kernel32
+IMPORTS = uuid crypt32 ole32 comctl32 comdlg32 user32 gdi32 advapi32 kernel32
DELAYIMPORTS = wintrust urlmon
IMPORTLIB = cryptui
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 4a4bb2d..301a759 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -38,6 +38,7 @@
#include "cryptuires.h"
#include "urlmon.h"
#include "hlink.h"
+#include "winreg.h"
#include "wine/debug.h"
#include "wine/unicode.h"
@@ -187,6 +188,41 @@ static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen,
}
}
+static LPSTR get_cert_mgr_usages(void)
+{
+ static const WCHAR keyName[] = { 'S','o','f','t','w','a','r','e','\\','M',
+ 'i','c','r','o','s','o','f','t','\\','C','r','y','p','t','o','g','r','a',
+ 'p','h','y','\\','U','I','\\','C','e','r','t','m','g','r','\\','P','u',
+ 'r','p','o','s','e',0 };
+ LPSTR str = NULL;
+ HKEY key;
+
+ if (!RegCreateKeyExW(HKEY_CURRENT_USER, keyName, 0, NULL, 0, KEY_READ,
+ NULL, &key, NULL))
+ {
+ LONG rc;
+ DWORD type, size;
+
+ rc = RegQueryValueExA(key, "Purpose", NULL, &type, NULL, &size);
+ if ((!rc || rc == ERROR_MORE_DATA) && type == REG_SZ)
+ {
+ str = HeapAlloc(GetProcessHeap(), 0, size);
+ if (str)
+ {
+ rc = RegQueryValueExA(key, "Purpose", NULL, NULL, (LPBYTE)str,
+ &size);
+ if (rc)
+ {
+ HeapFree(GetProcessHeap(), 0, str);
+ str = NULL;
+ }
+ }
+ }
+ RegCloseKey(key);
+ }
+ return str;
+}
+
static void show_store_certs(HWND hwnd, HCERTSTORE store)
{
HWND lv = GetDlgItem(hwnd, IDC_MGR_CERTS);
@@ -359,6 +395,31 @@ static void toggle_usage(HWND hwnd, int iItem)
}
}
+static LONG_PTR find_oid_in_list(HWND lv, LPCSTR oid)
+{
+ PCCRYPT_OID_INFO oidInfo = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
+ (void *)oid, CRYPT_ENHKEY_USAGE_OID_GROUP_ID);
+ LONG_PTR ret;
+
+ if (oidInfo)
+ {
+ LVFINDINFOW findInfo;
+
+ findInfo.flags = LVFI_PARAM;
+ findInfo.lParam = (LPARAM)oidInfo;
+ ret = SendMessageW(lv, LVM_FINDITEMW, -1, (LPARAM)&findInfo);
+ }
+ else
+ {
+ LVFINDINFOA findInfo;
+
+ findInfo.flags = LVFI_STRING;
+ findInfo.psz = oid;
+ ret = SendMessageW(lv, LVM_FINDITEMA, -1, (LPARAM)&findInfo);
+ }
+ return ret;
+}
+
static LRESULT CALLBACK cert_mgr_advanced_dlg_proc(HWND hwnd, UINT msg,
WPARAM wp, LPARAM lp)
{
@@ -370,6 +431,7 @@ static LRESULT CALLBACK cert_mgr_advanced_dlg_proc(HWND hwnd, UINT msg,
LVCOLUMNW column;
HWND lv = GetDlgItem(hwnd, IDC_CERTIFICATE_USAGES);
HIMAGELIST imageList;
+ LPSTR disabledUsages;
GetWindowRect(lv, &rc);
column.mask = LVCF_WIDTH;
@@ -389,6 +451,23 @@ static LRESULT CALLBACK cert_mgr_advanced_dlg_proc(HWND hwnd, UINT msg,
SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)imageList);
}
add_known_usages_to_list(lv, CheckBitmapIndexChecked);
+ if ((disabledUsages = get_cert_mgr_usages()))
+ {
+ LPSTR ptr, comma;
+
+ for (ptr = disabledUsages, comma = strchr(ptr, ','); ptr && *ptr;
+ ptr = comma ? comma + 1 : NULL,
+ comma = ptr ? strchr(ptr, ',') : NULL)
+ {
+ LONG_PTR index;
+
+ if (comma)
+ *comma = 0;
+ if ((index = find_oid_in_list(lv, ptr)) != -1)
+ toggle_usage(hwnd, index);
+ }
+ HeapFree(GetProcessHeap(), 0, disabledUsages);
+ }
break;
}
case WM_NOTIFY:
@@ -2408,30 +2487,8 @@ static BOOL is_valid_oid(LPCSTR oid)
static BOOL is_oid_in_list(HWND hwnd, LPCSTR oid)
{
- HWND lv = GetDlgItem(hwnd, IDC_CERTIFICATE_USAGES);
- PCCRYPT_OID_INFO oidInfo = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
- (void *)oid, CRYPT_ENHKEY_USAGE_OID_GROUP_ID);
- BOOL ret = FALSE;
-
- if (oidInfo)
- {
- LVFINDINFOW findInfo;
-
- findInfo.flags = LVFI_PARAM;
- findInfo.lParam = (LPARAM)oidInfo;
- if (SendMessageW(lv, LVM_FINDITEMW, -1, (LPARAM)&findInfo) != -1)
- ret = TRUE;
- }
- else
- {
- LVFINDINFOA findInfo;
-
- findInfo.flags = LVFI_STRING;
- findInfo.psz = oid;
- if (SendMessageW(lv, LVM_FINDITEMA, -1, (LPARAM)&findInfo) != -1)
- ret = TRUE;
- }
- return ret;
+ return find_oid_in_list(GetDlgItem(hwnd, IDC_CERTIFICATE_USAGES), oid)
+ != -1;
}
#define MAX_PURPOSE 255
More information about the wine-cvs
mailing list