[CRYPTUI] Sync with Wine Staging 3.3. CORE-14434
[reactos.git] / dll / win32 / cryptui / main.c
index 43daba7..a652239 100644 (file)
@@ -27,7 +27,6 @@
 #include "winbase.h"
 #include "winnls.h"
 #include "winuser.h"
-#include "undocuser.h"
 #include "softpub.h"
 #include "wingdi.h"
 #include "richedit.h"
@@ -59,10 +58,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
             hInstance = hinstDLL;
             DisableThreadLibraryCalls(hinstDLL);
             break;
-        case DLL_PROCESS_DETACH:
-            break;
-        default:
-            break;
     }
     return TRUE;
 }
@@ -296,7 +291,7 @@ static CERT_ENHKEY_USAGE *convert_usages_str_to_usage(LPSTR usageStr)
         {
             if (comma)
                 *comma = 0;
-            add_oid_to_usage(usage, ptr);
+            usage = add_oid_to_usage(usage, ptr);
         }
     }
     return usage;
@@ -324,7 +319,7 @@ static CERT_ENHKEY_USAGE *create_advanced_filter(void)
                 {
                     PCCRYPT_OID_INFO *ptr;
 
-                    for (ptr = usages; *ptr; ptr++)
+                    for (ptr = usages; advancedUsage && *ptr; ptr++)
                     {
                         DWORD i;
                         BOOL disabled = FALSE;
@@ -335,7 +330,7 @@ static CERT_ENHKEY_USAGE *create_advanced_filter(void)
                              (*ptr)->pszOID))
                                 disabled = TRUE;
                         if (!disabled)
