Juan Lang : cryptui: Show subject, issuer, and validity period for a cert in the properties dialog.

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


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Dec 16 09:46:39 2008 -0800

cryptui: Show subject, issuer, and validity period for a cert in the properties dialog.

---

 dlls/cryptui/cryptui_En.rc |    4 +
 dlls/cryptui/cryptuires.h  |    5 +
 dlls/cryptui/main.c        |  182 +++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 190 insertions(+), 1 deletions(-)

diff --git a/dlls/cryptui/cryptui_En.rc b/dlls/cryptui/cryptui_En.rc
index 625de87..3f718cc 100644
--- a/dlls/cryptui/cryptui_En.rc
+++ b/dlls/cryptui/cryptui_En.rc
@@ -23,6 +23,10 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
 STRINGTABLE DISCARDABLE
 {
     IDS_CERTIFICATE "Certificate"
+    IDS_SUBJECT_HEADING "Issued to: "
+    IDS_ISSUER_HEADING "Issued by: "
+    IDS_VALID_FROM "Valid from "
+    IDS_VALID_TO " to "
 }
 
 IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
diff --git a/dlls/cryptui/cryptuires.h b/dlls/cryptui/cryptuires.h
index 54ce3fa..8c99b8e 100644
--- a/dlls/cryptui/cryptuires.h
+++ b/dlls/cryptui/cryptuires.h
@@ -20,6 +20,11 @@
 
 #define IDS_CERTIFICATE 1000
 
+#define IDS_SUBJECT_HEADING 1010
+#define IDS_ISSUER_HEADING 1011
+#define IDS_VALID_FROM 1012
+#define IDS_VALID_TO 1013
+
 #define IDD_GENERAL 100
 
 #define IDC_STATIC 2000
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 7351743..6ec6aa3 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -27,6 +27,8 @@
 #include "winnls.h"
 #include "winuser.h"
 #include "softpub.h"
+#include "wingdi.h"
+#include "richedit.h"
 #include "cryptuiapi.h"
 #include "cryptuires.h"
 #include "wine/debug.h"
@@ -106,6 +108,184 @@ error:
     return ret;
 }
 
