2573 lines
73 KiB
C++
2573 lines
73 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997-2001
|
|
//
|
|
// File: FindDlg.cpp
|
|
//
|
|
// Contents: implementation Find certificate dialog
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include <gpedit.h>
|
|
#pragma warning(push, 3)
|
|
#include <process.h>
|
|
#pragma warning(pop)
|
|
#include "mbstring.h"
|
|
#include "FindDlg.h"
|
|
#include "cookie.h"
|
|
#include <wintrust.h>
|
|
#include <cryptui.h>
|
|
#include "compdata.h"
|
|
USE_HANDLE_MACROS("CERTMGR(finddlg.cpp)")
|
|
|
|
#ifdef _DEBUG
|
|
#ifndef ALPHA
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFindDialog dialog
|
|
const WCHAR chLEFT_TO_RIGHT = 0x200e;
|
|
|
|
|
|
CFindDialog::CFindDialog (CWnd* pParent,
|
|
const CString &pcszMachineName,
|
|
const CString &szFileName,
|
|
CCertMgrComponentData* pCompData)
|
|
: CHelpDialog(CFindDialog::IDD, pParent),
|
|
m_cyOriginal (0),
|
|
m_fWindowExpandedOnce (false),
|
|
m_cyMin (0),
|
|
m_cxBtnMargin (0),
|
|
m_cxMin (0),
|
|
m_cxAnimMargin (0),
|
|
m_cxStoreListMargin (0),
|
|
m_cxContainMargin (0),
|
|
m_cxTabMargin (0),
|
|
m_cxFieldListMargin (0),
|
|
m_cxResultListMargin (0),
|
|
m_szMachineName (pcszMachineName),
|
|
m_bAnimationRunning (false),
|
|
m_szFileName (szFileName),
|
|
m_hSearchThread (0),
|
|
m_singleLock (&m_critSec, FALSE),
|
|
m_pCompData (pCompData),
|
|
m_bConsoleRefreshRequired (false),
|
|
m_hCancelSearchEvent (0),
|
|
m_bInitComplete (false)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::CFindDialog\n");
|
|
//{{AFX_DATA_INIT(CFindDialog)
|
|
m_szContains = _T("");
|
|
m_szSearchField = _T("");
|
|
m_szSelectedStore = _T("");
|
|
//}}AFX_DATA_INIT
|
|
|
|
// Get name of logged-in user
|
|
DWORD dwSize = 0;
|
|
::GetUserName (0, &dwSize);
|
|
ASSERT (dwSize > 0);
|
|
if ( dwSize > 0 )
|
|
{
|
|
BOOL bRet = ::GetUserName (m_szLoggedInUser.GetBufferSetLength (dwSize), &dwSize);
|
|
ASSERT (bRet);
|
|
m_szLoggedInUser.ReleaseBuffer ();
|
|
}
|
|
|
|
m_hCancelSearchEvent = CreateEvent(
|
|
NULL, // pointer to security attributes
|
|
TRUE, // flag for manual-reset event
|
|
FALSE, // flag for initial state
|
|
L"CancelSearchEvent"); // pointer to event-object name
|
|
if ( !m_hCancelSearchEvent )
|
|
{
|
|
_TRACE (0, L"CreateEvent (CancelSearchEvent) failed: 0x%x\n", GetLastError ());
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::CFindDialog\n");
|
|
}
|
|
|
|
|
|
CFindDialog::~CFindDialog ()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::~CFindDialog\n");
|
|
if ( m_hSearchThread )
|
|
StopSearch ();
|
|
if ( m_hCancelSearchEvent )
|
|
CloseHandle (m_hCancelSearchEvent);
|
|
_TRACE (-1, L"Leaving CFindDialog::~CFindDialog\n");
|
|
}
|
|
|
|
void CFindDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CHelpDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CFindDialog)
|
|
DDX_Control(pDX, IDC_STORE_LIST, m_storeList);
|
|
DDX_Control(pDX, IDC_STOP, m_stopBtn);
|
|
DDX_Control(pDX, IDC_RESULT_LIST, m_resultsList);
|
|
DDX_Control(pDX, IDC_NEW_SEARCH, m_newSearchBtn);
|
|
DDX_Control(pDX, IDC_FIND_NOW, m_findNowBtn);
|
|
DDX_Control(pDX, IDC_FIELD_LIST, m_fieldList);
|
|
DDX_Control(pDX, IDC_ANIMATE, m_animate);
|
|
DDX_Text(pDX, IDC_CONTAINS_TEXT, m_szContains);
|
|
DDX_CBString(pDX, IDC_FIELD_LIST, m_szSearchField);
|
|
DDX_CBString(pDX, IDC_STORE_LIST, m_szSelectedStore);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CFindDialog, CHelpDialog)
|
|
//{{AFX_MSG_MAP(CFindDialog)
|
|
ON_BN_CLICKED(IDC_FIND_NOW, OnFindNow)
|
|
ON_WM_SIZING()
|
|
ON_WM_DESTROY()
|
|
ON_BN_CLICKED(IDC_NEW_SEARCH, OnNewSearch)
|
|
ON_BN_CLICKED(IDC_STOP, OnStop)
|
|
ON_NOTIFY(NM_RCLICK, IDC_RESULT_LIST, OnRclickResultList)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_RESULT_LIST, OnDblclkResultList)
|
|
ON_NOTIFY(LVN_COLUMNCLICK, IDC_RESULT_LIST, OnColumnclickResultList)
|
|
ON_EN_CHANGE(IDC_CONTAINS_TEXT, OnChangeContainsText)
|
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_RESULT_LIST, OnItemchangedResultList)
|
|
ON_WM_CONTEXTMENU()
|
|
ON_WM_SIZE()
|
|
//}}AFX_MSG_MAP
|
|
ON_COMMAND(IDM_PROPERTIES, OnProperties)
|
|
ON_COMMAND(ID_VIEW, OnView)
|
|
ON_COMMAND(ID_ENROLL_SAME_KEY, OnEnrollSameKey)
|
|
ON_COMMAND(ID_ENROLL_NEW_KEY, OnEnrollNewKey)
|
|
ON_COMMAND(ID_FILE_DELETE, OnFileDelete)
|
|
ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
|
|
ON_COMMAND(ID_FILE_RENEW_NEW_KEY, OnFileRenewNewKey)
|
|
ON_COMMAND(ID_FILE_RENEW_SAME_KEY, OnFileRenewSameKey)
|
|
ON_COMMAND(ID_EDIT_INVERTSELECTION, OnEditInvertselection)
|
|
ON_COMMAND(ID_EDIT_SELECTALL, OnEditSelectall)
|
|
ON_COMMAND(ID_FILE_PROPERTIES, OnFileProperties)
|
|
ON_COMMAND(ID_HELP_HELPTOPICS, OnHelpHelptopics)
|
|
ON_COMMAND(IDM_VIEW_DETAILS, OnViewDetails)
|
|
ON_COMMAND(ID_VIEW_LARGEICONS, OnViewLargeicons)
|
|
ON_COMMAND(IDM_VIEW_LIST, OnViewList)
|
|
ON_COMMAND(ID_VIEW_SMALLICONS, OnViewSmallicons)
|
|
ON_COMMAND(IDM_WHATS_THIS, OnWhatsThis)
|
|
ON_MESSAGE(WM_HELP, OnHelp)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
BOOL CFindDialog::OnInitDialog()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnInitDialog\n");
|
|
CHelpDialog::OnInitDialog();
|
|
|
|
|
|
|
|
// Set up the menu
|
|
HMENU hMenu = ::LoadMenu (AfxGetInstanceHandle (),
|
|
MAKEINTRESOURCE (IDR_FIND_DLG_MENU));
|
|
ASSERT (hMenu);
|
|
if ( hMenu )
|
|
{
|
|
if (::SetMenu (m_hWnd, hMenu) )
|
|
{
|
|
// Disable these menu items until the window is expanded when searching
|
|
VERIFY (::EnableMenuItem (hMenu, ID_VIEW_LARGEICONS, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_VIEW_SMALLICONS, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, IDM_VIEW_LIST, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, IDM_VIEW_DETAILS, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_SELECTALL, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_INVERTSELECTION, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_DELETE, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_EXPORT, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_RENEW_SAME_KEY, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_RENEW_NEW_KEY, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_PROPERTIES, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_VIEW, MF_GRAYED) != -1);
|
|
}
|
|
else
|
|
ASSERT (0);
|
|
}
|
|
|
|
SetUpResultList ();
|
|
|
|
// Size window to hide list view until search is performed
|
|
HideResultList ();
|
|
|
|
// Initialize animation
|
|
VERIFY (m_animate.Open (IDR_FINDCERT_AVI));
|
|
|
|
// Set up cert store list
|
|
AddLogicalStoresToList ();
|
|
|
|
// Set cert field list
|
|
AddFieldsToList ();
|
|
|
|
m_findNowBtn.EnableWindow (FALSE);
|
|
m_stopBtn.EnableWindow (FALSE);
|
|
m_newSearchBtn.EnableWindow (FALSE);
|
|
|
|
m_bInitComplete = true;
|
|
_TRACE (-1, L"Leaving CFindDialog::OnInitDialog\n");
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
|
|
void CFindDialog::OnFindNow()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnFindNow\n");
|
|
// Disable the controls during the search
|
|
GetDlgItem (IDC_CONTAINS_TEXT)->EnableWindow (FALSE);
|
|
m_resultsList.EnableWindow (FALSE);
|
|
m_fieldList.EnableWindow (FALSE);
|
|
m_storeList.EnableWindow (FALSE);
|
|
m_findNowBtn.EnableWindow (FALSE);
|
|
m_newSearchBtn.EnableWindow (FALSE);
|
|
m_stopBtn.EnableWindow (TRUE);
|
|
m_stopBtn.SetFocus ();
|
|
|
|
VERIFY (m_animate.Play (0, (UINT) -1, (UINT) -1));
|
|
m_bAnimationRunning = true;
|
|
UpdateData (TRUE);
|
|
DeleteAllResultItems ();
|
|
|
|
|
|
if ( !m_fWindowExpandedOnce )
|
|
{
|
|
// ChangeToSizableFrame ();
|
|
ExpandWindow ();
|
|
}
|
|
|
|
DoSearch ();
|
|
|
|
EnableMenuItems ();
|
|
|
|
}
|
|
|
|
void CFindDialog::EnableMenuItems ()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::EnableMenuItems\n");
|
|
HMENU hMenu = ::GetMenu (m_hWnd);
|
|
ASSERT (hMenu);
|
|
if ( hMenu )
|
|
{
|
|
int nCnt = m_resultsList.GetItemCount ();
|
|
if ( nCnt > 0 )
|
|
{
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_SELECTALL, MF_ENABLED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_INVERTSELECTION, MF_ENABLED) != -1);
|
|
}
|
|
else
|
|
{
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_SELECTALL, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_INVERTSELECTION, MF_GRAYED) != -1);
|
|
}
|
|
|
|
UINT nSelCnt = m_resultsList.GetSelectedCount ();
|
|
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_DELETE,
|
|
(nSelCnt >= 1) ? MF_ENABLED : MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_EXPORT,
|
|
(nSelCnt >= 1) ? MF_ENABLED : MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_PROPERTIES,
|
|
(nSelCnt == 1) ? MF_ENABLED : MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_VIEW,
|
|
(nSelCnt == 1) ? MF_ENABLED : MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_RENEW_SAME_KEY, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_RENEW_NEW_KEY, MF_GRAYED) != -1);
|
|
if ( nSelCnt == 1 )
|
|
{
|
|
int nSelItem = 0;
|
|
CCertificate* pCert = GetSelectedCertificate (&nSelItem);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
bool bIsMyStore = (pCert->GetStoreType () == MY_STORE);
|
|
if ( bIsMyStore && CERT_SYSTEM_STORE_SERVICES != m_pCompData->GetLocation () )
|
|
{
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_RENEW_SAME_KEY,
|
|
MF_ENABLED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_RENEW_NEW_KEY,
|
|
MF_ENABLED) != -1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::EnableMenuItems\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnSize (UINT nType, int cx, int cy)
|
|
{
|
|
CHelpDialog::OnSize (nType, cx, cy);
|
|
|
|
MoveControls ();
|
|
}
|
|
|
|
|
|
void CFindDialog::OnSizing (UINT nSide, LPRECT lpRect)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnSizing\n");
|
|
int cyHeight = lpRect->bottom - lpRect->top;
|
|
int cxWidth = lpRect->right - lpRect->left;
|
|
|
|
// If the user has never pressed "Find Now", don't let the user expand the window down
|
|
// Don't let the user shrink the window below it's initial state - I don't want to deal with
|
|
// control compression!
|
|
switch (nSide)
|
|
{
|
|
case WMSZ_BOTTOM:
|
|
if ( !m_fWindowExpandedOnce )
|
|
lpRect->top = lpRect->bottom - m_cyMin;
|
|
else
|
|
{
|
|
if ( cyHeight < m_cyMin )
|
|
lpRect->bottom = lpRect->top + m_cyMin;
|
|
}
|
|
break;
|
|
|
|
case WMSZ_BOTTOMLEFT:
|
|
if ( cxWidth < m_cxMin )
|
|
lpRect->left = lpRect->right - m_cxMin;
|
|
if ( !m_fWindowExpandedOnce )
|
|
lpRect->top = lpRect->bottom - m_cyMin;
|
|
else
|
|
{
|
|
if ( cyHeight < m_cyMin )
|
|
lpRect->bottom = lpRect->top + m_cyMin;
|
|
}
|
|
break;
|
|
|
|
case WMSZ_BOTTOMRIGHT:
|
|
if ( cxWidth < m_cxMin )
|
|
lpRect->right = lpRect->left + m_cxMin;
|
|
if ( !m_fWindowExpandedOnce )
|
|
lpRect->bottom = lpRect->top + m_cyMin;
|
|
else
|
|
{
|
|
if ( cyHeight < m_cyMin )
|
|
lpRect->bottom = lpRect->top + m_cyMin;
|
|
}
|
|
break;
|
|
|
|
case WMSZ_TOP:
|
|
if ( !m_fWindowExpandedOnce )
|
|
lpRect->top = lpRect->bottom - m_cyMin;
|
|
else
|
|
{
|
|
if ( cyHeight < m_cyMin )
|
|
lpRect->top = lpRect->bottom - m_cyMin;
|
|
}
|
|
break;
|
|
|
|
case WMSZ_TOPLEFT:
|
|
if ( cxWidth < m_cxMin )
|
|
lpRect->left = lpRect->right - m_cxMin;
|
|
if ( !m_fWindowExpandedOnce )
|
|
lpRect->top = lpRect->bottom - m_cyMin;
|
|
else
|
|
{
|
|
if ( cyHeight < m_cyMin )
|
|
lpRect->top = lpRect->bottom - m_cyMin;
|
|
}
|
|
break;
|
|
|
|
case WMSZ_TOPRIGHT:
|
|
if ( cxWidth < m_cxMin )
|
|
lpRect->right = lpRect->left + m_cxMin;
|
|
if ( !m_fWindowExpandedOnce )
|
|
lpRect->top = lpRect->bottom - m_cyMin;
|
|
else
|
|
{
|
|
if ( cyHeight < m_cyMin )
|
|
lpRect->top = lpRect->bottom - m_cyMin;
|
|
}
|
|
break;
|
|
|
|
case WMSZ_RIGHT:
|
|
if ( cxWidth < m_cxMin )
|
|
lpRect->right = lpRect->left + m_cxMin;
|
|
break;
|
|
|
|
case WMSZ_LEFT:
|
|
if ( cxWidth < m_cxMin )
|
|
lpRect->left = lpRect->right - m_cxMin;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
CHelpDialog::OnSizing (nSide, lpRect);
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::OnSizing\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::MoveControls ()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::MoveControls\n");
|
|
|
|
if ( !m_hWnd || !m_bInitComplete )
|
|
return;
|
|
|
|
// Only come down here if the window has already been created.
|
|
|
|
// Keep buttons glued to the right
|
|
CRect rcDlg;
|
|
GetWindowRect (&rcDlg); // returned in screen coords
|
|
ScreenToClient (&rcDlg);
|
|
|
|
|
|
// Move "Stop" button
|
|
CRect rcCtrl;
|
|
m_stopBtn.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
ScreenToClient (&rcCtrl);
|
|
int cxCtrl = rcCtrl.right - rcCtrl.left;
|
|
rcCtrl.right = rcDlg.right - m_cxBtnMargin;
|
|
rcCtrl.left = rcCtrl.right - cxCtrl;
|
|
m_stopBtn.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
|
|
// Move "Find Now" button
|
|
m_findNowBtn.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
ScreenToClient (&rcCtrl);
|
|
cxCtrl = rcCtrl.right - rcCtrl.left;
|
|
rcCtrl.right = rcDlg.right - m_cxBtnMargin;
|
|
rcCtrl.left = rcCtrl.right - cxCtrl;
|
|
m_findNowBtn.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
|
|
// Move "New Search" button
|
|
m_newSearchBtn.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
ScreenToClient (&rcCtrl);
|
|
cxCtrl = rcCtrl.right - rcCtrl.left;
|
|
rcCtrl.right = rcDlg.right - m_cxBtnMargin;
|
|
rcCtrl.left = rcCtrl.right - cxCtrl;
|
|
m_newSearchBtn.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
|
|
// Move animation control
|
|
m_animate.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
ScreenToClient (&rcCtrl);
|
|
cxCtrl = rcCtrl.right - rcCtrl.left;
|
|
rcCtrl.right = rcDlg.right - m_cxAnimMargin;
|
|
rcCtrl.left = rcCtrl.right - cxCtrl;
|
|
m_animate.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
|
|
// Stretch store list control
|
|
m_storeList.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
ScreenToClient (&rcCtrl);
|
|
rcCtrl.right = rcDlg.right - m_cxStoreListMargin;
|
|
m_storeList.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
|
|
// Stretch "contains" edit control
|
|
GetDlgItem (IDC_CONTAINS_TEXT)->GetWindowRect (&rcCtrl);
|
|
ScreenToClient (&rcCtrl);
|
|
rcCtrl.right = rcDlg.right - m_cxContainMargin;
|
|
GetDlgItem (IDC_CONTAINS_TEXT)->MoveWindow (rcCtrl);
|
|
|
|
// Stretch field list control
|
|
m_singleLock.Lock ();
|
|
m_fieldList.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
m_singleLock.Unlock ();
|
|
ScreenToClient (&rcCtrl);
|
|
rcCtrl.right = rcDlg.right - m_cxFieldListMargin;
|
|
m_singleLock.Lock ();
|
|
m_fieldList.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
m_singleLock.Unlock ();
|
|
m_fieldList.InvalidateRect (NULL, TRUE);
|
|
|
|
// Stretch list view to right edge and to bottom
|
|
int cyResultListMargin = 0;
|
|
if ( m_statusBar.m_hWnd )
|
|
{
|
|
// If the status bar has already been created, we need to take that
|
|
// account when we resize the list view
|
|
CRect rcStatusBar;
|
|
m_statusBar.GetWindowRect (&rcStatusBar);
|
|
cyResultListMargin = (rcStatusBar.bottom - rcStatusBar.top)
|
|
+ ::GetSystemMetrics (SM_CYDLGFRAME);
|
|
}
|
|
|
|
m_resultsList.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
ScreenToClient (&rcCtrl);
|
|
rcCtrl.right = rcDlg.right - m_cxResultListMargin;
|
|
if ( m_fWindowExpandedOnce )
|
|
rcCtrl.bottom = rcDlg.bottom - cyResultListMargin;
|
|
m_resultsList.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
|
|
// Resize last column to fill results list window
|
|
int nNewWidth = rcCtrl.right - (m_resultsList.GetColumnWidth (COL_ISSUED_TO) +
|
|
m_resultsList.GetColumnWidth (COL_ISSUED_BY) +
|
|
m_resultsList.GetColumnWidth (COL_EXPIRATION_DATE) +
|
|
m_resultsList.GetColumnWidth (COL_PURPOSES) +
|
|
m_resultsList.GetColumnWidth (COL_FRIENDLY_NAME));
|
|
if ( nNewWidth > m_resultsList.GetColumnWidth (COL_SOURCE_STORE) )
|
|
VERIFY (m_resultsList.SetColumnWidth (COL_SOURCE_STORE, nNewWidth));
|
|
|
|
|
|
|
|
// Stretch status bar to right edge
|
|
if ( m_statusBar.m_hWnd )
|
|
{
|
|
m_statusBar.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
ScreenToClient (&rcCtrl);
|
|
int cyCtrl = rcCtrl.bottom - rcCtrl.top;
|
|
rcCtrl.right = rcDlg.right;
|
|
rcCtrl.bottom = rcDlg.bottom;
|
|
rcCtrl.top = rcCtrl.bottom - cyCtrl;
|
|
m_statusBar.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::MoveControls\n");
|
|
}
|
|
|
|
|
|
typedef struct _ENUM_ARG {
|
|
DWORD dwFlags;
|
|
CComboBox* m_pComboBox;
|
|
LPCWSTR m_szMachineName;
|
|
IConsole* m_pConsole;
|
|
} ENUM_ARG, *PENUM_ARG;
|
|
|
|
static BOOL WINAPI EnumFindDlgSysCallback(
|
|
IN const void* pwszSystemStore,
|
|
IN DWORD dwFlags,
|
|
IN PCERT_SYSTEM_STORE_INFO /*pStoreInfo*/,
|
|
IN OPTIONAL void* /*pvReserved*/,
|
|
IN OPTIONAL void *pvArg
|
|
)
|
|
{
|
|
_TRACE (1, L"Entering EnumFindDlgSysCallback\n");
|
|
PENUM_ARG pEnumArg = (PENUM_ARG) pvArg;
|
|
|
|
// Create new cookies
|
|
SPECIAL_STORE_TYPE storeType = GetSpecialStoreType ((LPWSTR) pwszSystemStore);
|
|
|
|
//
|
|
// We will not expose the ACRS store for machines or users. It is not
|
|
// interesting or useful at this level. All Auto Cert Requests should
|
|
// be managed only at the policy level.
|
|
//
|
|
if ( ACRS_STORE != storeType )
|
|
{
|
|
CCertStore* pNewCookie = new CCertStore (CERTMGR_LOG_STORE,
|
|
CERT_STORE_PROV_SYSTEM,
|
|
dwFlags, pEnumArg->m_szMachineName,
|
|
(LPCWSTR) pwszSystemStore,
|
|
(LPCWSTR) pwszSystemStore,
|
|
_T(""), storeType,
|
|
dwFlags,
|
|
pEnumArg->m_pConsole);
|
|
if ( pNewCookie )
|
|
{
|
|
CString storeName = _T(" ");
|
|
int iResult = 0;
|
|
LPCWSTR localizedName = pNewCookie->GetLocalizedName ();
|
|
|
|
if ( localizedName )
|
|
storeName += localizedName;
|
|
else
|
|
storeName += (LPWSTR) pwszSystemStore;
|
|
|
|
iResult = pEnumArg->m_pComboBox->AddString ((LPCWSTR) storeName);
|
|
ASSERT (CB_ERR != iResult && CB_ERRSPACE != iResult);
|
|
if ( CB_ERR != iResult && CB_ERRSPACE != iResult)
|
|
{
|
|
iResult = pEnumArg->m_pComboBox->SetItemDataPtr (iResult, (void*) pNewCookie);
|
|
ASSERT (CB_ERR != iResult);
|
|
}
|
|
else
|
|
pNewCookie->Release ();
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving EnumFindDlgSysCallback\n");
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CFindDialog::AddLogicalStoresToList ()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::AddLogicalStoresToList\n");
|
|
CString text;
|
|
CWaitCursor cursor;
|
|
|
|
VERIFY (text.LoadString (IDS_ALL_STORES));
|
|
VERIFY (m_storeList.AddString (text) >= 0);
|
|
VERIFY (m_storeList.SetCurSel (0) != CB_ERR);
|
|
|
|
DWORD dwFlags = m_pCompData->GetLocation ();
|
|
ENUM_ARG EnumArg;
|
|
|
|
::ZeroMemory (&EnumArg, sizeof(EnumArg));
|
|
EnumArg.dwFlags = dwFlags;
|
|
EnumArg.m_szMachineName = m_szMachineName;
|
|
EnumArg.m_pComboBox = &m_storeList;
|
|
EnumArg.m_pConsole = m_pCompData->m_pConsole;
|
|
CString location;
|
|
void* pvPara = 0;
|
|
|
|
|
|
if ( !m_pCompData->GetManagedService ().IsEmpty () )
|
|
{
|
|
if ( !m_szMachineName.IsEmpty () )
|
|
{
|
|
location = m_szMachineName + _T("\\") +
|
|
m_pCompData->GetManagedService ();
|
|
pvPara = (void *) (LPCWSTR) location;
|
|
}
|
|
else
|
|
pvPara = (void *) (LPCWSTR) m_pCompData->GetManagedService ();
|
|
}
|
|
else if ( !m_szMachineName.IsEmpty () )
|
|
{
|
|
pvPara = (void *) (LPCWSTR) m_szMachineName;
|
|
}
|
|
|
|
if ( m_szFileName.IsEmpty () )
|
|
{
|
|
// This is not a file store but some kind of system store.
|
|
if ( !::CertEnumSystemStore (dwFlags, pvPara, &EnumArg, EnumFindDlgSysCallback) )
|
|
{
|
|
DWORD dwErr = GetLastError ();
|
|
CString caption;
|
|
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
if ( ERROR_ACCESS_DENIED == dwErr )
|
|
{
|
|
VERIFY (text.LoadString (IDS_NO_PERMISSION));
|
|
|
|
}
|
|
else
|
|
{
|
|
text.FormatMessage (IDS_CANT_ENUMERATE_SYSTEM_STORES, GetSystemMessage (dwErr));
|
|
}
|
|
CThemeContextActivator activator;
|
|
MessageBox (text, caption, MB_OK);
|
|
if ( ERROR_BAD_NETPATH == dwErr )
|
|
{
|
|
// Close dialog
|
|
PostMessage (WM_CLOSE, 0, 0L);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// CertOpenStore with provider type of:
|
|
// CERT_STORE_PROV_FILE or CERT_STORE_PROV_FILENAME_A
|
|
// or CERT_STORE_PROV_FILENAME_W.
|
|
// See online documentation or wincrypt.h for more info.
|
|
// Create new cookies
|
|
CCertStore* pNewCookie = new CCertStore (
|
|
CERTMGR_LOG_STORE,
|
|
CERT_STORE_PROV_FILENAME_W,
|
|
0,
|
|
m_szMachineName,
|
|
m_szFileName, m_szFileName, _T(""), NO_SPECIAL_TYPE,
|
|
m_pCompData->GetLocation (),
|
|
m_pCompData->m_pConsole);
|
|
if ( pNewCookie )
|
|
{
|
|
CString storeName = _T(" ");
|
|
|
|
storeName += m_szFileName;
|
|
|
|
int iResult = m_storeList.AddString ((LPCWSTR) storeName);
|
|
ASSERT (CB_ERR != iResult && CB_ERRSPACE != iResult);
|
|
if ( CB_ERR != iResult && CB_ERRSPACE != iResult )
|
|
{
|
|
iResult = m_storeList.SetItemDataPtr (iResult, (void*) pNewCookie);
|
|
ASSERT (CB_ERR != iResult);
|
|
}
|
|
}
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::AddLogicalStoresToList\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnDestroy()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnDestroy\n");
|
|
// In case a search is running when the user destroys the window, stop it!
|
|
StopSearch ();
|
|
|
|
CHelpDialog::OnDestroy();
|
|
|
|
|
|
CCertStore* pCookie = 0;
|
|
const int nCnt = m_storeList.GetCount ();
|
|
|
|
for (int nIndex = 0; nIndex < nCnt; nIndex++)
|
|
{
|
|
pCookie = (CCertStore*) m_storeList.GetItemDataPtr (nIndex);
|
|
if ( pCookie ) // one of the items has no cookie
|
|
pCookie->Release ();
|
|
}
|
|
|
|
DeleteAllResultItems ();
|
|
|
|
m_imageListNormal.Destroy ();
|
|
m_imageListSmall.Destroy ();
|
|
_TRACE (-1, L"Leaving CFindDialog::OnDestroy\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::AddFieldsToList()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::AddFieldsToList\n");
|
|
CString text;
|
|
int iResult = 0;
|
|
|
|
|
|
VERIFY (text.LoadString (IDS_FIND_MD5_HASH));
|
|
iResult = m_fieldList.AddString (text);
|
|
ASSERT (CB_ERR != iResult && CB_ERRSPACE != iResult);
|
|
if ( CB_ERR != iResult && CB_ERRSPACE != iResult )
|
|
VERIFY (m_fieldList.SetItemData (iResult, CERT_FIND_MD5_HASH) != CB_ERR);
|
|
|
|
VERIFY (text.LoadString (IDS_FIND_SHA1_HASH));
|
|
iResult = m_fieldList.AddString (text);
|
|
ASSERT (CB_ERR != iResult && CB_ERRSPACE != iResult);
|
|
if ( CB_ERR != iResult && CB_ERRSPACE != iResult )
|
|
VERIFY (m_fieldList.SetItemData (iResult, CERT_FIND_SHA1_HASH) != CB_ERR);
|
|
|
|
VERIFY (text.LoadString (IDS_FIND_SUBJECT_NAME));
|
|
iResult = m_fieldList.AddString (text);
|
|
ASSERT (CB_ERR != iResult && CB_ERRSPACE != iResult);
|
|
if ( CB_ERR != iResult && CB_ERRSPACE != iResult )
|
|
VERIFY (m_fieldList.SetItemData (iResult, CERT_FIND_SUBJECT_STR_W) != CB_ERR);
|
|
|
|
VERIFY (text.LoadString (IDS_FIND_ISSUER_NAME));
|
|
iResult = m_fieldList.AddString (text);
|
|
ASSERT (CB_ERR != iResult && CB_ERRSPACE != iResult);
|
|
if ( CB_ERR != iResult && CB_ERRSPACE != iResult )
|
|
{
|
|
VERIFY (m_fieldList.SetItemData (iResult, CERT_FIND_ISSUER_STR_W) != CB_ERR);
|
|
VERIFY (m_fieldList.SetCurSel (iResult) != CB_ERR);
|
|
}
|
|
|
|
VERIFY (text.LoadString (IDS_COLUMN_SERIAL_NUMBER));
|
|
iResult = m_fieldList.AddString (text);
|
|
ASSERT (CB_ERR != iResult && CB_ERRSPACE != iResult);
|
|
if ( CB_ERR != iResult && CB_ERRSPACE != iResult )
|
|
VERIFY (m_fieldList.SetItemData (iResult, CERT_FIND_SERIAL_NUMBER) != CB_ERR);
|
|
_TRACE (-1, L"Leaving CFindDialog::AddFieldsToList\n");
|
|
}
|
|
|
|
void CFindDialog::OnNewSearch()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnNewSearch\n");
|
|
CString caption;
|
|
CString text;
|
|
|
|
VERIFY (text.LoadString (IDS_CLEAR_SEARCH));
|
|
VERIFY (caption.LoadString (IDS_FIND_CERT));
|
|
CThemeContextActivator activator;
|
|
if ( MessageBox (text, caption, MB_ICONQUESTION | MB_OKCANCEL) == IDOK )
|
|
{
|
|
DeleteAllResultItems ();
|
|
m_singleLock.Lock ();
|
|
VERIFY (m_fieldList.SetCurSel (0) != CB_ERR);
|
|
m_singleLock.Unlock ();
|
|
|
|
VERIFY (text.LoadString (IDS_ALL_STORES));
|
|
int nIndex = m_storeList.FindStringExact (-1, text);
|
|
ASSERT (CB_ERR != nIndex);
|
|
if ( CB_ERR != nIndex )
|
|
VERIFY (m_storeList.SetCurSel (nIndex) != CB_ERR);
|
|
GetDlgItem (IDC_CONTAINS_TEXT)->SetWindowText (L"");
|
|
|
|
CString statusText;
|
|
VERIFY (statusText.LoadString (IDS_NO_CERTS_FOUND));
|
|
if ( m_statusBar.m_hWnd )
|
|
m_statusBar.SetWindowText (statusText);
|
|
m_newSearchBtn.EnableWindow (FALSE);
|
|
|
|
HMENU hMenu = ::GetMenu (m_hWnd);
|
|
ASSERT (hMenu);
|
|
if ( hMenu )
|
|
{
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_DELETE, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_EXPORT, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_PROPERTIES, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_VIEW, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_RENEW_SAME_KEY, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_FILE_RENEW_NEW_KEY, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_SELECTALL, MF_GRAYED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_INVERTSELECTION, MF_GRAYED) != -1);
|
|
}
|
|
|
|
GetDlgItem (IDC_CONTAINS_TEXT)->SetFocus ();
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::OnNewSearch\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnStop()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnStop\n");
|
|
StopSearch ();
|
|
_TRACE (-1, L"Leaving CFindDialog::OnStop\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::StopSearch()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::StopSearch\n");
|
|
if ( m_bAnimationRunning )
|
|
{
|
|
VERIFY (m_animate.Stop ());
|
|
m_bAnimationRunning = false;
|
|
}
|
|
VERIFY (m_animate.Seek (0));
|
|
|
|
if ( m_hSearchThread && WaitForSingleObject (m_hSearchThread, 0) != WAIT_OBJECT_0 )
|
|
{
|
|
VERIFY (SetEvent (m_hCancelSearchEvent));
|
|
if ( WaitForSingleObject (m_hSearchThread, 5000) != WAIT_OBJECT_0 )
|
|
{
|
|
RestoreAfterSearchSettings ();
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::StopSearch\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::ExpandWindow()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::ExpandWindow\n");
|
|
ASSERT (!m_fWindowExpandedOnce);
|
|
if ( m_fWindowExpandedOnce )
|
|
return;
|
|
|
|
m_fWindowExpandedOnce = true;
|
|
|
|
CRect rcDlg;
|
|
GetWindowRect (&rcDlg);
|
|
VERIFY (SetWindowPos (&wndTop, rcDlg.left, rcDlg.top,
|
|
rcDlg.right - rcDlg.left,
|
|
m_cyOriginal,
|
|
SWP_NOMOVE | SWP_NOOWNERZORDER));
|
|
|
|
// Create the status bar
|
|
CRect rcStatusBar;
|
|
CThemeContextActivator activator;
|
|
VERIFY (m_statusBar.Create (WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
|
|
rcStatusBar, this, 1));
|
|
if ( m_statusBar.m_hWnd )
|
|
m_statusBar.GetWindowRect (&rcStatusBar);
|
|
int cyResultListMargin = (rcStatusBar.bottom - rcStatusBar.top)
|
|
+ ::GetSystemMetrics (SM_CYDLGFRAME);
|
|
|
|
// Stretch list view to right edge and to bottom
|
|
GetWindowRect (&rcDlg);
|
|
ScreenToClient (&rcDlg);
|
|
CRect rcCtrl;
|
|
m_resultsList.GetWindowRect (&rcCtrl); // returned in screen coords
|
|
ScreenToClient (&rcCtrl);
|
|
m_cxResultListMargin = (rcDlg.right - rcCtrl.right); // + ::GetSystemMetrics (SM_CXDLGFRAME);
|
|
rcCtrl.right = rcDlg.right - m_cxResultListMargin;
|
|
rcCtrl.bottom = rcDlg.bottom - cyResultListMargin;
|
|
m_resultsList.MoveWindow (rcCtrl); // child window coords relative to parent client
|
|
|
|
// Permanently enable some menu items
|
|
HMENU hMenu = ::GetMenu (m_hWnd);
|
|
ASSERT (hMenu);
|
|
if ( hMenu)
|
|
{
|
|
VERIFY (::EnableMenuItem (hMenu, ID_VIEW_LARGEICONS, MF_ENABLED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_VIEW_SMALLICONS, MF_ENABLED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, IDM_VIEW_LIST, MF_ENABLED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, IDM_VIEW_DETAILS, MF_ENABLED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_SELECTALL, MF_ENABLED) != -1);
|
|
VERIFY (::EnableMenuItem (hMenu, ID_EDIT_INVERTSELECTION, MF_ENABLED) != -1);
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::ExpandWindow\n");
|
|
}
|
|
|
|
|
|
|
|
//DWORD WINAPI FindThreadFunc (LPVOID lpvThreadParm)
|
|
void __cdecl FindThreadFunc (LPVOID lpvThreadParm)
|
|
{
|
|
_TRACE (1, L"Entering FindThreadFunc\n");
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
|
|
CFindDialog* pFindDlg = (CFindDialog*) lpvThreadParm;
|
|
ASSERT (pFindDlg);
|
|
if ( !pFindDlg )
|
|
return; // dwResult;
|
|
|
|
pFindDlg->m_singleLock.Lock ();
|
|
int nCurSel = pFindDlg->m_fieldList.GetCurSel ();
|
|
pFindDlg->m_singleLock.Unlock ();
|
|
ASSERT (CB_ERR != nCurSel);
|
|
if ( CB_ERR != nCurSel )
|
|
{
|
|
CString statusText;
|
|
pFindDlg->m_singleLock.Lock ();
|
|
DWORD dwFindType = (DWORD)pFindDlg->m_fieldList.GetItemData (nCurSel);
|
|
pFindDlg->m_singleLock.Unlock ();
|
|
CString szFindText;
|
|
|
|
|
|
statusText.LoadString (IDS_SEARCHING);
|
|
if ( pFindDlg->m_statusBar.m_hWnd )
|
|
{
|
|
pFindDlg->m_statusBar.SetWindowText (statusText);
|
|
pFindDlg->GetDlgItem (IDC_CONTAINS_TEXT)->GetWindowText (szFindText);
|
|
}
|
|
|
|
// Bug 218084 - in BiDi, string may be prepended with Left-to-Right
|
|
// mark (0x200e). See if this character is present. If so, omit it
|
|
// from the search. Check for multiple occurances.
|
|
while ( chLEFT_TO_RIGHT == szFindText.GetAt (0) )
|
|
{
|
|
szFindText = ((PCWSTR) szFindText) + 1;
|
|
}
|
|
|
|
switch (dwFindType)
|
|
{
|
|
case CERT_FIND_SUBJECT_STR_W:
|
|
case CERT_FIND_ISSUER_STR_W:
|
|
pFindDlg->SearchForNames (szFindText, dwFindType);
|
|
break;
|
|
|
|
case CERT_FIND_MD5_HASH:
|
|
pFindDlg->SearchForText (szFindText, CERT_MD5_HASH_PROP_ID);
|
|
break;
|
|
|
|
case CERT_FIND_SHA1_HASH:
|
|
pFindDlg->SearchForText (szFindText, CERT_SHA1_HASH_PROP_ID);
|
|
break;
|
|
|
|
case CERT_FIND_SERIAL_NUMBER:
|
|
pFindDlg->SearchForText (szFindText, CERT_FIND_SERIAL_NUMBER);
|
|
break;
|
|
|
|
default:
|
|
{
|
|
CThemeContextActivator activator;
|
|
AfxMessageBox (_T("Search type not implemented"), MB_OK);
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
int nCnt = pFindDlg->m_resultsList.GetItemCount ();
|
|
ASSERT (-1 != nCnt);
|
|
switch (nCnt)
|
|
{
|
|
case -1:
|
|
case 0:
|
|
VERIFY (statusText.LoadString (IDS_NO_CERTS_FOUND));
|
|
break;
|
|
|
|
case 1:
|
|
VERIFY (statusText.LoadString (IDS_1_CERT_FOUND));
|
|
break;
|
|
|
|
break;
|
|
|
|
default:
|
|
statusText.FormatMessage (IDS_X_CERTS_FOUND, nCnt);
|
|
break;
|
|
}
|
|
pFindDlg->m_statusBar.SetWindowText (statusText);
|
|
}
|
|
|
|
pFindDlg->RestoreAfterSearchSettings ();
|
|
|
|
_TRACE (-1, L"Leaving FindThreadFunc\n");
|
|
|
|
pFindDlg->m_hSearchThread = 0;
|
|
_endthread ();
|
|
}
|
|
|
|
void CFindDialog::DoSearch()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::DoSearch\n");
|
|
CWaitCursor waitCursor;
|
|
|
|
// Because FindThreadFunc calls c-runtime functions, use _beginthread instead of CreateThread.
|
|
// BoundsChecker warns that using CreateThread here results in small memory leaks
|
|
|
|
VERIFY (ResetEvent (m_hCancelSearchEvent));
|
|
m_hSearchThread = (HANDLE) _beginthread (FindThreadFunc, 0, reinterpret_cast <void*> (this));
|
|
ASSERT (m_hSearchThread);
|
|
_TRACE (-1, L"Leaving CFindDialog::DoSearch\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::SearchForTextOnStore (DWORD dwPropId, CString &szFindText,
|
|
CCertStore& rCertStore)
|
|
{
|
|
_TRACE (0, L"Entering CFindDialog::SearchForTextOnStore - %s\n",
|
|
(LPCWSTR) rCertStore.GetStoreName ());
|
|
// NOTE: szFindText is already in upper case
|
|
CWaitCursor cursor;
|
|
PCCERT_CONTEXT pCertContext = 0;
|
|
CCertificate* pCert = 0;
|
|
CString szCertText;
|
|
int nPos = 0;
|
|
|
|
|
|
// Remove all spaces from szFindText
|
|
RemoveSpaces (szFindText);
|
|
|
|
// Iterate through the list of certificates in the system store,
|
|
// allocate new certificates with the CERT_CONTEXT returned,
|
|
// and store them in the certificate list if they meet search criteria
|
|
while ( WAIT_TIMEOUT == WaitForSingleObject (m_hCancelSearchEvent, 0) )
|
|
{
|
|
pCertContext = rCertStore.EnumCertificates (pCertContext);
|
|
if ( !pCertContext )
|
|
break;
|
|
pCert =
|
|
new CCertificate (pCertContext, &rCertStore);
|
|
if ( pCert )
|
|
{
|
|
switch (dwPropId)
|
|
{
|
|
case CERT_MD5_HASH_PROP_ID:
|
|
szCertText = pCert->GetMD5Hash ();
|
|
break;
|
|
|
|
case CERT_SHA1_HASH_PROP_ID:
|
|
szCertText = pCert->GetSHAHash ();
|
|
break;
|
|
|
|
case CERT_FIND_SERIAL_NUMBER:
|
|
szCertText = pCert->GetSerialNumber ();
|
|
RemoveSpaces (szCertText);
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
return;
|
|
}
|
|
|
|
szCertText.MakeUpper ();
|
|
nPos = szCertText.Find (szFindText);
|
|
if ( -1 != nPos )
|
|
{
|
|
pCert->AddRef ();
|
|
|
|
// Add cert to list control
|
|
InsertItemInList (pCert);
|
|
}
|
|
pCert->Release ();
|
|
}
|
|
}
|
|
rCertStore.Close ();
|
|
_TRACE (-1, L"Leaving CFindDialog::SearchForTextOnStore - %s\n",
|
|
(LPCWSTR) rCertStore.GetStoreName ());
|
|
}
|
|
|
|
|
|
void CFindDialog::SearchForNameOnStore (DWORD dwFindFlags, DWORD dwFindType,
|
|
void * pvPara, CCertStore& rCertStore)
|
|
{
|
|
_TRACE (0, L"Entering CFindDialog::SearchForNameOnStore - %s\n",
|
|
(LPCWSTR) rCertStore.GetStoreName ());
|
|
PCCERT_CONTEXT pPrevCertContext = 0;
|
|
PCCERT_CONTEXT pCertContext = 0;
|
|
CCertificate* pCert = 0;
|
|
DWORD dwErr = 0;
|
|
|
|
|
|
while ( WAIT_TIMEOUT == WaitForSingleObject (m_hCancelSearchEvent, 0) )
|
|
{
|
|
pCertContext = rCertStore.FindCertificate (
|
|
dwFindFlags,
|
|
dwFindType,
|
|
pvPara,
|
|
pPrevCertContext);
|
|
if ( !pCertContext )
|
|
{
|
|
dwErr = GetLastError ();
|
|
switch (dwErr)
|
|
{
|
|
case ERROR_SUCCESS:
|
|
break;
|
|
|
|
case CRYPT_E_NOT_FOUND: // We're done. No more certificates.
|
|
case ERROR_FILE_NOT_FOUND:
|
|
break;
|
|
|
|
default:
|
|
if ( !rCertStore.GetStoreHandle () )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
|
|
text.FormatMessage
|
|
(IDS_CANNOT_OPEN_CERT_STORE_TO_FIND_CERT_BY_PURPOSE,
|
|
rCertStore.GetLocalizedName ());
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
MessageBox (text, caption, MB_ICONWARNING | MB_OK);
|
|
break;
|
|
}
|
|
else
|
|
DisplaySystemError ();
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
pCert = new CCertificate (pCertContext, &rCertStore);
|
|
if ( pCert )
|
|
InsertItemInList (pCert); // Add cert to list control
|
|
else
|
|
break;
|
|
|
|
pPrevCertContext = pCertContext;
|
|
}
|
|
rCertStore.Close ();
|
|
_TRACE (-1, L"Leaving CFindDialog::SearchForNameOnStore - %s\n",
|
|
(LPCWSTR) rCertStore.GetStoreName ());
|
|
}
|
|
|
|
|
|
void CFindDialog::InsertItemInList(CCertificate * pCert)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::InsertItemInList\n");
|
|
LV_ITEM lvItem;
|
|
int iItem = m_resultsList.GetItemCount ();
|
|
int iResult = 0;
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
|
|
lvItem.iItem = iItem;
|
|
lvItem.iSubItem = COL_ISSUED_TO;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetSubjectName ();
|
|
lvItem.iImage = 0;
|
|
lvItem.lParam = (LPARAM) pCert;
|
|
iItem = m_resultsList.InsertItem (&lvItem);
|
|
ASSERT (-1 != iItem);
|
|
if ( -1 == iItem )
|
|
return;
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = iItem;
|
|
lvItem.iSubItem = COL_ISSUED_BY;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetIssuerName ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = iItem;
|
|
lvItem.iSubItem = COL_EXPIRATION_DATE;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetValidNotAfter ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = iItem;
|
|
lvItem.iSubItem = COL_PURPOSES;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetEnhancedKeyUsage ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = iItem;
|
|
lvItem.iSubItem = COL_FRIENDLY_NAME;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetFriendlyName ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
_TRACE (-1, L"Leaving CFindDialog::InsertItemInList\n");
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = iItem;
|
|
lvItem.iSubItem = COL_SOURCE_STORE;
|
|
if ( pCert->GetCertStore () )
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetCertStore ()->GetLocalizedName ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
_TRACE (-1, L"Leaving CFindDialog::InsertItemInList\n");
|
|
|
|
}
|
|
|
|
|
|
void CFindDialog::RefreshItemInList (CCertificate * pCert, int nItem)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::RefreshItemInList\n");
|
|
LV_ITEM lvItem;
|
|
int iResult = 0;
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
|
|
lvItem.iItem = nItem;
|
|
lvItem.iSubItem = COL_ISSUED_TO;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetSubjectName ();
|
|
lvItem.iImage = 0;
|
|
lvItem.lParam = (LPARAM) pCert;
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = nItem;
|
|
lvItem.iSubItem = COL_ISSUED_BY;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetIssuerName ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = nItem;
|
|
lvItem.iSubItem = COL_EXPIRATION_DATE;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetValidNotAfter ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = nItem;
|
|
lvItem.iSubItem = COL_PURPOSES;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetEnhancedKeyUsage ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
|
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
|
lvItem.mask = LVIF_TEXT;
|
|
lvItem.iItem = nItem;
|
|
lvItem.iSubItem = COL_FRIENDLY_NAME;
|
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pCert->GetFriendlyName ();
|
|
iResult = m_resultsList.SetItem (&lvItem);
|
|
ASSERT (-1 != iResult);
|
|
|
|
VERIFY (m_resultsList.Update (nItem));
|
|
_TRACE (-1, L"Leaving CFindDialog::RefreshItemInList\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::DeleteAllResultItems()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::DeleteAllResultItems\n");
|
|
int nCnt = m_resultsList.GetItemCount ();
|
|
ASSERT (-1 != nCnt);
|
|
CCertificate* pCert = 0;
|
|
|
|
for (int nIndex = 0; nIndex < nCnt; nIndex++)
|
|
{
|
|
pCert = (CCertificate*) m_resultsList.GetItemData (nIndex);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
pCert->Release ();
|
|
}
|
|
|
|
VERIFY (m_resultsList.DeleteAllItems ());
|
|
_TRACE (-1, L"Leaving CFindDialog::DeleteAllResultItems\n");
|
|
}
|
|
|
|
void CFindDialog::OnRclickResultList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnRclickResultList\n");
|
|
|
|
m_hWndWhatsThis = 0;
|
|
CMenu bar;
|
|
if ( bar.LoadMenu(IDR_FIND_DLG_CONTEXT_MENU) )
|
|
{
|
|
CMenu& popup = *bar.GetSubMenu (0);
|
|
ASSERT(popup.m_hMenu);
|
|
CPoint point;
|
|
NM_LISTVIEW* pnmv = (NM_LISTVIEW FAR *) pNMHDR;
|
|
bool bIsMyStore = false;
|
|
if ( -1 == pnmv->iItem )
|
|
return; // mouse not over valid item
|
|
|
|
DWORD_PTR dwItemData = m_resultsList.GetItemData (pnmv->iItem);
|
|
ASSERT (dwItemData);
|
|
if ( dwItemData )
|
|
{
|
|
CCertificate* pCert = (CCertificate*) dwItemData;
|
|
bIsMyStore = (pCert->GetStoreType () == MY_STORE);
|
|
}
|
|
|
|
int nSelCnt = m_resultsList.GetSelectedCount ();
|
|
switch (nSelCnt)
|
|
{
|
|
case 0:
|
|
popup.EnableMenuItem (ID_VIEW, MF_GRAYED);
|
|
popup.EnableMenuItem (IDM_PROPERTIES, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_RENEW_NEW_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_RENEW_SAME_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_EXPORT, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_DELETE, MF_GRAYED);
|
|
break;
|
|
|
|
case 1:
|
|
popup.EnableMenuItem (ID_VIEW, MF_ENABLED);
|
|
popup.EnableMenuItem (IDM_PROPERTIES, MF_ENABLED);
|
|
if ( bIsMyStore && CERT_SYSTEM_STORE_SERVICES != m_pCompData->GetLocation () )
|
|
{
|
|
popup.EnableMenuItem (ID_ENROLL_NEW_KEY, MF_ENABLED);
|
|
popup.EnableMenuItem (ID_ENROLL_SAME_KEY, MF_ENABLED);
|
|
popup.EnableMenuItem (ID_FILE_RENEW_NEW_KEY, MF_ENABLED);
|
|
popup.EnableMenuItem (ID_FILE_RENEW_SAME_KEY, MF_ENABLED);
|
|
}
|
|
else
|
|
{
|
|
popup.EnableMenuItem (ID_ENROLL_NEW_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_ENROLL_SAME_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_RENEW_NEW_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_RENEW_SAME_KEY, MF_GRAYED);
|
|
}
|
|
popup.EnableMenuItem (ID_FILE_EXPORT, MF_ENABLED);
|
|
popup.EnableMenuItem (ID_FILE_DELETE, MF_ENABLED);
|
|
break;
|
|
|
|
default:
|
|
popup.EnableMenuItem (ID_VIEW, MF_GRAYED);
|
|
popup.EnableMenuItem (IDM_PROPERTIES, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_ENROLL_NEW_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_ENROLL_SAME_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_RENEW_NEW_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_RENEW_SAME_KEY, MF_GRAYED);
|
|
popup.EnableMenuItem (ID_FILE_EXPORT, MF_ENABLED);
|
|
popup.EnableMenuItem (ID_FILE_DELETE, MF_ENABLED);
|
|
break;
|
|
}
|
|
GetCursorPos (&point);
|
|
m_hWndWhatsThis = GetDlgItem (IDC_RESULT_LIST)->m_hWnd;
|
|
popup.TrackPopupMenu (TPM_RIGHTBUTTON | TPM_LEFTBUTTON,
|
|
point.x, point.y,
|
|
this); // route commands through main window
|
|
}
|
|
|
|
*pResult = 0;
|
|
_TRACE (-1, L"Leaving CFindDialog::OnRclickResultList\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::ChangeViewStyle (DWORD dwNewStyle)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::ChangeViewStyle\n");
|
|
if ( m_resultsList.m_hWnd )
|
|
{
|
|
DWORD dwStyle = ::GetWindowLong (m_resultsList.m_hWnd, GWL_STYLE);
|
|
::SetWindowLong (m_resultsList.m_hWnd, GWL_STYLE,
|
|
(dwStyle & ~LVS_TYPEMASK) | dwNewStyle);
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::ChangeViewStyle\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnDelete()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnDelete\n");
|
|
if ( m_resultsList.m_hWnd )
|
|
{
|
|
int nCnt = m_resultsList.GetItemCount ();
|
|
ASSERT (nCnt >= 1);
|
|
CCertificate* pCert = 0;
|
|
CString text;
|
|
CString caption;
|
|
int nSelCnt = m_resultsList.GetSelectedCount ();
|
|
ASSERT (nSelCnt >= 1);
|
|
|
|
VERIFY (text.LoadString (1 == nSelCnt ? IDS_CONFIRM_DELETE : IDS_CONFIRM_DELETE_MULTIPLE));
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
|
|
CThemeContextActivator activator;
|
|
if ( MessageBox (text, caption, MB_ICONWARNING | MB_YESNO) == IDYES )
|
|
{
|
|
UINT flag = 0;
|
|
while (--nCnt >= 0)
|
|
{
|
|
flag = ListView_GetItemState (m_resultsList.m_hWnd, nCnt, LVIS_SELECTED);
|
|
if ( flag & LVNI_SELECTED )
|
|
{
|
|
pCert = (CCertificate*) m_resultsList.GetItemData (nCnt);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
if ( pCert->DeleteFromStore (true) )
|
|
{
|
|
m_bConsoleRefreshRequired = true;
|
|
if ( m_resultsList.DeleteItem (nCnt) )
|
|
pCert->Release ();
|
|
}
|
|
else
|
|
{
|
|
DWORD dwErr = GetLastError ();
|
|
ASSERT (E_ACCESSDENIED == dwErr);
|
|
if ( E_ACCESSDENIED == dwErr )
|
|
{
|
|
DisplaySystemError ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
EnableMenuItems ();
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::OnDelete\n");
|
|
}
|
|
|
|
DWORD CFindDialog::DisplaySystemError()
|
|
{
|
|
LPVOID lpMsgBuf;
|
|
DWORD dwErr = GetLastError ();
|
|
|
|
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
|
NULL,
|
|
dwErr,
|
|
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
(LPWSTR) &lpMsgBuf, 0, NULL );
|
|
|
|
// Display the string.
|
|
CString caption;
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
CThemeContextActivator activator;
|
|
MessageBox ((LPWSTR) lpMsgBuf, (LPCWSTR) caption, MB_OK);
|
|
// Free the buffer.
|
|
LocalFree (lpMsgBuf);
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
CCertificate* CFindDialog::GetSelectedCertificate (int * pnSelItem)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::GetSelectedCertificate\n");
|
|
CCertificate* pCert = 0;
|
|
|
|
if ( m_resultsList.m_hWnd )
|
|
{
|
|
int nCnt = m_resultsList.GetItemCount ();
|
|
int nSelCnt = m_resultsList.GetSelectedCount ();
|
|
ASSERT (1 == nSelCnt);
|
|
|
|
|
|
if ( 1 == nSelCnt )
|
|
{
|
|
UINT flag = 0;
|
|
while (--nCnt >= 0)
|
|
{
|
|
flag = ListView_GetItemState (m_resultsList.m_hWnd, nCnt, LVIS_SELECTED);
|
|
if ( flag & LVNI_SELECTED )
|
|
{
|
|
pCert = (CCertificate*) m_resultsList.GetItemData (nCnt);
|
|
ASSERT (pCert);
|
|
if ( pCert && pnSelItem )
|
|
*pnSelItem = nCnt;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::GetSelectedCertificate\n");
|
|
return pCert;
|
|
}
|
|
|
|
void CFindDialog::OnProperties()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnProperties\n");
|
|
int nSelItem = 0;
|
|
CCertificate* pCert = GetSelectedCertificate (&nSelItem);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
HCERTSTORE* pPropPageStores = new HCERTSTORE[1];
|
|
if ( pPropPageStores && pCert->GetCertStore () )
|
|
{
|
|
pPropPageStores[0] = pCert->GetCertStore ()->GetStoreHandle ();
|
|
|
|
|
|
CRYPTUI_VIEWCERTIFICATEPROPERTIES_STRUCT sps;
|
|
|
|
|
|
::ZeroMemory (&sps, sizeof (sps));
|
|
sps.dwSize = sizeof (sps);
|
|
sps.hwndParent = m_hWnd;
|
|
sps.dwFlags = 0;
|
|
sps.pCertContext = pCert->GetNewCertContext ();
|
|
sps.cStores = 1;
|
|
sps.rghStores = pPropPageStores;
|
|
|
|
|
|
BOOL fPropertiesChanged = FALSE;
|
|
CThemeContextActivator activator;
|
|
BOOL bResult = ::CryptUIDlgViewCertificateProperties (&sps, &fPropertiesChanged);
|
|
if ( bResult )
|
|
{
|
|
if ( fPropertiesChanged )
|
|
{
|
|
m_bConsoleRefreshRequired = true;
|
|
if ( pCert->GetCertStore () )
|
|
pCert->GetCertStore ()->SetDirty ();
|
|
pCert->Refresh ();
|
|
RefreshItemInList (pCert, nSelItem);
|
|
}
|
|
}
|
|
|
|
if ( pCert->GetCertStore () )
|
|
pCert->GetCertStore ()->Close ();
|
|
delete [] pPropPageStores;
|
|
}
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::OnProperties\n");
|
|
}
|
|
|
|
void CFindDialog::OnView()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnView\n");
|
|
int nSelItem = 0;
|
|
CCertificate* pCert = GetSelectedCertificate (&nSelItem);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
LaunchCommonCertDialog (pCert, nSelItem);
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::OnView\n");
|
|
}
|
|
|
|
void CFindDialog::OnFileDelete()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnFileDelete\n");
|
|
OnDelete ();
|
|
_TRACE (-1, L"Leaving CFindDialog::OnFileDelete\n");
|
|
}
|
|
|
|
void CFindDialog::OnEnrollNewKey()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnEnrollNewKey\n");
|
|
OnEnroll (true);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnEnrollNewKey\n");
|
|
}
|
|
|
|
void CFindDialog::OnEnrollSameKey()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnEnrollSameKey\n");
|
|
OnEnroll (false);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnEnrollSameKey\n");
|
|
}
|
|
|
|
void CFindDialog::OnEnroll(bool bNewKey)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnEnroll\n");
|
|
int nSelItem = 0;
|
|
CCertificate* pCert = GetSelectedCertificate (&nSelItem);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
CRYPTUI_WIZ_CERT_REQUEST_PVK_CERT pvkCert;
|
|
CRYPTUI_WIZ_CERT_REQUEST_PVK_NEW pvkNew;
|
|
CRYPTUI_WIZ_CERT_REQUEST_INFO cri;
|
|
CRYPT_KEY_PROV_INFO ckpi;
|
|
|
|
::ZeroMemory (&cri, sizeof (cri));
|
|
cri.dwSize = sizeof (cri);
|
|
cri.dwPurpose = CRYPTUI_WIZ_CERT_ENROLL;
|
|
|
|
// User wants to manage user account
|
|
// pass in NULL to machine name and to account name
|
|
// User wants to manage local machine account
|
|
// pass in NULL for account name and result of ::GetComputerName ()
|
|
// to machine name
|
|
// User want to manage remote machine
|
|
// pass in NULL for account name and machine name for machineName
|
|
// User wants to manage remote account on remote machine
|
|
// pass in account name for accountName and machine name for machineName
|
|
// TODO: Ensure that this is NULL if the local machine
|
|
switch (m_pCompData->GetLocation ())
|
|
{
|
|
case CERT_SYSTEM_STORE_CURRENT_SERVICE:
|
|
case CERT_SYSTEM_STORE_SERVICES:
|
|
cri.pwszMachineName = (LPCWSTR) m_szMachineName;
|
|
cri.pwszAccountName = (LPCWSTR) m_pCompData->GetManagedService ();
|
|
break;
|
|
|
|
case CERT_SYSTEM_STORE_CURRENT_USER:
|
|
cri.pwszMachineName = NULL;
|
|
cri.pwszAccountName = NULL;
|
|
break;
|
|
|
|
case CERT_SYSTEM_STORE_LOCAL_MACHINE:
|
|
cri.pwszMachineName = (LPCWSTR) m_szMachineName;
|
|
cri.pwszAccountName = NULL;
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
return;
|
|
break;
|
|
}
|
|
|
|
if ( bNewKey )
|
|
{
|
|
cri.dwPvkChoice = CRYPTUI_WIZ_CERT_REQUEST_PVK_CHOICE_NEW;
|
|
::ZeroMemory (&pvkNew, sizeof (pvkNew));
|
|
pvkNew.dwSize = sizeof (pvkNew);
|
|
cri.pPvkNew = &pvkNew;
|
|
if ( CERT_SYSTEM_STORE_LOCAL_MACHINE == m_pCompData->GetLocation () )
|
|
{
|
|
::ZeroMemory (&ckpi, sizeof (ckpi));
|
|
ckpi.dwFlags = CRYPT_MACHINE_KEYSET;
|
|
pvkNew.pKeyProvInfo = &ckpi;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( IsLocalComputername (m_pCompData->m_szManagedComputer) )
|
|
{
|
|
DWORD dwFlags = 0;
|
|
|
|
if ( CERT_SYSTEM_STORE_LOCAL_MACHINE == m_pCompData->m_dwLocationPersist )
|
|
dwFlags = CRYPT_FIND_MACHINE_KEYSET_FLAG;
|
|
if ( !::CryptFindCertificateKeyProvInfo (
|
|
pCert->GetCertContext (), dwFlags, 0) )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
CThemeContextActivator activator;
|
|
|
|
VERIFY (text.LoadString (IDS_NO_PRIVATE_KEY));
|
|
VERIFY (caption.LoadString (IDS_REQUEST_CERT_SAME_KEY));
|
|
MessageBox (text, caption, MB_OK);
|
|
return;
|
|
}
|
|
}
|
|
cri.dwPvkChoice = CRYPTUI_WIZ_CERT_REQUEST_PVK_CHOICE_CERT;
|
|
::ZeroMemory (&pvkCert, sizeof (pvkCert));
|
|
pvkCert.dwSize = sizeof (pvkCert);
|
|
pvkCert.pCertContext = pCert->GetCertContext ();
|
|
cri.pPvkCert = &pvkCert;
|
|
}
|
|
CString dnName;
|
|
dnName.FormatMessage (L"CN=%1", m_szLoggedInUser);
|
|
cri.pwszCertDNName = (LPWSTR) (LPCWSTR) dnName;
|
|
|
|
|
|
DWORD status = 0;
|
|
PCCERT_CONTEXT pNewCertContext = 0;
|
|
BOOL bResult = FALSE;
|
|
CThemeContextActivator activator;
|
|
while (1)
|
|
{
|
|
bResult = ::CryptUIWizCertRequest (
|
|
bNewKey ? CRYPTUI_WIZ_CERT_REQUEST_REQUIRE_NEW_KEY : 0,
|
|
m_hWnd,
|
|
NULL,
|
|
&cri, &pNewCertContext, &status);
|
|
if ( !bResult && HRESULT_FROM_WIN32 (NTE_TOKEN_KEYSET_STORAGE_FULL) == GetLastError () )
|
|
{
|
|
// NTRAID# 299089 Enrollment Wizard: Should return some
|
|
// meaningful message when users fail to enroll/renew on a
|
|
// smart card
|
|
if ( !bNewKey )
|
|
break;
|
|
|
|
CString text;
|
|
CString caption;
|
|
|
|
VERIFY (text.LoadString (IDS_SMARTCARD_FULL_REUSE_PRIVATE_KEY));
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
if ( IDYES == MessageBox (text, caption, MB_YESNO) )
|
|
{
|
|
bNewKey = false;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
if ( pNewCertContext )
|
|
CertFreeCertificateContext (pNewCertContext);
|
|
}
|
|
|
|
ResetMenu ();
|
|
_TRACE (-1, L"Leaving CFindDialog::OnEnroll\n");
|
|
}
|
|
|
|
void CFindDialog::OnFileExport()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnFileExport\n");
|
|
UINT nSelCnt = m_resultsList.GetSelectedCount ();
|
|
if ( 1 == nSelCnt )
|
|
{
|
|
int nSelItem = 0;
|
|
CCertificate* pCert = GetSelectedCertificate (&nSelItem);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
CRYPTUI_WIZ_EXPORT_INFO cwi;
|
|
|
|
::ZeroMemory (&cwi, sizeof (cwi));
|
|
cwi.dwSize = sizeof (cwi);
|
|
cwi.dwSubjectChoice = CRYPTUI_WIZ_EXPORT_CERT_CONTEXT;
|
|
cwi.pCertContext = pCert->GetCertContext ();
|
|
|
|
CThemeContextActivator activator;
|
|
::CryptUIWizExport (
|
|
0,
|
|
m_hWnd,
|
|
0,
|
|
&cwi,
|
|
NULL);
|
|
}
|
|
}
|
|
else if ( nSelCnt > 1 )
|
|
{
|
|
HCERTSTORE hCertStore = ::CertOpenStore (CERT_STORE_PROV_MEMORY,
|
|
0, NULL, 0, NULL);
|
|
ASSERT (hCertStore);
|
|
if ( hCertStore )
|
|
{
|
|
CCertificate* pCert = 0;
|
|
int nCnt = m_resultsList.GetItemCount ();
|
|
UINT flag = 0;
|
|
BOOL bResult = FALSE;
|
|
while (--nCnt >= 0)
|
|
{
|
|
flag = ListView_GetItemState (m_resultsList.m_hWnd, nCnt, LVIS_SELECTED);
|
|
if ( flag & LVNI_SELECTED )
|
|
{
|
|
pCert = (CCertificate*) m_resultsList.GetItemData (nCnt);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
bResult = ::CertAddCertificateContextToStore (
|
|
hCertStore,
|
|
::CertDuplicateCertificateContext (pCert->GetCertContext ()),
|
|
CERT_STORE_ADD_NEW, 0);
|
|
ASSERT (bResult);
|
|
if ( !bResult )
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Call Export Wizard
|
|
CRYPTUI_WIZ_EXPORT_INFO cwi;
|
|
::ZeroMemory (&cwi, sizeof (cwi));
|
|
cwi.dwSize = sizeof (cwi);
|
|
cwi.dwSubjectChoice = CRYPTUI_WIZ_EXPORT_CERT_STORE_CERTIFICATES_ONLY;
|
|
cwi.hCertStore = hCertStore;
|
|
|
|
CThemeContextActivator activator;
|
|
bResult = ::CryptUIWizExport (
|
|
0,
|
|
m_hWnd,
|
|
0,
|
|
&cwi,
|
|
NULL);
|
|
|
|
VERIFY (::CertCloseStore (hCertStore, CERT_CLOSE_STORE_CHECK_FLAG));
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"CertOpenStore (CERT_STORE_PROVIDER_MEMORY) failed: 0x%x\n",
|
|
GetLastError ());
|
|
}
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::OnFileExport\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnFileRenewNewKey()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnFileRenewNewKey\n");
|
|
OnFileRenew (true);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnFileRenewNewKey\n");
|
|
}
|
|
|
|
void CFindDialog::OnFileRenewSameKey()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnFileRenewSameKey\n");
|
|
OnFileRenew (false);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnFileRenewSameKey\n");
|
|
}
|
|
|
|
void CFindDialog::OnFileRenew(bool bNewKey)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnFileRenew\n");
|
|
int nSelItem = 0;
|
|
CCertificate* pCert = GetSelectedCertificate (&nSelItem);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
RenewCertificate (
|
|
pCert,
|
|
bNewKey,
|
|
m_szMachineName,
|
|
m_pCompData->GetLocation (),
|
|
m_pCompData->GetManagedComputer (),
|
|
m_pCompData->GetManagedService (),
|
|
m_hWnd,
|
|
0,
|
|
0);
|
|
}
|
|
|
|
ResetMenu ();
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::OnFileRenew\n");
|
|
}
|
|
|
|
void CFindDialog::OnEditInvertselection()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnEditInvertselection\n");
|
|
if ( m_resultsList.m_hWnd )
|
|
{
|
|
int iItem = -1;
|
|
while ((iItem = ListView_GetNextItem (m_resultsList.m_hWnd, iItem, 0)) != -1)
|
|
{
|
|
UINT flag;
|
|
|
|
// flip the selection bit on each item
|
|
flag = ListView_GetItemState (m_resultsList.m_hWnd, iItem, LVIS_SELECTED);
|
|
flag ^= LVNI_SELECTED;
|
|
ListView_SetItemState (m_resultsList.m_hWnd, iItem, flag, LVIS_SELECTED);
|
|
}
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::OnEditInvertselection\n");
|
|
}
|
|
|
|
void CFindDialog::OnEditSelectall()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnEditSelectall\n");
|
|
if ( m_resultsList.m_hWnd )
|
|
ListView_SetItemState (m_resultsList.m_hWnd, -1, LVIS_SELECTED, LVIS_SELECTED);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnEditSelectall\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnFileProperties()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnFileProperties\n");
|
|
OnProperties ();
|
|
_TRACE (-1, L"Leaving CFindDialog::OnFileProperties\n");
|
|
}
|
|
|
|
void CFindDialog::OnHelpHelptopics()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnHelpHelptopics\n");
|
|
CComPtr<IDisplayHelp> spDisplayHelp;
|
|
|
|
HRESULT hr = m_pCompData->m_pConsole->QueryInterface (
|
|
IID_PPV_ARG (IDisplayHelp, &spDisplayHelp));
|
|
ASSERT (SUCCEEDED (hr));
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
CString helpTopic;
|
|
|
|
UINT nLen = ::GetSystemWindowsDirectory (helpTopic.GetBufferSetLength(2 * MAX_PATH), 2 * MAX_PATH);
|
|
helpTopic.ReleaseBuffer();
|
|
if (0 == nLen)
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
helpTopic += L"\\help\\";
|
|
helpTopic += CM_LINKED_HELP_FILE; //CM_HELP_FILE; //CM_LINKED_HELP_FILE;
|
|
helpTopic += L"::/";
|
|
helpTopic += CM_HELP_TOPIC;
|
|
hr = spDisplayHelp->ShowTopic (T2OLE ((LPWSTR)(LPCWSTR) helpTopic));
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
if ( !SUCCEEDED (hr) )
|
|
{
|
|
CString caption;
|
|
CString text;
|
|
CThemeContextActivator activator;
|
|
|
|
VERIFY (caption.LoadString (IDS_FIND_CERT));
|
|
text.FormatMessage (IDS_CERTMGR_CHM_NOT_FOUND, CM_HELP_FILE);
|
|
MessageBox (text, caption, MB_OK);
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::OnHelpHelptopics\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnViewDetails()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnViewDetails\n");
|
|
ChangeViewStyle (LVS_REPORT);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnViewDetails\n");
|
|
}
|
|
|
|
void CFindDialog::OnViewLargeicons()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnViewLargeicons\n");
|
|
ChangeViewStyle (LVS_ICON);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnViewLargeicons\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnViewList()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnViewList\n");
|
|
ChangeViewStyle (LVS_LIST);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnViewList\n");
|
|
}
|
|
|
|
void CFindDialog::OnViewSmallicons()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnViewSmallicons\n");
|
|
ChangeViewStyle (LVS_SMALLICON);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnViewSmallicons\n");
|
|
}
|
|
|
|
|
|
HRESULT CFindDialog::SearchForNames(const CString & szFindText, DWORD dwFindType)
|
|
{
|
|
_TRACE (0, L"Entering CFindDialog::SearchForNames - %s\n", (LPCWSTR) szFindText);
|
|
HRESULT hr = S_OK;
|
|
void* pvFindPara = (void*) (LPCWSTR) szFindText;
|
|
int nCurSel = m_storeList.GetCurSel ();
|
|
CCertStore* pStore = (CCertStore*) m_storeList.GetItemData (nCurSel);
|
|
DWORD dwFindFlags = 0;
|
|
|
|
|
|
if ( pStore )
|
|
{
|
|
SearchForNameOnStore (dwFindFlags, dwFindType, pvFindPara,
|
|
*pStore);
|
|
}
|
|
else
|
|
{
|
|
// if pStore is 0, then search on all stores in store list
|
|
int nCnt = m_storeList.GetCount ();
|
|
ASSERT (CB_ERR != nCnt);
|
|
for (int nIndex = 0;
|
|
nIndex < nCnt && WAIT_TIMEOUT == WaitForSingleObject (m_hCancelSearchEvent, 0);
|
|
nIndex++)
|
|
{
|
|
pStore = (CCertStore*) m_storeList.GetItemData (nIndex);
|
|
if ( pStore )
|
|
{
|
|
SearchForNameOnStore (dwFindFlags, dwFindType,
|
|
pvFindPara, *pStore);
|
|
}
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::SearchForNames - %s\n", (LPCWSTR) szFindText);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CFindDialog::SearchForText (CString & szFindText, DWORD dwPropId)
|
|
{
|
|
_TRACE (0, L"Entering CFindDialog::SearchForText - %s\n", (LPCWSTR) szFindText);
|
|
HRESULT hr = S_OK;
|
|
int nCurSel = m_storeList.GetCurSel ();
|
|
CCertStore* pStore = (CCertStore*) m_storeList.GetItemData (nCurSel);
|
|
|
|
|
|
szFindText.MakeUpper ();
|
|
|
|
if ( pStore && pStore->GetStoreHandle () )
|
|
{
|
|
SearchForTextOnStore (dwPropId, szFindText, *pStore);
|
|
pStore->Close ();
|
|
}
|
|
else
|
|
{
|
|
// if hCertStore is 0, then search on all stores in store list
|
|
int nCnt = m_storeList.GetCount ();
|
|
ASSERT (CB_ERR != nCnt);
|
|
for (int nIndex = 0;
|
|
nIndex < nCnt && WAIT_TIMEOUT == WaitForSingleObject (m_hCancelSearchEvent, 0);
|
|
nIndex++)
|
|
{
|
|
pStore = (CCertStore*) m_storeList.GetItemData (nIndex);
|
|
if ( pStore )
|
|
{
|
|
SearchForTextOnStore (dwPropId,
|
|
szFindText, *pStore);
|
|
pStore->Close ();
|
|
}
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::SearchForText - %s\n", (LPCWSTR) szFindText);
|
|
return hr;
|
|
}
|
|
|
|
void CFindDialog::RemoveSpaces(CString & text)
|
|
{
|
|
_TRACE (0, L"Entering CFindDialog::RemoveSpaces - %s\n", (LPCWSTR) text);
|
|
text.TrimLeft ();
|
|
text.TrimRight ();
|
|
|
|
int nLen = text.GetLength ();
|
|
LPCWSTR pszText = text.GetBuffer (nLen);
|
|
int nResultLen = nLen+2;
|
|
LPWSTR pszResult = new WCHAR[nResultLen];
|
|
if ( pszResult )
|
|
{
|
|
while (--nResultLen >= 0)
|
|
pszResult[nResultLen] = 0;
|
|
|
|
nResultLen = 0;
|
|
for (int nText = 0; nText < nLen; nText++)
|
|
{
|
|
if ( _T(" ")[0] != pszText[nText] )
|
|
pszResult[nResultLen++] = pszText[nText];
|
|
}
|
|
text.ReleaseBuffer ();
|
|
text = pszResult;
|
|
delete [] pszResult;
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::RemoveSpaces - %s\n", (LPCWSTR) text);
|
|
}
|
|
|
|
void CFindDialog::OnDblclkResultList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnDblclkResultList\n");
|
|
OnOpen ();
|
|
|
|
*pResult = 0;
|
|
_TRACE (-1, L"Leaving CFindDialog::OnDblclkResultList\n");
|
|
}
|
|
|
|
|
|
int CALLBACK CFindDialog::CompareFunc (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
{
|
|
CCertificate* pCert1 = (CCertificate*) lParam1;
|
|
CCertificate* pCert2 = (CCertificate*) lParam2;
|
|
int compVal = 0;
|
|
|
|
ASSERT (pCert1 && pCert2);
|
|
if ( pCert1 && pCert2 )
|
|
{
|
|
switch (lParamSort)
|
|
{
|
|
case COL_ISSUED_TO:
|
|
compVal = LocaleStrCmp (pCert1->GetSubjectName (), pCert2->GetSubjectName ());
|
|
break;
|
|
|
|
case COL_ISSUED_BY:
|
|
compVal = LocaleStrCmp (pCert1->GetIssuerName (), pCert2->GetIssuerName ());
|
|
break;
|
|
|
|
case COL_EXPIRATION_DATE:
|
|
compVal = pCert1->CompareExpireDate (*pCert2);
|
|
break;
|
|
|
|
case COL_PURPOSES:
|
|
compVal = LocaleStrCmp (pCert1->GetEnhancedKeyUsage (), pCert2->GetEnhancedKeyUsage ());
|
|
break;
|
|
|
|
case COL_FRIENDLY_NAME:
|
|
compVal = LocaleStrCmp (pCert1->GetFriendlyName (), pCert2->GetFriendlyName ());
|
|
break;
|
|
|
|
case COL_SOURCE_STORE:
|
|
if ( pCert1->GetCertStore () && pCert2->GetCertStore () )
|
|
compVal = LocaleStrCmp (pCert1->GetCertStore ()->GetLocalizedName (),
|
|
pCert2->GetCertStore ()->GetLocalizedName ());
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return compVal;
|
|
}
|
|
|
|
void CFindDialog::OnColumnclickResultList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnColumnclickResultList\n");
|
|
CWaitCursor cursor;
|
|
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
|
|
|
|
BOOL bResult = m_resultsList.SortItems (CompareFunc, pNMListView->iSubItem);
|
|
ASSERT (bResult);
|
|
*pResult = 0;
|
|
_TRACE (-1, L"Leaving CFindDialog::OnColumnclickResultList\n");
|
|
}
|
|
|
|
void CFindDialog::DoContextHelp (HWND hWndControl)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::DoContextHelp\n");
|
|
static const DWORD help_map[] =
|
|
{
|
|
IDC_STORE_LIST, IDH_FIND_STORE_LIST,
|
|
IDC_CONTAINS_TEXT, IDH_FIND_CONTAINS_TEXT,
|
|
IDC_FIELD_LIST, IDH_FIND_FIELD_LIST,
|
|
IDC_FIND_NOW, IDH_FIND_FIND_NOW,
|
|
IDC_STOP, IDH_FIND_STOP,
|
|
IDC_NEW_SEARCH, IDH_FIND_NEW_SEARCH,
|
|
IDC_RESULT_LIST, IDH_FIND_RESULT_LIST,
|
|
0, 0
|
|
};
|
|
|
|
|
|
switch (::GetDlgCtrlID (hWndControl))
|
|
{
|
|
case IDC_STORE_LIST:
|
|
case IDC_CONTAINS_TEXT:
|
|
case IDC_FIELD_LIST:
|
|
case IDC_FIND_NOW:
|
|
case IDC_STOP:
|
|
case IDC_NEW_SEARCH:
|
|
case IDC_RESULT_LIST:
|
|
// Display context help for a control
|
|
if ( !::WinHelp (
|
|
hWndControl,
|
|
GetF1HelpFilename(),
|
|
HELP_WM_HELP,
|
|
(DWORD_PTR) help_map) )
|
|
{
|
|
_TRACE (0, L"WinHelp () failed: 0x%x\n", GetLastError ());
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::DoContextHelp\n");
|
|
}
|
|
|
|
void CFindDialog::OnChangeContainsText()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnChangeContainsText\n");
|
|
int nLen = GetDlgItem (IDC_CONTAINS_TEXT)->GetWindowTextLength ();
|
|
|
|
// If the text starts with the invisible Left-to-Right marker, don't count
|
|
// it in the length
|
|
UpdateData (TRUE);
|
|
int nIndex = 0;
|
|
while ( chLEFT_TO_RIGHT == m_szContains.GetAt (nIndex) )
|
|
{
|
|
nLen--;
|
|
nIndex++;
|
|
}
|
|
|
|
m_findNowBtn.EnableWindow (nLen ? TRUE : FALSE);
|
|
_TRACE (-1, L"Leaving CFindDialog::OnChangeContainsText\n");
|
|
}
|
|
|
|
void CFindDialog::RestoreAfterSearchSettings()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::RestoreAfterSearchSettings\n");
|
|
if ( m_bAnimationRunning )
|
|
{
|
|
VERIFY (m_animate.Stop ());
|
|
m_bAnimationRunning = false;
|
|
}
|
|
VERIFY (m_animate.Seek (0));
|
|
|
|
// Reenable the controls
|
|
m_stopBtn.EnableWindow (FALSE);
|
|
m_findNowBtn.EnableWindow (TRUE);
|
|
m_newSearchBtn.EnableWindow (TRUE);
|
|
GetDlgItem (IDC_CONTAINS_TEXT)->EnableWindow (TRUE);
|
|
m_resultsList.EnableWindow (TRUE);
|
|
m_fieldList.EnableWindow (TRUE);
|
|
m_storeList.EnableWindow (TRUE);
|
|
|
|
m_resultsList.SetFocus ();
|
|
EnableMenuItems ();
|
|
|
|
// NTRAID# 281799 Cert UI: Cert Snapin: Accessibility: Focus indicator
|
|
// cannot be seen in certificate list in Find Certificates
|
|
int nIndex = m_resultsList.GetTopIndex();
|
|
m_resultsList.SetFocus ();
|
|
m_resultsList.SetItemState (nIndex, LVIS_FOCUSED, LVIS_FOCUSED);
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::RestoreAfterSearchSettings\n");
|
|
}
|
|
|
|
//
|
|
// Initialize the result list view
|
|
//
|
|
void CFindDialog::SetUpResultList()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::SetUpResultList\n");
|
|
// Set up result list view
|
|
COLORREF cr = RGB (255, 0, 255);
|
|
CThemeContextActivator activator;
|
|
VERIFY (m_imageListNormal.Create (IDB_CERTIFICATE_LARGE, 32, 0, cr));
|
|
VERIFY (m_imageListSmall.Create (IDB_CERTIFICATE_SMALL, 16, 0, cr));
|
|
m_resultsList.SetImageList (CImageList::FromHandle (m_imageListSmall), LVSIL_SMALL);
|
|
m_resultsList.SetImageList (CImageList::FromHandle (m_imageListNormal), LVSIL_NORMAL);
|
|
|
|
int colWidths[NUM_COLS] = {100, 100, 100, 100, 100, 400};
|
|
|
|
// Add "Issued To" column
|
|
CString szText;
|
|
VERIFY (szText.LoadString (IDS_ISSUED_TO));
|
|
VERIFY (m_resultsList.InsertColumn (COL_ISSUED_TO, (LPCWSTR) szText,
|
|
LVCFMT_LEFT, colWidths[COL_ISSUED_TO], COL_ISSUED_TO) != -1);
|
|
|
|
// Add "Issued By" column
|
|
VERIFY (szText.LoadString (IDS_ISSUED_BY));
|
|
VERIFY (m_resultsList.InsertColumn (COL_ISSUED_BY, (LPCWSTR) szText,
|
|
LVCFMT_LEFT, colWidths[COL_ISSUED_BY], COL_ISSUED_BY) != -1);
|
|
|
|
// Add "Expiration Date" column
|
|
VERIFY (szText.LoadString (IDS_COLUMN_EXPIRATION_DATE));
|
|
VERIFY (m_resultsList.InsertColumn (COL_EXPIRATION_DATE, (LPCWSTR) szText,
|
|
LVCFMT_LEFT, colWidths[COL_EXPIRATION_DATE], COL_EXPIRATION_DATE) != -1);
|
|
|
|
// Add "Purposes" column
|
|
VERIFY (szText.LoadString (IDS_COLUMN_PURPOSE));
|
|
VERIFY (m_resultsList.InsertColumn (COL_PURPOSES, (LPCWSTR) szText,
|
|
LVCFMT_LEFT, colWidths[COL_PURPOSES], COL_PURPOSES) != -1);
|
|
|
|
// Add "Friendly Name" column
|
|
VERIFY (szText.LoadString (IDS_COLUMN_FRIENDLY_NAME));
|
|
VERIFY (m_resultsList.InsertColumn (COL_FRIENDLY_NAME, (LPCWSTR) szText,
|
|
LVCFMT_LEFT, colWidths[COL_FRIENDLY_NAME], COL_FRIENDLY_NAME) != -1);
|
|
|
|
// Add "Source Store" column
|
|
VERIFY (szText.LoadString (IDS_COLUMN_SOURCE_STORE));
|
|
VERIFY (m_resultsList.InsertColumn (COL_SOURCE_STORE, (LPCWSTR) szText,
|
|
LVCFMT_LEFT, colWidths[COL_SOURCE_STORE], COL_SOURCE_STORE) != -1);
|
|
|
|
// Set to full-row select
|
|
DWORD dwExstyle = m_resultsList.GetExtendedStyle ();
|
|
m_resultsList.SetExtendedStyle (dwExstyle | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::SetUpResultList\n");
|
|
}
|
|
|
|
//
|
|
// Hide the portion of the dialog containing the result list. This part
|
|
// becomes visible when a search is performed.
|
|
//
|
|
void CFindDialog::HideResultList()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::HideResultList\n");
|
|
// Size window to hide list view until search is performed
|
|
CRect rcList;
|
|
m_resultsList.GetWindowRect (&rcList);
|
|
ScreenToClient (&rcList);
|
|
CRect rcDlg;
|
|
GetWindowRect (&rcDlg);
|
|
ScreenToClient (&rcDlg);
|
|
|
|
int cyCaption = ::GetSystemMetrics (SM_CYCAPTION);
|
|
m_cyOriginal = (rcDlg.bottom - rcDlg.top) + cyCaption;
|
|
m_cyMin = (rcList.top - rcDlg.top) + cyCaption - 16;
|
|
m_cxMin = rcDlg.right - rcDlg.left;
|
|
VERIFY (SetWindowPos (&wndTop, rcDlg.left, rcDlg.top,
|
|
rcDlg.right - rcDlg.left,
|
|
m_cyMin,
|
|
SWP_NOMOVE | SWP_NOOWNERZORDER));
|
|
|
|
//
|
|
// Get information about the spatial relationship of the controls to the window.
|
|
// We will need this later for expanding and resizing the dialog.
|
|
// Get right margin to maintain distance of buttons to right side
|
|
//
|
|
CRect rcCtrl;
|
|
m_stopBtn.GetWindowRect (&rcCtrl);
|
|
ScreenToClient (&rcCtrl);
|
|
m_cxBtnMargin = rcDlg.right - rcCtrl.right;
|
|
|
|
m_animate.GetWindowRect (&rcCtrl);
|
|
ScreenToClient (&rcCtrl);
|
|
m_cxAnimMargin = rcDlg.right - rcCtrl.right;
|
|
|
|
m_storeList.GetWindowRect (&rcCtrl);
|
|
ScreenToClient (&rcCtrl);
|
|
m_cxStoreListMargin = rcDlg.right - rcCtrl.right;
|
|
|
|
GetDlgItem (IDC_CONTAINS_TEXT)->GetWindowRect (&rcCtrl);
|
|
ScreenToClient (&rcCtrl);
|
|
m_cxContainMargin = rcDlg.right - rcCtrl.right;
|
|
|
|
m_fieldList.GetWindowRect (&rcCtrl);
|
|
ScreenToClient (&rcCtrl);
|
|
m_cxFieldListMargin = rcDlg.right - rcCtrl.right;
|
|
_TRACE (-1, L"Leaving CFindDialog::HideResultList\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnItemchangedResultList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnItemchangedResultList\n");
|
|
EnableMenuItems ();
|
|
*pResult = 0;
|
|
_TRACE (-1, L"Leaving CFindDialog::OnItemchangedResultList\n");
|
|
}
|
|
|
|
void CFindDialog::OnOpen()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::OnOpen\n");
|
|
int nSelItem = 0;
|
|
CCertificate* pCert = GetSelectedCertificate (&nSelItem);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
VERIFY (SUCCEEDED (LaunchCommonCertDialog (pCert, nSelItem)));
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::OnOpen\n");
|
|
}
|
|
|
|
HRESULT CFindDialog::LaunchCommonCertDialog (CCertificate* pCert, const int nItem)
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::LaunchCommonCertDialog\n");
|
|
ASSERT (pCert);
|
|
if ( !pCert )
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
CTypedPtrList<CPtrList, CCertStore*> storeList;
|
|
|
|
// Add the Root store first on a remote machine.
|
|
if ( !IsLocalComputername (m_pCompData->GetManagedComputer ()) )
|
|
{
|
|
storeList.AddTail (new CCertStore (CERTMGR_LOG_STORE,
|
|
CERT_STORE_PROV_SYSTEM,
|
|
CERT_SYSTEM_STORE_LOCAL_MACHINE,
|
|
(LPCWSTR) m_pCompData->GetManagedComputer (),
|
|
ROOT_SYSTEM_STORE_NAME,
|
|
ROOT_SYSTEM_STORE_NAME,
|
|
_T (""), ROOT_STORE,
|
|
CERT_SYSTEM_STORE_LOCAL_MACHINE,
|
|
m_pCompData->m_pConsole));
|
|
}
|
|
CCertStore* pStore = pCert->GetCertStore ();
|
|
if ( pStore )
|
|
{
|
|
pStore->AddRef ();
|
|
storeList.AddTail (pStore);
|
|
|
|
hr = m_pCompData->EnumerateLogicalStores (&storeList);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
POSITION pos = 0;
|
|
POSITION prevPos = 0;
|
|
|
|
// Validate store handles
|
|
for (pos = storeList.GetHeadPosition ();
|
|
pos;)
|
|
{
|
|
prevPos = pos;
|
|
pStore = storeList.GetNext (pos);
|
|
ASSERT (pStore);
|
|
if ( pStore )
|
|
{
|
|
// Do not open the userDS store
|
|
if ( USERDS_STORE == pStore->GetStoreType () )
|
|
{
|
|
storeList.RemoveAt (prevPos);
|
|
pStore->Release ();
|
|
pStore = 0;
|
|
}
|
|
else
|
|
{
|
|
if ( !pStore->GetStoreHandle () )
|
|
{
|
|
CString caption;
|
|
CString text;
|
|
CThemeContextActivator activator;
|
|
|
|
text.FormatMessage (IDS_CANT_OPEN_STORE_AND_FAIL, pStore->GetLocalizedName ());
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
MessageBox (text, caption, MB_ICONWARNING | MB_OK);
|
|
hr = E_FAIL;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Proceed only if all handles are valid
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
CRYPTUI_VIEWCERTIFICATE_STRUCT vcs;
|
|
::ZeroMemory (&vcs, sizeof (vcs));
|
|
vcs.dwSize = sizeof (vcs);
|
|
vcs.hwndParent = m_hWnd;
|
|
|
|
// Set these flags only on a remote machine.
|
|
if ( !IsLocalComputername (m_pCompData->GetManagedComputer ()) )
|
|
vcs.dwFlags = CRYPTUI_DONT_OPEN_STORES | CRYPTUI_WARN_UNTRUSTED_ROOT;
|
|
else
|
|
vcs.dwFlags = 0;
|
|
vcs.pCertContext = pCert->GetNewCertContext ();
|
|
vcs.cStores = (DWORD)storeList.GetCount ();
|
|
vcs.rghStores = new HCERTSTORE[vcs.cStores];
|
|
if ( vcs.rghStores )
|
|
{
|
|
DWORD index = 0;
|
|
|
|
for (pos = storeList.GetHeadPosition ();
|
|
pos && index < vcs.cStores;
|
|
index++)
|
|
{
|
|
pStore = storeList.GetNext (pos);
|
|
ASSERT (pStore);
|
|
if ( pStore )
|
|
{
|
|
vcs.rghStores[index] = pStore->GetStoreHandle ();
|
|
}
|
|
}
|
|
BOOL fPropertiesChanged = FALSE;
|
|
CThemeContextActivator activator;
|
|
BOOL bResult = ::CryptUIDlgViewCertificate (&vcs, &fPropertiesChanged);
|
|
if ( bResult )
|
|
{
|
|
if ( fPropertiesChanged )
|
|
{
|
|
m_bConsoleRefreshRequired = true;
|
|
if ( pCert->GetCertStore () )
|
|
pCert->GetCertStore ()->SetDirty ();
|
|
pCert->Refresh ();
|
|
RefreshItemInList (pCert, nItem);
|
|
}
|
|
}
|
|
delete vcs.rghStores;
|
|
}
|
|
else
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
// Release all the stores in the list.
|
|
while (!storeList.IsEmpty () )
|
|
{
|
|
pStore = storeList.RemoveHead ();
|
|
ASSERT (pStore);
|
|
if ( pStore )
|
|
{
|
|
pStore->Close ();
|
|
pStore->Release ();
|
|
}
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::LaunchCommonCertDialog\n");
|
|
return hr;
|
|
}
|
|
|
|
|
|
void CFindDialog::ChangeToSizableFrame()
|
|
{
|
|
_TRACE (1, L"Entering CFindDialog::ChangeToSizableFrame\n");
|
|
LONG lStyle = ::GetWindowLong (m_hWnd, GWL_STYLE);
|
|
|
|
if ( lStyle )
|
|
{
|
|
lStyle &= ~DS_MODALFRAME;
|
|
lStyle |= WS_THICKFRAME;
|
|
if ( !::SetWindowLong (m_hWnd, GWL_STYLE, lStyle) )
|
|
{
|
|
_TRACE (0, L"SetWindowLong () failed: 0x%x\n", GetLastError ());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"GetWindowLong () failed: 0x%x\n", GetLastError ());
|
|
}
|
|
_TRACE (-1, L"Leaving CFindDialog::ChangeToSizableFrame\n");
|
|
}
|
|
|
|
|
|
void CFindDialog::OnContextMenu(CWnd* /*pWnd*/, CPoint scrPoint)
|
|
{
|
|
// point is in screen coordinates
|
|
_TRACE (1, L"Entering CFindDialog::OnContextMenu\n");
|
|
CMenu bar;
|
|
CPoint clPoint;
|
|
clPoint.x = scrPoint.x;
|
|
clPoint.y = scrPoint.y;
|
|
ScreenToClient (&clPoint);
|
|
|
|
|
|
// Get the handle of the window under the point.
|
|
CWnd* pChild = ChildWindowFromPoint (
|
|
clPoint, // in client coordinates
|
|
CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
|
|
if ( pChild && pChild->m_hWnd != GetDlgItem (IDC_RESULT_LIST)->m_hWnd )
|
|
{
|
|
m_hWndWhatsThis = 0;
|
|
|
|
if ( GetDlgItem (IDC_STORE_LIST)->m_hWnd == pChild->m_hWnd ||
|
|
GetDlgItem (IDC_FIND_NOW)->m_hWnd == pChild->m_hWnd ||
|
|
GetDlgItem (IDC_STOP)->m_hWnd == pChild->m_hWnd ||
|
|
GetDlgItem (IDC_NEW_SEARCH)->m_hWnd == pChild->m_hWnd ||
|
|
GetDlgItem (IDC_RESULT_LIST)->m_hWnd == pChild->m_hWnd ||
|
|
GetDlgItem (IDC_CONTAINS_TEXT)->m_hWnd == pChild->m_hWnd ||
|
|
GetDlgItem (IDC_FIELD_LIST)->m_hWnd == pChild->m_hWnd )
|
|
{
|
|
m_hWndWhatsThis = pChild->m_hWnd;
|
|
}
|
|
|
|
|
|
if ( m_hWndWhatsThis )
|
|
{
|
|
if ( bar.LoadMenu(IDR_WHATS_THIS_CONTEXT_MENU1) )
|
|
{
|
|
CMenu& popup = *bar.GetSubMenu (0);
|
|
ASSERT(popup.m_hMenu);
|
|
|
|
if ( !popup.TrackPopupMenu (TPM_RIGHTBUTTON | TPM_LEFTBUTTON,
|
|
scrPoint.x, // in screen coordinates
|
|
scrPoint.y, // in screen coordinates
|
|
this) ) // route commands through main window
|
|
{
|
|
m_hWndWhatsThis = 0;
|
|
}
|
|
}
|
|
else
|
|
m_hWndWhatsThis = 0;
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CFindDialog::OnContextMenu\n");
|
|
}
|
|
|
|
bool CFindDialog::ConsoleRefreshRequired() const
|
|
{
|
|
return m_bConsoleRefreshRequired;
|
|
}
|
|
|
|
|
|
|
|
void CFindDialog::ResetMenu()
|
|
{
|
|
// Set up the menu
|
|
if ( !::GetMenu (m_hWnd) )
|
|
{
|
|
HMENU hMenu = ::LoadMenu (AfxGetInstanceHandle (),
|
|
MAKEINTRESOURCE (IDR_FIND_DLG_MENU));
|
|
ASSERT (hMenu);
|
|
if ( hMenu )
|
|
{
|
|
if (::SetMenu (m_hWnd, hMenu) )
|
|
EnableMenuItems ();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CFindDialog::OnCancel()
|
|
{
|
|
if ( m_hSearchThread && WaitForSingleObject (m_hSearchThread, 0) != WAIT_OBJECT_0 )
|
|
{
|
|
CString caption;
|
|
CString text;
|
|
|
|
VERIFY (text.LoadString (IDS_FIND_CLICK_STOP_BEFORE_CLOSING));
|
|
VERIFY (caption.LoadString (IDS_FIND_CERT));
|
|
CThemeContextActivator activator;
|
|
MessageBox (text, caption, MB_OK);
|
|
|
|
return;
|
|
}
|
|
|
|
CHelpDialog::OnCancel();
|
|
}
|