Juan Lang : cryptui: Show issuer statement in cert properties dialog.

Alexandre Julliard julliard at winehq.org
Thu Dec 18 08:08:41 CST 2008


Module: wine
Branch: master
Commit: e7490ad0821356ee7d20ffc4fd357ed826383ae6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e7490ad0821356ee7d20ffc4fd357ed826383ae6

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Dec 17 08:51:27 2008 -0800

cryptui: Show issuer statement in cert properties dialog.

---

 dlls/cryptui/Makefile.in   |    2 +-
 dlls/cryptui/cryptui_En.rc |   11 +++
 dlls/cryptui/cryptuires.h  |    4 +
 dlls/cryptui/main.c        |  208 +++++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 223 insertions(+), 2 deletions(-)

diff --git a/dlls/cryptui/Makefile.in b/dlls/cryptui/Makefile.in
index 078cb33..d81a8e5 100644
--- a/dlls/cryptui/Makefile.in
+++ b/dlls/cryptui/Makefile.in
@@ -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 = \
diff --git a/dlls/cryptui/cryptui_En.rc b/dlls/cryptui/cryptui_En.rc
index f220679..d0ef8b1 100644
--- a/dlls/cryptui/cryptui_En.rc
+++ b/dlls/cryptui/cryptui_En.rc
@@ -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
diff --git a/dlls/cryptui/cryptuires.h b/dlls/cryptui/cryptuires.h
index 7cdb534..e499e0b 100644
--- a/dlls/cryptui/cryptuires.h
+++ b/dlls/cryptui/cryptuires.h
@@ -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_ */
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 148f91d..f04875f 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -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;




More information about the wine-cvs mailing list