-                            add_oid_to_usage(advancedUsage,
+                            advancedUsage = add_oid_to_usage(advancedUsage,
                              (LPSTR)(*ptr)->pszOID);
                     }
                     /* The individual strings are pointers to disabledUsagesStr,
@@ -1165,20 +1160,19 @@ static LRESULT CALLBACK cert_mgr_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
             break;
         case LVN_ITEMCHANGED:
         {
-            NMITEMACTIVATE *nm;
+            WCHAR empty[] = { 0 };
+            NMITEMACTIVATE *nm = (NMITEMACTIVATE*)lp;
             HWND lv = GetDlgItem(hwnd, IDC_MGR_CERTS);
+            int numSelected = SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0);
 
-            nm = (NMITEMACTIVATE*)lp;
-            if (nm->uNewState & LVN_ITEMACTIVATE)
-            {
-                int numSelected = SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0);
-
-                EnableWindow(GetDlgItem(hwnd, IDC_MGR_EXPORT), numSelected > 0);
-                EnableWindow(GetDlgItem(hwnd, IDC_MGR_REMOVE), numSelected > 0);
-                EnableWindow(GetDlgItem(hwnd, IDC_MGR_VIEW), numSelected == 1);
-                if (numSelected == 1)
-                    cert_mgr_show_cert_usages(hwnd, nm->iItem);
-            }
+            EnableWindow(GetDlgItem(hwnd, IDC_MGR_EXPORT), numSelected > 0);
+            EnableWindow(GetDlgItem(hwnd, IDC_MGR_REMOVE), numSelected > 0);
+            EnableWindow(GetDlgItem(hwnd, IDC_MGR_VIEW), numSelected == 1);
+            if (numSelected == 1)
+                cert_mgr_show_cert_usages(hwnd, nm->iItem);
+            else
+                SendMessageW(GetDlgItem(hwnd, IDC_MGR_PURPOSES), WM_SETTEXT, 0,
+                 (LPARAM)empty);
             break;
         }
         case NM_DBLCLK:
@@ -1283,7 +1277,6 @@ static LRESULT CALLBACK cert_mgr_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
         case IDCANCEL:
             free_certs(GetDlgItem(hwnd, IDC_MGR_CERTS));
             close_stores(GetDlgItem(hwnd, IDC_MGR_STORES));
-            close_stores(GetDlgItem(hwnd, IDC_MGR_STORES));
             data = (struct CertMgrData *)GetWindowLongPtrW(hwnd, DWLP_USER);
             ImageList_Destroy(data->imageList);
             HeapFree(GetProcessHeap(), 0, data);
@@ -1639,7 +1632,7 @@ HCERTSTORE WINAPI CryptUIDlgSelectStoreA(PCRYPTUI_SELECTSTORE_INFO_A info)
         SetLastError(E_INVALIDARG);
         return NULL;
     }
-    memcpy(&infoW, &info, sizeof(info));
+    memcpy(&infoW, info, sizeof(*info));
     if (info->pszTitle)
     {
         len = MultiByteToWideChar(CP_ACP, 0, info->pszTitle, -1, NULL, 0);
@@ -1799,17 +1792,16 @@ static void add_cert_string_to_control(HWND hwnd, PCCERT_CONTEXT pCertContext,
 static void add_icon_to_control(HWND hwnd, int id)
 {
     HRESULT hr;
-    LPRICHEDITOLE richEditOle = NULL;
-    LPOLEOBJECT object = NULL;
+    IRichEditOle *richEditOle = NULL;
+    IOleObject *object = NULL;
     CLSID clsid;
     LPOLECACHE oleCache = NULL;
     FORMATETC formatEtc;
     DWORD conn;
-    LPDATAOBJECT dataObject = NULL;
+    IDataObject *dataObject = NULL;
     HBITMAP bitmap = NULL;
-    RECT rect;
     STGMEDIUM stgm;
-    LPOLECLIENTSITE clientSite = NULL;
+    IOleClientSite *clientSite = NULL;
     REOBJECT reObject;
 
     TRACE("(%p, %d)\n", hwnd, id);
@@ -1846,9 +1838,6 @@ static void add_icon_to_control(HWND hwnd, int id)
      LR_DEFAULTSIZE | LR_LOADTRANSPARENT);
     if (!bitmap)
         goto end;
-    rect.left = rect.top = 0;
-    rect.right = GetSystemMetrics(SM_CXICON);
-    rect.bottom = GetSystemMetrics(SM_CYICON);
     stgm.tymed = TYMED_GDI;
     stgm.u.hBitmap = bitmap;
     stgm.pUnkForRelease = NULL;
@@ -1969,23 +1958,19 @@ static struct OIDToString oidMap[] = {
 
 static struct OIDToString *findSupportedOID(LPCSTR oid)
 {
-    int indexHigh = sizeof(oidMap) / sizeof(oidMap[0]) - 1, indexLow = 0, i;
-    struct OIDToString *ret = NULL;
+    int indexHigh = sizeof(oidMap) / sizeof(oidMap[0]) - 1, indexLow = 0;
 
-    for (i = (indexLow + indexHigh) / 2; !ret && indexLow <= indexHigh;
-     i = (indexLow + indexHigh) / 2)
+    while (indexLow <= indexHigh)
     {
-        int cmp;
-
-        cmp = strcmp(oid, oidMap[i].oid);
-        if (!cmp)
-            ret = &oidMap[i];
-        else if (cmp > 0)
+        int cmp, i = (indexLow + indexHigh) / 2;
+        if (!(cmp = strcmp(oid, oidMap[i].oid)))
+            return &oidMap[i];
+        if (cmp > 0)
             indexLow = i + 1;
         else
             indexHigh = i - 1;
     }
-    return ret;
+    return NULL;
 }
 
 static void add_local_oid_text_to_control(HWND text, LPCSTR oid)
@@ -2711,6 +2696,8 @@ static WCHAR *field_format_public_key(PCCERT_CONTEXT cert)
         if (LoadStringW(hInstance, IDS_FIELD_PUBLIC_KEY_FORMAT, fmt,
          sizeof(fmt) / sizeof(fmt[0])))
         {
+            DWORD len;
+
             /* Allocate the output buffer.  Use the number of bytes in the
              * public key as a conservative (high) estimate for the number of
              * digits in its output.
@@ -2720,14 +2707,18 @@ static WCHAR *field_format_public_key(PCCERT_CONTEXT cert)
              * good idea, but as this isn't a sentence fragment, it shouldn't
              * be word-order dependent.
              */
