You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6529 lines
244 KiB
6529 lines
244 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997-2002.
|
|
//
|
|
// File: cmponent.cpp
|
|
//
|
|
// Contents: Implementation of CCertMgrComponent
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include <gpedit.h>
|
|
#include <wintrust.h>
|
|
#include <sceattch.h>
|
|
#include "compdata.h" // CCertMgrComponentData
|
|
#include "dataobj.h"
|
|
#include "cmponent.h" // CCertMgrComponent
|
|
#include "storegpe.h"
|
|
#include "users.h"
|
|
#include "addsheet.h"
|
|
#include "StoreRSOP.h"
|
|
#include "SaferEntry.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#ifndef ALPHA
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
USE_HANDLE_MACROS ("CERTMGR (cmponent.cpp)")
|
|
#include "stdcmpnt.cpp" // CComponent
|
|
|
|
extern bool g_bSchemaIsW2K;
|
|
|
|
extern GUID g_guidExtension;
|
|
extern GUID g_guidRegExt;
|
|
extern GUID g_guidSnapin;
|
|
|
|
// CERTMGR_USAGE, CERTMGR_USAGE, CERTMGR_USAGE, CERTMGR_CERT_CONTAINER
|
|
UINT m_aColumns0[CERT_NUM_COLS+1] =
|
|
{IDS_COLUMN_SUBJECT, IDS_COLUMN_ISSUER, IDS_COLUMN_EXPIRATION_DATE,
|
|
IDS_COLUMN_PURPOSE, IDS_COLUMN_FRIENDLY_NAME, IDS_COLUMN_STATUS,
|
|
IDS_COLUMN_TEMPLATE_NAME, 0};
|
|
// CERTMGR_SNAPIN
|
|
UINT m_aColumns1[2] =
|
|
{IDS_COLUMN_LOG_CERTIFICATE_STORE,0};
|
|
// CERTMGR_CERTIFICATE, CERTMGR_CRL, CERTMGR_CTL
|
|
UINT m_aColumns2[2] =
|
|
{0,0};
|
|
// CERTMGR_CRL_CONTAINER
|
|
UINT m_aColumns3[4] =
|
|
{IDS_COLUMN_ISSUER, IDS_COLUMN_EFFECTIVE_DATE, IDS_COLUMN_NEXT_UPDATE, 0};
|
|
// CERTMGR_CTL_CONTAINER
|
|
UINT m_aColumns4[6] =
|
|
{IDS_COLUMN_ISSUER, IDS_COLUMN_EFFECTIVE_DATE, IDS_COLUMN_PURPOSE, IDS_COLUMN_FRIENDLY_NAME, 0};
|
|
|
|
UINT m_aColumns5[2] =
|
|
{IDS_COLUMN_OBJECT_TYPE, 0};
|
|
|
|
// CERTMGR_SAFER_USER_LEVELS, CERTMGR_SAFER_COMPUTER_LEVELS
|
|
UINT m_aColumns6[SAFER_LEVELS_NUM_COLS+1] =
|
|
{IDS_COLUMN_NAME, IDS_COLUMN_DESCRIPTION, 0};
|
|
|
|
// CERTMGR_SAFER_USER_ENTRIES, CERTMGR_SAFER_COMPUTER_ENTRIES
|
|
UINT m_aColumns7[SAFER_ENTRIES_NUM_COLS+1] =
|
|
{IDS_COLUMN_NAME, IDS_COLUMN_TYPE, IDS_COLUMN_LEVEL, IDS_COLUMN_DESCRIPTION, IDS_COLUMN_LAST_MODIFIED_DATE, 0};
|
|
|
|
UINT* m_Columns[CERTMGR_NUMTYPES] =
|
|
{
|
|
m_aColumns1, // CERTMGR_SNAPIN
|
|
m_aColumns2, // CERTMGR_CERTIFICATE (result)
|
|
m_aColumns5, // CERTMGR_LOG_STORE
|
|
m_aColumns5, // CERTMGR_PHYS_STORE
|
|
m_aColumns0, // CERTMGR_USAGE
|
|
m_aColumns3, // CERTMGR_CRL_CONTAINER
|
|
m_aColumns4, // CERTMGR_CTL_CONTAINER
|
|
m_aColumns0, // CERTMGR_CERT_CONTAINER
|
|
m_aColumns2, // CERTMGR_CRL (result)
|
|
m_aColumns2, // CERTMGR_CTL (result)
|
|
m_aColumns2, // CERTMGR_AUTO_CERT_REQUEST
|
|
m_aColumns5, // CERTMGR_CERT_POLICIES_USER,
|
|
m_aColumns5, // CERTMGR_CERT_POLICIES_COMPUTER,
|
|
m_aColumns5, // CERTMGR_LOG_STORE_GPE
|
|
m_aColumns5, // CERTMGR_LOG_STORE_RSOP
|
|
m_aColumns1, // CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS
|
|
m_aColumns1, // CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS
|
|
m_aColumns5, // CERTMGR_SAFER_COMPUTER_ROOT
|
|
m_aColumns5, // CERTMGR_SAFER_USER_ROOT
|
|
m_aColumns6, // CERTMGR_SAFER_COMPUTER_LEVELS
|
|
m_aColumns6, // CERTMGR_SAFER_USER_LEVELS
|
|
m_aColumns7, // CERTMGR_SAFER_COMPUTER_ENTRIES
|
|
m_aColumns7, // CERTMGR_SAFER_USER_ENTRIES
|
|
m_aColumns2, // CERTMGR_SAFER_COMPUTER_LEVEL,
|
|
m_aColumns2, // CERTMGR_SAFER_USER_LEVEL,
|
|
m_aColumns2, // CERTMGR_SAFER_COMPUTER_ENTRY,
|
|
m_aColumns2, // CERTMGR_SAFER_USER_ENTRY,
|
|
m_aColumns2, // CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS
|
|
m_aColumns2, // CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS
|
|
m_aColumns2, // CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES
|
|
m_aColumns2, // CERTMGR_SAFER_USER_DEFINED_FILE_TYPES
|
|
m_aColumns2, // CERTMGR_SAFER_USER_ENFORCEMENT
|
|
m_aColumns2 // CERTMGR_SAFER_COMPUTER_ENFORCEMENT
|
|
};
|
|
|
|
|
|
UINT** g_aColumns = 0; // for framework
|
|
int** g_aColumnWidths = 0; // for framework
|
|
const int SINGLE_COL_WIDTH = 450;
|
|
|
|
CCertMgrComponent::CCertMgrComponent ()
|
|
: m_pViewedCookie (NULL),
|
|
m_bUsageStoresEnumerated (false),
|
|
m_pPastedDO (NULL),
|
|
m_bShowArchivedCertsStateWhenLogStoresEnumerated (false),
|
|
m_nSelectedCertColumn (0),
|
|
m_nSelectedCRLColumn (0),
|
|
m_nSelectedCTLColumn (0),
|
|
m_nSelectedSaferEntryColumn (0),
|
|
m_pLastUsageCookie (0),
|
|
m_pToolbar (0)
|
|
{
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ( ));
|
|
_TRACE (1, L"Entering CCertMgrComponent::CCertMgrComponent\n");
|
|
|
|
const int ISSUED_TO_BY_WIDTH = 200;
|
|
const int FRIENDLY_NAME_WIDTH = 125;
|
|
const int DATE_WIDTH = 100;
|
|
const int PURPOSE_WIDTH = 125;
|
|
const int STATUS_WIDTH = 50;
|
|
const int TEMPLATE_WIDTH = 100;
|
|
const int SAFER_LEVEL_NAME_WIDTH = 150;
|
|
const int SAFER_LEVEL_DESCRIPTION_WIDTH = 400;
|
|
const int SAFER_ENTRY_NAME_WIDTH = 250;
|
|
const int SAFER_ENTRY_TYPE_WIDTH = 75;
|
|
const int SAFER_ENTRY_LEVEL_WIDTH = 100;
|
|
const int SAFER_ENTRY_DESCRIPTION_WIDTH = 200;
|
|
const int SAFER_ENTRY_LAST_MODIFIED_DATE_WIDTH = 200;
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (m_ColumnWidths, sizeof (UINT*) * CERTMGR_NUMTYPES);
|
|
m_ColumnWidths[CERTMGR_SNAPIN] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SNAPIN] )
|
|
m_ColumnWidths[CERTMGR_SNAPIN][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_USAGE] = new UINT[CERT_NUM_COLS];
|
|
if ( m_ColumnWidths[CERTMGR_USAGE] )
|
|
{
|
|
m_ColumnWidths[CERTMGR_USAGE][COLNUM_CERT_SUBJECT] = ISSUED_TO_BY_WIDTH; // issued to
|
|
m_ColumnWidths[CERTMGR_USAGE][COLNUM_CERT_ISSUER] = ISSUED_TO_BY_WIDTH; // issued by
|
|
m_ColumnWidths[CERTMGR_USAGE][COLNUM_CERT_EXPIRATION_DATE] = DATE_WIDTH; // expiration date
|
|
m_ColumnWidths[CERTMGR_USAGE][COLNUM_CERT_PURPOSE] = PURPOSE_WIDTH; // purpose
|
|
m_ColumnWidths[CERTMGR_USAGE][COLNUM_CERT_CERT_NAME] = FRIENDLY_NAME_WIDTH; // friendly name
|
|
m_ColumnWidths[CERTMGR_USAGE][COLNUM_CERT_STATUS] = STATUS_WIDTH; // status
|
|
m_ColumnWidths[CERTMGR_USAGE][COLNUM_CERT_TEMPLATE] = TEMPLATE_WIDTH; // template
|
|
}
|
|
|
|
m_ColumnWidths[CERTMGR_PHYS_STORE] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_PHYS_STORE] )
|
|
m_ColumnWidths[CERTMGR_PHYS_STORE][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_LOG_STORE] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_LOG_STORE] )
|
|
m_ColumnWidths[CERTMGR_LOG_STORE][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_CERTIFICATE] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_CERTIFICATE] )
|
|
m_ColumnWidths[CERTMGR_CERTIFICATE][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_CRL_CONTAINER] = new UINT[CRL_NUM_COLS];
|
|
if ( m_ColumnWidths[CERTMGR_CRL_CONTAINER] )
|
|
{
|
|
m_ColumnWidths[CERTMGR_CRL_CONTAINER][0] = ISSUED_TO_BY_WIDTH; // issued by
|
|
m_ColumnWidths[CERTMGR_CRL_CONTAINER][1] = DATE_WIDTH; // effective date
|
|
m_ColumnWidths[CERTMGR_CRL_CONTAINER][2] = DATE_WIDTH; // next update
|
|
}
|
|
|
|
m_ColumnWidths[CERTMGR_CTL_CONTAINER] = new UINT[CTL_NUM_COLS];
|
|
if ( m_ColumnWidths[CERTMGR_CTL_CONTAINER] )
|
|
{
|
|
m_ColumnWidths[CERTMGR_CTL_CONTAINER][0] = ISSUED_TO_BY_WIDTH; // issued by
|
|
m_ColumnWidths[CERTMGR_CTL_CONTAINER][1] = DATE_WIDTH; // effective date
|
|
m_ColumnWidths[CERTMGR_CTL_CONTAINER][2] = PURPOSE_WIDTH; // purpose
|
|
m_ColumnWidths[CERTMGR_CTL_CONTAINER][3] = FRIENDLY_NAME_WIDTH; // friendly name
|
|
}
|
|
|
|
m_ColumnWidths[CERTMGR_CERT_CONTAINER] = new UINT[CERT_NUM_COLS];
|
|
if ( m_ColumnWidths[CERTMGR_CERT_CONTAINER] )
|
|
{
|
|
m_ColumnWidths[CERTMGR_CERT_CONTAINER][COLNUM_CERT_SUBJECT] = ISSUED_TO_BY_WIDTH; // issued to
|
|
m_ColumnWidths[CERTMGR_CERT_CONTAINER][COLNUM_CERT_ISSUER] = ISSUED_TO_BY_WIDTH; // issued by
|
|
m_ColumnWidths[CERTMGR_CERT_CONTAINER][COLNUM_CERT_EXPIRATION_DATE] = DATE_WIDTH; // expiration date
|
|
m_ColumnWidths[CERTMGR_CERT_CONTAINER][COLNUM_CERT_PURPOSE] = PURPOSE_WIDTH; // purpose
|
|
m_ColumnWidths[CERTMGR_CERT_CONTAINER][COLNUM_CERT_CERT_NAME] = FRIENDLY_NAME_WIDTH;// friendly name
|
|
m_ColumnWidths[CERTMGR_CERT_CONTAINER][COLNUM_CERT_STATUS] = STATUS_WIDTH; // status
|
|
m_ColumnWidths[CERTMGR_CERT_CONTAINER][COLNUM_CERT_TEMPLATE] = TEMPLATE_WIDTH; // template
|
|
}
|
|
|
|
m_ColumnWidths[CERTMGR_CRL] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_CRL] )
|
|
m_ColumnWidths[CERTMGR_CRL][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_CTL] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_CTL] )
|
|
m_ColumnWidths[CERTMGR_CTL][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_LOG_STORE_GPE] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_LOG_STORE_GPE] )
|
|
m_ColumnWidths[CERTMGR_LOG_STORE_GPE][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_LOG_STORE_RSOP] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_LOG_STORE_RSOP] )
|
|
m_ColumnWidths[CERTMGR_LOG_STORE_RSOP][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_AUTO_CERT_REQUEST] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_AUTO_CERT_REQUEST] )
|
|
m_ColumnWidths[CERTMGR_AUTO_CERT_REQUEST][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_CERT_POLICIES_USER] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_CERT_POLICIES_USER] )
|
|
m_ColumnWidths[CERTMGR_CERT_POLICIES_USER][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_CERT_POLICIES_COMPUTER] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_CERT_POLICIES_COMPUTER] )
|
|
m_ColumnWidths[CERTMGR_CERT_POLICIES_COMPUTER][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS] )
|
|
m_ColumnWidths[CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS] )
|
|
m_ColumnWidths[CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ROOT] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ROOT] )
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ROOT][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ROOT] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_USER_ROOT] )
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ROOT][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_LEVELS] = new UINT[SAFER_LEVELS_NUM_COLS];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_COMPUTER_LEVELS] )
|
|
{
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_LEVELS][COLNUM_SAFER_LEVEL_NAME] = SAFER_LEVEL_NAME_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_LEVELS][COLNUM_SAFER_LEVEL_DESCRIPTION] = SAFER_LEVEL_DESCRIPTION_WIDTH;
|
|
}
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_LEVELS] = new UINT[SAFER_LEVELS_NUM_COLS];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_USER_LEVELS] )
|
|
{
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_LEVELS][COLNUM_SAFER_LEVEL_NAME] = SAFER_LEVEL_NAME_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_LEVELS][COLNUM_SAFER_LEVEL_DESCRIPTION] = SAFER_LEVEL_DESCRIPTION_WIDTH;
|
|
}
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRIES] = new UINT[SAFER_ENTRIES_NUM_COLS];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRIES] )
|
|
{
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRIES][COLNUM_SAFER_ENTRIES_NAME] = SAFER_ENTRY_NAME_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRIES][COLNUM_SAFER_ENTRIES_TYPE] = SAFER_ENTRY_TYPE_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRIES][COLNUM_SAFER_ENTRIES_LEVEL] = SAFER_ENTRY_LEVEL_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRIES][COLNUM_SAFER_ENTRIES_DESCRIPTION] = SAFER_ENTRY_DESCRIPTION_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRIES][COLNUM_SAFER_ENTRIES_LAST_MODIFIED_DATE] = SAFER_ENTRY_LAST_MODIFIED_DATE_WIDTH;
|
|
}
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENTRIES] = new UINT[SAFER_ENTRIES_NUM_COLS];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_USER_ENTRIES] )
|
|
{
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENTRIES][COLNUM_SAFER_ENTRIES_NAME] = SAFER_ENTRY_NAME_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENTRIES][COLNUM_SAFER_ENTRIES_TYPE] = SAFER_ENTRY_TYPE_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENTRIES][COLNUM_SAFER_ENTRIES_LEVEL] = SAFER_ENTRY_LEVEL_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENTRIES][COLNUM_SAFER_ENTRIES_DESCRIPTION] = SAFER_ENTRY_DESCRIPTION_WIDTH;
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENTRIES][COLNUM_SAFER_ENTRIES_LAST_MODIFIED_DATE] = SAFER_ENTRY_LAST_MODIFIED_DATE_WIDTH;
|
|
}
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_LEVEL] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_COMPUTER_LEVEL] )
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_LEVEL][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_LEVEL] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_USER_LEVEL] )
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_LEVEL][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRY] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRY] )
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENTRY][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENTRY] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_USER_ENTRY] )
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENTRY][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS] )
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS] )
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES] )
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_DEFINED_FILE_TYPES] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_USER_DEFINED_FILE_TYPES] )
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_DEFINED_FILE_TYPES][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENFORCEMENT] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_USER_ENFORCEMENT] )
|
|
m_ColumnWidths[CERTMGR_SAFER_USER_ENFORCEMENT][0] = SINGLE_COL_WIDTH;
|
|
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENFORCEMENT] = new UINT[1];
|
|
if ( m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENFORCEMENT] )
|
|
m_ColumnWidths[CERTMGR_SAFER_COMPUTER_ENFORCEMENT][0] = SINGLE_COL_WIDTH;
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::CCertMgrComponent\n");
|
|
}
|
|
|
|
CCertMgrComponent::~CCertMgrComponent ()
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::~CCertMgrComponent\n");
|
|
VERIFY ( SUCCEEDED (ReleaseAll ()) );
|
|
|
|
CloseAndReleaseUsageStores ();
|
|
|
|
for (int i = 0; i < CERTMGR_NUMTYPES; i++)
|
|
{
|
|
if ( m_ColumnWidths[i] )
|
|
delete [] m_ColumnWidths[i];
|
|
}
|
|
|
|
if ( m_pLastUsageCookie )
|
|
m_pLastUsageCookie->Release ();
|
|
|
|
if ( m_pToolbar )
|
|
m_pToolbar->Release ();
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::~CCertMgrComponent\n");
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::ReleaseAll ()
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::ReleaseAll\n");
|
|
|
|
HRESULT hr = CComponent::ReleaseAll ();
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::ReleaseAll: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// IComponent Implementation
|
|
|
|
HRESULT CCertMgrComponent::LoadStrings ()
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::LoadStrings\n");
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::LoadStrings\n");
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::LoadColumns ( CCertMgrCookie* pcookie )
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::LoadColumns\n");
|
|
TEST_NONNULL_PTR_PARAM (pcookie);
|
|
HRESULT hr = S_OK;
|
|
CString str;
|
|
|
|
|
|
switch ( pcookie->m_objecttype )
|
|
{
|
|
case CERTMGR_SNAPIN:
|
|
if ( IDM_STORE_VIEW == QueryComponentDataRef ().m_activeViewPersist )
|
|
VERIFY (str.LoadString (IDS_COLUMN_LOG_CERTIFICATE_STORE) );
|
|
else
|
|
VERIFY (str.LoadString (IDS_COLUMN_PURPOSE) );
|
|
hr = m_pHeader->InsertColumn (0,
|
|
const_cast<LPWSTR> ((LPCWSTR) str), LVCFMT_LEFT, m_ColumnWidths
|
|
[CERTMGR_SNAPIN][0]);
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE:
|
|
if ( QueryComponentDataRef ().m_bShowPhysicalStoresPersist )
|
|
VERIFY (str.LoadString (IDS_COLUMN_PHYS_CERTIFICATE_STORE) );
|
|
else
|
|
VERIFY (str.LoadString (IDS_COLUMN_OBJECT_TYPE) );
|
|
hr = m_pHeader->InsertColumn (0,
|
|
const_cast<LPWSTR> ((LPCWSTR) str), LVCFMT_LEFT,
|
|
m_ColumnWidths[CERTMGR_LOG_STORE][0]);
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
{
|
|
CCertStoreGPE* pStore = reinterpret_cast <CCertStoreGPE*> (pcookie);
|
|
if ( pStore )
|
|
{
|
|
switch (pStore->GetStoreType ())
|
|
{
|
|
case EFS_STORE:
|
|
if ( pStore->IsNullEFSPolicy () )
|
|
{
|
|
VERIFY (str.LoadString (IDS_STATUS));
|
|
hr = m_pHeader->InsertColumn (0,
|
|
const_cast<LPWSTR> ((LPCWSTR) str), LVCFMT_LEFT,
|
|
SINGLE_COL_WIDTH);
|
|
}
|
|
else
|
|
hr = LoadColumnsFromArrays ( (INT) (CERTMGR_CERT_CONTAINER));
|
|
break;
|
|
|
|
case ROOT_STORE:
|
|
hr = LoadColumnsFromArrays ( (INT) (CERTMGR_CERT_CONTAINER));
|
|
break;
|
|
|
|
case TRUST_STORE:
|
|
hr = LoadColumnsFromArrays ( (INT) (CERTMGR_CTL_CONTAINER));
|
|
break;
|
|
|
|
case ACRS_STORE:
|
|
VERIFY (str.LoadString (IDS_COLUMN_AUTO_CERT_REQUEST));
|
|
hr = m_pHeader->InsertColumn (0,
|
|
const_cast<LPWSTR> ((LPCWSTR) str), LVCFMT_LEFT,
|
|
m_ColumnWidths[CERTMGR_AUTO_CERT_REQUEST][0]);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"Unexpected error: reinterpret_cast <CCertStoreGPE*> (pcookie) failed.\n");
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
CCertStoreRSOP* pStore = reinterpret_cast <CCertStoreRSOP*> (pcookie);
|
|
if ( pStore )
|
|
{
|
|
switch (pStore->GetStoreType ())
|
|
{
|
|
case EFS_STORE:
|
|
if ( pStore->IsNullEFSPolicy () )
|
|
{
|
|
VERIFY (str.LoadString (IDS_STATUS));
|
|
hr = m_pHeader->InsertColumn (0,
|
|
const_cast<LPWSTR> ((LPCWSTR) str), LVCFMT_LEFT,
|
|
SINGLE_COL_WIDTH);
|
|
}
|
|
else
|
|
hr = LoadColumnsFromArrays ( (INT) (CERTMGR_CERT_CONTAINER));
|
|
break;
|
|
|
|
case ROOT_STORE:
|
|
hr = LoadColumnsFromArrays ( (INT) (CERTMGR_CERT_CONTAINER));
|
|
break;
|
|
|
|
case TRUST_STORE:
|
|
hr = LoadColumnsFromArrays ( (INT) (CERTMGR_CTL_CONTAINER));
|
|
break;
|
|
|
|
case ACRS_STORE:
|
|
VERIFY (str.LoadString (IDS_COLUMN_AUTO_CERT_REQUEST));
|
|
hr = m_pHeader->InsertColumn (0,
|
|
const_cast<LPWSTR> ((LPCWSTR) str), LVCFMT_LEFT,
|
|
m_ColumnWidths[CERTMGR_AUTO_CERT_REQUEST][0]);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"Unexpected error: reinterpret_cast <CCertStoreGPE*> (pcookie) failed.\n");
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
hr = LoadColumnsFromArrays ( (INT) (pcookie->m_objecttype));
|
|
break;
|
|
}
|
|
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::LoadColumns: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
/* This is generated by UpdateAllViews () */
|
|
HRESULT CCertMgrComponent::OnViewChange (LPDATAOBJECT pDataObject, LPARAM /*data*/, LPARAM hint)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnViewChange\n");
|
|
HRESULT hr = S_OK;
|
|
if ( pDataObject )
|
|
{
|
|
if ( HINT_CERT_ENROLLED_USAGE_MODE & hint )
|
|
{
|
|
// Force reenumeration of usage stores
|
|
m_bUsageStoresEnumerated = false;
|
|
}
|
|
|
|
if ( (HINT_CHANGE_VIEW_TYPE & hint) ||
|
|
(HINT_CHANGE_STORE_TYPE & hint) ||
|
|
(HINT_SHOW_ARCHIVE_CERTS & hint) ||
|
|
(HINT_CHANGE_COMPUTER & hint) ||
|
|
(HINT_REFRESH_STORES & hint) )
|
|
{
|
|
hr = QueryComponentDataRef ().RefreshScopePane (0);
|
|
}
|
|
else if ( HINT_EFS_ADD_DEL_POLICY & hint )
|
|
{
|
|
// Delete existing columns and add new columns
|
|
if ( m_pResultData )
|
|
{
|
|
m_pResultData->DeleteAllRsltItems ();
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"Unexpected error: m_pResultData was NULL\n");
|
|
}
|
|
do {
|
|
hr = m_pHeader->DeleteColumn (0);
|
|
} while ( SUCCEEDED (hr) );
|
|
|
|
CCertMgrCookie* pCookie = ConvertCookie (pDataObject);
|
|
if ( pCookie )
|
|
hr = LoadColumns (pCookie);
|
|
else
|
|
{
|
|
_TRACE (0, L"Unexpected error: ConvertCookie () returned NULL\n");
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
}
|
|
else if ( (HINT_PASTE_COOKIE & hint) ||
|
|
(HINT_IMPORT & hint) )
|
|
{
|
|
// Do nothing
|
|
}
|
|
else
|
|
{
|
|
hr = QueryComponentDataRef ().RefreshScopePane (pDataObject);
|
|
if ( IDM_USAGE_VIEW == QueryComponentDataRef ().m_activeViewPersist &&
|
|
m_pLastUsageCookie)
|
|
{
|
|
hr = DisplayCertificateCountByUsage (
|
|
m_pLastUsageCookie->GetObjectName (),
|
|
m_pLastUsageCookie->GetCertCount ());
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
hr = RefreshResultPane ();
|
|
}
|
|
|
|
CCertMgrComponentData& compData = QueryComponentDataRef ();
|
|
CCertMgrCookie* pCookie = compData.ConvertCookie (pDataObject);
|
|
if ( pCookie )
|
|
{
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pCookie);
|
|
if ( pCert )
|
|
{
|
|
if ( IDM_STORE_VIEW == QueryComponentDataRef ().m_activeViewPersist )
|
|
{
|
|
hr = DisplayCertificateCountByStore (m_pConsole,
|
|
pCert->GetCertStore ());
|
|
}
|
|
else
|
|
{
|
|
ASSERT (m_pLastUsageCookie);
|
|
if ( m_pLastUsageCookie )
|
|
{
|
|
hr = DisplayCertificateCountByUsage (
|
|
m_pLastUsageCookie->GetObjectName (),
|
|
m_pLastUsageCookie->GetCertCount ());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
CCertStore* pStore = reinterpret_cast <CCertStore*> (pCookie);
|
|
if ( pStore )
|
|
{
|
|
pStore->GetStoreHandle (); // to initialize read-only flag
|
|
if ( pStore->IsReadOnly () )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, FALSE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, TRUE);
|
|
hr = DisplayCertificateCountByStore (m_pConsole, pStore,
|
|
(CERTMGR_LOG_STORE_GPE == pCookie->m_objecttype ||
|
|
CERTMGR_LOG_STORE_RSOP == pCookie->m_objecttype));
|
|
pStore->Close ();
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_USAGE:
|
|
{
|
|
CUsageCookie* pUsage = reinterpret_cast <CUsageCookie*> (pCookie);
|
|
if ( pUsage )
|
|
{
|
|
hr = DisplayCertificateCountByUsage (pCookie->GetObjectName (),
|
|
pUsage->GetCertCount ());
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
ASSERT (0);
|
|
break;
|
|
|
|
case CERTMGR_SNAPIN:
|
|
case CERTMGR_CRL_CONTAINER:
|
|
case CERTMGR_CTL_CONTAINER:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
case CERTMGR_CRL:
|
|
case CERTMGR_CTL:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
default:
|
|
{
|
|
IConsole2* pConsole2 = 0;
|
|
hr = m_pConsole->QueryInterface (
|
|
IID_PPV_ARG(IConsole2, &pConsole2));
|
|
if (SUCCEEDED (hr))
|
|
{
|
|
hr = pConsole2->SetStatusText (L"");
|
|
if ( !SUCCEEDED (hr) )
|
|
{
|
|
_TRACE (0, L"IConsole2::SetStatusText () failed: %x", hr);
|
|
}
|
|
pConsole2->Release ();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_POINTER;
|
|
_TRACE (0, L"Unexpected error: paramater pDataObject was NULL\n");
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnViewChange: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::Show ( CCookie* pcookie, LPARAM arg, HSCOPEITEM /*hScopeItem*/, LPDATAOBJECT /*pDataObject*/)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::Show\n");
|
|
HRESULT hr = S_OK;
|
|
TEST_NONNULL_PTR_PARAM (pcookie);
|
|
|
|
if ( !arg )
|
|
{
|
|
if ( !m_pResultData )
|
|
{
|
|
_TRACE (0, L"Unexpected error: m_pResultData was NULL\n");
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
m_pViewedCookie = reinterpret_cast <CCertMgrCookie*> (pcookie);
|
|
if ( m_pViewedCookie )
|
|
hr = SaveWidths (m_pViewedCookie);
|
|
m_pViewedCookie = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
if ( m_pResultData )
|
|
{
|
|
MMC_RESULT_VIEW_STYLE dwRemoveStyle = (MMC_RESULT_VIEW_STYLE) 0;
|
|
MMC_RESULT_VIEW_STYLE dwAddStyle = (MMC_RESULT_VIEW_STYLE) 0;
|
|
CCertMgrCookie* pCertMgrCookie = dynamic_cast <CCertMgrCookie*> (pcookie);
|
|
if ( pCertMgrCookie )
|
|
{
|
|
switch (pCertMgrCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_CRL:
|
|
case CERTMGR_CTL:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
case CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_USER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_USER_ENFORCEMENT:
|
|
case CERTMGR_SAFER_COMPUTER_ENFORCEMENT:
|
|
dwAddStyle = MMC_NOSORTHEADER;
|
|
break;
|
|
|
|
case CERTMGR_SNAPIN:
|
|
case CERTMGR_USAGE:
|
|
case CERTMGR_CRL_CONTAINER:
|
|
case CERTMGR_CTL_CONTAINER:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
dwRemoveStyle = MMC_NOSORTHEADER;
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
m_pResultData->ModifyViewStyle (
|
|
(MMC_RESULT_VIEW_STYLE) (MMC_ENSUREFOCUSVISIBLE | MMC_SHOWSELALWAYS | dwAddStyle),
|
|
dwRemoveStyle);
|
|
}
|
|
}
|
|
|
|
m_pViewedCookie = reinterpret_cast <CCertMgrCookie*> (pcookie);
|
|
if ( m_pViewedCookie )
|
|
{
|
|
// Load default columns and widths
|
|
LoadColumns (m_pViewedCookie);
|
|
|
|
// Restore persisted column widths
|
|
switch (m_pViewedCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_SNAPIN:
|
|
case CERTMGR_USAGE:
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_CRL_CONTAINER:
|
|
case CERTMGR_CTL_CONTAINER:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
case CERTMGR_CRL:
|
|
case CERTMGR_CTL:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
default:
|
|
_TRACE (0, L"Invalid or unexpected m_objecttype in switch: 0x%x\n", m_pViewedCookie->m_objecttype);
|
|
break;
|
|
}
|
|
|
|
hr = PopulateListbox (m_pViewedCookie);
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::Show: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::Show ( CCookie* pcookie, LPARAM arg, HSCOPEITEM hScopeItem)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::Show\n");
|
|
_TRACE (0, L"Unexpected: We should never enter this method.\n");
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::Show\n");
|
|
return Show (pcookie, arg, hScopeItem, 0);
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::OnNotifyAddImages (
|
|
LPDATAOBJECT /*pDataObject*/,
|
|
LPIMAGELIST lpImageList,
|
|
HSCOPEITEM /*hSelectedItem*/)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnNotifyAddImages\n");
|
|
long lViewMode = 0;
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( m_pResultData )
|
|
{
|
|
QueryComponentDataRef ().SetResultData (m_pResultData);
|
|
|
|
hr = m_pResultData->GetViewMode (&lViewMode);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
BOOL bLoadLargeIcons = (LVS_ICON == lViewMode);
|
|
|
|
hr = QueryComponentDataRef ().LoadIcons (lpImageList, bLoadLargeIcons);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"Unexpected error: m_pResultData is NULL\n");
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnNotifyAddImages: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::EnumCertificates (CCertStore& rCertStore)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::EnumCertificates\n");
|
|
|
|
CWaitCursor cursor;
|
|
PCCERT_CONTEXT pCertContext = 0;
|
|
HRESULT hr = 0;
|
|
CCertificate* pCert = 0;
|
|
RESULTDATAITEM rdItem;
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
CCookie& rootCookie = dataRef.QueryBaseRootCookie ();
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&rdItem, sizeof (rdItem));
|
|
rdItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
|
rdItem.nImage = iIconCertificate;
|
|
rdItem.nCol = 0;
|
|
rdItem.str = MMC_TEXTCALLBACK;
|
|
|
|
|
|
// 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.
|
|
while ( 1 )
|
|
{
|
|
pCertContext = rCertStore.EnumCertificates (pCertContext);
|
|
if ( !pCertContext )
|
|
{
|
|
if ( EFS_STORE == rCertStore.GetStoreType () )
|
|
{
|
|
if ( rCertStore.IsNullEFSPolicy () )
|
|
{
|
|
CComPtr<IUnknown> spUnknown;
|
|
hr = m_pConsole->QueryResultView(&spUnknown);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
CComPtr<IMessageView> spMessageView;
|
|
hr = spUnknown->QueryInterface (IID_PPV_ARG (IMessageView, &spMessageView));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CString szTitle;
|
|
CString szMessage;
|
|
|
|
VERIFY (szTitle.LoadString (IDS_EFS_NO_POLICY_TITLE));
|
|
if ( dataRef.m_bIsRSOP )
|
|
VERIFY (szMessage.LoadString (IDS_EFS_NO_POLICY_TEXT_RSOP));
|
|
else
|
|
VERIFY (szMessage.LoadString (IDS_EFS_NO_POLICY_TEXT));
|
|
|
|
spMessageView->SetTitleText (szTitle);
|
|
spMessageView->SetBodyText (szMessage);
|
|
spMessageView->SetIcon (Icon_Warning);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
pCert =
|
|
new CCertificate (pCertContext, &rCertStore);
|
|
if ( !pCert )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pCert);
|
|
rdItem.lParam = (LPARAM) pCert;
|
|
pCert->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr);
|
|
}
|
|
}
|
|
rCertStore.Close ();
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::EnumCertificates: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::PopulateListbox (CCertMgrCookie* pCookie)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::PopulateListbox\n");
|
|
if ( !pCookie )
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_OK;
|
|
CWaitCursor cursor;
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
|
|
switch ( pCookie->m_objecttype )
|
|
{
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
CCertStore* pStore = reinterpret_cast <CCertStore*> (pCookie);
|
|
if ( pStore )
|
|
{
|
|
switch (pStore->GetStoreType () )
|
|
{
|
|
case EFS_STORE:
|
|
case ROOT_STORE:
|
|
hr = EnumCertificates (*pStore);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
m_currResultNodeType = CERTMGR_CERTIFICATE;
|
|
m_pResultData->Sort (m_nSelectedCertColumn, 0,
|
|
(long) m_currResultNodeType);
|
|
}
|
|
break;
|
|
|
|
case ACRS_STORE:
|
|
hr = EnumCTLs (*pStore);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
m_currResultNodeType = CERTMGR_AUTO_CERT_REQUEST;
|
|
m_pResultData->Sort (m_nSelectedCTLColumn, 0,
|
|
(long) m_currResultNodeType);
|
|
}
|
|
break;
|
|
|
|
case TRUST_STORE:
|
|
hr = EnumCTLs (*pStore);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
m_currResultNodeType = CERTMGR_CTL;
|
|
m_pResultData->Sort (m_nSelectedCTLColumn, 0,
|
|
(long) m_currResultNodeType);
|
|
}
|
|
break;
|
|
|
|
|
|
default:
|
|
_TRACE (0, L"Error: Unexpected store type: 0x%x\n", pStore->GetStoreType ());
|
|
hr = E_UNEXPECTED;
|
|
break;
|
|
}
|
|
|
|
if ( SUCCEEDED (hr) )
|
|
hr = DisplayCertificateCountByStore (m_pConsole, pStore, true);
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERT_CONTAINER:
|
|
{
|
|
CContainerCookie* pContainer = reinterpret_cast <CContainerCookie*> (pCookie);
|
|
if ( pContainer )
|
|
{
|
|
hr = EnumCertificates (pContainer->GetCertStore ());
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
m_currResultNodeType = CERTMGR_CERTIFICATE;
|
|
m_pResultData->Sort (m_nSelectedCertColumn, 0,
|
|
(long) m_currResultNodeType);
|
|
hr = DisplayCertificateCountByStore (m_pConsole, &pContainer->GetCertStore (), false);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_USAGE:
|
|
{
|
|
CUsageCookie* pUsageCookie = reinterpret_cast <CUsageCookie*> (pCookie);
|
|
if ( pUsageCookie )
|
|
{
|
|
hr = EnumCertsByUsage (pUsageCookie);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
m_currResultNodeType = CERTMGR_CERTIFICATE;
|
|
m_pResultData->Sort (m_nSelectedCertColumn, 0,
|
|
(long) m_currResultNodeType);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL_CONTAINER:
|
|
{
|
|
CContainerCookie* pContainer = reinterpret_cast <CContainerCookie*> (pCookie);
|
|
if ( pContainer )
|
|
{
|
|
PCCRL_CONTEXT pCRLContext = 0;
|
|
CCRL* pCRL = 0;
|
|
RESULTDATAITEM rdItem;
|
|
CCookie& rootCookie = dataRef.QueryBaseRootCookie ();
|
|
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&rdItem, sizeof (rdItem));
|
|
rdItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
|
rdItem.nImage = iIconCRL;
|
|
rdItem.nCol = 0;
|
|
|
|
// 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.
|
|
DWORD dwFlags = 0;
|
|
while ( 1 )
|
|
{
|
|
pCRLContext = pContainer->GetCertStore ().GetCRL (NULL,
|
|
pCRLContext, &dwFlags);
|
|
if ( !pCRLContext )
|
|
break;
|
|
pCRL =
|
|
new CCRL (pCRLContext, pContainer->GetCertStore ());
|
|
if ( !pCRL )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pCRL);
|
|
rdItem.str = MMC_TEXTCALLBACK;
|
|
rdItem.lParam = (LPARAM) pCRL;
|
|
pCRL->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr);
|
|
}
|
|
}
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
m_currResultNodeType = CERTMGR_CRL;
|
|
m_pResultData->Sort (m_nSelectedCRLColumn, 0,
|
|
(long) m_currResultNodeType);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL_CONTAINER:
|
|
{
|
|
CContainerCookie* pContainer = reinterpret_cast <CContainerCookie*> (pCookie);
|
|
if ( pContainer )
|
|
{
|
|
hr = EnumCTLs (pContainer->GetCertStore ());
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
m_currResultNodeType = CERTMGR_CTL;
|
|
m_pResultData->Sort (m_nSelectedCTLColumn, 0,
|
|
(long) m_currResultNodeType);
|
|
hr = DisplayCertificateCountByStore (m_pConsole, &pContainer->GetCertStore (), false);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
// Only this node if machine is joined to a Whistler or later domain
|
|
if ( !dataRef.m_bMachineIsStandAlone && !g_bSchemaIsW2K )
|
|
{
|
|
RESULTDATAITEM rdItem;
|
|
CCookie& rootCookie = dataRef.QueryBaseRootCookie ();
|
|
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&rdItem, sizeof (rdItem));
|
|
rdItem.mask = RDI_STR | RDI_PARAM | RDI_IMAGE;
|
|
rdItem.nImage = iIconAutoEnroll;
|
|
rdItem.nCol = 0;
|
|
|
|
CString objectName;
|
|
VERIFY (objectName.LoadString (IDS_PKP_AUTOENROLLMENT_SETTINGS));
|
|
CCertMgrCookie* pNewCookie = new CCertMgrCookie (
|
|
CERTMGR_CERT_POLICIES_COMPUTER == pCookie->m_objecttype ?
|
|
CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS :
|
|
CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS,
|
|
pCookie->QueryNonNULLMachineName (),
|
|
objectName);
|
|
if ( !pNewCookie )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pNewCookie);
|
|
rdItem.str = MMC_TEXTCALLBACK ;
|
|
rdItem.lParam = (LPARAM) pNewCookie;
|
|
pNewCookie->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
ASSERT (0);
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
{
|
|
CPolicyKey policyKey (dataRef.m_pGPEInformation,
|
|
SAFER_HKLM_REGBASE, true);
|
|
hr = AddSaferLevels (true,
|
|
pCookie->QueryNonNULLMachineName (), policyKey.GetKey ());
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
{
|
|
CPolicyKey policyKey (dataRef.m_pGPEInformation,
|
|
SAFER_HKLM_REGBASE, false);
|
|
hr = AddSaferLevels (false,
|
|
pCookie->QueryNonNULLMachineName (), policyKey.GetKey ());
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
{
|
|
CSaferEntries* pSaferEntries = dynamic_cast <CSaferEntries*> (pCookie);
|
|
if ( pSaferEntries )
|
|
{
|
|
hr = SaferEnumerateEntries (
|
|
CERTMGR_SAFER_COMPUTER_ENTRIES == pCookie->m_objecttype,
|
|
pSaferEntries);
|
|
if (SUCCEEDED (hr) )
|
|
m_pResultData->Sort (m_nSelectedCertColumn, 0,
|
|
(long) m_currResultNodeType);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
{
|
|
CSaferRootCookie* pSaferRootCookie = dynamic_cast <CSaferRootCookie*> (pCookie);
|
|
if ( pSaferRootCookie )
|
|
{
|
|
if ( (pSaferRootCookie->m_bCreateSaferNodes && dataRef.m_bSaferSupported)
|
|
|| dataRef.m_bIsRSOP )
|
|
{
|
|
RESULTDATAITEM rdItem;
|
|
CCookie& rootCookie = dataRef.QueryBaseRootCookie ();
|
|
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&rdItem, sizeof (rdItem));
|
|
rdItem.mask = RDI_STR | RDI_PARAM | RDI_IMAGE;
|
|
rdItem.nImage = iIconSettings;
|
|
rdItem.nCol = 0;
|
|
|
|
CString objectName;
|
|
CCertMgrCookie* pNewCookie = 0;
|
|
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
VERIFY (objectName.LoadString (IDS_SAFER_ENFORCEMENT));
|
|
pNewCookie = new CCertMgrCookie (
|
|
CERTMGR_SAFER_COMPUTER_ROOT == pCookie->m_objecttype ?
|
|
CERTMGR_SAFER_COMPUTER_ENFORCEMENT :
|
|
CERTMGR_SAFER_USER_ENFORCEMENT,
|
|
pCookie->QueryNonNULLMachineName (),
|
|
objectName);
|
|
if ( !pNewCookie )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pNewCookie);
|
|
rdItem.str = MMC_TEXTCALLBACK ;
|
|
rdItem.lParam = (LPARAM) pNewCookie;
|
|
pNewCookie->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr);
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
VERIFY (objectName.LoadString (IDS_SAFER_DEFINED_FILE_TYPES));
|
|
pNewCookie = new CCertMgrCookie (
|
|
CERTMGR_SAFER_COMPUTER_ROOT == pCookie->m_objecttype ?
|
|
CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES :
|
|
CERTMGR_SAFER_USER_DEFINED_FILE_TYPES,
|
|
pCookie->QueryNonNULLMachineName (),
|
|
objectName);
|
|
if ( !pNewCookie )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pNewCookie);
|
|
|
|
rdItem.str = MMC_TEXTCALLBACK ;
|
|
rdItem.lParam = (LPARAM) pNewCookie;
|
|
pNewCookie->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr);
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
VERIFY (objectName.LoadString (IDS_SAFER_TRUSTED_PUBLISHERS));
|
|
pNewCookie = new CCertMgrCookie (
|
|
CERTMGR_SAFER_COMPUTER_ROOT == pCookie->m_objecttype ?
|
|
CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS :
|
|
CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS,
|
|
pCookie->QueryNonNULLMachineName (),
|
|
objectName);
|
|
if ( !pNewCookie )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pNewCookie);
|
|
|
|
rdItem.str = MMC_TEXTCALLBACK ;
|
|
rdItem.lParam = (LPARAM) pNewCookie;
|
|
pNewCookie->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CComPtr<IUnknown> spUnknown;
|
|
hr = m_pConsole->QueryResultView(&spUnknown);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
CComPtr<IMessageView> spMessageView;
|
|
hr = spUnknown->QueryInterface (IID_PPV_ARG (IMessageView, &spMessageView));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CString szTitle;
|
|
CString szMessage;
|
|
|
|
VERIFY (szTitle.LoadString (IDS_SAFER_NO_POLICY_TITLE));
|
|
VERIFY (szMessage.LoadString (IDS_SAFER_NO_POLICY_TEXT));
|
|
|
|
spMessageView->SetTitleText (szTitle);
|
|
spMessageView->SetBodyText (szMessage);
|
|
spMessageView->SetIcon (Icon_Warning);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::PopulateListbox: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::RefreshResultPane ()
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::RefreshResultPane\n");
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( m_pResultData )
|
|
{
|
|
// Does this return E_UNEXPECTED when there are no items?
|
|
HRESULT hr1 = m_pResultData->DeleteAllRsltItems ();
|
|
if ( FAILED (hr1) )
|
|
{
|
|
_TRACE (0, L"IResultData::DeleteAllRsltItems () failed: 0x%x\n", hr1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"Unexpected error: m_pResultData is NULL\n");
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
if ( m_pViewedCookie )
|
|
{
|
|
hr = PopulateListbox (m_pViewedCookie);
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::RefreshResultPane: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CCertMgrComponent::GetDisplayInfo (RESULTDATAITEM * pResult)
|
|
{
|
|
// _TRACE (1, L"Entering CCertMgrComponent::GetDisplayInfo\n");
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
|
|
HRESULT hr = S_OK;
|
|
|
|
|
|
if ( pResult && !pResult->bScopeItem ) //&& (pResult->mask & RDI_PARAM) )
|
|
{
|
|
CCookie* pResultCookie = reinterpret_cast<CCookie*> (pResult->lParam);
|
|
ASSERT (pResultCookie);
|
|
if ( !pResultCookie || IsBadWritePtr ((LPVOID) pResultCookie, sizeof (CCookie)) )
|
|
return E_UNEXPECTED;
|
|
|
|
CCookie* pActiveCookie = ActiveBaseCookie (pResultCookie);
|
|
ASSERT (pActiveCookie);
|
|
if ( !pActiveCookie || IsBadWritePtr ((LPVOID) pActiveCookie, sizeof (CCookie)) )
|
|
return E_UNEXPECTED;
|
|
|
|
CCertMgrCookie* pCookie = reinterpret_cast <CCertMgrCookie*>(pActiveCookie);
|
|
ASSERT (pCookie);
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
// iIconSaferHashEntry
|
|
// iIconSaferURLEntry
|
|
// iIconSaferNameEntry
|
|
ASSERT (0);
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
if ( COLNUM_SAFER_LEVEL_NAME == pResult->nCol )
|
|
{
|
|
m_szDisplayInfoResult = pCookie->GetObjectName ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
}
|
|
else if ( COLNUM_SAFER_LEVEL_DESCRIPTION == pResult->nCol )
|
|
{
|
|
CSaferLevel* pLevel = dynamic_cast <CSaferLevel*> (pCookie);
|
|
if ( pLevel )
|
|
{
|
|
m_szDisplayInfoResult = pLevel->GetDescription ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
}
|
|
}
|
|
}
|
|
if ( pResult->mask & RDI_IMAGE )
|
|
{
|
|
CSaferLevel* pLevel = dynamic_cast <CSaferLevel*> (pCookie);
|
|
if ( pLevel && pLevel->IsDefault () )
|
|
{
|
|
QueryComponentDataRef ().m_dwDefaultSaferLevel =
|
|
pLevel->GetLevel ();
|
|
pResult->nImage = iIconDefaultSaferLevel;
|
|
}
|
|
else
|
|
pResult->nImage = iIconSaferLevel;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
CSaferEntry* pSaferEntry = dynamic_cast <CSaferEntry*> (pCookie);
|
|
if ( pSaferEntry )
|
|
{
|
|
switch (pResult->nCol)
|
|
{
|
|
case COLNUM_SAFER_ENTRIES_NAME:
|
|
m_szDisplayInfoResult = pSaferEntry->GetDisplayName ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
break;
|
|
|
|
case COLNUM_SAFER_ENTRIES_TYPE:
|
|
m_szDisplayInfoResult = pSaferEntry->GetTypeString ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
break;
|
|
|
|
case COLNUM_SAFER_ENTRIES_LEVEL:
|
|
m_szDisplayInfoResult = pSaferEntry->GetLevelFriendlyName ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
break;
|
|
|
|
case COLNUM_SAFER_ENTRIES_DESCRIPTION:
|
|
m_szDisplayInfoResult = pSaferEntry->GetDescription ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
break;
|
|
|
|
case COLNUM_SAFER_ENTRIES_LAST_MODIFIED_DATE:
|
|
m_szDisplayInfoResult = pSaferEntry->GetShortLastModified ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ( pResult->mask & RDI_IMAGE )
|
|
{
|
|
CSaferEntry* pEntry = dynamic_cast <CSaferEntry*> (pCookie);
|
|
if ( pEntry )
|
|
{
|
|
switch (pEntry->GetType () )
|
|
{
|
|
case SAFER_ENTRY_TYPE_HASH:
|
|
pResult->nImage = iIconSaferHashEntry;
|
|
break;
|
|
|
|
case SAFER_ENTRY_TYPE_PATH:
|
|
pResult->nImage = iIconSaferNameEntry;
|
|
break;
|
|
|
|
case SAFER_ENTRY_TYPE_URLZONE:
|
|
pResult->nImage = iIconSaferURLEntry;
|
|
break;
|
|
|
|
case SAFER_ENTRY_TYPE_CERT:
|
|
pResult->nImage = iIconSaferCertEntry;
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
if ( 0 == pResult->nCol )
|
|
{
|
|
m_szDisplayInfoResult = pCookie->GetObjectName ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
}
|
|
}
|
|
if (pResult->mask & RDI_IMAGE)
|
|
pResult->nImage = iIconAutoEnroll;
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_USER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_COMPUTER_ENFORCEMENT:
|
|
case CERTMGR_SAFER_USER_ENFORCEMENT:
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
if ( 0 == pResult->nCol )
|
|
{
|
|
m_szDisplayInfoResult = pCookie->GetObjectName ();
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
}
|
|
}
|
|
if (pResult->mask & RDI_IMAGE)
|
|
pResult->nImage = iIconSettings;
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pCookie);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
// Note: text is first stored in class variable so that the buffer is
|
|
// somewhat persistent. Copying the buffer pointer directly to the
|
|
// pResult->str would result in the buffer being freed before the pointer
|
|
// is used.
|
|
switch (pResult->nCol)
|
|
{
|
|
case COLNUM_CERT_ISSUER:
|
|
m_szDisplayInfoResult = pCert->GetIssuerName ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
m_szDisplayInfoResult = pCert->GetAlternateIssuerName ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
case COLNUM_CERT_SUBJECT:
|
|
m_szDisplayInfoResult = pCert->GetSubjectName ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
m_szDisplayInfoResult = pCert->GetAlternateSubjectName ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
case COLNUM_CERT_EXPIRATION_DATE:
|
|
m_szDisplayInfoResult = pCert->GetValidNotAfter ();
|
|
break;
|
|
|
|
case COLNUM_CERT_PURPOSE:
|
|
m_szDisplayInfoResult = pCert->GetEnhancedKeyUsage ();
|
|
break;
|
|
|
|
case COLNUM_CERT_CERT_NAME:
|
|
m_szDisplayInfoResult = pCert->GetFriendlyName ();
|
|
break;
|
|
|
|
case COLNUM_CERT_STATUS:
|
|
m_szDisplayInfoResult = pCert->FormatStatus ();
|
|
break;
|
|
|
|
// NTRAID# 247237 Cert UI: Cert Snapin: Certificates snapin should show template name
|
|
case COLNUM_CERT_TEMPLATE:
|
|
m_szDisplayInfoResult = pCert->GetTemplateName ();
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
}
|
|
if (pResult->mask & RDI_IMAGE)
|
|
pResult->nImage = iIconCertificate;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pCookie);
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
{
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
// Note: text is first stored in class variable so that the buffer is
|
|
// somewhat persistent. Copying the buffer pointer directly to the
|
|
// pResult->str would result in the buffer being freed before the pointer
|
|
// is used.
|
|
switch (pResult->nCol)
|
|
{
|
|
case COLNUM_CTL_ISSUER:
|
|
m_szDisplayInfoResult = pCTL->GetIssuerName ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
|
|
case COLNUM_CTL_EFFECTIVE_DATE:
|
|
m_szDisplayInfoResult = pCTL->GetEffectiveDate ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
case COLNUM_CTL_PURPOSE:
|
|
m_szDisplayInfoResult = pCTL->GetPurpose ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
case COLNUM_CTL_FRIENDLY_NAME:
|
|
m_szDisplayInfoResult = pCTL->GetFriendlyName ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
}
|
|
if (pResult->mask & RDI_IMAGE)
|
|
pResult->nImage = iIconCTL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pCookie);
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
{
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
// Note: text is first stored in class variable so that the buffer is
|
|
// somewhat persistent. Copying the buffer pointer directly to the
|
|
// pResult->str would result in the buffer being freed before the pointer
|
|
// is used.
|
|
switch (pResult->nCol)
|
|
{
|
|
case COLNUM_CRL_ISSUER:
|
|
m_szDisplayInfoResult = pCRL->GetIssuerName ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
|
|
case COLNUM_CRL_EFFECTIVE_DATE:
|
|
m_szDisplayInfoResult = pCRL->GetEffectiveDate ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
case COLNUM_CRL_NEXT_UPDATE:
|
|
m_szDisplayInfoResult = pCRL->GetNextUpdate ();
|
|
if ( m_szDisplayInfoResult.IsEmpty () )
|
|
{
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
}
|
|
if (pResult->mask & RDI_IMAGE)
|
|
pResult->nImage = iIconCRL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
{
|
|
CAutoCertRequest* pACR = reinterpret_cast <CAutoCertRequest*> (pCookie);
|
|
ASSERT (pACR);
|
|
if ( pACR )
|
|
{
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
// Note: text is first stored in class variable so that the buffer is
|
|
// somewhat persistent. Copying the buffer pointer directly to the
|
|
// pResult->str would result in the buffer being freed before the pointer
|
|
// is used.
|
|
switch (pResult->nCol)
|
|
{
|
|
case 0:
|
|
{
|
|
CString name;
|
|
|
|
if ( SUCCEEDED (pACR->GetCertTypeName (name)) )
|
|
m_szDisplayInfoResult = name;
|
|
else
|
|
SetTextNotAvailable ();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
|
|
pResult->str = const_cast<LPWSTR> ( (LPCWSTR) m_szDisplayInfoResult);
|
|
}
|
|
if (pResult->mask & RDI_IMAGE)
|
|
pResult->nImage = iIconAutoCertRequest;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
hr = CComponent::GetDisplayInfo (pResult);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// IExtendContextMenu implementation
|
|
//
|
|
STDMETHODIMP CCertMgrComponent::AddMenuItems (LPDATAOBJECT pDataObject,
|
|
LPCONTEXTMENUCALLBACK pContextMenuCallback,
|
|
long *pInsertionAllowed)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::AddMenuItems\n");
|
|
HRESULT hr = S_OK;
|
|
hr = QueryComponentDataRef ().AddMenuItems (pDataObject,
|
|
pContextMenuCallback, pInsertionAllowed);
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::AddMenuItems: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CCertMgrComponent::Command (long nCommandID, LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::Command\n");
|
|
HRESULT hr = S_OK;
|
|
|
|
switch (nCommandID)
|
|
{
|
|
case IDM_OPEN:
|
|
case IDM_TASK_OPEN:
|
|
hr = OnOpen (pDataObject);
|
|
break;
|
|
|
|
default:
|
|
hr = QueryComponentDataRef ().Command (nCommandID, pDataObject);
|
|
break;
|
|
}
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::Command: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::OnNotifyDblClick (LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnNotifyDblClick\n");
|
|
HRESULT hr = S_OK;
|
|
ASSERT (pDataObject);
|
|
|
|
CCertMgrCookie* pParentCookie =
|
|
QueryComponentDataRef ().ConvertCookie (pDataObject);
|
|
if ( pParentCookie )
|
|
{
|
|
switch ( pParentCookie->m_objecttype )
|
|
{
|
|
case CERTMGR_SNAPIN:
|
|
case CERTMGR_USAGE:
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
case CERTMGR_CRL_CONTAINER:
|
|
case CERTMGR_CTL_CONTAINER:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
case CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_USER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_COMPUTER_ENFORCEMENT:
|
|
case CERTMGR_SAFER_USER_ENFORCEMENT:
|
|
hr = S_FALSE;
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pParentCookie);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
hr = LaunchCommonCertDialog (pCert);
|
|
if ( hr == CRYPT_E_NOT_FOUND )
|
|
m_pConsole->UpdateAllViews (pDataObject, 0, 0);
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
hr = S_OK;
|
|
break;
|
|
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pParentCookie);
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
hr = LaunchCommonCTLDialog (pCTL);
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
hr = S_OK;
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pParentCookie);
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
hr = LaunchCommonCRLDialog (pCRL);
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
hr = S_OK;
|
|
break;
|
|
|
|
default:
|
|
_TRACE (0, L"CCertMgrComponentData::EnumerateScopeChildren bad parent type\n");
|
|
ASSERT (FALSE);
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnNotifyDblClick: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::OnNotifySelect (LPDATAOBJECT pDataObject, BOOL fSelected)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnNotifySelect - fSelected == %d.\n", fSelected);
|
|
ASSERT (m_pConsoleVerb && 0xdddddddd != (UINT_PTR) m_pConsoleVerb);
|
|
if ( !m_pConsoleVerb || 0xdddddddd == (UINT_PTR) m_pConsoleVerb )
|
|
return E_FAIL;
|
|
|
|
if ( ((LPDATAOBJECT) -1) == pDataObject )
|
|
return E_FAIL;
|
|
|
|
|
|
HRESULT hr = S_OK;
|
|
CCertMgrComponentData& compData = QueryComponentDataRef ();
|
|
compData.SetResultData (m_pResultData);
|
|
BOOL bIsFileView = !(compData.m_szFileName.IsEmpty ());
|
|
|
|
// Don't add menu items if this is a serialized file
|
|
|
|
CertificateManagerObjectType objectType = compData.GetObjectType (pDataObject);
|
|
if ( objectType >= 0)
|
|
{
|
|
CCertMgrCookie* pCookie = ConvertCookie (pDataObject);
|
|
if ( pCookie )
|
|
{
|
|
pCookie->SetSelected (fSelected ? true : false);
|
|
switch (objectType)
|
|
{
|
|
case CERTMGR_SNAPIN:
|
|
if ( fSelected )
|
|
{
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
}
|
|
m_currResultNodeType = CERTMGR_INVALID;
|
|
break;
|
|
|
|
case CERTMGR_USAGE:
|
|
m_currResultNodeType = CERTMGR_CERTIFICATE;
|
|
{
|
|
CUsageCookie* pUsage = reinterpret_cast <CUsageCookie*> (pCookie);
|
|
ASSERT (pUsage);
|
|
if ( pUsage )
|
|
{
|
|
if ( m_pLastUsageCookie )
|
|
m_pLastUsageCookie->Release ();
|
|
m_pLastUsageCookie = pUsage;
|
|
m_pLastUsageCookie->AddRef ();
|
|
hr = DisplayCertificateCountByUsage (pCookie->GetObjectName (),
|
|
pUsage->GetCertCount ());
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
if ( fSelected )
|
|
{
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
if ( fSelected )
|
|
{
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, TRUE);
|
|
}
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
if ( !bIsFileView )
|
|
{
|
|
CCertStore* pStore = reinterpret_cast <CCertStore*> (pCookie);
|
|
ASSERT (pStore);
|
|
if ( pStore )
|
|
{
|
|
pStore->GetStoreHandle (); // to initialize read-only flag
|
|
if ( pStore->IsReadOnly () ) //|| !fSelected)
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, FALSE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, TRUE);
|
|
if ( fSelected )
|
|
hr = DisplayCertificateCountByStore (m_pConsole, pStore);
|
|
pStore->Close ();
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
m_currResultNodeType = CERTMGR_INVALID;
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
if ( fSelected && CERTMGR_LOG_STORE_RSOP != QueryComponentDataRef ().GetObjectType (pDataObject) )
|
|
{
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, TRUE);
|
|
}
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
if ( !bIsFileView )
|
|
{
|
|
CCertStoreGPE* pStore = reinterpret_cast <CCertStoreGPE*> (pCookie);
|
|
ASSERT (pStore);
|
|
if ( pStore )
|
|
{
|
|
hr = DisplayCertificateCountByStore (m_pConsole, pStore, true);
|
|
|
|
switch (pStore->GetStoreType ())
|
|
{
|
|
case ROOT_STORE:
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, FALSE);
|
|
m_currResultNodeType = CERTMGR_CERTIFICATE;
|
|
break;
|
|
|
|
case EFS_STORE:
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, FALSE);
|
|
m_currResultNodeType = CERTMGR_CERTIFICATE;
|
|
break;
|
|
|
|
case TRUST_STORE:
|
|
m_currResultNodeType = CERTMGR_CTL;
|
|
break;
|
|
|
|
case ACRS_STORE:
|
|
m_currResultNodeType = CERTMGR_AUTO_CERT_REQUEST;
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
m_currResultNodeType = CERTMGR_INVALID;
|
|
break;
|
|
}
|
|
|
|
if ( pStore->IsReadOnly () ) //|| !fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, FALSE);
|
|
else if ( ACRS_STORE != pStore->GetStoreType () )
|
|
{
|
|
// Do not allow cut and paste for ACRS store.
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, TRUE);
|
|
if ( !fSelected &&
|
|
CERTMGR_LOG_STORE_GPE != pStore->m_objecttype )
|
|
{
|
|
pStore->Commit ();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pCookie);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
if ( fSelected )
|
|
{
|
|
if ( IDM_STORE_VIEW == QueryComponentDataRef ().m_activeViewPersist )
|
|
{
|
|
hr = DisplayCertificateCountByStore (
|
|
m_pConsole, pCert->GetCertStore ());
|
|
}
|
|
else
|
|
{
|
|
// Display by count in each purpose
|
|
ASSERT (m_pLastUsageCookie);
|
|
if ( m_pLastUsageCookie )
|
|
{
|
|
hr = DisplayCertificateCountByUsage (
|
|
m_pLastUsageCookie->GetObjectName (),
|
|
m_pLastUsageCookie->GetCertCount ());
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_COPY, ENABLED, TRUE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_COPY, ENABLED, FALSE);
|
|
if ( !bIsFileView )
|
|
{
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, FALSE);
|
|
|
|
CCertStore* pCertStore = pCert->GetCertStore ();
|
|
if ( pCertStore )
|
|
{
|
|
if ( pCertStore->IsReadOnly () || !fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, FALSE);
|
|
else
|
|
{
|
|
if ( pCert->CanDelete () )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, TRUE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, FALSE);
|
|
|
|
if ( !fSelected &&
|
|
CERTMGR_LOG_STORE_GPE == pCertStore->m_objecttype )
|
|
{
|
|
pCertStore->Commit ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
m_currResultNodeType = CERTMGR_CERTIFICATE;
|
|
break;
|
|
|
|
case CERTMGR_CRL_CONTAINER:
|
|
if ( fSelected )
|
|
{
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, TRUE);
|
|
}
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
if ( !bIsFileView )
|
|
{
|
|
CContainerCookie* pCont = reinterpret_cast <CContainerCookie*> (pCookie);
|
|
ASSERT (pCont);
|
|
if ( pCont )
|
|
{
|
|
if ( pCont->GetCertStore ().IsReadOnly () ) //|| !fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, FALSE);
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, TRUE);
|
|
if ( !fSelected )
|
|
pCont->GetCertStore ().Commit ();
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
m_currResultNodeType = CERTMGR_CRL;
|
|
break;
|
|
|
|
case CERTMGR_CTL_CONTAINER:
|
|
if ( fSelected )
|
|
{
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, TRUE);
|
|
}
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
if ( !bIsFileView )
|
|
{
|
|
CContainerCookie* pCont = reinterpret_cast <CContainerCookie*> (pCookie);
|
|
ASSERT (pCont);
|
|
if ( pCont )
|
|
{
|
|
if ( pCont->GetCertStore ().IsReadOnly () ) //|| !fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, FALSE);
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, TRUE);
|
|
if ( !fSelected )
|
|
pCont->GetCertStore ().Commit ();
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
m_currResultNodeType = CERTMGR_CTL;
|
|
break;
|
|
|
|
case CERTMGR_CERT_CONTAINER:
|
|
if ( fSelected )
|
|
{
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, TRUE);
|
|
}
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
if ( !bIsFileView )
|
|
{
|
|
CContainerCookie* pCont = reinterpret_cast <CContainerCookie*> (pCookie);
|
|
ASSERT (pCont);
|
|
if ( pCont )
|
|
{
|
|
if ( fSelected )
|
|
hr = DisplayCertificateCountByStore (
|
|
m_pConsole, &pCont->GetCertStore ());
|
|
if ( pCont->GetCertStore ().IsReadOnly () ) //|| !fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, FALSE);
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, TRUE);
|
|
if ( !fSelected )
|
|
pCont->GetCertStore ().Commit ();
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
m_currResultNodeType = CERTMGR_CERTIFICATE;
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_COPY, ENABLED, TRUE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_COPY, ENABLED, FALSE);
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pCookie);
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
{
|
|
if ( pCRL->GetCertStore ().IsReadOnly () || !fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, FALSE);
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, TRUE);
|
|
if ( !fSelected &&
|
|
CERTMGR_LOG_STORE_GPE == pCRL->GetCertStore ().m_objecttype )
|
|
{
|
|
pCRL->GetCertStore ().Commit ();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
m_currResultNodeType = CERTMGR_CRL;
|
|
break;
|
|
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
if ( fSelected )
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_PROPERTIES);
|
|
}
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, FALSE);
|
|
|
|
{
|
|
CAutoCertRequest* pAutoCert = reinterpret_cast <CAutoCertRequest*> (pCookie);
|
|
ASSERT (pAutoCert);
|
|
if ( pAutoCert )
|
|
{
|
|
if ( pAutoCert->GetCertStore ().IsReadOnly () || !fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, FALSE);
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, TRUE);
|
|
if ( !fSelected &&
|
|
CERTMGR_LOG_STORE_GPE == pAutoCert->GetCertStore ().m_objecttype )
|
|
{
|
|
pAutoCert->GetCertStore ().Commit ();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
m_currResultNodeType = CERTMGR_AUTO_CERT_REQUEST;
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
if ( !bIsFileView )
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pCookie);
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
{
|
|
if ( pCTL->GetCertStore ().IsReadOnly () || !fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, FALSE);
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, TRUE);
|
|
if ( !fSelected &&
|
|
CERTMGR_LOG_STORE_GPE == pCTL->GetCertStore ().m_objecttype )
|
|
{
|
|
pCTL->GetCertStore ().Commit ();
|
|
}
|
|
}
|
|
|
|
// Don't allow auto cert requests to be copied. They can't be
|
|
// pasted anywhere.
|
|
if ( ACRS_STORE != pCTL->GetCertStore ().GetStoreType () )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_COPY, ENABLED, TRUE);
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
m_currResultNodeType = CERTMGR_CTL;
|
|
if ( QueryComponentDataRef ().m_bIsRSOP )
|
|
{
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, FALSE);
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
m_currResultNodeType = CERTMGR_INVALID;
|
|
if ( fSelected )
|
|
{
|
|
// NTRAID# 456367 SAFER RSOP: Delete menu item appears in the
|
|
// context menu for SAFER rules in RSOP mode.
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, !dataRef.m_bIsRSOP);
|
|
}
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
case CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_USER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_COMPUTER_ENFORCEMENT:
|
|
case CERTMGR_SAFER_USER_ENFORCEMENT:
|
|
if ( fSelected )
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_PROPERTIES);
|
|
}
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, FALSE);
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
if ( fSelected )
|
|
{
|
|
// NTRAID# 456367 SAFER RSOP: Delete menu item appears in the
|
|
// context menu for SAFER rules in RSOP mode.
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_PROPERTIES);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, !dataRef.m_bIsRSOP);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, !dataRef.m_bIsRSOP);
|
|
}
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PROPERTIES, ENABLED, FALSE);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, FALSE);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
if ( fSelected )
|
|
{
|
|
// NTRAID# 456367 SAFER RSOP: Delete menu item appears in the
|
|
// context menu for SAFER rules in RSOP mode.
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, !dataRef.m_bIsRSOP);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, !dataRef.m_bIsRSOP);
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
}
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_REFRESH, ENABLED, FALSE);
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_PASTE, ENABLED, FALSE);
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetDefaultVerb (MMC_VERB_OPEN);
|
|
{
|
|
CString szStatusText;
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
|
|
if ( !dataRef.m_bIsRSOP && !dataRef.m_bSaferSupported )
|
|
{
|
|
szStatusText.LoadString (IDS_SAFER_NOT_SUPPORTED);
|
|
}
|
|
IConsole2* pConsole2 = 0;
|
|
hr = m_pConsole->QueryInterface (
|
|
IID_PPV_ARG(IConsole2, &pConsole2));
|
|
if (SUCCEEDED (hr))
|
|
{
|
|
hr = pConsole2->SetStatusText (const_cast <LPOLESTR>((PCWSTR) szStatusText));
|
|
if ( !SUCCEEDED (hr) )
|
|
{
|
|
_TRACE (0, L"IConsole::SetStatusText () failed: %x", hr);
|
|
}
|
|
pConsole2->Release ();
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
m_currResultNodeType = CERTMGR_INVALID;
|
|
hr = E_UNEXPECTED;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if ( CERTMGR_MULTISEL == objectType )
|
|
{
|
|
if ( fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_COPY, ENABLED, TRUE);
|
|
else
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_COPY, ENABLED, FALSE);
|
|
|
|
bool bDeleteSet = false;
|
|
|
|
|
|
CCertMgrDataObject* pDO = reinterpret_cast <CCertMgrDataObject*>(pDataObject);
|
|
ASSERT (pDO);
|
|
if ( pDO )
|
|
{
|
|
// Is multiple select, get all selected items and delete - confirm
|
|
// first deletion only.
|
|
CCertMgrCookie* pCookie = 0;
|
|
pDO->Reset();
|
|
while (pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pCookie), NULL) != S_FALSE)
|
|
{
|
|
switch (pCookie->m_objecttype )
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pCookie);
|
|
ASSERT (pCert);
|
|
if ( (pCert && !pCert->CanDelete ()) || !fSelected )
|
|
{
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, FALSE);
|
|
bDeleteSet = true;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
// NTRAID# 409138 SAFER: Multi-selected safer rules have
|
|
// "cut" and "copy" in their context menu
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_COPY, ENABLED, FALSE);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !bDeleteSet && fSelected )
|
|
m_pConsoleVerb->SetVerbState (MMC_VERB_DELETE, ENABLED, TRUE);
|
|
|
|
m_currResultNodeType = CERTMGR_MULTISEL;
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnNotifySelect: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CCertMgrComponent::CreatePropertyPages (
|
|
LPPROPERTYSHEETCALLBACK pCallBack,
|
|
LONG_PTR handle, // This handle must be saved in the property page object to notify the parent when modified
|
|
LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::CreatePropertyPages\n");
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = QueryComponentDataRef ().CreatePropertyPages (pCallBack, handle, pDataObject);
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::CreatePropertyPages: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CCertMgrComponent::QueryPagesFor (LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::QueryPagesFor\n");
|
|
HRESULT hr = S_OK;
|
|
hr = QueryComponentDataRef ().QueryPagesFor (pDataObject);
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::QueryPagesFor: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::OnNotifyRefresh (LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnNotifyRefresh\n");
|
|
ASSERT (pDataObject);
|
|
if ( !pDataObject )
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
CCertMgrCookie* pCookie = ConvertCookie (pDataObject);
|
|
if ( !pCookie )
|
|
return E_UNEXPECTED;
|
|
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
if ( dataRef.m_bIsRSOP )
|
|
{
|
|
// Delete all the scope items and force a reexpansion
|
|
|
|
hr = dataRef.DeleteScopeItems (pCookie->m_hScopeItem);
|
|
|
|
hr = dataRef.BuildWMIList (0,
|
|
CERTMGR_CERT_POLICIES_COMPUTER == pCookie->m_objecttype);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
GUID guid;
|
|
hr = dataRef.ExpandScopeNodes (
|
|
pCookie, pCookie->m_hScopeItem,
|
|
_T (""), 0, guid);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SNAPIN:
|
|
{
|
|
// Close and release the usage stores if any.
|
|
CloseAndReleaseUsageStores ();
|
|
m_bUsageStoresEnumerated = false;
|
|
|
|
// Delete all the scope items and force a reexpansion
|
|
hr = dataRef.DeleteScopeItems ();
|
|
|
|
if ( dataRef.m_bIsRSOP )
|
|
{
|
|
ASSERT (0); // do we ever hit this?
|
|
hr = dataRef.BuildWMIList (0, true);
|
|
}
|
|
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
GUID guid;
|
|
hr = dataRef.ExpandScopeNodes (
|
|
dataRef.m_pRootCookie, dataRef.m_hRootScopeItem,
|
|
_T (""), 0, guid);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
{
|
|
CCertStore* pCertStore = reinterpret_cast <CCertStore*> (pCookie);
|
|
ASSERT (pCertStore);
|
|
if ( pCertStore )
|
|
pCertStore->Resync ();
|
|
|
|
HSCOPEITEM hScopeItem = pCookie->m_hScopeItem;
|
|
ASSERT (hScopeItem);
|
|
if ( hScopeItem )
|
|
{
|
|
hr = dataRef.DeleteChildren (hScopeItem);
|
|
GUID guid;
|
|
hr = dataRef.ExpandScopeNodes (
|
|
pCookie, hScopeItem, _T (""), 0, guid);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
hr = RefreshResultPane ();
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL_CONTAINER:
|
|
case CERTMGR_CTL_CONTAINER:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
{
|
|
CContainerCookie* pContainer = reinterpret_cast <CContainerCookie*> (pCookie);
|
|
ASSERT (pContainer);
|
|
if ( pContainer )
|
|
{
|
|
pContainer->GetCertStore ().Resync ();
|
|
}
|
|
}
|
|
hr = RefreshResultPane ();
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
{
|
|
CCertStore* pCertStore = reinterpret_cast <CCertStore*> (pCookie);
|
|
ASSERT (pCertStore);
|
|
if ( pCertStore )
|
|
pCertStore->Resync ();
|
|
}
|
|
hr = RefreshResultPane ();
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
// must be refreshed at root node
|
|
ASSERT (0);
|
|
break;
|
|
|
|
case CERTMGR_USAGE:
|
|
// Close all the stores. This will force them to be
|
|
// re-enumerated later.
|
|
CloseAndReleaseUsageStores ();
|
|
m_bUsageStoresEnumerated = false;
|
|
hr = RefreshResultPane ();
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
hr = RefreshResultPane ();
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pCookie);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
CCertStore* pStore = pCert->GetCertStore ();
|
|
if ( pStore )
|
|
pStore->Resync ();
|
|
}
|
|
}
|
|
hr = RefreshResultItem (pCookie);
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pCookie);
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
{
|
|
pCTL->GetCertStore ().Resync ();
|
|
}
|
|
}
|
|
hr = RefreshResultItem (pCookie);
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pCookie);
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
{
|
|
pCRL->GetCertStore ().Resync ();
|
|
}
|
|
}
|
|
hr = RefreshResultItem (pCookie);
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
ASSERT (0);
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
{
|
|
bool bAllowRefresh = true;
|
|
|
|
RESULTDATAITEM rdItem;
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&rdItem, sizeof (rdItem));
|
|
rdItem.nIndex = -1;
|
|
rdItem.mask = RDI_STATE | RDI_PARAM | RDI_INDEX;
|
|
do
|
|
{
|
|
hr = m_pResultData->GetNextItem (&rdItem);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
CCertMgrCookie* pCurrCookie = (CCertMgrCookie*) rdItem.lParam;
|
|
if ( pCurrCookie )
|
|
{
|
|
if ( pCurrCookie->HasOpenPropertyPages () )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
VERIFY (text.LoadString (IDS_CANT_REFRESH_PAGES_OPEN));
|
|
int iRetVal = 0;
|
|
VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal)));
|
|
bAllowRefresh = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} while ( SUCCEEDED (hr) && -1 != rdItem.nIndex );
|
|
|
|
|
|
if ( !bAllowRefresh )
|
|
break;
|
|
}
|
|
|
|
hr = RefreshResultPane ();
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
hr = RefreshResultPane ();
|
|
ASSERT (SUCCEEDED (hr));
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
hr = E_UNEXPECTED;
|
|
break;
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnNotifyRefresh: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
void CCertMgrComponent::SetTextNotAvailable ()
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::SetTextNotAvailable\n");
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
|
|
m_szDisplayInfoResult.LoadString (IDS_NOT_AVAILABLE);
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::SetTextNotAvailable\n");
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::DeleteCookie (
|
|
CCertMgrCookie* pCookie,
|
|
LPDATAOBJECT pDataObject,
|
|
bool bRequestConfirmation,
|
|
bool bIsMultipleSelect,
|
|
bool bDoCommit)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::DeleteCookie\n");
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
|
|
HRESULT hr = S_OK;
|
|
CString text;
|
|
CString caption;
|
|
int iRetVal = IDYES;
|
|
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pCookie);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
if ( bRequestConfirmation )
|
|
{
|
|
switch ( pCert->GetStoreType () )
|
|
{
|
|
case ROOT_STORE:
|
|
if ( bIsMultipleSelect )
|
|
{
|
|
if ( IDM_USAGE_VIEW == QueryComponentDataRef ().m_activeViewPersist )
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_MULT_CERT_BY_PURPOSE));
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_ROOT_MULTI_CERT));
|
|
}
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_ROOT_CERT));
|
|
break;
|
|
|
|
case CA_STORE:
|
|
if ( bIsMultipleSelect )
|
|
{
|
|
if ( IDM_USAGE_VIEW == QueryComponentDataRef ().m_activeViewPersist )
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_MULT_CERT_BY_PURPOSE));
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_CA_MULTI_CERT));
|
|
}
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_CA_CERT));
|
|
break;
|
|
|
|
case MY_STORE:
|
|
if ( bIsMultipleSelect )
|
|
{
|
|
if ( IDM_USAGE_VIEW == QueryComponentDataRef ().m_activeViewPersist )
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_MULT_CERT_BY_PURPOSE));
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_MY_MULTI_CERT));
|
|
}
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_MY_CERT));
|
|
break;
|
|
|
|
default:
|
|
if ( bIsMultipleSelect )
|
|
{
|
|
if ( IDM_USAGE_VIEW == QueryComponentDataRef ().m_activeViewPersist )
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_MULT_CERT_BY_PURPOSE));
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_MULTI));
|
|
}
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE));
|
|
break;
|
|
}
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
hr = m_pConsole->MessageBox (text, caption, MB_ICONWARNING | MB_YESNO, &iRetVal);
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
|
|
if ( IDYES == iRetVal )
|
|
{
|
|
CWaitCursor waitCursor;
|
|
pCert->GetCertStore (); // to initialize handle
|
|
|
|
hr = DeleteCertFromResultPane (pCert, pDataObject, bDoCommit);
|
|
}
|
|
else
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pCookie);
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
{
|
|
if ( m_pPastedDO != pDataObject )
|
|
{
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_CRL));
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
hr = m_pConsole->MessageBox (text, caption, MB_ICONWARNING | MB_YESNO, &iRetVal);
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
|
|
if ( IDYES == iRetVal )
|
|
{
|
|
CWaitCursor waitCursor;
|
|
hr = DeleteCRLFromResultPane (pCRL, pDataObject);
|
|
if ( SUCCEEDED (hr) )
|
|
pCRL->GetCertStore ().Commit ();
|
|
}
|
|
else
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pCookie);
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
{
|
|
if ( bRequestConfirmation )
|
|
{
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_CTL));
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
hr = m_pConsole->MessageBox (text, caption, MB_ICONWARNING | MB_YESNO, &iRetVal);
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
|
|
if ( IDYES == iRetVal )
|
|
{
|
|
CWaitCursor waitCursor;
|
|
hr = QueryComponentDataRef ().DeleteCTLFromResultPane (pCTL,
|
|
pDataObject);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
pCTL->GetCertStore ().Commit ();
|
|
}
|
|
}
|
|
else
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
{
|
|
CAutoCertRequest* pACR = reinterpret_cast <CAutoCertRequest*> (pCookie);
|
|
ASSERT (pACR);
|
|
if ( pACR )
|
|
{
|
|
if ( bRequestConfirmation )
|
|
{
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_ACR));
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
hr = m_pConsole->MessageBox (text, caption, MB_ICONWARNING | MB_YESNO, &iRetVal);
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
|
|
if ( IDYES == iRetVal )
|
|
{
|
|
hr = QueryComponentDataRef ().DeleteCTLFromResultPane (pACR,
|
|
pDataObject);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
pACR->GetCertStore ().Commit ();
|
|
}
|
|
}
|
|
else
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
{
|
|
CSaferEntry* pSaferEntry = reinterpret_cast <CSaferEntry*> (pCookie);
|
|
ASSERT (pSaferEntry);
|
|
if ( pSaferEntry )
|
|
{
|
|
if ( bRequestConfirmation )
|
|
{
|
|
if ( bIsMultipleSelect )
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_MULTI_SAFER_ENTRY));
|
|
else
|
|
VERIFY (text.LoadString (IDS_CONFIRM_DELETE_SAFER_ENTRY));
|
|
|
|
VERIFY (caption.LoadString (IDS_SAFER_WINDOWS_NODE_NAME));
|
|
hr = m_pConsole->MessageBox (text, caption, MB_ICONWARNING | MB_YESNO, &iRetVal);
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
|
|
if ( IDYES == iRetVal )
|
|
{
|
|
CWaitCursor waitCursor;
|
|
|
|
hr = DeleteSaferEntryFromResultPane (pSaferEntry, pDataObject, bDoCommit);
|
|
}
|
|
else
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
hr = E_UNEXPECTED;
|
|
break;
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::DeleteCookie: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
void CCertMgrComponent::DeleteCertFromContextList (
|
|
CCertMgrCookie *pCookie,
|
|
CERT_CONTEXT_LIST& EFSCertContextList)
|
|
{
|
|
if ( CERTMGR_CERTIFICATE == pCookie->m_objecttype )
|
|
{
|
|
CCertificate* pCert = dynamic_cast <CCertificate*> (pCookie);
|
|
if ( pCert )
|
|
{
|
|
for (POSITION nextPos = EFSCertContextList.GetHeadPosition (); nextPos; )
|
|
{
|
|
POSITION curPos = nextPos;
|
|
CERT_CONTEXT* pCertContext = EFSCertContextList.GetNext (nextPos);
|
|
if ( pCertContext )
|
|
{
|
|
if ( ::CertCompareCertificate (
|
|
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
|
|
pCert->GetCertContext ()->pCertInfo,
|
|
pCertContext->pCertInfo) )
|
|
{
|
|
EFSCertContextList.RemoveAt (curPos);
|
|
::CertFreeCertificateContext (pCertContext);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool CCertMgrComponent::DoChainDeletion (
|
|
CCertMgrCookie* pCookie,
|
|
CCertStore** ppEFSStore)
|
|
{
|
|
ASSERT (pCookie && ppEFSStore);
|
|
if ( !pCookie || !ppEFSStore )
|
|
return false;
|
|
|
|
bool bDoChainDeletion = false;
|
|
|
|
if ( CERTMGR_CERTIFICATE == pCookie->m_objecttype )
|
|
{
|
|
CCertificate* pCert = dynamic_cast <CCertificate*> (pCookie);
|
|
if ( pCert &&
|
|
pCert->GetCertStore () &&
|
|
EFS_STORE == pCert->GetCertStore ()->GetStoreType () )
|
|
{
|
|
*ppEFSStore = pCert->GetCertStore ();
|
|
bDoChainDeletion = true;
|
|
}
|
|
}
|
|
|
|
return bDoChainDeletion;
|
|
}
|
|
|
|
void CCertMgrComponent::CreateCertChainsFromMultiSelect (CCertMgrDataObject* pDO, CCertMgrCookie* pCookie)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::CreateCertChainsFromMultiSelect\n");
|
|
// If this is the EFS store, prepare to delete all cert chain certs from
|
|
// the CA and TRUST store
|
|
// 1. Enumerate all certs to be deleted
|
|
// 2. Enumerate all certs in EFS store
|
|
// 3. Remove certs to be deleted from list of certs in EFS store
|
|
// 4. Get all cert chains from remaining EFS certs and save in list
|
|
// 5. As each cert is deleted, get its cert chain. For each
|
|
// cert from the chain that is not found in the list, remove
|
|
// from CA store.
|
|
bool bDoChainDeletion = false;
|
|
CERT_CONTEXT_LIST EFSCertContextList;
|
|
|
|
CCertStore* pEFSStore = 0;
|
|
pDO->Reset ();
|
|
if ( pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pCookie), NULL) != S_FALSE )
|
|
{
|
|
bDoChainDeletion = DoChainDeletion (pCookie, &pEFSStore);
|
|
}
|
|
|
|
if ( bDoChainDeletion && pEFSStore )
|
|
{
|
|
CERT_CONTEXT* pCertContext = 0;
|
|
// enumerate EFS store
|
|
while ( 1 )
|
|
{
|
|
pCertContext = const_cast <CERT_CONTEXT*> (pEFSStore->EnumCertificates (pCertContext));
|
|
if ( pCertContext )
|
|
{
|
|
EFSCertContextList.AddTail (
|
|
const_cast <CERT_CONTEXT*> (::CertDuplicateCertificateContext (pCertContext)));
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
// eliminate certs to be deleted
|
|
pDO->Reset ();
|
|
while ( pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pCookie), NULL) != S_FALSE )
|
|
{
|
|
DeleteCertFromContextList (pCookie, EFSCertContextList);
|
|
}
|
|
}
|
|
|
|
// Build required cert chain certs - these must not be deleted from the CA
|
|
// store
|
|
GetNotToBeDeletedCertChains (EFSCertContextList);
|
|
|
|
// Clean up the cert context list
|
|
CERT_CONTEXT* pCertContext = 0;
|
|
while (!EFSCertContextList.IsEmpty () )
|
|
{
|
|
pCertContext = EFSCertContextList.RemoveHead ();
|
|
if ( pCertContext )
|
|
::CertFreeCertificateContext (pCertContext);
|
|
}
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::CreateCertChainsFromMultiSelect\n");
|
|
}
|
|
|
|
void CCertMgrComponent::CreateCertChainsFromSingleSelect (CCertMgrCookie* pCookie)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::CreateCertChainsFromSingleSelect\n");
|
|
// If this is the EFS store, prepare to delete all cert chain certs from
|
|
// the CA and TRUST store
|
|
// 1. Enumerate all certs to be deleted
|
|
// 2. Enumerate all certs in EFS store
|
|
// 3. Remove certs to be deleted from list of certs in EFS store
|
|
// 4. Get all cert chains from remaining EFS certs and save in list
|
|
// 5. As each cert is deleted, get its cert chain. For each
|
|
// cert from the chain that is not found in the list, remove
|
|
// from CA store.
|
|
CERT_CONTEXT_LIST EFSCertContextList;
|
|
|
|
CCertStore* pEFSStore = 0;
|
|
bool bDoChainDeletion = DoChainDeletion (pCookie, &pEFSStore);
|
|
|
|
if ( bDoChainDeletion && pEFSStore )
|
|
{
|
|
CERT_CONTEXT* pCertContext = 0;
|
|
// enumerate EFS store
|
|
while ( 1 )
|
|
{
|
|
pCertContext = const_cast <CERT_CONTEXT*> (pEFSStore->EnumCertificates (pCertContext));
|
|
if ( pCertContext )
|
|
{
|
|
EFSCertContextList.AddTail (
|
|
const_cast <CERT_CONTEXT*> (::CertDuplicateCertificateContext (pCertContext)));
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
DeleteCertFromContextList (pCookie, EFSCertContextList);
|
|
}
|
|
|
|
// Build required cert chain certs - these must not be deleted from the CA
|
|
// store
|
|
GetNotToBeDeletedCertChains (EFSCertContextList);
|
|
|
|
// Clean up the cert context list
|
|
CERT_CONTEXT* pCertContext = 0;
|
|
while (!EFSCertContextList.IsEmpty () )
|
|
{
|
|
pCertContext = EFSCertContextList.RemoveHead ();
|
|
if ( pCertContext )
|
|
::CertFreeCertificateContext (pCertContext);
|
|
}
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::CreateCertChainsFromSingleSelect\n");
|
|
}
|
|
|
|
|
|
|
|
void CCertMgrComponent::GetNotToBeDeletedCertChains (CERT_CONTEXT_LIST& EFSCertContextList)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponentData::GetNotToBeDeletedCertChains\n");
|
|
CERT_CONTEXT* pCertContext = 0;
|
|
|
|
// for each cert context
|
|
for (POSITION nextPos = EFSCertContextList.GetHeadPosition (); nextPos; )
|
|
{
|
|
pCertContext = EFSCertContextList.GetNext (nextPos);
|
|
if ( pCertContext )
|
|
{
|
|
CERT_CONTEXT_LIST certChainList;
|
|
BOOL bValidated = GetCertificateChain (pCertContext, certChainList);
|
|
if ( bValidated )
|
|
{
|
|
for (POSITION chainPos = certChainList.GetHeadPosition (); chainPos; )
|
|
{
|
|
bool bFound = false;
|
|
PCCERT_CONTEXT pChainCertContext =
|
|
certChainList.GetNext (chainPos);
|
|
if ( pChainCertContext )
|
|
{
|
|
for (POSITION pos = m_certChainsThatCantBeDeleted.GetHeadPosition ();
|
|
pos; )
|
|
{
|
|
CERT_CONTEXT* pNonDelChainCertContext = m_certChainsThatCantBeDeleted.GetNext (pos);
|
|
if ( pNonDelChainCertContext )
|
|
{
|
|
if ( ::CertCompareCertificate (
|
|
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
|
|
pNonDelChainCertContext->pCertInfo,
|
|
pChainCertContext->pCertInfo) )
|
|
{
|
|
bFound = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !bFound )
|
|
{
|
|
m_certChainsThatCantBeDeleted.AddTail (
|
|
const_cast<CERT_CONTEXT*>
|
|
(::CertDuplicateCertificateContext (pCertContext)));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Clean up list
|
|
CERT_CONTEXT* pDeleteContext = 0;
|
|
while (!certChainList.IsEmpty () )
|
|
{
|
|
pDeleteContext = certChainList.RemoveHead ();
|
|
if ( pDeleteContext )
|
|
::CertFreeCertificateContext (pCertContext);
|
|
}
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"LeavingLeaving CCertMgrComponentData::GetNotToBeDeletedCertChains\n");
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::OnNotifyDelete (LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnNotifyDelete\n");
|
|
ASSERT (pDataObject);
|
|
if ( !pDataObject )
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_OK;
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
CCertMgrCookie* pCookie =
|
|
dataRef.ConvertCookie (pDataObject);
|
|
if ( pCookie )
|
|
{
|
|
CWaitCursor waitCursor;
|
|
if ( ((CCertMgrCookie*) MMC_MULTI_SELECT_COOKIE) == pCookie )
|
|
{
|
|
|
|
// Is multiple select, get all selected items and delete each one
|
|
CCertMgrDataObject* pDO = reinterpret_cast <CCertMgrDataObject*>(pDataObject);
|
|
ASSERT (pDO);
|
|
if ( pDO )
|
|
{
|
|
// Is multiple select, get all selected items and delete - confirm
|
|
// first deletion only. Don't commit until all are deleted.
|
|
bool bRequestConfirmation = true;
|
|
|
|
CCertStore* pCertStore = 0;
|
|
// NTRAID# 129428 Cert UI: Cert snapin: Deleting large
|
|
// number of certificates from the stores takes over 3 minutes
|
|
// Change this to false to do commit only at end.
|
|
bool bDoCommit = false;
|
|
|
|
CreateCertChainsFromMultiSelect (pDO, pCookie);
|
|
|
|
pDO->Reset();
|
|
while (pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pCookie), NULL) != S_FALSE &&
|
|
SUCCEEDED (hr) )
|
|
{
|
|
if ( pCookie->HasOpenPropertyPages () )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
text.FormatMessage (IDS_CANT_DELETE_OBJECT_PAGES_OPEN,
|
|
pCookie->GetObjectName ());
|
|
int iRetVal = 0;
|
|
VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal)));
|
|
hr = E_FAIL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
// If this is the store view, don't commit with each delete but commit
|
|
// all at once at the end.
|
|
pDO->Reset();
|
|
while (pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pCookie), NULL) != S_FALSE &&
|
|
SUCCEEDED (hr) )
|
|
{
|
|
if ( bRequestConfirmation ) // first time through
|
|
{
|
|
if ( CERTMGR_SAFER_COMPUTER_ENTRY == pCookie->m_objecttype ||
|
|
CERTMGR_SAFER_USER_ENTRY == pCookie->m_objecttype )
|
|
{
|
|
}
|
|
// Get the affected store. The store is the same for all the
|
|
// certs in the list if the view mode is by store
|
|
else if ( IDM_STORE_VIEW == dataRef.m_activeViewPersist )
|
|
{
|
|
bDoCommit = false;
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = dynamic_cast<CCertificate*> (pCookie);
|
|
if ( pCert )
|
|
{
|
|
pCertStore = pCert->GetCertStore ();
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = dynamic_cast<CCRL*> (pCookie);
|
|
if ( pCRL )
|
|
pCertStore = &(pCRL->GetCertStore ());
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = dynamic_cast<CCTL*> (pCookie);
|
|
if ( pCTL )
|
|
pCertStore = &(pCTL->GetCertStore ());
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
{
|
|
CAutoCertRequest* pAutoCertReq = dynamic_cast <CAutoCertRequest*> (pCookie);
|
|
if ( pAutoCertReq )
|
|
pCertStore = &(pAutoCertReq->GetCertStore ());
|
|
}
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = DeleteCookie (pCookie, pDataObject, bRequestConfirmation, true, bDoCommit);
|
|
bRequestConfirmation = false;
|
|
}
|
|
|
|
|
|
if ( pCertStore )
|
|
{
|
|
hr = pCertStore->Commit ();
|
|
if ( SUCCEEDED (hr) )
|
|
pCertStore->Resync ();
|
|
}
|
|
else if ( dataRef.m_pGPEInformation &&
|
|
(CERTMGR_SAFER_COMPUTER_ENTRY == pCookie->m_objecttype ||
|
|
CERTMGR_SAFER_USER_ENTRY == pCookie->m_objecttype ) )
|
|
{
|
|
hr = dataRef.m_pGPEInformation->PolicyChanged (
|
|
CERTMGR_SAFER_COMPUTER_ENTRY == pCookie->m_objecttype ? TRUE : FALSE,
|
|
FALSE, &g_guidExtension, &g_guidSnapin);
|
|
hr = dataRef.m_pGPEInformation->PolicyChanged (
|
|
CERTMGR_SAFER_COMPUTER_ENTRY == pCookie->m_objecttype ? TRUE : FALSE,
|
|
FALSE, &g_guidRegExt, &g_guidSnapin);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( pCookie->HasOpenPropertyPages () )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
text.FormatMessage (IDS_CANT_DELETE_OBJECT_PAGES_OPEN,
|
|
pCookie->GetObjectName ());
|
|
int iRetVal = 0;
|
|
VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal)));
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
CreateCertChainsFromSingleSelect (pCookie);
|
|
|
|
// If m_pPastedDO == pDataObject then this delete is the
|
|
// result of a paste.
|
|
// In that event, we don't want a confirmation message.
|
|
hr = DeleteCookie (pCookie, pDataObject, m_pPastedDO != pDataObject, false, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( m_pPastedDO == pDataObject )
|
|
m_pPastedDO = 0;
|
|
|
|
// if ( SUCCEEDED (hr) )
|
|
// hr = m_pConsole->UpdateAllViews (pDataObject, 0, 0);
|
|
|
|
// Clean up the not-to-be-deleted cert context list
|
|
CERT_CONTEXT* pCertContext = 0;
|
|
while (!m_certChainsThatCantBeDeleted.IsEmpty () )
|
|
{
|
|
pCertContext = m_certChainsThatCantBeDeleted.RemoveHead ();
|
|
if ( pCertContext )
|
|
::CertFreeCertificateContext (pCertContext);
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnNotifyDelete: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::DeleteCertFromResultPane (
|
|
CCertificate * pCert,
|
|
LPDATAOBJECT pDataObject,
|
|
bool bDoCommit)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::DeleteCertFromResultPane\n");
|
|
HRESULT hr = S_OK;
|
|
SPECIAL_STORE_TYPE storeType = pCert->GetCertStore ()->GetStoreType ();
|
|
if ( pCert->DeleteFromStore (bDoCommit) )
|
|
{
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
|
|
if ( EFS_STORE == storeType )
|
|
{
|
|
dataRef.RemoveCertChainFromPolicy(pCert->GetCertContext (),
|
|
m_certChainsThatCantBeDeleted);
|
|
}
|
|
|
|
if ( IDM_USAGE_VIEW == dataRef.m_activeViewPersist && m_pLastUsageCookie )
|
|
{
|
|
m_pLastUsageCookie->SetCertCount (m_pLastUsageCookie->GetCertCount () - 1);
|
|
}
|
|
HRESULTITEM itemID;
|
|
hr = m_pResultData->FindItemByLParam ( (LPARAM) pCert, &itemID);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
hr = m_pResultData->DeleteItem (itemID, 0);
|
|
}
|
|
|
|
// If we can't succeed in removing this one item, then update the whole panel.
|
|
if ( !SUCCEEDED (hr) )
|
|
{
|
|
hr = m_pConsole->UpdateAllViews (pDataObject, 0, 0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD dwErr = GetLastError ();
|
|
CString text;
|
|
CString caption;
|
|
CCertStore* pStore = pCert->GetCertStore ();
|
|
|
|
if ( pStore )
|
|
{
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
text.FormatMessage (IDS_CANT_DELETE_CERT_FROM_SYSTEM_STORE,
|
|
pStore->GetLocalizedName (),
|
|
GetSystemMessage (dwErr));
|
|
int iRetVal = 0;
|
|
VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal)));
|
|
}
|
|
hr = HRESULT_FROM_WIN32 (dwErr);
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::DeleteCertFromResultPane: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::DeleteCRLFromResultPane (CCRL * pCRL, LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::DeleteCRLFromResultPane\n");
|
|
HRESULT hr = S_OK;
|
|
if ( pCRL->DeleteFromStore () )
|
|
{
|
|
hr = pCRL->GetCertStore ().Commit ();
|
|
ASSERT (SUCCEEDED (hr));
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
HRESULTITEM itemID;
|
|
hr = m_pResultData->FindItemByLParam ( (LPARAM) pCRL, &itemID);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
hr = m_pResultData->DeleteItem (itemID, 0);
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"IResultData::FindItemByLParam () failed: 0x%x (%s)\n",
|
|
hr, (PCWSTR) GetSystemMessage (hr));
|
|
}
|
|
|
|
// If we can't succeed in removing this one item, then update the whole panel.
|
|
if ( !SUCCEEDED (hr) )
|
|
{
|
|
hr = m_pConsole->UpdateAllViews (pDataObject, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DisplayAccessDenied ();
|
|
}
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::DeleteCRLFromResultPane: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
typedef struct _ENUM_ARG {
|
|
DWORD dwFlags;
|
|
CCertMgrComponent* m_pComp;
|
|
LPCWSTR m_pcszMachineName;
|
|
LPCONSOLE m_pConsole;
|
|
} ENUM_ARG, *PENUM_ARG;
|
|
|
|
static BOOL WINAPI EnumIComponentSysCallback (
|
|
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 EnumIComponentSysCallback\n");
|
|
PENUM_ARG pEnumArg = (PENUM_ARG) pvArg;
|
|
|
|
// Create new cookies
|
|
SPECIAL_STORE_TYPE storeType = GetSpecialStoreType ((LPWSTR) pwszSystemStore);
|
|
|
|
if ( pEnumArg->m_pComp->QueryComponentDataRef ().ShowArchivedCerts () )
|
|
dwFlags |= CERT_STORE_ENUM_ARCHIVED_FLAG;
|
|
|
|
//
|
|
// 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_pcszMachineName,
|
|
(LPCWSTR) pwszSystemStore,
|
|
(LPCWSTR) pwszSystemStore,
|
|
_T (""),
|
|
storeType,
|
|
dwFlags,
|
|
pEnumArg->m_pConsole);
|
|
if ( pNewCookie )
|
|
pEnumArg->m_pComp->m_usageStoreList.AddTail (pNewCookie);
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving EnumIComponentSysCallback\n");
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
HRESULT CCertMgrComponent::EnumerateLogicalStores (CCertMgrCookie& parentCookie)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::EnumerateLogicalStores\n");
|
|
CWaitCursor cursor;
|
|
HRESULT hr = S_OK;
|
|
ENUM_ARG enumArg;
|
|
CCertMgrComponentData& compData = QueryComponentDataRef ();
|
|
DWORD dwFlags = compData.GetLocation ();
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&enumArg, sizeof (enumArg));
|
|
enumArg.dwFlags = dwFlags;
|
|
enumArg.m_pComp = this;
|
|
enumArg.m_pcszMachineName = parentCookie.QueryNonNULLMachineName ();
|
|
enumArg.m_pConsole = m_pConsole;
|
|
CString location;
|
|
void* pvPara = 0;
|
|
|
|
// empty out the store list first
|
|
CCertStore* pCertStore = 0;
|
|
while (!m_usageStoreList.IsEmpty () )
|
|
{
|
|
pCertStore = m_usageStoreList.RemoveHead ();
|
|
ASSERT (pCertStore);
|
|
if ( pCertStore )
|
|
{
|
|
pCertStore->SetDirty ();
|
|
pCertStore->Commit ();
|
|
pCertStore->Release ();
|
|
}
|
|
}
|
|
|
|
if ( !compData.GetManagedService ().IsEmpty () )
|
|
{
|
|
if ( !compData.GetManagedComputer ().IsEmpty () )
|
|
{
|
|
location = compData.GetManagedComputer () + _T("\\") +
|
|
compData.GetManagedComputer ();
|
|
pvPara = (void *) (LPCWSTR) location;
|
|
}
|
|
else
|
|
pvPara = (void *) (LPCWSTR) compData.GetManagedService ();
|
|
}
|
|
else if ( !compData.GetManagedComputer ().IsEmpty () )
|
|
{
|
|
pvPara = (void *) (LPCWSTR) compData.GetManagedComputer ();
|
|
}
|
|
|
|
CString fileName = compData.GetCommandLineFileName ();
|
|
if ( fileName.IsEmpty () )
|
|
{
|
|
// Ensure creation of MY store
|
|
HCERTSTORE hTempStore = ::CertOpenStore (CERT_STORE_PROV_SYSTEM,
|
|
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, NULL,
|
|
dwFlags | CERT_STORE_SET_LOCALIZED_NAME_FLAG,
|
|
MY_SYSTEM_STORE_NAME);
|
|
if ( hTempStore ) // otherwise, store is read only
|
|
{
|
|
VERIFY (::CertCloseStore (hTempStore, CERT_CLOSE_STORE_CHECK_FLAG));
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"CertOpenStore (%s) failed: 0x%x\n",
|
|
MY_SYSTEM_STORE_NAME, GetLastError ());
|
|
}
|
|
|
|
if ( !::CertEnumSystemStore (dwFlags, pvPara, &enumArg,
|
|
EnumIComponentSysCallback) )
|
|
{
|
|
DWORD dwErr = GetLastError ();
|
|
CString text;
|
|
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));
|
|
}
|
|
int iRetVal = 0;
|
|
VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal)));
|
|
hr = HRESULT_FROM_WIN32 (dwErr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Create new cookies
|
|
|
|
CCertStore* pNewCookie = new CCertStore (
|
|
CERTMGR_LOG_STORE,
|
|
CERT_STORE_PROV_FILENAME_W,
|
|
0, //dwFlags,
|
|
parentCookie.QueryNonNULLMachineName (),
|
|
fileName, fileName, _T (""), NO_SPECIAL_TYPE,
|
|
QueryComponentDataRef ().GetLocation (),
|
|
m_pConsole);
|
|
if ( pNewCookie )
|
|
m_usageStoreList.AddTail (pNewCookie);
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::EnumerateLogicalStores: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::EnumCertsByUsage (CUsageCookie * pUsageCookie)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::EnumCertsByUsage\n");
|
|
ASSERT (pUsageCookie);
|
|
if ( !pUsageCookie )
|
|
return E_POINTER;
|
|
CCertMgrComponentData& compData = QueryComponentDataRef ();
|
|
|
|
HRESULT hr = m_pResultData->DeleteAllRsltItems ();
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
compData.RemoveResultCookies (m_pResultData);
|
|
}
|
|
|
|
if ( m_bShowArchivedCertsStateWhenLogStoresEnumerated !=
|
|
compData.ShowArchivedCerts () )
|
|
{
|
|
m_bShowArchivedCertsStateWhenLogStoresEnumerated =
|
|
compData.ShowArchivedCerts ();
|
|
m_bUsageStoresEnumerated = false;
|
|
CloseAndReleaseUsageStores ();
|
|
}
|
|
// Enumerate system stores, if not already done
|
|
if ( !m_bUsageStoresEnumerated && pUsageCookie )
|
|
{
|
|
hr = EnumerateLogicalStores (*pUsageCookie);
|
|
m_bUsageStoresEnumerated = true;
|
|
}
|
|
|
|
|
|
// Iterate through stores and find certs for given Oid.
|
|
CCertStore* pCertStore = 0;
|
|
CCookie& rootCookie = compData.QueryBaseRootCookie ();
|
|
int nCertCount = 0;
|
|
|
|
for (POSITION pos = m_usageStoreList.GetHeadPosition (); pos; )
|
|
{
|
|
pCertStore = m_usageStoreList.GetNext (pos);
|
|
ASSERT (pCertStore);
|
|
if ( pCertStore )
|
|
{
|
|
int nOIDCount = pUsageCookie->GetOIDCount ();
|
|
ASSERT (nOIDCount > 0);
|
|
if ( nOIDCount <= 0 )
|
|
continue;
|
|
|
|
CERT_ENHKEY_USAGE enhKeyUsage;
|
|
enhKeyUsage.cUsageIdentifier = nOIDCount;
|
|
enhKeyUsage.rgpszUsageIdentifier = new LPSTR [nOIDCount];
|
|
if ( enhKeyUsage.rgpszUsageIdentifier )
|
|
{
|
|
for (int nIndex = 0; nIndex < nOIDCount; nIndex++)
|
|
{
|
|
enhKeyUsage.rgpszUsageIdentifier[nIndex] =
|
|
(!nIndex) ?
|
|
pUsageCookie->GetFirstOID () :
|
|
pUsageCookie->GetNextOID ();
|
|
}
|
|
|
|
PCCERT_CONTEXT pPrevCertContext = 0;
|
|
PCCERT_CONTEXT pCertContext = 0;
|
|
CCertificate* pCert = 0;
|
|
DWORD dwErr = 0;
|
|
RESULTDATAITEM rdItem;
|
|
void* pvPara = (void *) &enhKeyUsage;
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&rdItem, sizeof (rdItem));
|
|
rdItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
|
rdItem.nImage = iIconCertificate;
|
|
rdItem.nCol = 0;
|
|
|
|
bool bDone = false;
|
|
while ( !bDone )
|
|
{
|
|
pCertContext = pCertStore->FindCertificate (
|
|
CERT_FIND_VALID_ENHKEY_USAGE_FLAG |
|
|
CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG, // | CERT_FIND_OR_ENHKEY_USAGE_FLAG ,
|
|
CERT_FIND_ENHKEY_USAGE,
|
|
pvPara,
|
|
pPrevCertContext);
|
|
if ( !pCertContext )
|
|
{
|
|
dwErr = GetLastError ();
|
|
switch (dwErr)
|
|
{
|
|
case CRYPT_E_NOT_FOUND: // We're done. No more certificates.
|
|
break;
|
|
|
|
case 0: // no error to display
|
|
break;
|
|
|
|
case E_INVALIDARG:
|
|
if ( !pCertStore->GetStoreHandle () )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
int iRetVal = IDNO;
|
|
|
|
text.FormatMessage
|
|
(IDS_CANNOT_OPEN_CERT_STORE_TO_FIND_CERT_BY_PURPOSE,
|
|
pCertStore->GetLocalizedName ());
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
hr = m_pConsole->MessageBox (text, caption,
|
|
MB_ICONWARNING | MB_OK, &iRetVal);
|
|
break;
|
|
}
|
|
// fall through
|
|
|
|
default:
|
|
compData.DisplaySystemError (dwErr);
|
|
break;
|
|
}
|
|
bDone = true;
|
|
continue;
|
|
}
|
|
pCert =
|
|
new CCertificate (pCertContext, pCertStore);
|
|
|
|
if ( !pCert )
|
|
{
|
|
// Do this twice. Must reduce ref count by 2
|
|
::CertFreeCertificateContext (pCertContext);
|
|
::CertFreeCertificateContext (pCertContext);
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
nCertCount++;
|
|
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pCert);
|
|
rdItem.str = MMC_CALLBACK;
|
|
rdItem.lParam = (LPARAM) pCert;
|
|
pCert->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
ASSERT (SUCCEEDED (hr));
|
|
|
|
|
|
pPrevCertContext = pCertContext;
|
|
}
|
|
pCertStore->Close ();
|
|
delete [] enhKeyUsage.rgpszUsageIdentifier;
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
pUsageCookie->SetCertCount (nCertCount);
|
|
hr = DisplayCertificateCountByUsage (
|
|
pUsageCookie->GetObjectName (),
|
|
pUsageCookie->GetCertCount ());
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::EnumCertsByUsage: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
// This compare is used to sort the items in the listview
|
|
//
|
|
// Parameters:
|
|
//
|
|
// lUserParam - user param passed in when IResultData::Sort () was called
|
|
// prdc->prdch1->cookie - first item to compare
|
|
// prdc->prdch2->cookie - second item to compare
|
|
// pnResult [in, out]- contains the col on entry,
|
|
// -1, 0, 1 based on comparison for return value.
|
|
//
|
|
// Note: Assume sort is ascending when comparing.
|
|
|
|
STDMETHODIMP CCertMgrComponent::Compare (RDCOMPARE* prdc, int* pnResult)
|
|
{
|
|
if ( !prdc )
|
|
return E_INVALIDARG;
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( pnResult && prdc->prdch1->cookie && prdc->prdch2->cookie )
|
|
{
|
|
|
|
if ( CERTMGR_MULTISEL == m_currResultNodeType )
|
|
{
|
|
CCertMgrCookie* pCookie = reinterpret_cast<CCertMgrCookie*> (prdc->prdch1->cookie);
|
|
if ( pCookie )
|
|
{
|
|
// result node type is CERTMGR_MULTISEL. Must be changed to
|
|
// a real result node type so that we can sort
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
case CERTMGR_CTL:
|
|
case CERTMGR_CRL:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
m_currResultNodeType = pCookie->m_objecttype;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// NTRAID# 464606 SAFER: Can't sort security levels by description.
|
|
// Sometimes m_currResultNodeType doesn't come in with the right type
|
|
// because the node hasn't actually been selected prior to sorting.
|
|
// When this happens, set bTypeFound to false, set m_currResultNodeType
|
|
// to the cookie's type.
|
|
// If the sort is successfully completed, set nPasses to 0 to break out
|
|
// of the loop.
|
|
// If we have to reset m_currResultNodeType and it still fails, nPasses
|
|
// will have already been decremented to 0. In any case, we only want
|
|
// two passes through the while loop at most.
|
|
|
|
CCertMgrCookie* pCookieA = reinterpret_cast <CCertificate*> (prdc->prdch1->cookie);
|
|
CCertMgrCookie* pCookieB = reinterpret_cast <CCertificate*> (prdc->prdch2->cookie);
|
|
bool bTypeFound = true;
|
|
int nPasses = 2;
|
|
|
|
while (nPasses--)
|
|
{
|
|
if ( !bTypeFound )
|
|
m_currResultNodeType = pCookieA->m_objecttype;
|
|
|
|
switch (m_currResultNodeType)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
if ( CERTMGR_CERTIFICATE == pCookieA->m_objecttype &&
|
|
CERTMGR_CERTIFICATE == pCookieB->m_objecttype )
|
|
{
|
|
m_nSelectedCertColumn = prdc->nColumn;
|
|
CCertificate* pCertA = reinterpret_cast <CCertificate*> (prdc->prdch1->cookie);
|
|
CCertificate* pCertB = reinterpret_cast <CCertificate*> (prdc->prdch2->cookie);
|
|
switch ( prdc->nColumn )
|
|
{
|
|
case COLNUM_CERT_SUBJECT:
|
|
*pnResult = LocaleStrCmp (pCertA->GetSubjectName (),
|
|
pCertB->GetSubjectName ());
|
|
break;
|
|
|
|
case COLNUM_CERT_ISSUER:
|
|
*pnResult = LocaleStrCmp (pCertA->GetIssuerName (),
|
|
pCertB->GetIssuerName ());
|
|
break;
|
|
|
|
case COLNUM_CERT_EXPIRATION_DATE:
|
|
*pnResult = pCertA->CompareExpireDate (*pCertB);
|
|
break;
|
|
|
|
case COLNUM_CERT_PURPOSE:
|
|
*pnResult = LocaleStrCmp (pCertA->GetEnhancedKeyUsage (),
|
|
pCertB->GetEnhancedKeyUsage ());
|
|
break;
|
|
|
|
case COLNUM_CERT_CERT_NAME:
|
|
*pnResult = LocaleStrCmp (pCertA->GetFriendlyName (),
|
|
pCertB->GetFriendlyName ());
|
|
break;
|
|
|
|
case COLNUM_CERT_STATUS:
|
|
*pnResult = LocaleStrCmp (pCertA->FormatStatus (),
|
|
pCertB->FormatStatus ());
|
|
break;
|
|
|
|
// NTRAID# 247237 Cert UI: Cert Snapin: Certificates snapin should show template name
|
|
case COLNUM_CERT_TEMPLATE:
|
|
*pnResult = LocaleStrCmp (pCertA->GetTemplateName (),
|
|
pCertB->GetTemplateName ());
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
nPasses = 0;
|
|
}
|
|
else
|
|
bTypeFound = false;
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
if ( CERTMGR_CRL == pCookieA->m_objecttype &&
|
|
CERTMGR_CRL == pCookieB->m_objecttype )
|
|
{
|
|
m_nSelectedCRLColumn = prdc->nColumn;
|
|
CCRL* pCRLA = reinterpret_cast <CCRL*> (prdc->prdch1->cookie);
|
|
CCRL* pCRLB = reinterpret_cast <CCRL*> (prdc->prdch2->cookie);
|
|
switch ( prdc->nColumn )
|
|
{
|
|
case COLNUM_CRL_EFFECTIVE_DATE:
|
|
*pnResult = pCRLA->CompareEffectiveDate (*pCRLB);
|
|
break;
|
|
|
|
case COLNUM_CRL_ISSUER:
|
|
*pnResult = LocaleStrCmp (pCRLA->GetIssuerName (),
|
|
pCRLB->GetIssuerName ());
|
|
break;
|
|
|
|
case COLNUM_CRL_NEXT_UPDATE:
|
|
*pnResult = pCRLA->CompareNextUpdate (*pCRLB);
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
nPasses = 0;
|
|
}
|
|
else
|
|
bTypeFound = false;
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
if ( CERTMGR_CTL == pCookieA->m_objecttype &&
|
|
CERTMGR_CTL == pCookieB->m_objecttype )
|
|
{
|
|
m_nSelectedCTLColumn = prdc->nColumn;
|
|
CCTL* pCTLA = reinterpret_cast <CCTL*> (prdc->prdch1->cookie);
|
|
CCTL* pCTLB = reinterpret_cast <CCTL*> (prdc->prdch2->cookie);
|
|
switch ( prdc->nColumn )
|
|
{
|
|
case COLNUM_CTL_ISSUER:
|
|
*pnResult = LocaleStrCmp (pCTLA->GetIssuerName (),
|
|
pCTLB->GetIssuerName ());
|
|
break;
|
|
|
|
case COLNUM_CTL_EFFECTIVE_DATE:
|
|
*pnResult = pCTLA->CompareEffectiveDate (*pCTLB);
|
|
break;
|
|
|
|
case COLNUM_CTL_PURPOSE:
|
|
*pnResult = LocaleStrCmp (pCTLA->GetPurpose (),
|
|
pCTLB->GetPurpose ());
|
|
break;
|
|
|
|
case COLNUM_CTL_FRIENDLY_NAME:
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
nPasses = 0;
|
|
}
|
|
else
|
|
bTypeFound = false;
|
|
break;
|
|
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
if ( CERTMGR_AUTO_CERT_REQUEST == pCookieA->m_objecttype &&
|
|
CERTMGR_AUTO_CERT_REQUEST == pCookieB->m_objecttype )
|
|
{
|
|
CAutoCertRequest* pAutoCertA = reinterpret_cast <CAutoCertRequest*> (prdc->prdch1->cookie);
|
|
CAutoCertRequest* pAutoCertB = reinterpret_cast <CAutoCertRequest*> (prdc->prdch2->cookie);
|
|
switch ( prdc->nColumn )
|
|
{
|
|
case 0:
|
|
{
|
|
CString strA;
|
|
CString strB;
|
|
|
|
VERIFY (SUCCEEDED (pAutoCertA->GetCertTypeName (strA)));
|
|
VERIFY (SUCCEEDED (pAutoCertB->GetCertTypeName (strB)));
|
|
*pnResult = LocaleStrCmp (strA, strB);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
nPasses = 0;
|
|
}
|
|
else
|
|
bTypeFound = false;
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
if ( (CERTMGR_SAFER_COMPUTER_ENTRY == pCookieA->m_objecttype &&
|
|
CERTMGR_SAFER_COMPUTER_ENTRY == pCookieB->m_objecttype) ||
|
|
(CERTMGR_SAFER_USER_ENTRY == pCookieA->m_objecttype &&
|
|
CERTMGR_SAFER_USER_ENTRY == pCookieB->m_objecttype) )
|
|
{
|
|
CSaferEntry* pSaferEntryA = reinterpret_cast <CSaferEntry*> (prdc->prdch1->cookie);
|
|
CSaferEntry* pSaferEntryB = reinterpret_cast <CSaferEntry*> (prdc->prdch2->cookie);
|
|
m_nSelectedSaferEntryColumn = prdc->nColumn;
|
|
switch (prdc->nColumn)
|
|
{
|
|
case COLNUM_SAFER_ENTRIES_NAME:
|
|
*pnResult = LocaleStrCmp (pSaferEntryA->GetObjectName (),
|
|
pSaferEntryB->GetObjectName ());
|
|
break;
|
|
|
|
case COLNUM_SAFER_ENTRIES_TYPE:
|
|
*pnResult = LocaleStrCmp (pSaferEntryA->GetTypeString (),
|
|
pSaferEntryB->GetTypeString ());
|
|
break;
|
|
|
|
case COLNUM_SAFER_ENTRIES_LEVEL:
|
|
*pnResult = LocaleStrCmp (pSaferEntryA->GetLevelFriendlyName (),
|
|
pSaferEntryB->GetLevelFriendlyName ());
|
|
break;
|
|
|
|
case COLNUM_SAFER_ENTRIES_DESCRIPTION:
|
|
*pnResult = LocaleStrCmp (pSaferEntryA->GetDescription (),
|
|
pSaferEntryB->GetDescription ());
|
|
break;
|
|
|
|
case COLNUM_SAFER_ENTRIES_LAST_MODIFIED_DATE:
|
|
*pnResult = pSaferEntryA->CompareLastModified (*pSaferEntryB);
|
|
break;
|
|
}
|
|
nPasses = 0;
|
|
}
|
|
else
|
|
bTypeFound = false;
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
if ( (CERTMGR_SAFER_COMPUTER_LEVEL == pCookieA->m_objecttype &&
|
|
CERTMGR_SAFER_COMPUTER_LEVEL == pCookieB->m_objecttype) ||
|
|
(CERTMGR_SAFER_USER_LEVEL == pCookieA->m_objecttype &&
|
|
CERTMGR_SAFER_USER_LEVEL == pCookieB->m_objecttype) )
|
|
{
|
|
CSaferLevel* pSaferLevelA = reinterpret_cast <CSaferLevel*> (prdc->prdch1->cookie);
|
|
CSaferLevel* pSaferLevelB = reinterpret_cast <CSaferLevel*> (prdc->prdch2->cookie);
|
|
switch (prdc->nColumn)
|
|
{
|
|
case COLNUM_SAFER_LEVEL_NAME:
|
|
if ( pSaferLevelA->GetLevel () > pSaferLevelB->GetLevel () )
|
|
*pnResult = 1;
|
|
else if ( pSaferLevelA->GetLevel () < pSaferLevelB->GetLevel () )
|
|
*pnResult = -1;
|
|
else
|
|
*pnResult = 0;
|
|
break;
|
|
|
|
case COLNUM_SAFER_LEVEL_DESCRIPTION:
|
|
*pnResult = LocaleStrCmp (pSaferLevelA->GetDescription (),
|
|
pSaferLevelB->GetDescription ());
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
nPasses = 0;
|
|
}
|
|
else
|
|
bTypeFound = false;
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_PHYS_STORE:
|
|
if ( (CERTMGR_LOG_STORE == pCookieA->m_objecttype &&
|
|
CERTMGR_LOG_STORE == pCookieB->m_objecttype) ||
|
|
(CERTMGR_PHYS_STORE == pCookieA->m_objecttype &&
|
|
CERTMGR_PHYS_STORE == pCookieB->m_objecttype) )
|
|
{
|
|
CCertStore* pStoreA = reinterpret_cast <CCertStore*> (prdc->prdch1->cookie);
|
|
CCertStore* pStoreB = reinterpret_cast <CCertStore*> (prdc->prdch2->cookie);
|
|
m_nSelectedSaferEntryColumn = prdc->nColumn;
|
|
if (0 == prdc->nColumn )
|
|
{
|
|
*pnResult = LocaleStrCmp (pStoreA->GetLocalizedName (),
|
|
pStoreB->GetLocalizedName ());
|
|
}
|
|
nPasses = 0;
|
|
}
|
|
else
|
|
bTypeFound = false;
|
|
break;
|
|
|
|
case CERTMGR_USAGE:
|
|
if ( CERTMGR_USAGE == pCookieA->m_objecttype &&
|
|
CERTMGR_USAGE == pCookieB->m_objecttype )
|
|
{
|
|
CUsageCookie* pUsageA = reinterpret_cast <CUsageCookie*> (prdc->prdch1->cookie);
|
|
CUsageCookie* pUsageB = reinterpret_cast <CUsageCookie*> (prdc->prdch2->cookie);
|
|
m_nSelectedSaferEntryColumn = prdc->nColumn;
|
|
if (0 == prdc->nColumn )
|
|
{
|
|
*pnResult = LocaleStrCmp (pUsageA->GetObjectName (),
|
|
pUsageB->GetObjectName ());
|
|
}
|
|
nPasses = 0;
|
|
}
|
|
else
|
|
bTypeFound = false;
|
|
break;
|
|
|
|
default:
|
|
bTypeFound = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::EnumCTLs (CCertStore& rCertStore)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::EnumCTLs\n");
|
|
CCertMgrComponentData& compdata = QueryComponentDataRef ();
|
|
RESULTDATAITEM rdItem;
|
|
CWaitCursor cursor;
|
|
PCCTL_CONTEXT pCTLContext = 0;
|
|
HRESULT hr = 0;
|
|
CCTL* pCTL = 0;
|
|
CCookie& rootCookie = compdata.QueryBaseRootCookie ();
|
|
CTypedPtrList<CPtrList, CCertStore*> storeList;
|
|
|
|
// Only enumerate the logical stores if this is not the GPE or RSOP. If it is the
|
|
// GPE, add the Trust and Root store.
|
|
if ( !compdata.m_pGPEInformation && !compdata.m_bIsRSOP )
|
|
{
|
|
hr = compdata.EnumerateLogicalStores (&storeList);
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
else
|
|
{
|
|
if ( compdata.m_pGPERootStore )
|
|
{
|
|
compdata.m_pGPERootStore->AddRef ();
|
|
storeList.AddTail (compdata.m_pGPERootStore);
|
|
}
|
|
if ( compdata.m_pGPETrustStore )
|
|
{
|
|
compdata.m_pGPETrustStore->AddRef ();
|
|
storeList.AddTail (compdata.m_pGPETrustStore);
|
|
}
|
|
}
|
|
if ( compdata.m_pFileBasedStore )
|
|
{
|
|
compdata.m_pFileBasedStore->AddRef ();
|
|
storeList.AddTail (compdata.m_pFileBasedStore);
|
|
}
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&rdItem, sizeof (rdItem));
|
|
rdItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
|
rdItem.nCol = 0; // Must always be 0
|
|
while ( 1 )
|
|
{
|
|
pCTLContext = rCertStore.EnumCTLs (pCTLContext);
|
|
if ( !pCTLContext )
|
|
break;
|
|
if ( ACRS_STORE == rCertStore.GetStoreType () )
|
|
{
|
|
pCTL =
|
|
new CAutoCertRequest (pCTLContext, rCertStore);
|
|
}
|
|
else
|
|
{
|
|
pCTL =
|
|
new CCTL (pCTLContext, rCertStore, CERTMGR_CTL, &storeList);
|
|
}
|
|
if ( !pCTL )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
if ( ACRS_STORE != rCertStore.GetStoreType () )
|
|
rdItem.nImage = iIconCTL;
|
|
else
|
|
rdItem.nImage = 0;
|
|
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pCTL);
|
|
rdItem.str = MMC_TEXTCALLBACK;
|
|
rdItem.lParam = (LPARAM) pCTL;
|
|
pCTL->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
rCertStore.Close ();
|
|
|
|
CCertStore* pStore = 0;
|
|
|
|
// Clean up store list
|
|
while (!storeList.IsEmpty () )
|
|
{
|
|
pStore = storeList.RemoveHead ();
|
|
ASSERT (pStore);
|
|
if ( pStore )
|
|
{
|
|
pStore->Close ();
|
|
pStore->Release ();
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::EnumCTLs: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CCertMgrComponent::Notify (LPDATAOBJECT pDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::Notify\n");
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
|
|
HRESULT hr = S_OK;
|
|
|
|
// NTRAID# 678670 SAFER UI: AV When Create New Policies is used as a TaskPad task...
|
|
// NTRAID# 677512 SAFER UI: Access Violation when creating new safer policy
|
|
// NTRAID# 677529 SAFER UI: Access Violation while deleting software restriction policies
|
|
// The component data console pointer could be bad and should be set to a
|
|
// valid current pointer.
|
|
if ( MMCN_ACTIVATE != event || 0 != arg ) // If MMC_ACTIVATE and window is
|
|
// being activated or any other notification
|
|
SetComponentDataConsolePointer (m_pConsole);
|
|
|
|
switch (event)
|
|
{
|
|
case MMCN_CUTORMOVE:
|
|
hr = OnNotifyCutOrMove (arg);
|
|
break;
|
|
|
|
case MMCN_QUERY_PASTE:
|
|
hr = OnNotifyQueryPaste (pDataObject, arg, param);
|
|
break;
|
|
|
|
case MMCN_PASTE:
|
|
hr = OnNotifyPaste (pDataObject, arg, param);
|
|
break;
|
|
|
|
case MMCN_SHOW:
|
|
// CODEWORK this is hacked together quickly
|
|
{
|
|
CCookie* pCookie = NULL;
|
|
hr = ExtractData (pDataObject,
|
|
CDataObject::m_CFRawCookie,
|
|
&pCookie,
|
|
sizeof(pCookie));
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
hr = Show (ActiveBaseCookie (pCookie), arg,
|
|
(HSCOPEITEM) param, pDataObject);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case MMCN_CANPASTE_OUTOFPROC:
|
|
hr = OnNotifyCanPasteOutOfProc (reinterpret_cast<LPBOOL>(param));
|
|
break;
|
|
|
|
default:
|
|
hr = CComponent::Notify (pDataObject, event, arg, param);
|
|
break;
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::Notify: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
void CCertMgrComponent::SetComponentDataConsolePointer (LPCONSOLE pConsole)
|
|
{
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
if ( dataRef.m_pComponentConsole != pConsole )
|
|
{
|
|
if ( dataRef.m_pComponentConsole )
|
|
SAFE_RELEASE (dataRef.m_pComponentConsole);
|
|
dataRef.m_pComponentConsole = pConsole;
|
|
dataRef.m_pComponentConsole->AddRef ();
|
|
}
|
|
}
|
|
|
|
void CCertMgrComponent::DisplayAccessDenied ()
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::DisplayAccessDenied\n");
|
|
DWORD dwErr = GetLastError ();
|
|
ASSERT (E_ACCESSDENIED == dwErr);
|
|
if ( E_ACCESSDENIED == dwErr )
|
|
{
|
|
LPVOID lpMsgBuf;
|
|
|
|
// security review 2/26/2002 BryanWal ok - message is from system
|
|
::FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
|
NULL,
|
|
GetLastError (),
|
|
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
(LPWSTR) &lpMsgBuf, 0, NULL );
|
|
|
|
// Display the string.
|
|
CString caption;
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
int iRetVal = 0;
|
|
VERIFY (SUCCEEDED (m_pConsole->MessageBox ( (LPWSTR) lpMsgBuf, caption,
|
|
MB_ICONWARNING | MB_OK, &iRetVal)));
|
|
|
|
// Free the buffer.
|
|
LocalFree (lpMsgBuf);
|
|
}
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::DisplayAccessDenied\n");
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::OnNotifyPaste (LPDATAOBJECT pDataObject, LPARAM arg, LPARAM param)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnNotifyPaste\n");
|
|
ASSERT (pDataObject && arg);
|
|
if ( !pDataObject || !arg )
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_OK;
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
HSCOPEITEM hScopeItem = -1;
|
|
bool bContainsCerts = false;
|
|
bool bContainsCTLs = false;
|
|
bool bContainsCRLs = false;
|
|
|
|
CCertMgrCookie* pTargetCookie = dataRef.ConvertCookie (pDataObject);
|
|
ASSERT (pTargetCookie);
|
|
if ( pTargetCookie )
|
|
{
|
|
CCertStore* pCertStore = 0;
|
|
SPECIAL_STORE_TYPE storeType = NO_SPECIAL_TYPE;
|
|
|
|
switch (pTargetCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
pCertStore = reinterpret_cast <CCertStore*>
|
|
(pTargetCookie);
|
|
ASSERT (pCertStore);
|
|
if ( pCertStore )
|
|
{
|
|
pCertStore->AddRef ();
|
|
storeType = pCertStore->GetStoreType ();
|
|
hScopeItem = pCertStore->m_hScopeItem;
|
|
bContainsCerts = pCertStore->ContainsCertificates ();
|
|
bContainsCRLs = pCertStore->ContainsCRLs ();
|
|
bContainsCTLs = pCertStore->ContainsCTLs ();
|
|
ASSERT (-1 != hScopeItem);
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL_CONTAINER:
|
|
{
|
|
bContainsCRLs = true;
|
|
CContainerCookie* pCont = reinterpret_cast <CContainerCookie*>
|
|
(pTargetCookie);
|
|
ASSERT (pCont);
|
|
if ( pCont )
|
|
{
|
|
pCertStore = &(pCont->GetCertStore ());
|
|
pCertStore->AddRef ();
|
|
storeType = pCont->GetStoreType ();
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL_CONTAINER:
|
|
{
|
|
bContainsCTLs = true;
|
|
CContainerCookie* pCont = reinterpret_cast <CContainerCookie*>
|
|
(pTargetCookie);
|
|
ASSERT (pCont);
|
|
if ( pCont )
|
|
{
|
|
pCertStore = &(pCont->GetCertStore ());
|
|
pCertStore->AddRef ();
|
|
storeType = pCont->GetStoreType ();
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERT_CONTAINER:
|
|
{
|
|
bContainsCerts = true;
|
|
CContainerCookie* pCont = reinterpret_cast <CContainerCookie*>
|
|
(pTargetCookie);
|
|
ASSERT (pCont);
|
|
if ( pCont )
|
|
{
|
|
pCertStore = &(pCont->GetCertStore ());
|
|
pCertStore->AddRef ();
|
|
storeType = pCont->GetStoreType ();
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pTargetCookie);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
pCertStore = pCert->GetCertStore ();
|
|
pCertStore->AddRef ();
|
|
storeType = pCert->GetStoreType ();
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pTargetCookie);
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
{
|
|
pCertStore = &(pCRL->GetCertStore ());
|
|
pCertStore->AddRef ();
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pTargetCookie);
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
{
|
|
pCertStore = &(pCTL->GetCertStore ());
|
|
pCertStore->AddRef ();
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
ASSERT (0);
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
{
|
|
param = 0; // do not allow cut/move of originating cert
|
|
CSaferEntries* pSaferEntries = dynamic_cast <CSaferEntries*> (pTargetCookie);
|
|
if ( pSaferEntries )
|
|
{
|
|
CCertStore* pGPEStore = 0;
|
|
bool bIsComputer =
|
|
(CERTMGR_SAFER_COMPUTER_ENTRIES == pTargetCookie->m_objecttype);
|
|
DWORD dwDefaultLevelID = CSaferLevel::ReturnDefaultLevel (
|
|
dataRef.m_pGPEInformation,
|
|
bIsComputer ? true : false,
|
|
bIsComputer ? dataRef.m_rsopObjectArrayComputer : dataRef.m_rsopObjectArrayUser);
|
|
|
|
if ( SAFER_LEVELID_DISALLOWED== dwDefaultLevelID )
|
|
hr = pSaferEntries->GetTrustedPublishersStore (&pGPEStore);
|
|
else
|
|
hr = pSaferEntries->GetDisallowedStore (&pGPEStore);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
pCertStore = pGPEStore;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
hr = E_UNEXPECTED;
|
|
break;
|
|
}
|
|
|
|
|
|
if ( !SUCCEEDED (hr) )
|
|
return hr;
|
|
|
|
CCertMgrCookie* pPastedCookie =
|
|
dataRef.ConvertCookie ((LPDATAOBJECT) arg);
|
|
if ( pPastedCookie && pCertStore )
|
|
{
|
|
if ( ((CCertMgrCookie*) MMC_MULTI_SELECT_COOKIE) == pPastedCookie )
|
|
{
|
|
LPDATAOBJECT* ppDO = reinterpret_cast<LPDATAOBJECT*>((LPDATAOBJECT) param);
|
|
CCookiePtrArray rgCookiesCopied;
|
|
|
|
// Is multiple select, get all selected items and paste each one
|
|
LPDATAOBJECT pMSDO = (LPDATAOBJECT) arg;
|
|
if ( pMSDO )
|
|
{
|
|
CCertMgrDataObject* pDO = reinterpret_cast <CCertMgrDataObject*>(pMSDO);
|
|
ASSERT (pDO);
|
|
if ( pDO )
|
|
{
|
|
bool bRequestConfirmation = true;
|
|
CCertMgrCookie* pCookie = 0;
|
|
pDO->Reset();
|
|
while (pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pCookie), NULL) != S_FALSE)
|
|
{
|
|
hr = PasteCookie (pCookie, pTargetCookie, *pCertStore,
|
|
storeType, bContainsCerts, bContainsCRLs, bContainsCTLs,
|
|
hScopeItem, bRequestConfirmation, true,
|
|
pDataObject);
|
|
if ( SUCCEEDED (hr) && ppDO && S_FALSE != hr )
|
|
rgCookiesCopied.Add (pCookie);
|
|
else if ( FAILED (hr) )
|
|
break;
|
|
bRequestConfirmation = false;
|
|
}
|
|
}
|
|
else
|
|
return E_UNEXPECTED;
|
|
}
|
|
else
|
|
return E_UNEXPECTED;
|
|
|
|
|
|
if ( pCertStore && SUCCEEDED (hr) )
|
|
{
|
|
pCertStore->Commit ();
|
|
}
|
|
else
|
|
pCertStore->Resync ();
|
|
|
|
if ( !bContainsCerts )
|
|
{
|
|
// not necessary for certs - they're
|
|
//added to the end
|
|
m_pConsole->UpdateAllViews (pDataObject, 0, HINT_PASTE_COOKIE);
|
|
}
|
|
|
|
if ( !ppDO )
|
|
return S_OK;
|
|
|
|
*ppDO = 0;
|
|
|
|
|
|
|
|
if ( rgCookiesCopied.GetSize () == 0 )
|
|
return S_FALSE;
|
|
|
|
CComObject<CCertMgrDataObject>* pObject = 0;
|
|
hr = CComObject<CCertMgrDataObject>::CreateInstance(&pObject);
|
|
ASSERT(SUCCEEDED(hr));
|
|
if (FAILED(hr))
|
|
return hr;
|
|
|
|
ASSERT(pObject != NULL);
|
|
if (pObject == NULL)
|
|
return E_OUTOFMEMORY;
|
|
|
|
hr = pObject->Initialize (
|
|
pPastedCookie,
|
|
CCT_UNINITIALIZED,
|
|
FALSE,
|
|
0,
|
|
L"",
|
|
L"",
|
|
L"",
|
|
dataRef);
|
|
|
|
for (int i=0; i < rgCookiesCopied.GetSize(); ++i)
|
|
{
|
|
pObject->AddCookie(rgCookiesCopied[i]);
|
|
}
|
|
|
|
hr = pObject->QueryInterface(
|
|
IID_PPV_ARG (IDataObject, ppDO));
|
|
|
|
return hr;
|
|
}
|
|
else
|
|
{
|
|
hr = PasteCookie (pPastedCookie, pTargetCookie, *pCertStore,
|
|
storeType, bContainsCerts, bContainsCRLs, bContainsCTLs,
|
|
hScopeItem, true, false,
|
|
pDataObject);
|
|
if ( pCertStore && SUCCEEDED (hr) )
|
|
{
|
|
if ( param ) // a non-NULL value indicates that a cut/move is desired
|
|
{
|
|
LPDATAOBJECT srcDO = (LPDATAOBJECT) arg;
|
|
LPDATAOBJECT* ppDO = reinterpret_cast<LPDATAOBJECT*>(param);
|
|
hr = srcDO->QueryInterface(
|
|
IID_PPV_ARG (IDataObject, ppDO));
|
|
}
|
|
m_pPastedDO = (LPDATAOBJECT) arg;
|
|
pCertStore->Commit ();
|
|
}
|
|
else
|
|
pCertStore->Resync ();
|
|
if ( !bContainsCerts )
|
|
{
|
|
// not necessary for certs - they're
|
|
//added to the end
|
|
m_pConsole->UpdateAllViews (pDataObject, 0, HINT_PASTE_COOKIE);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( pCertStore )
|
|
{
|
|
pCertStore->Release ();
|
|
pCertStore = 0;
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnNotifyPaste: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::PasteCookie (
|
|
CCertMgrCookie* pPastedCookie,
|
|
CCertMgrCookie* pTargetCookie,
|
|
CCertStore& rCertStore,
|
|
SPECIAL_STORE_TYPE storeType,
|
|
bool bContainsCerts,
|
|
bool bContainsCRLs,
|
|
bool bContainsCTLs,
|
|
HSCOPEITEM hScopeItem,
|
|
bool bRequestConfirmation,
|
|
bool bIsMultipleSelect,
|
|
LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::PasteCookie\n");
|
|
HRESULT hr = S_OK;
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
switch (pPastedCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*>(pPastedCookie);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
DWORD dwFlags = 0;
|
|
CCertStore* pStore = pCert->GetCertStore ();
|
|
if ( pStore )
|
|
{
|
|
if ( CERT_SYSTEM_STORE_LOCAL_MACHINE == QueryComponentDataRef ().m_dwLocationPersist )
|
|
dwFlags = CRYPT_FIND_MACHINE_KEYSET_FLAG;
|
|
bool bDeletePrivateKey = DeletePrivateKey (rCertStore, *pStore);
|
|
if ( bRequestConfirmation &&
|
|
pCert->GetStoreType () == MY_STORE &&
|
|
bDeletePrivateKey &&
|
|
::CryptFindCertificateKeyProvInfo (
|
|
pCert->GetCertContext (), dwFlags, 0) )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
int iRetVal = IDNO;
|
|
|
|
if ( bIsMultipleSelect )
|
|
VERIFY (text.LoadString (IDS_WARNING_MULTI_CERT_COPY_W_PRIVATE_KEY_MULTI));
|
|
else
|
|
VERIFY (text.LoadString (IDS_WARNING_CERT_COPY_W_PRIVATE_KEY));
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_COPY));
|
|
hr = m_pConsole->MessageBox (text, caption,
|
|
MB_ICONWARNING | MB_YESNO, &iRetVal);
|
|
ASSERT (SUCCEEDED (hr));
|
|
if ( iRetVal == IDNO )
|
|
return E_FAIL;
|
|
}
|
|
|
|
hr = CopyPastedCert (pCert, rCertStore, storeType, bDeletePrivateKey,
|
|
pTargetCookie, pDataObject);
|
|
if ( SUCCEEDED (hr) && S_FALSE != hr )
|
|
{
|
|
hr = pTargetCookie->Commit ();
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
if ( !bContainsCerts )
|
|
hr = QueryComponentDataRef ().CreateContainers (
|
|
hScopeItem, rCertStore);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*>(pPastedCookie);
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
{
|
|
hr = CopyPastedCRL (pCRL, rCertStore);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
pTargetCookie->Commit ();
|
|
if ( !bContainsCRLs )
|
|
hr = QueryComponentDataRef ().CreateContainers (hScopeItem,
|
|
rCertStore);
|
|
}
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*>(pPastedCookie);
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
{
|
|
hr = CopyPastedCTL (pCTL, rCertStore);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
pTargetCookie->Commit ();
|
|
if ( !bContainsCTLs )
|
|
hr = QueryComponentDataRef ().CreateContainers (hScopeItem,
|
|
rCertStore);
|
|
}
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
{
|
|
CAutoCertRequest* pAutoCert = reinterpret_cast <CAutoCertRequest*>(pPastedCookie);
|
|
ASSERT (pAutoCert);
|
|
if ( pAutoCert )
|
|
{
|
|
hr = CopyPastedCTL (pAutoCert, rCertStore);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
pTargetCookie->Commit ();
|
|
if ( !bContainsCTLs )
|
|
hr = QueryComponentDataRef ().CreateContainers (hScopeItem,
|
|
rCertStore);
|
|
}
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::PasteCookie: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::OnNotifyQueryPaste(
|
|
LPDATAOBJECT pDataObject,
|
|
LPARAM arg,
|
|
LPARAM /*param*/)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnNotifyQueryPaste\n");
|
|
ASSERT (pDataObject && arg);
|
|
if ( !pDataObject || !arg )
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_FALSE;
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
|
|
// NTRAID# 456366 SAFER RSOP: Dragging certificates into "Additional
|
|
// Rules" should be prevented in RSOP mode.
|
|
if ( dataRef.m_bIsRSOP ) // no paste allowed if RSOP
|
|
return hr;
|
|
|
|
CCertMgrCookie* pTargetCookie = dataRef.ConvertCookie (pDataObject);
|
|
ASSERT (pTargetCookie);
|
|
if ( pTargetCookie )
|
|
{
|
|
CCertMgrCookie* pPastedCookie =
|
|
dataRef.ConvertCookie ((LPDATAOBJECT) arg);
|
|
if ( pPastedCookie )
|
|
{
|
|
// If this is multi-selection, get the first selected object
|
|
// and substitute it for the pasted cookie.
|
|
if ( ((CCertMgrCookie*) MMC_MULTI_SELECT_COOKIE) == pPastedCookie )
|
|
{
|
|
LPDATAOBJECT pMSDO = (LPDATAOBJECT) arg;
|
|
if ( pMSDO )
|
|
{
|
|
CCertMgrDataObject* pDO = reinterpret_cast <CCertMgrDataObject*>(pMSDO);
|
|
ASSERT (pDO);
|
|
if ( pDO )
|
|
{
|
|
pDO->Reset();
|
|
if (pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pPastedCookie), NULL) == S_FALSE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
else
|
|
return E_UNEXPECTED;
|
|
}
|
|
else
|
|
return E_UNEXPECTED;
|
|
|
|
}
|
|
|
|
switch (pPastedCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
switch (pTargetCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
{
|
|
CCertStore* pTargetStore = reinterpret_cast <CCertStore*> (pTargetCookie);
|
|
if ( pTargetStore )
|
|
{
|
|
CCertStore* pSourceStore =
|
|
reinterpret_cast <CCertificate*> (pPastedCookie)->GetCertStore ();
|
|
|
|
if ( pSourceStore )
|
|
{
|
|
if ( pTargetStore->IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( *pSourceStore == *pTargetStore )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERT_CONTAINER:
|
|
{
|
|
CContainerCookie* pContainer = reinterpret_cast <CContainerCookie*> (pTargetCookie);
|
|
if ( pContainer )
|
|
{
|
|
CCertStore* pSourceStore =
|
|
reinterpret_cast <CCertificate*> (pPastedCookie)->GetCertStore ();
|
|
|
|
if ( pSourceStore )
|
|
{
|
|
if ( pContainer->GetCertStore ().IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( *pSourceStore == pContainer->GetCertStore () )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pTargetCookie);
|
|
if ( pCert )
|
|
{
|
|
CCertStore* pSourceStore =
|
|
reinterpret_cast <CCertificate*> (pPastedCookie)->GetCertStore ();
|
|
CCertStore* pTargetStore = pCert->GetCertStore ();
|
|
|
|
if ( pSourceStore && pTargetStore )
|
|
{
|
|
if ( pTargetStore->IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( *pSourceStore == *pTargetStore )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
{
|
|
CCertStoreGPE* pTargetStore =
|
|
reinterpret_cast <CCertStoreGPE*> (pTargetCookie);
|
|
ASSERT (pTargetStore);
|
|
if ( pTargetStore )
|
|
{
|
|
if ( TRUST_STORE == pTargetStore->GetStoreType () )
|
|
hr = S_FALSE;
|
|
else
|
|
{
|
|
CCertStore* pSourceStore =
|
|
reinterpret_cast <CCertificate*> (pPastedCookie)->GetCertStore ();
|
|
if ( pSourceStore )
|
|
{
|
|
if ( *pSourceStore == *pTargetStore )
|
|
hr = S_FALSE;
|
|
else if ( pTargetStore->CanContain (pPastedCookie->m_objecttype) &&
|
|
!pTargetStore->IsReadOnly () )
|
|
hr = S_OK;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
CCertStoreRSOP* pTargetStore =
|
|
reinterpret_cast <CCertStoreRSOP*> (pTargetCookie);
|
|
ASSERT (pTargetStore);
|
|
if ( pTargetStore )
|
|
{
|
|
CCertStore* pSourceStore =
|
|
reinterpret_cast <CCertificate*> (pPastedCookie)->GetCertStore ();
|
|
if ( pSourceStore )
|
|
{
|
|
if ( *pSourceStore == *pTargetStore )
|
|
hr = S_FALSE;
|
|
else if ( pTargetStore->CanContain (pPastedCookie->m_objecttype) &&
|
|
!pTargetStore->IsReadOnly () )
|
|
hr = S_OK;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
hr = S_OK;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
switch (pTargetCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
{
|
|
CCertStore* pTargetStore = reinterpret_cast <CCertStore*> (pTargetCookie);
|
|
if ( pTargetStore )
|
|
{
|
|
CCertStore& rSourceStore =
|
|
reinterpret_cast <CCRL*> (pPastedCookie)->GetCertStore ();
|
|
if ( pTargetStore->IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( rSourceStore == *pTargetStore )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL_CONTAINER:
|
|
{
|
|
CContainerCookie* pContainer = reinterpret_cast <CContainerCookie*> (pTargetCookie);
|
|
if ( pContainer )
|
|
{
|
|
CCertStore& rSourceStore =
|
|
reinterpret_cast <CCRL*> (pPastedCookie)->GetCertStore ();
|
|
|
|
if ( pContainer->GetCertStore ().IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( rSourceStore == pContainer->GetCertStore () )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pTargetCookie);
|
|
if ( pCRL )
|
|
{
|
|
CCertStore* pSourceStore =
|
|
reinterpret_cast <CCertificate*> (pPastedCookie)->GetCertStore ();
|
|
CCertStore& rTargetStore = pCRL->GetCertStore ();
|
|
|
|
if ( pSourceStore )
|
|
{
|
|
if ( rTargetStore.IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( *pSourceStore == rTargetStore )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
switch (pTargetCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
{
|
|
CCertStore* pTargetStore = reinterpret_cast <CCertStore*> (pTargetCookie);
|
|
if ( pTargetStore )
|
|
{
|
|
CCertStore& rSourceStore =
|
|
reinterpret_cast <CCTL*> (pPastedCookie)->GetCertStore ();
|
|
if ( pTargetStore->IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( rSourceStore == *pTargetStore )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL_CONTAINER:
|
|
{
|
|
CContainerCookie* pContainer = reinterpret_cast <CContainerCookie*> (pTargetCookie);
|
|
if ( pContainer )
|
|
{
|
|
CCertStore& rSourceStore =
|
|
reinterpret_cast <CCTL*> (pPastedCookie)->GetCertStore ();
|
|
|
|
if ( pContainer->GetCertStore ().IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( rSourceStore == pContainer->GetCertStore () )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pTargetCookie);
|
|
if ( pCTL )
|
|
{
|
|
CCertStore* pSourceStore =
|
|
reinterpret_cast <CCertificate*> (pPastedCookie)->GetCertStore ();
|
|
CCertStore& rTargetStore = pCTL->GetCertStore ();
|
|
|
|
if ( pSourceStore )
|
|
{
|
|
if ( rTargetStore.IsReadOnly () )
|
|
hr = S_FALSE;
|
|
else if ( *pSourceStore == rTargetStore )
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
CCertStore* pTargetStore =
|
|
reinterpret_cast <CCertStore*> (pTargetCookie);
|
|
ASSERT (pTargetStore);
|
|
if ( pTargetStore )
|
|
{
|
|
CCertStore& rSourceStore =
|
|
reinterpret_cast <CCTL*> (pPastedCookie)->GetCertStore ();
|
|
if ( rSourceStore == *pTargetStore )
|
|
hr = S_FALSE;
|
|
else if ( pTargetStore->CanContain (pPastedCookie->m_objecttype) &&
|
|
!pTargetStore->IsReadOnly () )
|
|
hr = S_OK;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
switch (pTargetCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
CCertStore* pTargetStore =
|
|
reinterpret_cast <CCertStore*> (pTargetCookie);
|
|
ASSERT (pTargetStore);
|
|
if ( pTargetStore )
|
|
{
|
|
if ( ACRS_STORE == pTargetStore->GetStoreType () &&
|
|
!pTargetStore->IsReadOnly ())
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
ASSERT (0);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnNotifyQueryPaste: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::CopyPastedCert(
|
|
CCertificate * pCert,
|
|
CCertStore& rCertStore,
|
|
const SPECIAL_STORE_TYPE /*storeType*/,
|
|
bool bDeletePrivateKey,
|
|
CCertMgrCookie* pTargetCookie,
|
|
LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::CopyPastedCert\n");
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
|
|
HRESULT hr = S_OK;
|
|
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
PCCERT_CONTEXT pCertContext = pCert->GetCertContext ();
|
|
ASSERT (pCertContext);
|
|
if ( pCertContext )
|
|
{
|
|
bool bCertWasReplaced = false;
|
|
|
|
hr = rCertStore.AddCertificateContext (pCertContext,
|
|
m_pConsole, bDeletePrivateKey, 0, &bCertWasReplaced);
|
|
if ( FAILED (hr) && S_FALSE != hr )
|
|
{
|
|
if ( HRESULT_FROM_WIN32 (CRYPT_E_EXISTS) != hr )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
int iRetVal = 0;
|
|
if ( E_INVALIDARG == hr && !rCertStore.GetStoreHandle () )
|
|
{
|
|
text.FormatMessage (IDS_CERT_CANNOT_BE_PASTED_CANT_OPEN_STORE,
|
|
rCertStore.GetLocalizedName ());
|
|
}
|
|
else
|
|
{
|
|
text.FormatMessage (IDS_CERT_CANNOT_BE_PASTED,
|
|
rCertStore.GetLocalizedName (),
|
|
GetSystemMessage (hr));
|
|
}
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( CERTMGR_CERT_CONTAINER == pTargetCookie->m_objecttype )
|
|
{
|
|
CContainerCookie* pContainerCookie = dynamic_cast <CContainerCookie*> (pTargetCookie);
|
|
if ( pContainerCookie )
|
|
{
|
|
if ( pContainerCookie->IsSelected () )
|
|
{
|
|
if ( !bCertWasReplaced )
|
|
{
|
|
// Add certificate to result pane
|
|
RESULTDATAITEM rdItem;
|
|
CCookie& rootCookie =
|
|
QueryComponentDataRef ().QueryBaseRootCookie ();
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&rdItem, sizeof (rdItem));
|
|
rdItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM | RDI_STATE;
|
|
rdItem.nImage = iIconCertificate;
|
|
rdItem.nCol = 0;
|
|
rdItem.nState = LVIS_SELECTED | LVIS_FOCUSED;
|
|
rdItem.str = MMC_TEXTCALLBACK;
|
|
|
|
CCertificate* pNewCert = new CCertificate (
|
|
::CertDuplicateCertificateContext (pCertContext),
|
|
&rCertStore);
|
|
if ( pNewCert )
|
|
{
|
|
rootCookie.m_listResultCookieBlocks.AddHead (pNewCert);
|
|
rdItem.lParam = (LPARAM) pNewCert;
|
|
pCert->m_resultDataID = m_pResultData;
|
|
hr = m_pResultData->InsertItem (&rdItem);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr);
|
|
}
|
|
else
|
|
{
|
|
hr = DisplayCertificateCountByStore (m_pConsole,
|
|
&rCertStore, false);
|
|
}
|
|
}
|
|
else
|
|
hr = E_OUTOFMEMORY;
|
|
ASSERT (SUCCEEDED (hr));
|
|
}
|
|
else
|
|
{
|
|
// Cert was replaced. Since a deletion needs to
|
|
// be performed, it's easier just to refresh
|
|
// the pane
|
|
hr = m_pConsole->UpdateAllViews (pDataObject, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::CopyPastedCert: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
HRESULT CCertMgrComponent::CopyPastedCTL(CCTL * pCTL, CCertStore& rCertStore)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::CopyPastedCTL\n");
|
|
HRESULT hr = S_OK;
|
|
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
{
|
|
PCCTL_CONTEXT pCTLContext = pCTL->GetCTLContext ();
|
|
ASSERT (pCTLContext);
|
|
if ( pCTLContext )
|
|
{
|
|
bool bResult = rCertStore.AddCTLContext (pCTLContext);
|
|
if ( !bResult )
|
|
{
|
|
DWORD dwErr = GetLastError ();
|
|
if ( CRYPT_E_EXISTS == dwErr )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
int iRetVal = 0;
|
|
|
|
|
|
VERIFY (text.LoadString (IDS_DUPLICATE_CTL));
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
hr = m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal);
|
|
ASSERT (SUCCEEDED (hr));
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
ASSERT (0);
|
|
hr = HRESULT_FROM_WIN32 (dwErr);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::CopyPastedCTL: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::CopyPastedCRL(CCRL * pCRL, CCertStore& rCertStore)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::CopyPastedCRL\n");
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
|
|
HRESULT hr = S_OK;
|
|
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
{
|
|
PCCRL_CONTEXT pCRLContext = pCRL->GetCRLContext ();
|
|
ASSERT (pCRLContext);
|
|
if ( pCRLContext )
|
|
{
|
|
bool bResult = rCertStore.AddCRLContext (pCRLContext);
|
|
if ( !bResult )
|
|
{
|
|
DWORD dwErr = GetLastError ();
|
|
if ( CRYPT_E_EXISTS == dwErr )
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
int iRetVal = 0;
|
|
|
|
|
|
VERIFY (text.LoadString (IDS_DUPLICATE_CRL));
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
hr = m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal);
|
|
ASSERT (SUCCEEDED (hr));
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
ASSERT (0);
|
|
hr = HRESULT_FROM_WIN32 (dwErr);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::CopyPastedCRL: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CCertMgrComponent::GetResultViewType(MMC_COOKIE cookie,
|
|
BSTR* ppViewType,
|
|
long* pViewOptions)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::GetResultViewType\n");
|
|
HRESULT hr = S_FALSE;
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
CCertMgrCookie* pScopeCookie = reinterpret_cast <CCertMgrCookie*> (cookie);
|
|
if ( pScopeCookie )
|
|
{
|
|
switch (pScopeCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERT_CONTAINER:
|
|
case CERTMGR_CTL_CONTAINER:
|
|
case CERTMGR_CRL_CONTAINER:
|
|
case CERTMGR_USAGE:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
if ( !dataRef.m_bIsRSOP )
|
|
*pViewOptions |= MMC_VIEW_OPTIONS_MULTISELECT;
|
|
*ppViewType = NULL;
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
CCertStore* pStore = reinterpret_cast <CCertStore*> (pScopeCookie);
|
|
if ( pStore &&
|
|
EFS_STORE == pStore->GetStoreType ()
|
|
&& pStore->IsNullEFSPolicy () )
|
|
{
|
|
*pViewOptions = MMC_VIEW_OPTIONS_NOLISTVIEWS;
|
|
|
|
LPOLESTR psz = NULL;
|
|
StringFromCLSID(CLSID_MessageView, &psz);
|
|
|
|
USES_CONVERSION;
|
|
|
|
if (psz != NULL)
|
|
{
|
|
*ppViewType = psz;
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( !dataRef.m_bIsRSOP )
|
|
*pViewOptions |= MMC_VIEW_OPTIONS_MULTISELECT;
|
|
*ppViewType = NULL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
{
|
|
CSaferRootCookie* pSaferRootCookie = dynamic_cast <CSaferRootCookie*> (pScopeCookie);
|
|
if ( pSaferRootCookie )
|
|
{
|
|
if ( pSaferRootCookie->m_bCreateSaferNodes )
|
|
{
|
|
*ppViewType = NULL;
|
|
}
|
|
else
|
|
{
|
|
*pViewOptions = MMC_VIEW_OPTIONS_NOLISTVIEWS;
|
|
|
|
LPOLESTR psz = NULL;
|
|
StringFromCLSID(CLSID_MessageView, &psz);
|
|
|
|
USES_CONVERSION;
|
|
|
|
if (psz != NULL)
|
|
{
|
|
*ppViewType = psz;
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
*ppViewType = NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::GetResultViewType: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CCertMgrComponent::Initialize(LPCONSOLE lpConsole)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::Initialize\n");
|
|
HRESULT hr = CComponent::Initialize (lpConsole);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
ASSERT (m_pHeader);
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
dataRef.m_pHeader = m_pHeader;
|
|
|
|
SetComponentDataConsolePointer (m_pConsole);
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::Initialize: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::LoadColumnsFromArrays (INT objecttype )
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::LoadColumnsFromArrays\n");
|
|
ASSERT (m_pHeader);
|
|
|
|
CString str;
|
|
for ( INT i = 0; 0 != m_Columns[objecttype][i]; i++)
|
|
{
|
|
VERIFY(str.LoadString (m_Columns[objecttype][i]));
|
|
m_pHeader->InsertColumn(i, const_cast<LPWSTR>((LPCWSTR)str), LVCFMT_LEFT,
|
|
m_ColumnWidths[objecttype][i]);
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::LoadColumnsFromArrays: S_OK\n");
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::SaveWidths(CCertMgrCookie * pCookie)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::SaveWidths\n");
|
|
HRESULT hr = S_OK;
|
|
|
|
m_fDirty = TRUE;
|
|
|
|
ASSERT (pCookie);
|
|
if ( pCookie )
|
|
{
|
|
switch (m_pViewedCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_SNAPIN:
|
|
case CERTMGR_USAGE:
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_CRL_CONTAINER:
|
|
case CERTMGR_CTL_CONTAINER:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
{
|
|
const UINT* pColumns = m_Columns[m_pViewedCookie->m_objecttype];
|
|
ASSERT(pColumns);
|
|
int nWidth = 0;
|
|
|
|
for (UINT iIndex = 0; iIndex < pColumns[iIndex]; iIndex++)
|
|
{
|
|
hr = m_pHeader->GetColumnWidth ((int) iIndex, &nWidth);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
m_ColumnWidths[m_pViewedCookie->m_objecttype][iIndex] =
|
|
(UINT) nWidth;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
case CERTMGR_CRL:
|
|
case CERTMGR_CTL:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::SaveWidths: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
#define _dwMagicword 10001 // Internal version number
|
|
STDMETHODIMP CCertMgrComponent::Load(IStream __RPC_FAR *pIStream)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::Load\n");
|
|
HRESULT hr = S_OK;
|
|
|
|
#ifndef DONT_PERSIST
|
|
ASSERT (pIStream);
|
|
XSafeInterfacePtr<IStream> pIStreamSafePtr( pIStream );
|
|
|
|
// Read the magic word from the stream
|
|
DWORD dwMagicword = 0;
|
|
hr = pIStream->Read (&dwMagicword, sizeof(dwMagicword), NULL);
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT( FALSE );
|
|
return hr;
|
|
}
|
|
if (dwMagicword != _dwMagicword)
|
|
{
|
|
// We have a version mismatch
|
|
_TRACE (0, L"INFO: CCertMgrComponentData::Load() - Wrong Magicword. You need to re-save your .msc file.\n");
|
|
return S_OK;
|
|
}
|
|
|
|
int numCols = 0;
|
|
|
|
for (int iIndex = 0; iIndex < CERTMGR_NUMTYPES && SUCCEEDED (hr); iIndex++)
|
|
{
|
|
switch (iIndex)
|
|
{
|
|
case CERTMGR_USAGE:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
numCols = CERT_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_CRL_CONTAINER:
|
|
numCols = CRL_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_CTL_CONTAINER:
|
|
numCols = CTL_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_SNAPIN:
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
case CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_USER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_COMPUTER_ENFORCEMENT:
|
|
case CERTMGR_SAFER_USER_ENFORCEMENT:
|
|
numCols = 1;
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
numCols = SAFER_LEVELS_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
numCols = SAFER_ENTRIES_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
case CERTMGR_CRL:
|
|
case CERTMGR_CTL:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
continue;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
|
|
for (int colNum = 0; colNum < numCols; colNum++)
|
|
{
|
|
hr = pIStream->Read (&(m_ColumnWidths[iIndex][colNum]),
|
|
sizeof (UINT), NULL);
|
|
ASSERT (SUCCEEDED (hr));
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT (FALSE);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::Load: 0x%x\n", hr);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CCertMgrComponent::Save(
|
|
IStream __RPC_FAR *pIStream,
|
|
BOOL /*fSameAsLoad*/)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::Save\n");
|
|
HRESULT hr = S_OK;
|
|
|
|
|
|
#ifndef DONT_PERSIST
|
|
ASSERT (pIStream);
|
|
XSafeInterfacePtr<IStream> pIStreamSafePtr (pIStream);
|
|
|
|
// Store the magic word to the stream
|
|
DWORD dwMagicword = _dwMagicword;
|
|
hr = pIStream->Write (&dwMagicword, sizeof(dwMagicword), NULL);
|
|
ASSERT (SUCCEEDED (hr));
|
|
if ( FAILED (hr) )
|
|
return hr;
|
|
|
|
|
|
int numCols = 0;
|
|
|
|
for (int iIndex = 0; iIndex < CERTMGR_NUMTYPES && SUCCEEDED (hr); iIndex++)
|
|
{
|
|
switch (iIndex)
|
|
{
|
|
case CERTMGR_USAGE:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
numCols = CERT_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_CRL_CONTAINER:
|
|
numCols = CRL_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_CTL_CONTAINER:
|
|
numCols = CTL_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_SNAPIN:
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
case CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_USER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_COMPUTER_ENFORCEMENT:
|
|
case CERTMGR_SAFER_USER_ENFORCEMENT:
|
|
numCols = 1;
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
numCols = SAFER_ENTRIES_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
numCols = SAFER_LEVELS_NUM_COLS;
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
case CERTMGR_CRL:
|
|
case CERTMGR_CTL:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
continue;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
|
|
for (int colNum = 0; colNum < numCols; colNum++)
|
|
{
|
|
hr = pIStream->Write (&(m_ColumnWidths[iIndex][colNum]),
|
|
sizeof (UINT), NULL);
|
|
ASSERT (SUCCEEDED (hr));
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT (FALSE);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::Save: 0x%x\n", hr);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::OnNotifyCutOrMove(LPARAM arg)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnNotifyCutOrMove\n");
|
|
if ( !arg )
|
|
return E_POINTER;
|
|
|
|
LPDATAOBJECT pDataObject = reinterpret_cast <IDataObject*> (arg);
|
|
ASSERT (pDataObject);
|
|
if ( !pDataObject )
|
|
return E_UNEXPECTED;
|
|
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
CCertMgrCookie* pCookie =
|
|
QueryComponentDataRef ().ConvertCookie (pDataObject);
|
|
if ( pCookie )
|
|
{
|
|
if ( ((CCertMgrCookie*) MMC_MULTI_SELECT_COOKIE) == pCookie )
|
|
{
|
|
CCertMgrDataObject* pDO = reinterpret_cast <CCertMgrDataObject*>(pDataObject);
|
|
ASSERT (pDO);
|
|
if ( pDO )
|
|
{
|
|
// CCertStore& rCertStore = pCookie->GetCertStore ();
|
|
pDO->Reset();
|
|
while (pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pCookie), NULL) != S_FALSE)
|
|
{
|
|
hr = DeleteCookie (pCookie, pDataObject, false, true, false);
|
|
}
|
|
|
|
// hr = rCertStore.Commit ();
|
|
// if ( SUCCEEDED (hr) )
|
|
// rCertStore.Resync ();
|
|
}
|
|
else
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
hr = DeleteCookie (pCookie, pDataObject, false, false, true);
|
|
}
|
|
if ( SUCCEEDED (hr) )
|
|
RefreshResultPane ();
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnNotifyCutOrMove: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
CCertMgrCookie* CCertMgrComponent::ConvertCookie(LPDATAOBJECT pDataObject)
|
|
{
|
|
CCertMgrCookie* pCookie = 0;
|
|
|
|
pCookie = QueryComponentDataRef ().ConvertCookie (pDataObject);
|
|
return pCookie;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::OnOpen (LPDATAOBJECT pDataObject)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnOpen\n");
|
|
HRESULT hr = S_OK;
|
|
ASSERT (pDataObject);
|
|
CCertMgrCookie* pParentCookie = ConvertCookie (pDataObject);
|
|
if ( pParentCookie )
|
|
{
|
|
switch (pParentCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pParentCookie);
|
|
ASSERT (pCert);
|
|
if ( pCert )
|
|
{
|
|
hr = LaunchCommonCertDialog (pCert);
|
|
if ( hr == CRYPT_E_NOT_FOUND )
|
|
m_pConsole->UpdateAllViews (pDataObject, 0, 0);
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pParentCookie);
|
|
ASSERT (pCTL);
|
|
if ( pCTL )
|
|
{
|
|
hr = LaunchCommonCTLDialog (pCTL);
|
|
if ( SUCCEEDED (hr) )
|
|
hr = RefreshResultItem (pParentCookie);
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pParentCookie);
|
|
ASSERT (pCRL);
|
|
if ( pCRL )
|
|
{
|
|
hr = LaunchCommonCRLDialog (pCRL);
|
|
if ( SUCCEEDED (hr) )
|
|
hr = RefreshResultItem (pParentCookie);
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
break;
|
|
|
|
break;
|
|
|
|
default:
|
|
ASSERT (0);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnOpen: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::LaunchCommonCertDialog (CCertificate* pCert)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::LaunchCommonCertDialog\n");
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
ASSERT (pCert);
|
|
if ( !pCert )
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_OK;
|
|
if ( pCert->IsCertStillInStore () )
|
|
{
|
|
CWaitCursor waitCursor;
|
|
HWND hwndParent = 0;
|
|
|
|
hr = m_pConsole->GetMainWindow (&hwndParent);
|
|
ASSERT (SUCCEEDED (hr));
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
CTypedPtrList<CPtrList, CCertStore*> storeList;
|
|
|
|
// Add the Root store first on a remote machine.
|
|
if ( !IsLocalComputername (dataRef.GetManagedComputer ()) )
|
|
{
|
|
storeList.AddTail (new CCertStore (CERTMGR_LOG_STORE,
|
|
CERT_STORE_PROV_SYSTEM,
|
|
CERT_SYSTEM_STORE_LOCAL_MACHINE,
|
|
(LPCWSTR) dataRef.GetManagedComputer (),
|
|
ROOT_SYSTEM_STORE_NAME,
|
|
ROOT_SYSTEM_STORE_NAME,
|
|
_T (""), ROOT_STORE,
|
|
CERT_SYSTEM_STORE_LOCAL_MACHINE,
|
|
m_pConsole));
|
|
}
|
|
|
|
hr = dataRef.EnumerateLogicalStores (&storeList);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
POSITION pos = 0;
|
|
POSITION prevPos = 0;
|
|
|
|
// Validate store handles
|
|
for (pos = storeList.GetHeadPosition ();
|
|
pos;)
|
|
{
|
|
prevPos = pos;
|
|
CCertStore* 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 () )
|
|
{
|
|
int iRetVal = 0;
|
|
CString caption;
|
|
CString text;
|
|
|
|
text.FormatMessage (IDS_CANT_OPEN_STORE_AND_FAIL, pStore->GetLocalizedName ());
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
hr = E_FAIL;
|
|
VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption,
|
|
MB_ICONWARNING | MB_OK, &iRetVal)));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Proceed only if all handles are valid
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
CRYPTUI_VIEWCERTIFICATE_STRUCT vcs;
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&vcs, sizeof (vcs));
|
|
vcs.dwSize = sizeof (vcs);
|
|
vcs.hwndParent = hwndParent;
|
|
|
|
// Set these flags only on a remote machine.
|
|
if ( !IsLocalComputername (dataRef.GetManagedComputer ()) )
|
|
vcs.dwFlags = CRYPTUI_DONT_OPEN_STORES | CRYPTUI_WARN_UNTRUSTED_ROOT;
|
|
else
|
|
vcs.dwFlags = 0;
|
|
|
|
// All dialogs should be read-only under RSOP
|
|
if ( dataRef.m_bIsRSOP || pCert->IsReadOnly () )
|
|
vcs.dwFlags |= CRYPTUI_DISABLE_EDITPROPERTIES;
|
|
|
|
// NTRAID # 546105 PKP GrpPol: Revoked certs that are
|
|
// installed into EFS policy do not indicate "revoked" in
|
|
// properties.
|
|
// If this is RSOP or Group Policy and the store is EFS, then
|
|
// check revocation
|
|
if ( (dataRef.m_bIsRSOP || dataRef.m_pGPEInformation) &&
|
|
pCert->GetCertStore () &&
|
|
EFS_STORE == pCert->GetCertStore ()->GetStoreType () )
|
|
{
|
|
vcs.dwFlags |= CRYPTUI_ENABLE_REVOCATION_CHECKING;
|
|
}
|
|
|
|
vcs.pCertContext = pCert->GetNewCertContext ();
|
|
vcs.cStores = (DWORD)storeList.GetCount ();
|
|
vcs.rghStores = new HCERTSTORE[vcs.cStores];
|
|
if ( vcs.rghStores )
|
|
{
|
|
CCertStore* pStore = 0;
|
|
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;
|
|
_TRACE (0, L"Calling CryptUIDlgViewCertificate()\n");
|
|
CThemeContextActivator activator;
|
|
BOOL bResult = ::CryptUIDlgViewCertificate (&vcs, &fPropertiesChanged);
|
|
if ( bResult )
|
|
{
|
|
if ( fPropertiesChanged )
|
|
{
|
|
pStore = pCert->GetCertStore ();
|
|
if ( pStore )
|
|
{
|
|
pStore->SetDirty ();
|
|
pStore->Commit ();
|
|
pStore->Close ();
|
|
if ( IDM_USAGE_VIEW == dataRef.m_activeViewPersist )
|
|
{
|
|
// In case purposes were changed and the cert needs to be removed
|
|
RefreshResultPane ();
|
|
}
|
|
else
|
|
RefreshResultItem (pCert);
|
|
}
|
|
}
|
|
}
|
|
|
|
delete vcs.rghStores;
|
|
}
|
|
else
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
while (!storeList.IsEmpty () )
|
|
{
|
|
CCertStore* pStore = storeList.RemoveHead ();
|
|
if ( pStore )
|
|
{
|
|
pStore->Close ();
|
|
pStore->Release ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CString text;
|
|
CString caption;
|
|
|
|
VERIFY (caption.LoadString (IDS_CERTIFICATE_MANAGER));
|
|
VERIFY (text.LoadString (
|
|
IDS_CANCEL_BECAUSE_CERT_HAS_BEEN_DELETED));
|
|
int iRetVal = 0;
|
|
VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption,
|
|
MB_OK, &iRetVal)));
|
|
|
|
hr = CRYPT_E_NOT_FOUND;
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::LaunchCommonCertDialog: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::RefreshResultItem (CCertMgrCookie* pCookie)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::RefreshResultItem\n");
|
|
HRESULT hr = S_OK;
|
|
if ( pCookie )
|
|
{
|
|
HRESULTITEM itemID = 0;
|
|
|
|
if ( m_pResultData )
|
|
{
|
|
pCookie->Refresh ();
|
|
hr = m_pResultData->FindItemByLParam ( (LPARAM) pCookie, &itemID);
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
hr = m_pResultData->UpdateItem (itemID);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IResultData::UpdateItem () failed: 0x%x\n", hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"IResultData::FindItemByLParam () failed: 0x%x\n", hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"Unexpected error: m_pResultData was NULL\n");
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_TRACE (0, L"Unexpected error: pCookie parameter was NULL\n");
|
|
hr = E_POINTER;
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::RefreshResultItem: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::LaunchCommonCTLDialog (CCTL* pCTL)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::LaunchCommonCTLDialog\n");
|
|
HRESULT hr = S_OK;
|
|
if ( pCTL )
|
|
{
|
|
CRYPTUI_VIEWCTL_STRUCT vcs;
|
|
HWND hwndParent = 0;
|
|
|
|
hr = m_pConsole->GetMainWindow (&hwndParent);
|
|
if ( FAILED (hr) )
|
|
{
|
|
_TRACE (0, L"IConsole::GetMainWindow () failed: 0x%x\n", hr);
|
|
}
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&vcs, sizeof (vcs));
|
|
vcs.dwSize = sizeof (vcs);
|
|
vcs.hwndParent = hwndParent;
|
|
vcs.dwFlags = 0;
|
|
|
|
// All dialogs should be read-only under RSOP
|
|
if ( QueryComponentDataRef ().m_bIsRSOP )
|
|
vcs.dwFlags |= CRYPTUI_DISABLE_EDITPROPERTIES;
|
|
|
|
vcs.pCTLContext = pCTL->GetCTLContext ();
|
|
|
|
CThemeContextActivator activator;
|
|
VERIFY (::CryptUIDlgViewCTL (&vcs));
|
|
}
|
|
else
|
|
hr = E_POINTER;
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::LaunchCommonCTLDialog: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::LaunchCommonCRLDialog (CCRL* pCRL)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::LaunchCommonCRLDialog\n");
|
|
ASSERT (pCRL);
|
|
CRYPTUI_VIEWCRL_STRUCT vcs;
|
|
HWND hwndParent;
|
|
HRESULT hr = m_pConsole->GetMainWindow (&hwndParent);
|
|
ASSERT (SUCCEEDED (hr));
|
|
|
|
// security review 2/26/2002 BryanWal ok
|
|
::ZeroMemory (&vcs, sizeof (vcs));
|
|
vcs.dwSize = sizeof (vcs);
|
|
vcs.hwndParent = hwndParent;
|
|
vcs.dwFlags = 0;
|
|
|
|
// All dialogs should be read-only under RSOP
|
|
if ( QueryComponentDataRef ().m_bIsRSOP )
|
|
vcs.dwFlags |= CRYPTUI_DISABLE_EDITPROPERTIES;
|
|
|
|
vcs.pCRLContext = pCRL->GetCRLContext ();
|
|
|
|
CThemeContextActivator activator;
|
|
VERIFY (::CryptUIDlgViewCRL (&vcs));
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::LaunchCommonCRLDialog: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
void CCertMgrComponent::CloseAndReleaseUsageStores()
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::CloseAndReleaseUsageStores\n");
|
|
CCertStore* pCertStore = 0;
|
|
while (!m_usageStoreList.IsEmpty () )
|
|
{
|
|
pCertStore = m_usageStoreList.RemoveHead ();
|
|
ASSERT (pCertStore);
|
|
if ( pCertStore )
|
|
pCertStore->Release ();
|
|
}
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::CloseAndReleaseUsageStores\n");
|
|
}
|
|
|
|
bool CCertMgrComponent::DeletePrivateKey(CCertStore& rCertStoreDest, CCertStore& rCertStoreSrc)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::DeletePrivateKey\n");
|
|
bool bDeletePrivateKey = false;
|
|
|
|
|
|
// Do not copy the private key if the stores are on different machines or
|
|
// if the destination store is in the GPO.
|
|
if ( rCertStoreDest.m_strMachineName != rCertStoreSrc.m_strMachineName )
|
|
bDeletePrivateKey = true;
|
|
else if ( !rCertStoreDest.GetLocation () ) // Store is GPO store
|
|
bDeletePrivateKey = true;
|
|
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::DeletePrivateKey\n");
|
|
return bDeletePrivateKey;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Virtual function called by CComponent::IComponent::Notify(MMCN_PROPERTY_CHANGE)
|
|
// OnPropertyChange() is generated by MMCPropertyChangeNotify( param )
|
|
HRESULT CCertMgrComponent::OnPropertyChange (LPARAM param)
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::OnPropertyChange\n");
|
|
HRESULT hr = S_OK;
|
|
CCertMgrComponentData& dataRef = QueryComponentDataRef ();
|
|
|
|
// NTRAID# 464886 MMC->certmgr.dlll: AV when use 'New window from here'
|
|
if ( 0 != &dataRef )
|
|
hr = dataRef.OnPropertyChange (param);
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::OnPropertyChange: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CCertMgrComponent::DisplayCertificateCountByUsage(const CString & usageName, int nCertCnt) const
|
|
{
|
|
_TRACE (1, L"Entering CCertMgrComponent::DisplayCertificateCountByUsage\n");
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState ( ));
|
|
ASSERT (!usageName.IsEmpty ());
|
|
ASSERT (nCertCnt >= 0);
|
|
IConsole2* pConsole2 = 0;
|
|
HRESULT hr = m_pConsole->QueryInterface (
|
|
IID_PPV_ARG (IConsole2, &pConsole2));
|
|
if (SUCCEEDED (hr))
|
|
{
|
|
CString statusText;
|
|
|
|
|
|
switch (nCertCnt)
|
|
{
|
|
case 0:
|
|
statusText.FormatMessage (IDS_STATUS_NO_CERTS_USAGE, usageName);
|
|
break;
|
|
|
|
case 1:
|
|
statusText.FormatMessage (IDS_STATUS_ONE_CERT_USAGE, usageName);
|
|
break;
|
|
|
|
default:
|
|
WCHAR wszCertCount[34];
|
|
|
|
// security review 2/26/2002 BryanWal ok - buffer increased to 34.
|
|
// 33 is max size for int64 plus null terminator
|
|
AfxFormatString2 (statusText, IDS_STATUS_X_CERTS_USAGE,
|
|
_itow (nCertCnt, wszCertCount, 10), (LPCWSTR) usageName);
|
|
break;
|
|
}
|
|
|
|
hr = pConsole2->SetStatusText ((LPWSTR)(LPCWSTR) statusText);
|
|
|
|
pConsole2->Release ();
|
|
}
|
|
|
|
_TRACE (-1, L"Leaving CCertMgrComponent::DisplayCertificateCountByUsage: 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CCertMgrComponent::OnNotifySnapinHelp (LPDATAOBJECT pDataObject)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
CComQIPtr<IDisplayHelp,&IID_IDisplayHelp> spDisplayHelp = m_pConsole;
|
|
if ( !!spDisplayHelp )
|
|
{
|
|
CString strHelpTopic;
|
|
|
|
UINT nLen = ::GetSystemWindowsDirectory (strHelpTopic.GetBufferSetLength(2 * MAX_PATH), 2 * MAX_PATH);
|
|
strHelpTopic.ReleaseBuffer();
|
|
if ( nLen )
|
|
{
|
|
/*
|
|
* Help on the stores / purposes should start HTML help with Certficate Manager / Concepts / Understanding Certificate Manager / Certificate stores.
|
|
topic is CMconcepts.chm::/sag_CMunCertStor.htm
|
|
* Help on the Certificates / CTL / CRL nodes on the scope pane should open Certificate Manager / Concepts / Understanding Certificate Manager.
|
|
topic is CMconcepts.chm::/sag_CMunderstandWks.htm
|
|
* Help on certificates / CTL / CRL objects on the result pane should open Certificate Manager / Concepts / Using Certificate Manager.
|
|
topic is CMconcepts.chm::/sag_CMusingWks.htm
|
|
* Help on the Certificate Manager node should launch help with Certificate Manager.
|
|
topic is CMconcepts.chm::/sag_CMtopNode.htm
|
|
*/
|
|
CString helpFile;
|
|
CString helpTopic;
|
|
CCertMgrComponentData& compData = QueryComponentDataRef ();
|
|
CCertMgrCookie* pCookie = compData.ConvertCookie (pDataObject);
|
|
if ( pCookie )
|
|
{
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case CERTMGR_LOG_STORE_GPE:
|
|
case CERTMGR_LOG_STORE_RSOP:
|
|
{
|
|
CCertStore* pStore = dynamic_cast<CCertStore*>(pCookie);
|
|
if ( pStore && EFS_STORE == pStore->GetStoreType () )
|
|
{
|
|
helpFile = EFS_LINKED_HELP_FILE;
|
|
helpTopic = EFS_HELP_TOPIC;
|
|
}
|
|
else
|
|
{
|
|
helpFile = PKP_LINKED_HELP_FILE;
|
|
helpTopic = PKP_HELP_TOPIC;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CERT_POLICIES_USER:
|
|
case CERTMGR_CERT_POLICIES_COMPUTER:
|
|
case CERTMGR_AUTO_CERT_REQUEST:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_COMPUTER_SETTINGS:
|
|
case CERTMGR_PKP_AUTOENROLLMENT_USER_SETTINGS:
|
|
helpFile = PKP_LINKED_HELP_FILE;
|
|
helpTopic = PKP_HELP_TOPIC;
|
|
break;
|
|
|
|
case CERTMGR_LOG_STORE:
|
|
case CERTMGR_PHYS_STORE:
|
|
case CERTMGR_USAGE:
|
|
helpFile = CM_LINKED_HELP_FILE;
|
|
helpTopic = CM_HELP_TOPIC;
|
|
break;
|
|
|
|
case CERTMGR_CRL_CONTAINER:
|
|
case CERTMGR_CTL_CONTAINER:
|
|
case CERTMGR_CERT_CONTAINER:
|
|
helpFile = CM_LINKED_HELP_FILE;
|
|
helpTopic = CM_HELP_TOPIC;
|
|
break;
|
|
|
|
case CERTMGR_CERTIFICATE:
|
|
{
|
|
CCertificate* pCert = reinterpret_cast <CCertificate*> (pCookie);
|
|
if ( pCert )
|
|
{
|
|
CCertStore* pStore = pCert->GetCertStore ();
|
|
if ( pStore )
|
|
{
|
|
if ( EFS_STORE == pStore->GetStoreType () )
|
|
{
|
|
helpFile = PKP_LINKED_HELP_FILE;
|
|
helpTopic = PKP_HELP_TOPIC;
|
|
}
|
|
else
|
|
{
|
|
helpFile = CM_LINKED_HELP_FILE;
|
|
helpTopic = CM_HELP_TOPIC;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CRL:
|
|
{
|
|
CCRL* pCRL = reinterpret_cast <CCRL*> (pCookie);
|
|
if ( pCRL )
|
|
{
|
|
if ( EFS_STORE == pCRL->GetCertStore ().GetStoreType () )
|
|
{
|
|
helpFile = PKP_LINKED_HELP_FILE;
|
|
helpTopic = PKP_HELP_TOPIC;
|
|
}
|
|
else
|
|
{
|
|
helpFile = CM_LINKED_HELP_FILE;
|
|
helpTopic = CM_HELP_TOPIC;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_CTL:
|
|
{
|
|
CCTL* pCTL = reinterpret_cast <CCTL*> (pCookie);
|
|
if ( pCTL )
|
|
{
|
|
if ( EFS_STORE == pCTL->GetCertStore ().GetStoreType () )
|
|
{
|
|
helpFile = PKP_LINKED_HELP_FILE;
|
|
helpTopic = PKP_HELP_TOPIC;
|
|
}
|
|
else
|
|
{
|
|
helpFile = CM_LINKED_HELP_FILE;
|
|
helpTopic = CM_HELP_TOPIC;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CERTMGR_SAFER_COMPUTER_ROOT:
|
|
case CERTMGR_SAFER_USER_ROOT:
|
|
case CERTMGR_SAFER_COMPUTER_LEVELS:
|
|
case CERTMGR_SAFER_USER_LEVELS:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRIES:
|
|
case CERTMGR_SAFER_USER_ENTRIES:
|
|
case CERTMGR_SAFER_COMPUTER_LEVEL:
|
|
case CERTMGR_SAFER_USER_LEVEL:
|
|
case CERTMGR_SAFER_COMPUTER_ENTRY:
|
|
case CERTMGR_SAFER_USER_ENTRY:
|
|
case CERTMGR_SAFER_COMPUTER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_USER_TRUSTED_PUBLISHERS:
|
|
case CERTMGR_SAFER_COMPUTER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_USER_DEFINED_FILE_TYPES:
|
|
case CERTMGR_SAFER_COMPUTER_ENFORCEMENT:
|
|
case CERTMGR_SAFER_USER_ENFORCEMENT:
|
|
helpFile = SAFER_WINDOWS_LINKED_HELP_FILE;
|
|
helpTopic = SAFER_HELP_TOPIC;
|
|
break;
|
|
|
|
case CERTMGR_SNAPIN:
|
|
default:
|
|
helpFile = CM_LINKED_HELP_FILE;
|
|
helpTopic = CM_HELP_TOPIC;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
strHelpTopic += L"\\help\\";
|
|
strHelpTopic += helpFile;
|
|
strHelpTopic += L"::/";
|
|
strHelpTopic += helpTopic;
|
|
|
|
|
|
hr = spDisplayHelp->ShowTopic ((LPWSTR)(LPCWSTR) strHelpTopic);
|
|
}
|
|
else
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|