cryptui: Show issuer statement in cert properties dialog.

This commit is contained in:
Juan Lang 2008-12-17 08:51:27 -08:00 committed by Alexandre Julliard
parent 86e1184943
commit e7490ad082
4 changed files with 223 additions and 2 deletions

View File

@ -4,7 +4,7 @@ SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = cryptui.dll
IMPORTS = uuid crypt32 ole32 comctl32 user32 kernel32
DELAYIMPORTS = wintrust
DELAYIMPORTS = wintrust urlmon
IMPORTLIB = cryptui
C_SRCS = \

View File

@ -81,3 +81,14 @@ BEGIN
PUSHBUTTON "&Install Certificate...", IDC_ADDTOSTORE,103,216,70,14
PUSHBUTTON "Issuer &Statement", IDC_ISSUERSTATEMENT,177,216,70,14
END
IDD_USERNOTICE DIALOG DISCARDABLE 0, 0, 255, 256
CAPTION "Disclaimer"
STYLE WS_VISIBLE
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", IDC_USERNOTICE,"RichEdit20W",
WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200
PUSHBUTTON "Close", IDOK,103,216,70,14
PUSHBUTTON "More &Info", IDC_CPS,177,216,70,14
END

View File

@ -60,6 +60,7 @@
#define IDS_PURPOSE_DS_EMAIL_REPLICATION 1125
#define IDD_GENERAL 100
#define IDD_USERNOTICE 103
#define IDB_CERT 201
#define IDB_CERT_ERROR 202
@ -74,4 +75,7 @@
#define IDC_ADDTOSTORE 2005
#define IDC_ISSUERSTATEMENT 2006
#define IDC_USERNOTICE 2300
#define IDC_CPS 2301
#endif /* ndef __CRYPTUIRES_H_ */

View File

