410 lines
12 KiB
C++
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;
|
|
}
|
|
}
|