-            buf = HeapAlloc(GetProcessHeap(), 0,
-             (strlenW(fmt) + strlenW(oidInfo->pwszName) +
-             cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData * 8)
-             * sizeof(WCHAR));
+            len = strlenW(fmt) + strlenW(oidInfo->pwszName) +
+                cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData * 8;
+            buf = HeapAlloc(GetProcessHeap(), 0, len * sizeof(*buf));
             if (buf)
-                sprintfW(buf, fmt, oidInfo->pwszName,
-                 CertGetPublicKeyLength(X509_ASN_ENCODING,
-                  &cert->pCertInfo->SubjectPublicKeyInfo));
+            {
+                DWORD_PTR args[2];
+                args[0] = (DWORD_PTR)oidInfo->pwszName;
+                args[1] = CertGetPublicKeyLength(X509_ASN_ENCODING,
+                              &cert->pCertInfo->SubjectPublicKeyInfo);
+                FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
+                               fmt, 0, 0, buf, len, (__ms_va_list*)args);
+            }
         }
     }
     return buf;
@@ -2841,7 +2832,7 @@ static const struct v1_field v1_fields[] = {
 
 static void add_v1_fields(HWND hwnd, struct detail_data *data)
 {
-    int i;
+    unsigned int i;
     PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
 
     /* The last item in v1_fields is the public key, which is not in the loop
@@ -3084,7 +3075,7 @@ struct selection_list_item
     add_fields_func add;
 };
 
-const struct selection_list_item listItems[] = {
+static const struct selection_list_item listItems[] = {
  { IDS_FIELDS_ALL, add_all_fields },
  { IDS_FIELDS_V1, add_v1_fields },
  { IDS_FIELDS_EXTENSIONS, add_all_extensions },
@@ -3773,7 +3764,7 @@ static void show_edit_cert_properties_dialog(HWND parent,
 
 static void free_detail_fields(struct detail_data *data)
 {
-    DWORD i;
+    int i;
 
     for (i = 0; i < data->cFields; i++)
         HeapFree(GetProcessHeap(), 0, data->fields[i].detailed_value);
@@ -4042,8 +4033,8 @@ static void show_cert_chain(HWND hwnd, struct hierarchy_data *data)
             tvis.u.item.pszText = name;
             tvis.u.item.state = TVIS_EXPANDED;
             tvis.u.item.stateMask = TVIS_EXPANDED;
-            if (i == 1 &&
-             (provSigner->pChainContext->TrustStatus.dwErrorStatus &
+            if (i == 1 && (!provSigner->pChainContext ||
+             provSigner->pChainContext->TrustStatus.dwErrorStatus &
              CERT_TRUST_IS_PARTIAL_CHAIN))
             {
                 /* The root of the chain has a special case:  if the chain is
@@ -4286,7 +4277,6 @@ static BOOL init_hierarchy_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo,
 static int CALLBACK cert_prop_sheet_proc(HWND hwnd, UINT msg, LPARAM lp)
 {
     RECT rc;
-    POINT topLeft;
 
     TRACE("(%p, %08x, %08lx)\n", hwnd, msg, lp);
 
@@ -4295,17 +4285,12 @@ static int CALLBACK cert_prop_sheet_proc(HWND hwnd, UINT msg, LPARAM lp)
     case PSCB_INITIALIZED:
         /* Get cancel button's position.. */
         GetWindowRect(GetDlgItem(hwnd, IDCANCEL), &rc);
-        topLeft.x = rc.left;
-        topLeft.y = rc.top;
-        ScreenToClient(hwnd, &topLeft);
+        MapWindowPoints( 0, hwnd, (POINT *)&rc, 2 );
         /* hide the cancel button.. */
         ShowWindow(GetDlgItem(hwnd, IDCANCEL), FALSE);
-        /* get the OK button's size.. */
-        GetWindowRect(GetDlgItem(hwnd, IDOK), &rc);
         /* and move the OK button to the cancel button's original position. */
-        MoveWindow(GetDlgItem(hwnd, IDOK), topLeft.x, topLeft.y,
-         rc.right - rc.left, rc.bottom - rc.top, FALSE);
-        GetWindowRect(GetDlgItem(hwnd, IDOK), &rc);
+        SetWindowPos(GetDlgItem(hwnd, IDOK), 0, rc.left, rc.top, 0, 0,
+                     SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW );
         break;
     }
     return 0;
@@ -4436,7 +4421,7 @@ BOOL WINAPI CryptUIDlgViewCertificateW(
     }
     /* Make a local copy in case we have to call WinVerifyTrust ourselves */
     memcpy(&viewInfo, pCertViewInfo, sizeof(viewInfo));
-    if (!viewInfo.u.hWVTStateData)
+    if (!pCertViewInfo->u.hWVTStateData)
     {
         memset(&wvt, 0, sizeof(wvt));
         wvt.cbStruct = sizeof(wvt);
@@ -4478,7 +4463,7 @@ BOOL WINAPI CryptUIDlgViewCertificateW(
     if (ret)
     {
         ret = show_cert_dialog(&viewInfo, provCert, pfPropertiesChanged);
-        if (!viewInfo.u.hWVTStateData)
+        if (!pCertViewInfo->u.hWVTStateData)
         {
             wvt.dwStateAction = WTD_STATEACTION_CLOSE;
             WinVerifyTrust(NULL, &generic_cert_verify, &wvt);
@@ -4929,7 +4914,7 @@ static const WCHAR filter_cms[] = { '*','.','s','p','c',';','*','.',
  'p','7','b',0 };
 static const WCHAR filter_all[] = { '*','.','*',0 };
 
-struct StringToFilter
+static struct StringToFilter
 {
     int     id;
     DWORD   allowFlags;
@@ -5484,7 +5469,7 @@ static BOOL show_import_ui(DWORD dwFlags, HWND hwndParent,
     data.autoDest = TRUE;
     data.success = TRUE;
 
-    memset(&pages, 0, sizeof(pages));
+    memset(pages, 0, sizeof(pages));
 
     pages[nPages].dwSize = sizeof(pages[0]);
     pages[nPages].hInstance = hInstance;
@@ -6897,7 +6882,7 @@ static BOOL show_export_ui(DWORD dwFlags, HWND hwndParent,
     data.file = INVALID_HANDLE_VALUE;
     data.success = FALSE;
 
-    memset(&pages, 0, sizeof(pages));
+    memset(pages, 0, sizeof(pages));
 
     pages[nPages].dwSize = sizeof(pages[0]);
     pages[nPages].hInstance = hInstance;
@@ -7046,3 +7031,36 @@ BOOL WINAPI CryptUIWizExport(DWORD dwFlags, HWND hwndParent,
     }
     return ret;
 }
+
+BOOL WINAPI CryptUIDlgViewSignerInfoA(CRYPTUI_VIEWSIGNERINFO_STRUCTA *pcvsi)
+{
+    FIXME("%p: stub\n", pcvsi);
+    return FALSE;
+}
+
+PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateW(PCCRYPTUI_SELECTCERTIFICATE_STRUCTW pcsc)
+{
+    FIXME("%p: stub\n", pcsc);
+    return NULL;
+}
+
+PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateA(PCCRYPTUI_SELECTCERTIFICATE_STRUCTA pcsc)
+{
+    FIXME("%p: stub\n", pcsc);
+    return NULL;
+}
+
+PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateFromStore(HCERTSTORE hCertStore, HWND hwnd, LPCWSTR pwszTitle,
+                                                           LPCWSTR pwszDisplayString, DWORD dwDontUseColumn,
+                                                           DWORD dwFlags, void *pvReserved)
+{
+    FIXME("%p %p %s %s %d %d %p: stub\n", hCertStore, hwnd, debugstr_w(pwszTitle), debugstr_w(pwszDisplayString), dwDontUseColumn, dwFlags, pvReserved);
+    return NULL;
+}
+
+BOOL WINAPI CryptUIWizDigitalSign(DWORD flags, HWND parent, LPCWSTR title, PCCRYPTUI_WIZ_DIGITAL_SIGN_INFO info,
+                                  PCCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT *context)
+{
+    FIXME("%d %p %s %p %p: stub\n", flags, parent, debugstr_w(title), info, context);
+    return FALSE;
+}