+struct ReadStringStruct
+{
+    LPCWSTR buf;
+    LONG pos;
+    LONG len;
+};
+
+static DWORD CALLBACK read_text_callback(DWORD_PTR dwCookie, LPBYTE buf,
+ LONG cb, LONG *pcb)
+{
+    struct ReadStringStruct *string = (struct ReadStringStruct *)dwCookie;
+    LONG cch = min(cb / sizeof(WCHAR), string->len - string->pos);
+
+    TRACE("(%p, %p, %d, %p)\n", string, buf, cb, pcb);
+
+    memmove(buf, string->buf + string->pos, cch * sizeof(WCHAR));
+    string->pos += cch;
+    *pcb = cch * sizeof(WCHAR);
+    return 0;
+}
+
+static void add_unformatted_text_to_control(HWND hwnd, LPCWSTR text, LONG len)
+{
+    struct ReadStringStruct string;
+    EDITSTREAM editstream;
+
+    TRACE("(%p, %s)\n", hwnd, debugstr_wn(text, len));
+
+    string.buf = text;
+    string.pos = 0;
+    string.len = len;
+    editstream.dwCookie = (DWORD_PTR)&string;
+    editstream.dwError = 0;
+    editstream.pfnCallback = read_text_callback;
+    SendMessageW(hwnd, EM_STREAMIN, SF_TEXT | SFF_SELECTION | SF_UNICODE,
+     (LPARAM)&editstream);
+}
+
+static void add_string_resource_to_control(HWND hwnd, int id)
+{
+    LPWSTR str;
+    LONG len;
+
+    len = LoadStringW(hInstance, id, (LPWSTR)&str, 0);
+    add_unformatted_text_to_control(hwnd, str, len);
+}
+
+static void add_text_with_paraformat_to_control(HWND hwnd, LPCWSTR text,
+ LONG len, const PARAFORMAT2 *fmt)
+{
+    add_unformatted_text_to_control(hwnd, text, len);
+    SendMessageW(hwnd, EM_SETPARAFORMAT, 0, (LPARAM)fmt);
+}
+
+static void add_string_resource_with_paraformat_to_control(HWND hwnd, int id,
+ const PARAFORMAT2 *fmt)
+{
+    LPWSTR str;
+    LONG len;
+
+    len = LoadStringW(hInstance, id, (LPWSTR)&str, 0);
+    add_text_with_paraformat_to_control(hwnd, str, len, fmt);
+}
+
+static LPWSTR get_cert_name_string(PCCERT_CONTEXT pCertContext, DWORD dwType,
+ DWORD dwFlags)
+{
+    LPWSTR buf = NULL;
+    DWORD len;
+
+    len = CertGetNameStringW(pCertContext, dwType, dwFlags, NULL, NULL, 0);
+    if (len)
+    {
+        buf = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+        if (buf)
+            CertGetNameStringW(pCertContext, dwType, dwFlags, NULL, buf, len);
+    }
+    return buf;
+}
+
+static void add_cert_string_to_control(HWND hwnd, PCCERT_CONTEXT pCertContext,
+ DWORD dwType, DWORD dwFlags)
+{
+    LPWSTR name = get_cert_name_string(pCertContext, dwType, dwFlags);
+
+    if (name)
+    {
+        /* Don't include NULL-terminator in output */
+        DWORD len = lstrlenW(name);
+
+        add_unformatted_text_to_control(hwnd, name, len);
+        HeapFree(GetProcessHeap(), 0, name);
+    }
+}
+
+#define MY_INDENT 200
+
+static void set_cert_name_string(HWND hwnd, PCCERT_CONTEXT cert,
+ DWORD nameFlags, int heading)
+{
+    WCHAR nl = '\n';
+    HWND text = GetDlgItem(hwnd, IDC_CERTIFICATE_NAMES);
+    CHARFORMATW charFmt;
+    PARAFORMAT2 parFmt;
+
+    memset(&charFmt, 0, sizeof(charFmt));
+    charFmt.cbSize = sizeof(charFmt);
+    charFmt.dwMask = CFM_BOLD;
+    charFmt.dwEffects = CFE_BOLD;
+    SendMessageW(text, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFmt);
+    parFmt.cbSize = sizeof(parFmt);
+    parFmt.dwMask = PFM_STARTINDENT;
+    parFmt.dxStartIndent = MY_INDENT * 3;
+    add_string_resource_with_paraformat_to_control(text, heading, &parFmt);
+    charFmt.dwEffects = 0;
+    SendMessageW(text, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFmt);
+    add_cert_string_to_control(text, cert, CERT_NAME_SIMPLE_DISPLAY_TYPE,
+     nameFlags);
+    add_unformatted_text_to_control(text, &nl, 1);
+    add_unformatted_text_to_control(text, &nl, 1);
+    add_unformatted_text_to_control(text, &nl, 1);
+
+}
+
+static void add_date_string_to_control(HWND hwnd, const FILETIME *fileTime)
+{
+    WCHAR dateFmt[80]; /* sufficient for all versions of LOCALE_SSHORTDATE */
+    WCHAR date[80];
+    SYSTEMTIME sysTime;
+
+    GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, dateFmt,
+     sizeof(dateFmt) / sizeof(dateFmt[0]));
+    FileTimeToSystemTime(fileTime, &sysTime);
+    GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date,
+     sizeof(date) / sizeof(date[0]));
+    add_unformatted_text_to_control(hwnd, date, lstrlenW(date));
+}
+
+static void set_cert_validity_period(HWND hwnd, PCCERT_CONTEXT cert)
+{
+    WCHAR nl = '\n';
+    HWND text = GetDlgItem(hwnd, IDC_CERTIFICATE_NAMES);
+    CHARFORMATW charFmt;
+    PARAFORMAT2 parFmt;
+
+    memset(&charFmt, 0, sizeof(charFmt));
+    charFmt.cbSize = sizeof(charFmt);
+    charFmt.dwMask = CFM_BOLD;
+    charFmt.dwEffects = CFE_BOLD;
+    SendMessageW(text, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFmt);
+    parFmt.cbSize = sizeof(parFmt);
+    parFmt.dwMask = PFM_STARTINDENT;
+    parFmt.dxStartIndent = MY_INDENT * 3;
+    add_string_resource_with_paraformat_to_control(text, IDS_VALID_FROM,
+     &parFmt);
+    charFmt.dwEffects = 0;
+    SendMessageW(text, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFmt);
+    add_date_string_to_control(text, &cert->pCertInfo->NotBefore);
+    charFmt.dwEffects = CFE_BOLD;
+    SendMessageW(text, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFmt);
+    add_string_resource_to_control(text, IDS_VALID_TO);
+    charFmt.dwEffects = 0;
+    SendMessageW(text, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFmt);
+    add_date_string_to_control(text, &cert->pCertInfo->NotAfter);
+    add_unformatted_text_to_control(text, &nl, 1);
+}
+
+static void set_general_info(HWND hwnd,
+ PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
+{
+    FIXME("set cert general info\n");
+    set_cert_name_string(hwnd, pCertViewInfo->pCertContext, 0,
+     IDS_SUBJECT_HEADING);
+    set_cert_name_string(hwnd, pCertViewInfo->pCertContext,
+     CERT_NAME_ISSUER_FLAG, IDS_ISSUER_HEADING);
+    set_cert_validity_period(hwnd, pCertViewInfo->pCertContext);
+}
+
 static LRESULT CALLBACK general_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
  LPARAM lp)
 {
@@ -122,7 +302,7 @@ static LRESULT CALLBACK general_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
         if (pCertViewInfo->dwFlags & CRYPTUI_DISABLE_ADDTOSTORE)
             ShowWindow(GetDlgItem(hwnd, IDC_ADDTOSTORE), FALSE);
         EnableWindow(GetDlgItem(hwnd, IDC_ISSUERSTATEMENT), FALSE);
-        FIXME("show cert properties\n");
+        set_general_info(hwnd, pCertViewInfo);
         break;
     case WM_COMMAND:
         switch (wp)




More information about the wine-cvs mailing list