|
|
//+---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997-2002.
//
// File: compdata.cpp
//
// Contents: Implementation of CCertTmplComponentData
//
//----------------------------------------------------------------------------
#include "stdafx.h"
USE_HANDLE_MACROS ("CERTTMPL (compdata.cpp)") #include "compdata.h"
#include "dataobj.h"
#include "cookie.h"
#include "uuids.h"
#include "TemplateGeneralPropertyPage.h"
#include "TemplateV1RequestPropertyPage.h"
#include "TemplateV2RequestPropertyPage.h"
#include "TemplateV1SubjectNamePropertyPage.h"
#include "TemplateV2SubjectNamePropertyPage.h"
#include "TemplateV2AuthenticationPropertyPage.h"
#include "TemplateV2SupercedesPropertyPage.h"
#include "TemplateExtensionsPropertyPage.h"
#include "SecurityPropertyPage.h"
#include "TemplatePropertySheet.h"
#include "ViewOIDDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#include "dbg.h"
#include "stdcdata.cpp" // CComponentData implementation
extern HINSTANCE g_hInstance; POLICY_OID_LIST g_policyOIDList;
BOOL CALLBACK AddPageProc(HPROPSHEETPAGE hPage, LPARAM pCall);
extern bool g_bSchemaIsW2K; bool g_bDomainIsPresent = true;
//
// CCertTmplComponentData
//
CCertTmplComponentData::CCertTmplComponentData () : m_RootCookie (CERTTMPL_SNAPIN), m_hRootScopeItem (0), m_pResultData (0), m_bIsUserAdministrator (FALSE), m_pHeader (0), m_bMultipleObjectsSelected (false), m_dwNumCertTemplates (0), m_pComponentConsole (0), m_fUseCache (false), m_bSchemaChecked (false) { _TRACE (1, L"Entering CCertTmplComponentData::CCertTmplComponentData\n");
// Get name of logged-in user
DWORD dwSize = 0; BOOL bRet = ::GetUserName (0, &dwSize); if ( dwSize > 0 ) { bRet = ::GetUserName (m_szLoggedInUser.GetBufferSetLength (dwSize), &dwSize); _ASSERT (bRet); m_szLoggedInUser.ReleaseBuffer (); }
// Get name of this computer
dwSize = MAX_COMPUTERNAME_LENGTH + 1 ; bRet = ::GetComputerName (m_szThisComputer.GetBufferSetLength (MAX_COMPUTERNAME_LENGTH + 1 ), &dwSize); _ASSERT (bRet); m_szThisComputer.ReleaseBuffer ();
// Find out if logged-in users is an Administrator
HRESULT hr = IsUserAdministrator (m_bIsUserAdministrator); _ASSERT (SUCCEEDED (hr));
// default help file name.
SetHtmlHelpFileName (CERTTMPL_HTML_HELP_FILE);
// Find out if we're joined to a domain.
PDSROLE_PRIMARY_DOMAIN_INFO_BASIC pInfo = 0; DWORD dwErr = ::DsRoleGetPrimaryDomainInformation ( 0, DsRolePrimaryDomainInfoBasic, (PBYTE*) &pInfo); if ( ERROR_SUCCESS == dwErr ) { if ( pInfo->Flags & DSROLE_PRIMARY_DS_RUNNING || pInfo->Flags & DSROLE_PRIMARY_DOMAIN_GUID_PRESENT ) { m_szThisDomainDns = pInfo->DomainNameDns; m_RootCookie.SetManagedDomainDNSName (m_szThisDomainDns); m_szThisDomainFlat = pInfo->DomainNameFlat; } } else { _TRACE (0, L"DsRoleGetPrimaryDomainInformation () failed: 0x%x\n", dwErr); }
::DsRoleFreeMemory (pInfo);
_TRACE (-1, L"Leaving CCertTmplComponentData::CCertTmplComponentData\n"); }
CCertTmplComponentData::~CCertTmplComponentData () { _TRACE (1, L"Entering CCertTmplComponentData::~CCertTmplComponentData\n"); CCookie& rootCookie = QueryBaseRootCookie (); while ( !rootCookie.m_listResultCookieBlocks.IsEmpty() ) { (rootCookie.m_listResultCookieBlocks.RemoveHead())->Release(); }
if ( m_pResultData ) { m_pResultData->Release (); m_pResultData = 0; }
if ( m_pComponentConsole ) { SAFE_RELEASE (m_pComponentConsole); m_pComponentConsole = 0; }
_TRACE (-1, L"Leaving CCertTmplComponentData::~CCertTmplComponentData\n"); }
DEFINE_FORWARDS_MACHINE_NAME ( CCertTmplComponentData, (&m_RootCookie) )
CCookie& CCertTmplComponentData::QueryBaseRootCookie () { return (CCookie&) m_RootCookie; }
STDMETHODIMP CCertTmplComponentData::CreateComponent (LPCOMPONENT* ppComponent) { _TRACE (1, L"Entering CCertTmplComponentData::CreateComponent\n"); _ASSERT (ppComponent);
CComObject<CCertTmplComponent>* pObject = 0; CComObject<CCertTmplComponent>::CreateInstance (&pObject); _ASSERT (pObject); pObject->SetComponentDataPtr ( (CCertTmplComponentData*) this);
_TRACE (-1, L"Leaving CCertTmplComponentData::CreateComponent\n"); return pObject->QueryInterface (IID_PPV_ARG (IComponent, ppComponent)); }
HRESULT CCertTmplComponentData::LoadIcons (LPIMAGELIST pImageList, BOOL /*fLoadLargeIcons*/) { _TRACE (1, L"Entering CCertTmplComponentData::LoadIcons\n"); AFX_MANAGE_STATE (AfxGetStaticModuleState ());
// Structure to map a Resource ID to an index of icon
struct RESID2IICON { UINT uIconId; // Icon resource ID
int iIcon; // Index of the icon in the image list
}; const static RESID2IICON rgzLoadIconList[] = { // Misc icons
{ IDI_CERT_TEMPLATEV1, iIconCertTemplateV1 }, { IDI_CERT_TEMPLATEV2, iIconCertTemplateV2 }, { 0, 0} // Must be last
};
HINSTANCE hInst = AfxGetInstanceHandle (); for (int i = 0; rgzLoadIconList[i].uIconId != 0; i++) { HICON hIcon = ::LoadIcon (hInst, MAKEINTRESOURCE (rgzLoadIconList[i].uIconId)); _ASSERT (hIcon && "Icon ID not found in resources"); if ( hIcon ) { HRESULT hr = pImageList->ImageListSetIcon ( (PLONG_PTR) hIcon, rgzLoadIconList[i].iIcon); _ASSERT (SUCCEEDED (hr) && "Unable to add icon to ImageList"); } } _TRACE (-1, L"Leaving CCertTmplComponentData::LoadIcons\n");
return S_OK; }
HRESULT CCertTmplComponentData::OnNotifyExpand (LPDATAOBJECT pDataObject, BOOL bExpanding, HSCOPEITEM hParent) { _TRACE (1, L"Entering CCertTmplComponentData::OnNotifyExpand\n"); AFX_MANAGE_STATE (AfxGetStaticModuleState ()); HRESULT hr = S_OK; CWaitCursor waitCursor;
_ASSERT (pDataObject && hParent && m_pConsoleNameSpace); if ( bExpanding ) { // Need to check schema first before getting OIDs (sets g_bSchemaIsW2K)
if ( !m_bSchemaChecked ) { InstallWindows2002CertTemplates (); m_bSchemaChecked = true; }
if ( 0 == g_policyOIDList.GetCount () ) { hr = GetEnterpriseOIDs (); if ( FAILED (hr) ) { if ( HRESULT_FROM_WIN32 (ERROR_DS_NO_SUCH_OBJECT) == hr ) g_bSchemaIsW2K = true; else if ( HRESULT_FROM_WIN32 (ERROR_NO_SUCH_DOMAIN) == hr ) g_bDomainIsPresent = false;
if ( !g_bSchemaIsW2K ) { CString caption; CString text;
VERIFY (caption.LoadString (IDS_CERTTMPL)); // security review BryanWal 2/20/2002 ok
text.FormatMessage (IDS_CANNOT_LOAD_OID_LIST, GetSystemMessage (hr));
int iRetVal = 0; VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption, MB_ICONWARNING | MB_OK, &iRetVal))); } else hr = S_OK; } }
GUID guidObjectType; hr = ExtractObjectTypeGUID (pDataObject, &guidObjectType); _ASSERT (SUCCEEDED (hr));
// Beyond this point we are not dealing with extension node types.
{ CCertTmplCookie* pParentCookie = ConvertCookie (pDataObject); if ( pParentCookie ) { hr = ExpandScopeNodes (pParentCookie, hParent, guidObjectType, pDataObject); } else hr = E_UNEXPECTED; } } else hr = S_OK;
_TRACE (-1, L"Leaving CCertTmplComponentData::OnNotifyExpand: 0x%x\n", hr); return hr; }
HRESULT CCertTmplComponentData::OnNotifyRelease (LPDATAOBJECT /*pDataObject*/, HSCOPEITEM hItem) { _TRACE (1, L"Entering CCertTmplComponentData::OnNotifyRelease\n"); // _ASSERT ( IsExtensionSnapin () );
// This might also happen if I expand a node and then remove
// the snapin via Snapin Manager
HRESULT hr = DeleteChildren (hItem);
_TRACE (-1, L"Leaving CCertTmplComponentData::OnNotifyRelease: 0x%x\n", hr); return hr; }
// global space to store the string handed back to GetDisplayInfo ()
// CODEWORK should use "bstr" for ANSI-ization
CString g_strResultColumnText;
BSTR CCertTmplComponentData::QueryResultColumnText (CCookie& basecookie, int /*nCol*/) { BSTR strResult = L"";
CCertTmplCookie& cookie = (CCertTmplCookie&) basecookie; #ifndef UNICODE
#error not ANSI-enabled
#endif
switch ( cookie.m_objecttype ) { case CERTTMPL_SNAPIN: break;
case CERTTMPL_CERT_TEMPLATE: _ASSERT (0); break;
default: break; }
return strResult; }
int CCertTmplComponentData::QueryImage (CCookie& basecookie, BOOL /*fOpenImage*/) { int nIcon = 0;
CCertTmplCookie& cookie = (CCertTmplCookie&)basecookie; switch ( cookie.m_objecttype ) { case CERTTMPL_SNAPIN: nIcon = iIconCertTemplateV2; break;
case CERTTMPL_CERT_TEMPLATE: { CCertTemplate& rCertTemplate = (CCertTemplate&) cookie;
if ( 1 == rCertTemplate.GetType () ) nIcon = iIconCertTemplateV1; else nIcon = iIconCertTemplateV2; } break;
default: _TRACE (0, L"CCertTmplComponentData::QueryImage bad parent type\n"); break; } return nIcon; }
///////////////////////////////////////////////////////////////////////////////
/// IExtendPropertySheet
STDMETHODIMP CCertTmplComponentData::QueryPagesFor (LPDATAOBJECT pDataObject) { _TRACE (1, L"Entering CCertTmplComponentData::QueryPagesFor\n"); HRESULT hr = S_OK; _ASSERT (pDataObject);
if ( pDataObject ) { DATA_OBJECT_TYPES dataobjecttype = CCT_SCOPE; hr = ::ExtractData (pDataObject, CCertTemplatesDataObject::m_CFDataObjectType, &dataobjecttype, sizeof (dataobjecttype)); if ( SUCCEEDED (hr) ) { switch (dataobjecttype) { case CCT_SNAPIN_MANAGER: hr = S_FALSE; break;
case CCT_RESULT: { hr = S_FALSE; CCertTmplCookie* pParentCookie = ConvertCookie (pDataObject); if ( pParentCookie ) { switch (pParentCookie->m_objecttype) { case CERTTMPL_CERT_TEMPLATE: hr = S_OK; break;
default: break; } } } break;
case CCT_SCOPE: hr = S_FALSE; break;
default: hr = S_FALSE; break; } } } else hr = E_POINTER;
_TRACE (-1, L"Leaving CCertTmplComponentData::QueryPagesFor: 0x%x\n", hr); return hr; }
STDMETHODIMP CCertTmplComponentData::CreatePropertyPages ( LPPROPERTYSHEETCALLBACK pCallback, LONG_PTR lNotifyHandle, // This handle must be saved in the property page object to notify the parent when modified
LPDATAOBJECT pDataObject) { AFX_MANAGE_STATE (AfxGetStaticModuleState ()); _TRACE (1, L"Entering CCertTmplComponentData::CreatePropertyPages\n"); HRESULT hr = S_OK;
_ASSERT (pCallback && pDataObject); if ( pCallback && pDataObject ) { DATA_OBJECT_TYPES dataobjecttype = CCT_SCOPE; hr = ::ExtractData (pDataObject, CCertTemplatesDataObject::m_CFDataObjectType, &dataobjecttype, sizeof (dataobjecttype)); switch (dataobjecttype) { case CCT_SNAPIN_MANAGER: break;
case CCT_RESULT: { CCertTmplCookie* pParentCookie = ConvertCookie (pDataObject); if ( pParentCookie ) { switch (pParentCookie->m_objecttype) { case CERTTMPL_CERT_TEMPLATE: { CCertTemplate* pCertTemplate = dynamic_cast <CCertTemplate*> (pParentCookie); _ASSERT (pCertTemplate); if ( pCertTemplate ) { hr = AddCertTemplatePropPages (pCertTemplate, pCallback, lNotifyHandle); } else hr = E_FAIL; } break;
default: _ASSERT (0); break; } } else hr = E_UNEXPECTED; } break;
case CCT_SCOPE: { CCertTmplCookie* pParentCookie = ConvertCookie (pDataObject); if ( pParentCookie ) { } else hr = E_UNEXPECTED; } break;
default: break; } } else hr = E_POINTER;
_TRACE (-1, L"Leaving CCertTmplComponentData::CreatePropertyPages: 0x%x\n", hr); return hr; }
BOOL IsMMCMultiSelectDataObject(IDataObject* pDataObject) { if (pDataObject == NULL) return FALSE;
static UINT s_cf = 0; if (s_cf == 0) { USES_CONVERSION; s_cf = RegisterClipboardFormat(CCF_MMC_MULTISELECT_DATAOBJECT); }
FORMATETC fmt = {(CLIPFORMAT)s_cf, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
return (pDataObject->QueryGetData(&fmt) == S_OK); }
///////////////////////////////////////////////////////////////////////////////
// IExtendContextMenu implementation
//
STDMETHODIMP CCertTmplComponentData::AddMenuItems (LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK pContextMenuCallback, long *pInsertionAllowed) { _TRACE (1, L"Entering CCertTmplComponentData::AddMenuItems\n"); HRESULT hr = S_OK;
CCertTmplCookie* pCookie = 0;
LPDATAOBJECT pMSDO = ExtractMultiSelect (pDataObject); m_bMultipleObjectsSelected = false;
if ( pMSDO ) { m_bMultipleObjectsSelected = true;
CCertTemplatesDataObject* pDO = dynamic_cast <CCertTemplatesDataObject*>(pMSDO); _ASSERT (pDO); if ( pDO ) { // Get first cookie - all items should be the same?
// Is this a valid assumption?
// TODO: Verify
pDO->Reset(); if ( pDO->Next(1, reinterpret_cast<MMC_COOKIE*>(&pCookie), NULL) == S_FALSE ) return S_FALSE; } else return E_UNEXPECTED;
} else pCookie = ConvertCookie (pDataObject); _ASSERT (pCookie); if ( !pCookie ) return E_UNEXPECTED;
CertTmplObjectType objType = pCookie->m_objecttype;
if ( *pInsertionAllowed & CCM_INSERTIONALLOWED_TOP ) { switch (objType) { case CERTTMPL_CERT_TEMPLATE: if ( !m_bMultipleObjectsSelected ) { CCertTemplate* pCertTemplate = dynamic_cast <CCertTemplate*> (pCookie); _ASSERT (pCertTemplate); if ( pCertTemplate ) { if ( !g_bSchemaIsW2K ) { // NTRAID# 457682 Certtmpl.msc: Should not allow
// admins to duplicate certificate template if windows
// did not upgrade templates successfully
if ( !pCertTemplate->IsDefault () || CAIsCertTypeCurrent (0, const_cast<PWSTR>((PCWSTR) pCertTemplate->GetTemplateName ())) ) { hr = AddCloneTemplateMenuItem (pContextMenuCallback, CCM_INSERTIONPOINTID_PRIMARY_TOP); } if ( SUCCEEDED (hr) ) { // NTRAID# 471160 Certtmpl: Remove option to
// "ReEnroll all Certificate Holders" on any V1
// Certificate Template. V2 ONLY.
if ( pCertTemplate->GetType () > 1 ) { hr = AddReEnrollAllCertsMenuItem (pContextMenuCallback, CCM_INSERTIONPOINTID_PRIMARY_TOP); } } } } else hr = E_FAIL; } break;
case CERTTMPL_SNAPIN: _ASSERT (!m_bMultipleObjectsSelected); hr = AddViewOIDsMenuItem (pContextMenuCallback, CCM_INSERTIONPOINTID_PRIMARY_TOP); break;
default: break; } } if ( *pInsertionAllowed & CCM_INSERTIONALLOWED_NEW ) { } if ( *pInsertionAllowed & CCM_INSERTIONALLOWED_TASK ) { switch (objType) { case CERTTMPL_CERT_TEMPLATE: if ( !m_bMultipleObjectsSelected ) { CCertTemplate* pCertTemplate = dynamic_cast <CCertTemplate*> (pCookie); _ASSERT (pCertTemplate); if ( pCertTemplate ) { if ( !g_bSchemaIsW2K ) { hr = AddCloneTemplateMenuItem (pContextMenuCallback, CCM_INSERTIONPOINTID_PRIMARY_TASK); if ( SUCCEEDED (hr) ) { // NTRAID# 471160 Certtmpl: Remove option to
// "ReEnroll all Certificate Holders" on any V1
// Certificate Template. V2 ONLY.
if ( pCertTemplate->GetType () > 1 ) { hr = AddReEnrollAllCertsMenuItem (pContextMenuCallback, CCM_INSERTIONPOINTID_PRIMARY_TASK); } } } } else hr = E_FAIL; } break;
case CERTTMPL_SNAPIN: _ASSERT (!m_bMultipleObjectsSelected); hr = AddViewOIDsMenuItem (pContextMenuCallback, CCM_INSERTIONPOINTID_PRIMARY_TASK); break; } } if ( *pInsertionAllowed & CCM_INSERTIONALLOWED_VIEW ) { switch (objType) { case CERTTMPL_SNAPIN: _ASSERT (!m_bMultipleObjectsSelected); break;
case CERTTMPL_CERT_TEMPLATE: _ASSERT (0); break;
default: break; } }
_TRACE (-1, L"Leaving CCertTmplComponentData::AddMenuItems: 0x%x\n", hr); return hr; }
STDMETHODIMP CCertTmplComponentData::Command (long nCommandID, LPDATAOBJECT pDataObject) { HRESULT hr = S_OK;
switch (nCommandID) { case IDM_CLONE_TEMPLATE: hr = OnCloneTemplate (pDataObject); break;
case IDM_REENROLL_ALL_CERTS: hr = OnReEnrollAllCerts (pDataObject); break;
case IDM_VIEW_OIDS: OnViewOIDs (); break;
case -1: // Received on forward/back buttons from toolbar
break;
default: _ASSERT (0); break; }
return hr; }
HRESULT CCertTmplComponentData::RefreshScopePane (LPDATAOBJECT pDataObject) { _TRACE (1, L"Entering CCertTmplComponentData::RefreshScopePane\n"); HRESULT hr = S_OK; CCertTmplCookie* pCookie = 0;
if ( pDataObject ) pCookie = ConvertCookie (pDataObject); if ( !pDataObject || pCookie ) { hr = DeleteScopeItems (); _ASSERT (SUCCEEDED (hr)); GUID guid; hr = ExpandScopeNodes (&m_RootCookie, m_hRootScopeItem, guid, pDataObject); } _TRACE (-1, L"Leaving CCertTmplComponentData::RefreshScopePane: 0x%x\n", hr); return hr; }
HRESULT CCertTmplComponentData::ExpandScopeNodes ( CCertTmplCookie* pParentCookie, HSCOPEITEM hParent, const GUID& /*guidObjectType*/, LPDATAOBJECT /*pDataObject*/) { _TRACE (1, L"Entering CCertTmplComponentData::ExpandScopeNodes\n"); _ASSERT (hParent); AFX_MANAGE_STATE (AfxGetStaticModuleState ()); CWaitCursor waitCursor; HRESULT hr = S_OK;
if ( pParentCookie ) { CString objectName;
switch ( pParentCookie->m_objecttype ) { // These node types have no children yet
case CERTTMPL_SNAPIN: // We don't expect the handle of the root scope item to change, ever!
_ASSERT ( m_hRootScopeItem ? (m_hRootScopeItem == hParent) : 1); if ( !m_hRootScopeItem ) m_hRootScopeItem = hParent; break;
case CERTTMPL_CERT_TEMPLATE: _ASSERT (0); break;
// This node type has no children
default: _TRACE (0, L"CCertTmplComponentData::EnumerateScopeChildren bad parent type\n"); hr = S_OK; break; } } else { // If parentCookie not passed in, then this is an extension snap-in
}
_TRACE (-1, L"Leaving CCertTmplComponentData::ExpandScopeNodes: 0x%x\n", hr); return hr; }
HRESULT CCertTmplComponentData::DeleteScopeItems () { _TRACE (1, L"Entering CCertTmplComponentData::DeleteScopeItems\n"); HRESULT hr = S_OK;
hr = DeleteChildren (m_hRootScopeItem);
_TRACE (-1, L"Leaving CCertTmplComponentData::DeleteScopeItems: 0x%x\n", hr); return hr; }
HRESULT CCertTmplComponentData::DeleteChildren (HSCOPEITEM hParent) { _TRACE (1, L"Entering CCertTmplComponentData::DeleteChildren\n"); HRESULT hr = S_OK; if ( hParent ) { HSCOPEITEM hChild = 0; HSCOPEITEM hNextChild = 0; MMC_COOKIE lCookie = 0;
// Optimization: If we're deleting everything below the root, free all
// the result items here so we don't have to go looking for them later by
// store
if ( hParent == m_hRootScopeItem ) { LPRESULTDATA pResultData = 0; hr = GetResultData (&pResultData); if ( SUCCEEDED (hr) ) { hr = pResultData->DeleteAllRsltItems (); if ( SUCCEEDED (hr) || E_UNEXPECTED == hr ) // returns E_UNEXPECTED if console shutting down
{ RemoveResultCookies (pResultData); } pResultData->Release (); } }
hr = m_pConsoleNameSpace->GetChildItem (hParent, &hChild, &lCookie); _ASSERT (SUCCEEDED (hr) || E_FAIL == hr); // appears to return E_FAIL when there are no children
while ( SUCCEEDED (hr) && hChild ) { hr = m_pConsoleNameSpace->GetNextItem (hChild, &hNextChild, &lCookie); _ASSERT (SUCCEEDED (hr));
hr = DeleteChildren (hChild); _ASSERT (SUCCEEDED (hr)); if ( SUCCEEDED (hr) ) { m_pConsoleNameSpace->DeleteItem (hChild, TRUE); } hChild = hNextChild; } }
_TRACE (-1, L"Leaving CCertTmplComponentData::DeleteChildren: 0x%x\n", hr); return hr; }
CertTmplObjectType CCertTmplComponentData::GetObjectType (LPDATAOBJECT pDataObject) { _ASSERT (pDataObject); CCertTmplCookie* pCookie = ConvertCookie (pDataObject); if ( ((CCertTmplCookie*) MMC_MULTI_SELECT_COOKIE) == pCookie ) return CERTTMPL_MULTISEL; else if ( pCookie ) return pCookie->m_objecttype;
return CERTTMPL_INVALID; }
HRESULT CCertTmplComponentData::IsUserAdministrator (BOOL & bIsAdministrator) { HRESULT hr = S_OK; DWORD dwErr = 0;
bIsAdministrator = FALSE; if ( IsWindowsNT () ) { PSID psidAdministrators = 0; SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
// security review BryanWal 2/20/2002 ok
BOOL bResult = AllocateAndInitializeSid (&siaNtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &psidAdministrators); _ASSERT (bResult); if ( bResult && psidAdministrators) { bResult = CheckTokenMembership (0, psidAdministrators, &bIsAdministrator); _ASSERT (bResult); if ( !bResult ) { dwErr = GetLastError (); DisplaySystemError (dwErr); hr = HRESULT_FROM_WIN32 (dwErr); } FreeSid (psidAdministrators); } else { dwErr = GetLastError (); DisplaySystemError (dwErr); hr = HRESULT_FROM_WIN32 (dwErr); } } return hr; }
void CCertTmplComponentData::DisplaySystemError (DWORD dwErr) { AFX_MANAGE_STATE (AfxGetStaticModuleState ()); LPVOID lpMsgBuf;
// security review BryanWal 2/20/2002 ok because using
// FORMAT_MESSAGE_ALLOCATE_BUFFER flag and getting message from system
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(PWSTR) &lpMsgBuf, 0, NULL );
// Display the string.
CString caption; VERIFY (caption.LoadString (IDS_CERTTMPL)); int iRetVal = 0; if ( m_pConsole ) { HRESULT hr = m_pConsole->MessageBox ( (PWSTR) lpMsgBuf, caption, MB_ICONWARNING | MB_OK, &iRetVal); _ASSERT (SUCCEEDED (hr)); } else { CThemeContextActivator activator; ::MessageBox (NULL, (PWSTR) lpMsgBuf, caption, MB_ICONWARNING | MB_OK); } // Free the buffer.
LocalFree (lpMsgBuf); }
HRESULT CCertTmplComponentData::AddSeparator (LPCONTEXTMENUCALLBACK pContextMenuCallback) { AFX_MANAGE_STATE (AfxGetStaticModuleState ()); _ASSERT (pContextMenuCallback); CONTEXTMENUITEM menuItem;
// security review BryanWal 02/20/2002 ok
::ZeroMemory (&menuItem, sizeof (menuItem)); menuItem.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TASK; menuItem.fSpecialFlags = 0; menuItem.strName = _T ("Separator"); // Dummy name
menuItem.strStatusBarText = _T ("Separator");// Dummy status text
menuItem.lCommandID = ID_SEPARATOR; // Command ID
menuItem.fFlags = MF_SEPARATOR; // most important the flag
HRESULT hr = pContextMenuCallback->AddItem (&menuItem); // _ASSERT (SUCCEEDED (hr));
return hr; }
LPCONSOLENAMESPACE CCertTmplComponentData::GetConsoleNameSpace () const { return m_pConsoleNameSpace; }
CCertTmplCookie* CCertTmplComponentData::ConvertCookie (LPDATAOBJECT pDataObject) { CCertTmplCookie* pParentCookie = 0; CCookie* pBaseParentCookie = 0; HRESULT hr = ::ExtractData (pDataObject, CCertTemplatesDataObject::m_CFRawCookie, &pBaseParentCookie, sizeof (pBaseParentCookie) ); if ( SUCCEEDED (hr) ) { pParentCookie = ActiveCookie (pBaseParentCookie); _ASSERT (pParentCookie); } return pParentCookie; }
HRESULT CCertTmplComponentData::AddScopeNode(CCertTmplCookie * pNewCookie, HSCOPEITEM hParent) { _TRACE (1, L"Entering CCertTmplComponentData::AddScopeNode\n"); _ASSERT (pNewCookie); HRESULT hr = S_OK; if ( pNewCookie ) { SCOPEDATAITEM tSDItem;
// security review BryanWal 02/20/2002 ok
::ZeroMemory (&tSDItem,sizeof (tSDItem)); tSDItem.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE | SDI_STATE | SDI_PARAM | SDI_PARENT | SDI_CHILDREN; tSDItem.displayname = MMC_CALLBACK; tSDItem.relativeID = hParent; tSDItem.nState = 0; tSDItem.cChildren = 0;
if ( pNewCookie != &m_RootCookie ) m_RootCookie.m_listScopeCookieBlocks.AddHead ( (CBaseCookieBlock*) pNewCookie); tSDItem.lParam = reinterpret_cast<LPARAM> ( (CCookie*) pNewCookie); tSDItem.nImage = QueryImage (*pNewCookie, FALSE); tSDItem.nOpenImage = QueryImage (*pNewCookie, FALSE); hr = m_pConsoleNameSpace->InsertItem (&tSDItem); if ( SUCCEEDED (hr) ) pNewCookie->m_hScopeItem = tSDItem.ID; } else hr = E_POINTER;
_TRACE (-1, L"Leaving CCertTmplComponentData::AddScopeNode: 0x%x\n", hr); return hr; }
HRESULT CCertTmplComponentData::ReleaseResultCookie ( CBaseCookieBlock * pResultCookie, CCookie& /*rootCookie*/, POSITION /*pos2*/) { _TRACE (1, L"Entering CCertTmplComponentData::ReleaseResultCookie\n"); CCertTmplCookie* pCookie = dynamic_cast <CCertTmplCookie*> (pResultCookie); _ASSERT (pCookie); if ( pCookie ) { switch (pCookie->m_objecttype) { case CERTTMPL_CERT_TEMPLATE: _ASSERT (0); break;
default: _ASSERT (0); break; } }
_TRACE (-1, L"Leaving CCertTmplComponentData::ReleaseResultCookie\n"); return S_OK; }
void CCertTmplComponentData::SetResultData(LPRESULTDATA pResultData) { _ASSERT (pResultData); if ( pResultData && pResultData != m_pResultData ) { if ( m_pResultData ) m_pResultData->Release (); m_pResultData = pResultData; m_pResultData->AddRef (); } }
HRESULT CCertTmplComponentData::GetResultData(LPRESULTDATA* ppResultData) { HRESULT hr = S_OK;
if ( !ppResultData ) hr = E_POINTER; else if ( !m_pResultData ) { if ( m_pConsole ) { hr = m_pConsole->QueryInterface(IID_PPV_ARG (IResultData, &m_pResultData)); _ASSERT (SUCCEEDED (hr)); } else hr = E_FAIL; } if ( SUCCEEDED (hr) && m_pResultData ) { *ppResultData = m_pResultData; m_pResultData->AddRef (); }
return hr; }
CString CCertTmplComponentData::GetThisComputer() const { return m_szThisComputer; }
HRESULT CCertTmplComponentData::OnPropertyChange (LPARAM param) { _TRACE (1, L"Entering CCertTmplComponentData::OnPropertyChange\n"); _ASSERT (param); HRESULT hr = S_OK; if ( param ) { CCertTmplCookie* pCookie = reinterpret_cast<CCertTmplCookie*> (param); if ( pCookie ) { switch (pCookie->m_objecttype) { case CERTTMPL_CERT_TEMPLATE: { HRESULTITEM itemID = 0; hr = pCookie->m_resultDataID->FindItemByLParam ((LPARAM) pCookie, &itemID); _ASSERT (SUCCEEDED (hr)); if ( SUCCEEDED (hr) ) { hr = m_pResultData->UpdateItem (itemID); _ASSERT (SUCCEEDED (hr)); } } break;
default: break; } } } else hr = E_FAIL;
_TRACE (-1, L"Leaving CCertTmplComponentData::OnPropertyChange: 0x%x\n", hr); return hr; }
///////////////////////////////////////////////////////////////////////////////
//
// CCertTmplComponentData::RemoveResultCookies
//
// Remove and delete all the result cookies corresponding to the LPRESULTDATA
// object passed in. Thus all cookies added to pResultData are released and
// removed from the master list.
//
///////////////////////////////////////////////////////////////////////////////
void CCertTmplComponentData::RemoveResultCookies(LPRESULTDATA pResultData) { _TRACE (1, L"Entering CCertTmplComponentData::RemoveResultCookies\n"); CCertTmplCookie* pCookie = 0;
CCookie& rootCookie = QueryBaseRootCookie ();
POSITION curPos = 0;
for (POSITION nextPos = rootCookie.m_listResultCookieBlocks.GetHeadPosition (); nextPos; ) { curPos = nextPos; pCookie = dynamic_cast <CCertTmplCookie*> (rootCookie.m_listResultCookieBlocks.GetNext (nextPos)); _ASSERT (pCookie); if ( pCookie ) { if ( pCookie->m_resultDataID == pResultData ) { pCookie->Release (); rootCookie.m_listResultCookieBlocks.RemoveAt (curPos); } } } _TRACE (-1, L"Leaving CCertTmplComponentData::RemoveResultCookies\n"); }
HRESULT CCertTmplComponentData::AddVersion1CertTemplatePropPages (CCertTemplate* pCertTemplate, LPPROPERTYSHEETCALLBACK pCallback) { _TRACE (1, L"Entering CCertTmplComponentData::AddVersion1CertTemplatePropPages\n"); HRESULT hr = S_OK; _ASSERT (pCertTemplate && pCallback); if ( pCertTemplate && pCallback ) { _ASSERT (1 == pCertTemplate->GetType ());
// Add General page
CTemplateGeneralPropertyPage * pGeneralPage = new CTemplateGeneralPropertyPage ( *pCertTemplate, this); if ( pGeneralPage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pGeneralPage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } else { hr = E_OUTOFMEMORY; }
// Add Request page only if subject is not a CA
if ( SUCCEEDED (hr) && !pCertTemplate->SubjectIsCA () ) { CTemplateV1RequestPropertyPage * pRequestPage = new CTemplateV1RequestPropertyPage (*pCertTemplate); if ( pRequestPage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pRequestPage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } else { hr = E_OUTOFMEMORY; } }
// Add Subject Name page only if subject is not a CA
if ( SUCCEEDED (hr) && !pCertTemplate->SubjectIsCA () ) { CTemplateV1SubjectNamePropertyPage * pSubjectNamePage = new CTemplateV1SubjectNamePropertyPage (*pCertTemplate); if ( pSubjectNamePage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pSubjectNamePage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } else { hr = E_OUTOFMEMORY; } }
// Add extensions page - always add this page last (except for security)
if ( SUCCEEDED (hr) ) { CTemplateExtensionsPropertyPage * pExtensionsPage = new CTemplateExtensionsPropertyPage (*pCertTemplate, pGeneralPage->m_bIsDirty); if ( pExtensionsPage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pExtensionsPage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } else { hr = E_OUTOFMEMORY; } }
// Add security page
if ( SUCCEEDED (hr) ) { // if error, don't display this page
LPSECURITYINFO pCertTemplateSecurity = NULL;
hr = CreateCertTemplateSecurityInfo (pCertTemplate, &pCertTemplateSecurity); if ( SUCCEEDED (hr) ) { // save the pCASecurity pointer for later releasing
pGeneralPage->SetAllocedSecurityInfo (pCertTemplateSecurity);
HPROPSHEETPAGE hPage = CreateSecurityPage (pCertTemplateSecurity); if (hPage == NULL) { hr = HRESULT_FROM_WIN32 (GetLastError()); _TRACE (0, L"CreateSecurityPage () failed: 0x%x\n", hr); } hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } } } _TRACE (-1, L"Leaving CCertTmplComponentData::AddVersion1CertTemplatePropPages: 0x%x\n", hr); return hr; }
HRESULT CCertTmplComponentData::AddVersion2CertTemplatePropPages (CCertTemplate* pCertTemplate, LPPROPERTYSHEETCALLBACK pCallback, LONG_PTR lNotifyHandle) { _TRACE (1, L"Entering CCertTmplComponentData::AddVersion2CertTemplatePropPages\n"); HRESULT hr = S_OK; _ASSERT (pCertTemplate && pCallback); if ( pCertTemplate && pCallback ) { _ASSERT (2 == pCertTemplate->GetType ()); int nPage = 0;
// Add General page
CTemplateGeneralPropertyPage * pGeneralPage = new CTemplateGeneralPropertyPage ( *pCertTemplate, this); if ( pGeneralPage ) { pGeneralPage->m_lNotifyHandle = lNotifyHandle; HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pGeneralPage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } else { hr = E_OUTOFMEMORY; }
// Add Request page only if subject is not a CA
if ( SUCCEEDED (hr) && !pCertTemplate->SubjectIsCA () ) { CTemplateV2RequestPropertyPage * pRequestPage = new CTemplateV2RequestPropertyPage (*pCertTemplate, pGeneralPage->m_bIsDirty); if ( pRequestPage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pRequestPage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); if ( SUCCEEDED (hr) ) { nPage++; pGeneralPage->SetV2RequestPageNumber (nPage); } } else { hr = E_OUTOFMEMORY; } }
// Add Subject Name page only if subject is not a CA
if ( SUCCEEDED (hr) && !pCertTemplate->SubjectIsCA () ) { if( !pCertTemplate->SubjectIsCrossCA() ) //Bug 435628, Yanggao, 7/13/2001
{ CTemplateV2SubjectNamePropertyPage * pSubjectNamePage = new CTemplateV2SubjectNamePropertyPage (*pCertTemplate, pGeneralPage->m_bIsDirty); if ( pSubjectNamePage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pSubjectNamePage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); if ( SUCCEEDED (hr) ) nPage++; } else { hr = E_OUTOFMEMORY; } } }
// Add Authentication Name page
if ( SUCCEEDED (hr) ) { CTemplateV2AuthenticationPropertyPage * pAuthenticationPage = new CTemplateV2AuthenticationPropertyPage (*pCertTemplate, pGeneralPage->m_bIsDirty); if ( pAuthenticationPage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pAuthenticationPage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); if ( SUCCEEDED (hr) ) { nPage++; pGeneralPage->SetV2AuthPageNumber (nPage); } } else { hr = E_OUTOFMEMORY; } }
// Add Superceded page
if ( SUCCEEDED (hr) ) { CTemplateV2SupercedesPropertyPage * pSupercededPage = new CTemplateV2SupercedesPropertyPage (*pCertTemplate, pGeneralPage->m_bIsDirty, this); if ( pSupercededPage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pSupercededPage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } else { hr = E_OUTOFMEMORY; } }
// Add extensions page - always add this page last (except for security)
if ( SUCCEEDED (hr) ) { CTemplateExtensionsPropertyPage * pExtensionsPage = new CTemplateExtensionsPropertyPage (*pCertTemplate, pGeneralPage->m_bIsDirty); if ( pExtensionsPage ) { HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pExtensionsPage->m_psp); _ASSERT (hPage); hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } else { hr = E_OUTOFMEMORY; } }
// Add security page
if ( SUCCEEDED (hr) ) { // if error, don't display this page
LPSECURITYINFO pCertTemplateSecurity = NULL;
hr = CreateCertTemplateSecurityInfo (pCertTemplate, &pCertTemplateSecurity); if ( SUCCEEDED (hr) ) { // save the pCertTemplateSecurity pointer for later releasing
pGeneralPage->SetAllocedSecurityInfo (pCertTemplateSecurity);
HPROPSHEETPAGE hPage = CreateSecurityPage (pCertTemplateSecurity); if (hPage == NULL) { hr = HRESULT_FROM_WIN32 (GetLastError()); _TRACE (0, L"CreateSecurityPage () failed: 0x%x\n", hr); } hr = pCallback->AddPage (hPage); _ASSERT (SUCCEEDED (hr)); } } } _TRACE (-1, L"Leaving CCertTmplComponentData::AddVersion2CertTemplatePropPages: 0x%x\n", hr); return hr; }
HRESULT CCertTmplComponentData::AddCertTemplatePropPages ( CCertTemplate* pCertTemplate, LPPROPERTYSHEETCALLBACK pCallback, LONG_PTR lNotifyHandle) { _TRACE (1, L"Entering CCertTmplComponentData::AddCertTemplatePropPages\n"); HRESULT hr = S_OK; _ASSERT (pCertTemplate && pCallback); if ( pCertTemplate && pCallback ) { switch (pCertTemplate->GetType ()) { case 1: hr = AddVersion1CertTemplatePropPages (pCertTemplate, pCallback); break;
case 2: hr = AddVersion2CertTemplatePropPages (pCertTemplate, pCallback, lNotifyHandle); break;
default: _ASSERT (0); break; } } else hr = E_POINTER;
_TRACE(-1, L"Leaving CCertTmplComponentData::AddCertTemplatePropPages: 0x%x\n", hr); return hr; }
/////////////////////////////////////////////////////////////////////////////
// IExtendPropertySheet Implementation
//+----------------------------------------------------------------------------
//
// Function: AddPageProc
//
// Synopsis: The IShellPropSheetExt->AddPages callback.
//
//-----------------------------------------------------------------------------
BOOL CALLBACK AddPageProc(HPROPSHEETPAGE hPage, LPARAM pCall) { TRACE(_T("xx.%03x> AddPageProc()\n"), GetCurrentThreadId());
HRESULT hr = ((LPPROPERTYSHEETCALLBACK)pCall)->AddPage(hPage);
return hr == S_OK; }
HRESULT CCertTmplComponentData::AddCloneTemplateMenuItem(LPCONTEXTMENUCALLBACK pContextMenuCallback, LONG lInsertionPointID) { _TRACE (1, L"Entering CCertTmplComponentData::AddCloneTemplateMenuItem\n"); AFX_MANAGE_STATE (AfxGetStaticModuleState ()); _ASSERT (pContextMenuCallback); HRESULT hr = S_OK; CONTEXTMENUITEM menuItem; CString szMenu; CString szHint;
// security review BryanWal 02/20/2002 ok
::ZeroMemory (&menuItem, sizeof (menuItem)); menuItem.lInsertionPointID = lInsertionPointID; menuItem.fFlags = 0; menuItem.fSpecialFlags = 0; VERIFY (szMenu.LoadString (IDS_CLONE_TEMPLATE)); menuItem.strName = (PWSTR) (PCWSTR) szMenu; VERIFY (szHint.LoadString (IDS_CLONE_TEMPLATE_HINT)); menuItem.strStatusBarText = (PWSTR) (PCWSTR) szHint; menuItem.lCommandID = IDM_CLONE_TEMPLATE;
hr = pContextMenuCallback->AddItem (&menuItem); _ASSERT (SUCCEEDED (hr));
_TRACE (-1, L"Leaving CCertTmplComponentData::AddCloneTemplateMenuItem\n"); return hr; }
HRESULT CCertTmplComponentData::AddReEnrollAllCertsMenuItem(LPCONTEXTMENUCALLBACK pContextMenuCallback, LONG lInsertionPointID) { _TRACE (1, L"Entering CCertTmplComponentData::AddReEnrollAllCertsMenuItem\n"); AFX_MANAGE_STATE (AfxGetStaticModuleState ()); _ASSERT (pContextMenuCallback); HRESULT hr = S_OK; CONTEXTMENUITEM menuItem; CString szMenu; CString szHint;
// security review BryanWal 02/20/2002 ok
::ZeroMemory (&menuItem, sizeof (menuItem)); menuItem.lInsertionPointID = lInsertionPointID; menuItem.fFlags = 0; menuItem.fSpecialFlags = 0; VERIFY (szMenu.LoadString (IDS_REENROLL_ALL_CERTS)); menuItem.strName = (PWSTR) (PCWSTR) szMenu; VERIFY (szHint.LoadString (IDS_REENROLL_ALL_CERTS_HINT)); menuItem.strStatusBarText = (PWSTR) (PCWSTR) szHint; menuItem.lCommandID = IDM_REENROLL_ALL_CERTS;
hr = pContextMenuCallback->AddItem (&menuItem); _ASSERT (SUCCEEDED (hr));
_TRACE (-1, L"Leaving CCertTmplComponentData::AddReEnrollAllCertsMenuItem\n"); return hr; }
HRESULT CCertTmplComponentData::RefreshServer() { // Delete all the scope items and result items, attempt recreate the
// server and force a reexpansion
HRESULT hr = DeleteScopeItems (); if ( m_pResultData ) { m_pResultData->DeleteAllRsltItems (); }
HWND hWndConsole = 0;
m_pConsole->GetMainWindow (&hWndConsole); GUID guid; hr = ExpandScopeNodes ( &(m_RootCookie), m_hRootScopeItem, guid);
return hr; }
///////////////////////////////////////////////////////////////////////////////
//
// ChangeRootNodeName ()
//
// Purpose: Change the text of the root node
//
// Input: newName - the new machine name that the snapin manages
// Output: Returns S_OK on success
//
///////////////////////////////////////////////////////////////////////////////
HRESULT CCertTmplComponentData::ChangeRootNodeName() { _TRACE (1, L"Entering CCertTmplComponentData::ChangeRootNodeName\n");
if ( !QueryBaseRootCookie ().m_hScopeItem ) { if ( m_hRootScopeItem ) QueryBaseRootCookie ().m_hScopeItem = m_hRootScopeItem; else return E_UNEXPECTED; }
CString formattedName;
if ( m_szManagedDomain.IsEmpty () ) { // security review BryanWal 2/20/2002 ok
formattedName.FormatMessage (IDS_CERTTMPL_ROOT_NODE_NAME, m_szThisDomainDns); } else { // security review BryanWal 2/20/2002 ok
formattedName.FormatMessage (IDS_CERTTMPL_ROOT_NODE_NAME, m_szManagedDomain); }
SCOPEDATAITEM item; // security review BryanWal 02/20/2002 ok
::ZeroMemory (&item, sizeof (item)); item.mask = SDI_STR; item.displayname = (PWSTR) (PCWSTR) formattedName; item.ID = QueryBaseRootCookie ().m_hScopeItem;
HRESULT hr = m_pConsoleNameSpace->SetItem (&item); if ( FAILED (hr) ) { _TRACE (0, L"IConsoleNameSpace2::SetItem () failed: 0x%x\n", hr); } _TRACE (-1, L"Leaving CCertTmplComponentData::ChangeRootNodeName: 0x%x\n", hr); return hr; }
HRESULT CCertTmplComponentData::OnNotifyPreload(LPDATAOBJECT /*pDataObject*/, HSCOPEITEM hRootScopeItem) { _TRACE (1, L"Entering CCertTmplComponentData::OnNotifyPreload\n"); HRESULT hr = S_OK;
QueryBaseRootCookie ().m_hScopeItem = hRootScopeItem; hr = ChangeRootNodeName ();
_TRACE (-1, L"Leaving CCertTmplComponentData::OnNotifyPreload: 0x%x\n", hr); return hr; }
// Help on IComponentData just returns the file and no particular topic
STDMETHODIMP CCertTmplComponentData::GetHelpTopic(LPOLESTR* lpCompiledHelpFile) { if (lpCompiledHelpFile == NULL) return E_INVALIDARG;
CString szHelpFilePath; HRESULT hr = GetHtmlHelpFilePath( szHelpFilePath ); if ( FAILED(hr) ) return hr;
*lpCompiledHelpFile = reinterpret_cast <LPOLESTR> ( CoTaskMemAlloc ((szHelpFilePath.GetLength () + 1) * sizeof (wchar_t))); if ( NULL == *lpCompiledHelpFile ) return E_OUTOFMEMORY;
USES_CONVERSION; // security review BryanWal 2/20/2002 ok
wcscpy (*lpCompiledHelpFile, T2OLE ((LPTSTR)(LPCTSTR) szHelpFilePath)); return S_OK; }
HRESULT CCertTmplComponentData::GetHtmlHelpFilePath( CString& strref ) const { UINT nLen = ::GetSystemWindowsDirectory (strref.GetBufferSetLength(2 * MAX_PATH), 2 * MAX_PATH); strref.ReleaseBuffer(); if (0 == nLen) { _ASSERT(FALSE); return E_FAIL; }
strref += CERTTMPL_HELP_PATH; strref += CERTTMPL_LINKED_HELP_FILE; return S_OK; }
HRESULT CCertTmplComponentData::OnReEnrollAllCerts (LPDATAOBJECT pDataObject) { _TRACE (1, L"Entering CCertTmplComponentData::OnReEnrollAllCerts"); AFX_MANAGE_STATE (AfxGetStaticModuleState ()); HRESULT hr = S_OK;
if ( pDataObject ) { CCertTmplCookie* pCookie = ConvertCookie (pDataObject); if ( pCookie ) { _ASSERT (CERTTMPL_CERT_TEMPLATE == pCookie->m_objecttype); CCertTemplate* pCertTemplate = dynamic_cast <CCertTemplate*> (pCookie); if ( pCertTemplate ) { hr = pCertTemplate->IncrementMajorVersion (); if ( SUCCEEDED (hr) ) { // Don't increment minor version - was set to 0 in
// IncrementMajorVersion
hr = pCertTemplate->SaveChanges (false); if ( SUCCEEDED (hr) ) { HRESULTITEM itemID = 0; hr = pCookie->m_resultDataID->FindItemByLParam ((LPARAM) pCookie, &itemID); _ASSERT (SUCCEEDED (hr)); if ( SUCCEEDED (hr) ) { hr = m_pResultData->UpdateItem (itemID); _ASSERT (SUCCEEDED (hr)); } } } } else hr = E_FAIL; } else hr = E_FAIL; } else hr = E_POINTER;
_TRACE (-1, L"Leaving CCertTmplComponentData::OnReEnrollAllCerts"); return hr; }
HRESULT CCertTmplComponentData::OnCloneTemplate (LPDATAOBJECT pDataObject) { _TRACE (1, L"Entering CCertTmplComponentData::OnCloneTemplate"); AFX_MANAGE_STATE (AfxGetStaticModuleState ()); HRESULT hr = S_OK; CWaitCursor waitCursor;
if ( pDataObject ) { CCertTmplCookie* pCookie = ConvertCookie (pDataObject); if ( pCookie ) { _ASSERT (CERTTMPL_CERT_TEMPLATE == pCookie->m_objecttype); CCertTemplate* pOldTemplate = dynamic_cast <CCertTemplate*> (pCookie); if ( pOldTemplate ) { static PCWSTR pszDomainController = L"DomainController"; static PCWSTR pszComputer = L"Machine"; bool bIsComputerOrDC = pOldTemplate->GetTemplateName () == pszDomainController || pOldTemplate->GetTemplateName () == pszComputer;
HWND hWndConsole = 0;
m_pConsole->GetMainWindow (&hWndConsole); CWnd mainWindow; mainWindow.Attach (hWndConsole);
CCertTemplate* pNewTemplate = new CCertTemplate (*pOldTemplate, true, false, m_fUseCache); if ( pNewTemplate ) { // Generate a unique name for the new template
int nCopy = 1; CString newName;
while ( 1 ) { if ( 1 == nCopy ) { // security review BryanWal 2/20/2002 ok
newName.FormatMessage (IDS_COPY_OF_TEMPLATE, (PCWSTR) pOldTemplate->GetDisplayName ()); } else { // security review BryanWal 2/20/2002 ok
newName.FormatMessage (IDS_COPY_X_OF_TEMPLATE, nCopy, (PCWSTR) pOldTemplate->GetDisplayName ()); }
HCERTTYPE hCertType = 0; HRESULT hr1 = CAFindCertTypeByName (newName, NULL, CT_ENUM_MACHINE_TYPES | CT_ENUM_USER_TYPES | CT_FLAG_NO_CACHE_LOOKUP, &hCertType); _TRACE (0, L"checking to see if %s exists: %s\n", (PCWSTR) newName, SUCCEEDED (hr) ? L"was found" : L"was not found"); if ( SUCCEEDED (hr1) ) { hr1 = CACloseCertType (hCertType); if ( FAILED (hr1) ) { _TRACE (0, L"CACloseCertType () failed: 0x%x", hr); }
// This one exists, try another.
nCopy++; continue; } else { // This one does not exist. Use it as the new name.
break; } } if ( SUCCEEDED (hr) ) { hr = pNewTemplate->Clone (*pOldTemplate, newName, newName); if ( SUCCEEDED (hr) ) {
CString title;
VERIFY (title.LoadString (IDS_PROPERTIES_OF_NEW_TEMPLATE)); CTemplatePropertySheet propSheet (title, *pNewTemplate, &mainWindow);
CTemplateGeneralPropertyPage* pGeneralPage = new CTemplateGeneralPropertyPage ( *pNewTemplate, this);
if ( pGeneralPage ) { propSheet.AddPage (pGeneralPage); int nPage = 0;
// Add Request and Subject pages if subject is not a CA
if ( !pNewTemplate->SubjectIsCA () ) { propSheet.AddPage (new CTemplateV2RequestPropertyPage ( *pNewTemplate, pGeneralPage->m_bIsDirty)); nPage++; pGeneralPage->SetV2RequestPageNumber (nPage); if( !pNewTemplate->SubjectIsCrossCA() ) //Bug 435628, Yanggao, 7/13/2001
{ propSheet.AddPage (new CTemplateV2SubjectNamePropertyPage ( *pNewTemplate, pGeneralPage->m_bIsDirty, bIsComputerOrDC)); nPage++; } }
propSheet.AddPage (new CTemplateV2AuthenticationPropertyPage ( *pNewTemplate, pGeneralPage->m_bIsDirty)); nPage++; pGeneralPage->SetV2AuthPageNumber (nPage);
propSheet.AddPage (new CTemplateV2SupercedesPropertyPage ( *pNewTemplate, pGeneralPage->m_bIsDirty, this));
// Add template extension page - always add this page last (except for security)
propSheet.AddPage (new CTemplateExtensionsPropertyPage ( *pNewTemplate, pGeneralPage->m_bIsDirty));
CThemeContextActivator activator; INT_PTR iResult = propSheet.DoModal (); switch (iResult) { case IDOK: if ( pNewTemplate->FailedToSetSecurity () ) hr = pNewTemplate->Delete (); else { hr = pNewTemplate->DoAutoEnrollmentPendingSave ();
m_globalTemplateNameList.AddTail ( pNewTemplate->GetTemplateName ());
// unselect old template
HRESULTITEM itemID = 0;
ASSERT (m_pResultData); if ( m_pResultData ) { hr = m_pResultData->FindItemByLParam ( (LPARAM) pCookie, &itemID); ASSERT (SUCCEEDED (hr)); if ( SUCCEEDED (hr) ) { RESULTDATAITEM rdItem; // security review BryanWal 02/20/2002 ok
::ZeroMemory (&rdItem, sizeof (rdItem)); rdItem.itemID = itemID;
rdItem.mask = RDI_STATE; rdItem.nState &= ~(LVIS_FOCUSED | LVIS_SELECTED); hr = m_pResultData->SetItem (&rdItem); if ( SUCCEEDED (hr) ) { hr = m_pResultData->UpdateItem (itemID); ASSERT (SUCCEEDED (hr)); } } } else hr = E_FAIL;
// Reinitialize before displaying
hr = pNewTemplate->Initialize ();
// Add certificate template to result pane
RESULTDATAITEM rdItem; CCookie& rootCookie = QueryBaseRootCookie ();
// security review BryanWal 02/20/2002 ok
::ZeroMemory (&rdItem, sizeof (rdItem)); rdItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM | RDI_STATE; rdItem.nImage = iIconCertTemplateV2; rdItem.nCol = 0; rdItem.nState = LVIS_SELECTED | LVIS_FOCUSED; rdItem.str = MMC_TEXTCALLBACK;
rootCookie.m_listResultCookieBlocks.AddHead (pNewTemplate); rdItem.lParam = (LPARAM) pNewTemplate; pNewTemplate->m_resultDataID = m_pResultData; hr = m_pResultData->InsertItem (&rdItem); if ( FAILED (hr) ) { _TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr); } else { m_dwNumCertTemplates++; DisplayObjectCountInStatusBar ( m_pConsole, m_dwNumCertTemplates); } pNewTemplate = 0; } break;
case IDCANCEL: // Delete cloned template
if ( pNewTemplate->CanBeDeletedOnCancel () || pNewTemplate->FailedToSetSecurity () ) hr = pNewTemplate->Delete (); else // was created - let's update
{ hr = pNewTemplate->DoAutoEnrollmentPendingSave (); m_globalTemplateNameList.AddTail ( pNewTemplate->GetTemplateName ());
// Reinitialize before displaying
hr = pNewTemplate->Initialize ();
// Add certificate template to result pane
RESULTDATAITEM rdItem; CCookie& rootCookie = QueryBaseRootCookie ();
// security review BryanWal 02/20/2002 ok
::ZeroMemory (&rdItem, sizeof (rdItem)); rdItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM | RDI_STATE; rdItem.nImage = iIconCertTemplateV2; rdItem.nCol = 0; rdItem.nState = LVIS_SELECTED | LVIS_FOCUSED; rdItem.str = MMC_TEXTCALLBACK;
rootCookie.m_listResultCookieBlocks.AddHead (pNewTemplate); rdItem.lParam = (LPARAM) pNewTemplate; pNewTemplate->m_resultDataID = m_pResultData; hr = m_pResultData->InsertItem (&rdItem); if ( FAILED (hr) ) { _TRACE (0, L"IResultData::InsertItem () failed: 0x%x\n", hr); } else { m_dwNumCertTemplates++; DisplayObjectCountInStatusBar ( m_pConsole, m_dwNumCertTemplates); } pNewTemplate = 0; } break; } } else hr = E_OUTOFMEMORY;
} else { CString caption; CString text;
VERIFY (caption.LoadString (IDS_CERTTMPL)); // security review BryanWal 2/20/2002 ok
text.FormatMessage (IDS_UNABLE_TO_CLONE_TEMPLATE, pOldTemplate->GetDisplayName (), GetSystemMessage (hr));
int iRetVal = 0; VERIFY (SUCCEEDED (m_pConsole->MessageBox (text, caption, MB_ICONWARNING | MB_OK, &iRetVal))); } }
if ( pNewTemplate ) delete pNewTemplate; } else hr = E_OUTOFMEMORY;
mainWindow.Detach (); } else hr = E_UNEXPECTED; } else hr = E_FAIL; } else hr = E_POINTER;
_TRACE (-1, L"Leaving CCertTmplComponentData::OnCloneTemplate"); return hr; } HRESULT CCertTmplComponentData::AddViewOIDsMenuItem ( LPCONTEXTMENUCALLBACK pContextMenuCallback, LONG lInsertionPointID) { _TRACE (1, L"Entering CCertTmplComponentData::AddViewOIDsMenuItem\n"); AFX_MANAGE_STATE (AfxGetStaticModuleState ()); _ASSERT (pContextMenuCallback); HRESULT hr = S_OK; CONTEXTMENUITEM menuItem; CString szMenu; CString szHint;
// security review BryanWal 02/20/2002 ok
::ZeroMemory (&menuItem, sizeof (menuItem)); menuItem.lInsertionPointID = lInsertionPointID; menuItem.fFlags = 0; menuItem.fSpecialFlags = 0; VERIFY (szMenu.LoadString (IDS_VIEW_OIDS)); menuItem.strName = (PWSTR) (PCWSTR) szMenu; VERIFY (szHint.LoadString (IDS_VIEW_OIDS_HINT)); menuItem.strStatusBarText = (PWSTR) (PCWSTR) szHint; menuItem.lCommandID = IDM_VIEW_OIDS;
hr = pContextMenuCallback->AddItem (&menuItem); _ASSERT (SUCCEEDED (hr));
_TRACE (-1, L"Leaving CCertTmplComponentData::AddViewOIDsMenuItem\n"); return hr;
}
void CCertTmplComponentData::OnViewOIDs () { AFX_MANAGE_STATE (AfxGetStaticModuleState ()); HWND hWndConsole = 0;
m_pConsole->GetMainWindow (&hWndConsole); CWnd mainWindow; mainWindow.Attach (hWndConsole);
CViewOIDDlg dlg (&mainWindow);
CThemeContextActivator activator; dlg.DoModal ();
mainWindow.Detach (); }
|