@ -34,6 +34,8 @@
#include "richole.h"
#include "cryptuiapi.h"
#include "cryptuires.h"
#include "urlmon.h"
#include "hlink.h"
#include "wine/debug.h"
#include "wine/unicode.h"
@ -614,6 +616,117 @@ static void set_policy_text(HWND text,
}
}
static CRYPT_OBJID_BLOB *find_policy_qualifier(CERT_POLICIES_INFO *policies,
LPCSTR policyOid)
{
CRYPT_OBJID_BLOB *ret = NULL;
DWORD i;
for (i = 0; !ret && i < policies->cPolicyInfo; i++)
{
DWORD j;
for (j = 0; !ret && j < policies->rgPolicyInfo[i].cPolicyQualifier; j++)
if (!strcmp(policies->rgPolicyInfo[i].rgPolicyQualifier[j].
pszPolicyQualifierId, policyOid))
ret = &policies->rgPolicyInfo[i].rgPolicyQualifier[j].
Qualifier;
}
return ret;
}
static WCHAR *get_cps_str_from_qualifier(CRYPT_OBJID_BLOB *qualifier)
{
LPWSTR qualifierStr = NULL;
CERT_NAME_VALUE *qualifierValue;
DWORD size;
if (CryptDecodeObjectEx(X509_ASN_ENCODING, X509_NAME_VALUE,
qualifier->pbData, qualifier->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
&qualifierValue, &size))
{
size = CertRDNValueToStrW(qualifierValue->dwValueType,
&qualifierValue->Value, NULL, 0);
qualifierStr = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
if (qualifierStr)
CertRDNValueToStrW(qualifierValue->dwValueType,
&qualifierValue->Value, qualifierStr, size);
LocalFree(qualifierValue);
}
return qualifierStr;
}
static WCHAR *get_user_notice_from_qualifier(CRYPT_OBJID_BLOB *qualifier)
{
LPWSTR str = NULL;
CERT_POLICY_QUALIFIER_USER_NOTICE *qualifierValue;
DWORD size;
if (CryptDecodeObjectEx(X509_ASN_ENCODING,
X509_PKIX_POLICY_QUALIFIER_USERNOTICE,
qualifier->pbData, qualifier->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
&qualifierValue, &size))
{
str = HeapAlloc(GetProcessHeap(), 0,
(strlenW(qualifierValue->pszDisplayText) + 1) * sizeof(WCHAR));
if (str)
strcpyW(str, qualifierValue->pszDisplayText);
LocalFree(qualifierValue);
}
return str;
}
struct IssuerStatement
{
LPWSTR cps;
LPWSTR userNotice;
};
static void set_issuer_statement(HWND hwnd,
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
{
PCERT_EXTENSION policyExt;
if (!(pCertViewInfo->dwFlags & CRYPTUI_DISABLE_ISSUERSTATEMENT) &&
(policyExt = CertFindExtension(szOID_CERT_POLICIES,
pCertViewInfo->pCertContext->pCertInfo->cExtension,
pCertViewInfo->pCertContext->pCertInfo->rgExtension)))
{
CERT_POLICIES_INFO *policies;
DWORD size;
if (CryptDecodeObjectEx(X509_ASN_ENCODING, policyExt->pszObjId,
policyExt->Value.pbData, policyExt->Value.cbData,
CRYPT_DECODE_ALLOC_FLAG, NULL, &policies, &size))
{
CRYPT_OBJID_BLOB *qualifier;
LPWSTR cps = NULL, userNotice = NULL;
if ((qualifier = find_policy_qualifier(policies,
szOID_PKIX_POLICY_QUALIFIER_CPS)))
cps = get_cps_str_from_qualifier(qualifier);
if ((qualifier = find_policy_qualifier(policies,
szOID_PKIX_POLICY_QUALIFIER_USERNOTICE)))
userNotice = get_user_notice_from_qualifier(qualifier);
if (cps || userNotice)
{
struct IssuerStatement *issuerStatement =
HeapAlloc(GetProcessHeap(), 0, sizeof(struct IssuerStatement));
if (issuerStatement)
{
issuerStatement->cps = cps;
issuerStatement->userNotice = userNotice;
EnableWindow(GetDlgItem(hwnd, IDC_ISSUERSTATEMENT), TRUE);
SetWindowLongPtrW(hwnd, DWLP_USER,
(ULONG_PTR)issuerStatement);
}
}
LocalFree(policies);
}
}
}
static void set_cert_info(HWND hwnd,
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
{
@ -669,7 +782,7 @@ static void set_cert_info(HWND hwnd,
else
{
set_policy_text(text, pCertViewInfo);
FIXME("show issuer statement\n");
set_issuer_statement(hwnd, pCertViewInfo);
}
}
@ -754,6 +867,55 @@ static void set_general_info(HWND hwnd,
set_cert_validity_period(hwnd, pCertViewInfo->pCertContext);
}
static LRESULT CALLBACK user_notice_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
LPARAM lp)
{
LRESULT ret = 0;
HWND text;
struct IssuerStatement *issuerStatement;
switch (msg)
{
case WM_INITDIALOG:
text = GetDlgItem(hwnd, IDC_USERNOTICE);
issuerStatement = (struct IssuerStatement *)lp;
add_unformatted_text_to_control(text, issuerStatement->userNotice,
strlenW(issuerStatement->userNotice));
if (issuerStatement->cps)
SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)issuerStatement->cps);
else
EnableWindow(GetDlgItem(hwnd, IDC_CPS), FALSE);
break;
case WM_COMMAND:
switch (wp)
{
case IDOK:
EndDialog(hwnd, IDOK);
ret = TRUE;
break;
case IDC_CPS:
{
IBindCtx *bctx = NULL;
LPWSTR cps;
CreateBindCtx(0, &bctx);
cps = (LPWSTR)GetWindowLongPtrW(hwnd, DWLP_USER);
HlinkSimpleNavigateToString(cps, NULL, NULL, NULL, bctx, NULL,
HLNF_OPENINNEWWINDOW, 0);
IBindCtx_Release(bctx);
break;
}
}
}
return ret;
}
static void show_user_notice(HWND hwnd, struct IssuerStatement *issuerStatement)
{
DialogBoxParamW(hInstance, MAKEINTRESOURCEW(IDD_USERNOTICE), hwnd,
user_notice_dlg_proc, (LPARAM)issuerStatement);
}
static LRESULT CALLBACK general_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
LPARAM lp)
{
@ -778,17 +940,61 @@ static LRESULT CALLBACK general_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
case IDC_ADDTOSTORE:
FIXME("call CryptUIWizImport\n");
break;
case IDC_ISSUERSTATEMENT:
{
struct IssuerStatement *issuerStatement =
(struct IssuerStatement *)GetWindowLongPtrW(hwnd, DWLP_USER);
if (issuerStatement)
{
if (issuerStatement->userNotice)
show_user_notice(hwnd, issuerStatement);
else if (issuerStatement->cps)
{
IBindCtx *bctx = NULL;
CreateBindCtx(0, &bctx);
HlinkSimpleNavigateToString(issuerStatement->cps, NULL,
NULL, NULL, bctx, NULL, HLNF_OPENINNEWWINDOW, 0);
IBindCtx_Release(bctx);
}
}
break;
}
}
break;
}
return 0;
}
static UINT CALLBACK general_callback_proc(HWND hwnd, UINT msg,
PROPSHEETPAGEW *page)
{
struct IssuerStatement *issuerStatement;
switch (msg)
{
case PSPCB_RELEASE:
issuerStatement =
(struct IssuerStatement *)GetWindowLongPtrW(hwnd, DWLP_USER);
if (issuerStatement)
{
HeapFree(GetProcessHeap(), 0, issuerStatement->cps);
HeapFree(GetProcessHeap(), 0, issuerStatement->userNotice);
HeapFree(GetProcessHeap(), 0, issuerStatement);
}
break;
}
return 1;
}
static void init_general_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo,
PROPSHEETPAGEW *page)
{
memset(page, 0, sizeof(PROPSHEETPAGEW));
page->dwSize = sizeof(PROPSHEETPAGEW);
page->dwFlags = PSP_USECALLBACK;
page->pfnCallback = general_callback_proc;
page->hInstance = hInstance;
page->u.pszTemplate = MAKEINTRESOURCEW(IDD_GENERAL);
page->pfnDlgProc = general_dlg_proc;