WindowsXP-SP1/admin/snapin/certmgr/saferentrypathpropertypage.cpp
2020-09-30 16:53:49 +02:00

410 lines
12 KiB
C++

//+---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000-2001.
//
// File: SaferEntryPathPropertyPage.cpp
//
// Contents: Implementation of CSaferEntryPathPropertyPage
//
//----------------------------------------------------------------------------
// SaferEntryPathPropertyPage.cpp : implementation file
//
#include "stdafx.h"
#include <gpedit.h>
#include "certmgr.h"
#include "compdata.h"
#include "SaferEntryPathPropertyPage.h"
#include "SaferUtil.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSaferEntryPathPropertyPage property page
CSaferEntryPathPropertyPage::CSaferEntryPathPropertyPage(
CSaferEntry& rSaferEntry,
LONG_PTR lNotifyHandle,
LPDATAOBJECT pDataObject,
bool bReadOnly,
bool bNew,
CCertMgrComponentData* pCompData,
bool bIsMachine)
: CHelpPropertyPage(CSaferEntryPathPropertyPage::IDD),
m_rSaferEntry (rSaferEntry),
m_bDirty (bNew),
m_lNotifyHandle (lNotifyHandle),
m_pDataObject (pDataObject),
m_bReadOnly (bReadOnly),
m_pCompData (pCompData),
m_bIsMachine (bIsMachine),
m_bFirst (true),
m_pidl (0),
m_bDialogInitInProgress (false)
{
//{{AFX_DATA_INIT(CSaferEntryPathPropertyPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_rSaferEntry.AddRef ();
m_rSaferEntry.IncrementOpenPageCount ();
}
CSaferEntryPathPropertyPage::~CSaferEntryPathPropertyPage()
{
if ( m_lNotifyHandle )
MMCFreeNotifyHandle (m_lNotifyHandle);
m_rSaferEntry.DecrementOpenPageCount ();
m_rSaferEntry.Release ();
if ( m_pidl )
{
LPMALLOC pMalloc = 0;
if ( SUCCEEDED (SHGetMalloc (&pMalloc)) )
{
pMalloc->Free (m_pidl);
pMalloc->Release ();
}
}
}
void CSaferEntryPathPropertyPage::DoDataExchange(CDataExchange* pDX)
{
CHelpPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSaferEntryPathPropertyPage)
DDX_Control(pDX, IDC_PATH_ENTRY_DESCRIPTION, m_descriptionEdit);
DDX_Control(pDX, IDC_PATH_ENTRY_PATH, m_pathEdit);
DDX_Control(pDX, IDC_PATH_ENTRY_SECURITY_LEVEL, m_securityLevelCombo);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSaferEntryPathPropertyPage, CHelpPropertyPage)
//{{AFX_MSG_MAP(CSaferEntryPathPropertyPage)
ON_EN_CHANGE(IDC_PATH_ENTRY_DESCRIPTION, OnChangePathEntryDescription)
ON_CBN_SELCHANGE(IDC_PATH_ENTRY_SECURITY_LEVEL, OnSelchangePathEntrySecurityLevel)
ON_EN_CHANGE(IDC_PATH_ENTRY_PATH, OnChangePathEntryPath)
ON_BN_CLICKED(IDC_PATH_ENTRY_BROWSE, OnPathEntryBrowse)
ON_EN_SETFOCUS(IDC_PATH_ENTRY_PATH, OnSetfocusPathEntryPath)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaferEntryPathPropertyPage message handlers
void CSaferEntryPathPropertyPage::DoContextHelp (HWND hWndControl)
{
_TRACE (1, L"Entering CSaferEntryPathPropertyPage::DoContextHelp\n");
static const DWORD help_map[] =
{
IDC_PATH_ENTRY_PATH, IDH_PATH_ENTRY_PATH,
IDC_PATH_ENTRY_SECURITY_LEVEL, IDH_PATH_ENTRY_SECURITY_LEVEL,
IDC_PATH_ENTRY_DESCRIPTION, IDH_PATH_ENTRY_DESCRIPTION,
IDC_PATH_ENTRY_LAST_MODIFIED, IDH_PATH_ENTRY_LAST_MODIFIED,
IDC_PATH_ENTRY_BROWSE, IDH_PATH_ENTRY_BROWSE_FOLDER,
0, 0
};
switch (::GetDlgCtrlID (hWndControl))
{
case IDC_PATH_ENTRY_PATH:
case IDC_PATH_ENTRY_SECURITY_LEVEL:
case IDC_PATH_ENTRY_DESCRIPTION:
case IDC_PATH_ENTRY_LAST_MODIFIED:
case IDC_PATH_ENTRY_BROWSE:
if ( !::WinHelp (
hWndControl,
GetF1HelpFilename(),
HELP_WM_HELP,
(DWORD_PTR) help_map) )
{
_TRACE (0, L"WinHelp () failed: 0x%x\n", GetLastError ());
}
break;
default:
break;
}
_TRACE (-1, L"Leaving CSaferEntryPathPropertyPage::DoContextHelp\n");
}
BOOL CSaferEntryPathPropertyPage::OnInitDialog()
{
CHelpPropertyPage::OnInitDialog();
m_bDialogInitInProgress = true;
if ( m_bDirty ) // bNew
{
SetDlgItemText (IDC_DATE_LAST_MODIFIED_LABEL, L"");
}
else
{
CString szText;
VERIFY (szText.LoadString (IDS_PATH_TITLE));
SetDlgItemText (IDC_PATH_TITLE, szText);
}
ASSERT (m_pCompData);
if ( m_pCompData )
{
CPolicyKey policyKey (m_pCompData->m_pGPEInformation,
SAFER_HKLM_REGBASE,
m_bIsMachine);
InitializeSecurityLevelComboBox (m_securityLevelCombo, false,
m_rSaferEntry.GetLevel (), policyKey.GetKey (),
m_pCompData->m_pdwSaferLevels,
m_bIsMachine);
// Initialize path
m_pathEdit.SetWindowText (m_rSaferEntry.GetPath ());
// Initialize description
m_descriptionEdit.LimitText (SAFER_MAX_DESCRIPTION_SIZE);
m_descriptionEdit.SetWindowText (m_rSaferEntry.GetDescription ());
SetDlgItemText (IDC_PATH_ENTRY_LAST_MODIFIED,
m_rSaferEntry.GetLongLastModified ());
if ( m_bReadOnly )
{
m_pathEdit.SetReadOnly ();
m_descriptionEdit.SetReadOnly ();
m_securityLevelCombo.EnableWindow (FALSE);
GetDlgItem (IDC_PATH_ENTRY_BROWSE)->EnableWindow (FALSE);
}
}
m_bDialogInitInProgress = false;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CSaferEntryPathPropertyPage::OnApply()
{
if ( m_bDirty && !m_bReadOnly )
{
if ( !ValidateEntryPath () )
return FALSE;
// Set the level
int nCurSel = m_securityLevelCombo.GetCurSel ();
ASSERT (CB_ERR != nCurSel);
m_rSaferEntry.SetLevel ((DWORD) m_securityLevelCombo.GetItemData (nCurSel));
CString szText;
m_pathEdit.GetWindowText (szText);
if ( szText.IsEmpty () )
{
CString text;
CString caption;
CThemeContextActivator activator;
VERIFY (caption.LoadString (IDS_SAFER_WINDOWS_NODE_NAME));
VERIFY (text.LoadString (IDS_SAFER_PATH_EMPTY));
MessageBox (text, caption, MB_OK);
m_pathEdit.SetFocus ();
return FALSE;
}
m_rSaferEntry.SetPath (szText);
m_descriptionEdit.GetWindowText (szText);
m_rSaferEntry.SetDescription (szText);
HRESULT hr = m_rSaferEntry.Save ();
if ( SUCCEEDED (hr) )
{
if ( m_lNotifyHandle )
MMCPropertyChangeNotify (
m_lNotifyHandle, // handle to a notification
(LPARAM) m_pDataObject); // unique identifier
m_bDirty = false;
}
else
{
CString text;
CString caption;
CThemeContextActivator activator;
VERIFY (caption.LoadString (IDS_SAFER_WINDOWS_NODE_NAME));
text.FormatMessage (IDS_ERROR_SAVING_ENTRY, GetSystemMessage (hr));
MessageBox (text, caption, MB_OK);
return FALSE;
}
}
return CHelpPropertyPage::OnApply();
}
void CSaferEntryPathPropertyPage::OnChangePathEntryDescription()
{
if ( !m_bDialogInitInProgress )
{
m_bDirty = true;
SetModified ();
}
}
void CSaferEntryPathPropertyPage::OnSelchangePathEntrySecurityLevel()
{
if ( !m_bDialogInitInProgress )
{
m_bDirty = true;
SetModified ();
}
}
void CSaferEntryPathPropertyPage::OnChangePathEntryPath()
{
if ( !m_bDialogInitInProgress )
{
m_bDirty = true;
SetModified ();
}
}
//+--------------------------------------------------------------------------
//
// Function: BrowseCallbackProc
//
// Synopsis: Callback procedure for File & Folder adding SHBrowseForFolder
// to set the title bar appropriately
//
// Arguments: [hwnd] - the hwnd of the browse dialog
// [uMsg] - the message from the dialog
// [lParam] - message dependant
// [pData] - PIDL from last successful call to SHBrowseForFolder
//
// Returns: 0
//
//---------------------------------------------------------------------------
int CSaferEntryPathPropertyPage::BrowseCallbackProc (HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM pData)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
switch(uMsg)
{
case BFFM_INITIALIZED:
{
CString szTitle;
VERIFY (szTitle.LoadString (IDS_SHBROWSEFORFOLDER_TITLE));
::SetWindowText (hwnd, szTitle);
if ( pData )
::SendMessage (hwnd, BFFM_SETSELECTION, FALSE, pData);
}
break;
default:
break;
}
return 0;
}
void CSaferEntryPathPropertyPage::OnPathEntryBrowse()
{
_TRACE (1, L"Entering CSaferEntryPathPropertyPage::OnPathEntryBrowse()\n");
CString szTitle;
VERIFY (szTitle.LoadString (IDS_SELECT_A_FOLDER));
WCHAR szDisplayName[MAX_PATH];
BROWSEINFO bi;
::ZeroMemory (&bi, sizeof (BROWSEINFO));
bi.hwndOwner = m_hWnd;
bi.pidlRoot = 0;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = szTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_VALIDATE | BIF_BROWSEINCLUDEFILES;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM) m_pidl;
bi.iImage = 0;
LPITEMIDLIST pidl = SHBrowseForFolder (&bi);
if ( pidl )
{
CString szFolderPath;
BOOL bRVal = SHGetPathFromIDList (pidl, szFolderPath.GetBuffer (MAX_PATH));
szFolderPath.ReleaseBuffer();
if ( bRVal )
{
LPMALLOC pMalloc = 0;
if ( SUCCEEDED (SHGetMalloc (&pMalloc)) )
{
if ( m_pidl )
pMalloc->Free (m_pidl);
pMalloc->Release ();
m_pidl = pidl;
}
m_pathEdit.SetWindowText (szFolderPath);
m_bDirty = true;
SetModified ();
}
}
_TRACE (-1, L"Leaving CSaferEntryPathPropertyPage::OnPathEntryBrowse()\n");
}
// NTRAID# 310880 SAFER: New Path Rule property sheet should not reject
// wildcard characters * and ?
#define ILLEGAL_FAT_CHARS L"\"+,;<=>[]|"
bool CSaferEntryPathPropertyPage::ValidateEntryPath()
{
bool bRVal = true;
CString szPath;
m_pathEdit.GetWindowText (szPath);
PCWSTR szInvalidCharSet = ILLEGAL_FAT_CHARS;
if ( -1 != szPath.FindOneOf (szInvalidCharSet) )
{
bRVal = false;
CString text;
CString caption;
VERIFY (caption.LoadString (IDS_SAFER_WINDOWS_NODE_NAME));
CString charsWithSpaces;
UINT nIndex = 0;
while (szInvalidCharSet[nIndex])
{
charsWithSpaces += szInvalidCharSet[nIndex];
charsWithSpaces += L" ";
nIndex++;
}
text.FormatMessage (IDS_SAFER_PATH_CONTAINS_INVALID_CHARS, charsWithSpaces);
CThemeContextActivator activator;
MessageBox (text, caption, MB_OK);
m_pathEdit.SetFocus ();
}
return bRVal;
}
void CSaferEntryPathPropertyPage::OnSetfocusPathEntryPath()
{
if ( m_bFirst )
{
if ( true == m_bReadOnly )
SendDlgItemMessage (IDC_PATH_ENTRY_PATH, EM_SETSEL, (WPARAM) 0, 0);
m_bFirst = false;
}
}