1924 lines
50 KiB
C++
1924 lines
50 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corporation, 1997-1999 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
snmppp.cpp
|
|
snmp extension property pages
|
|
|
|
FILE HISTORY:
|
|
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "snmpclst.h"
|
|
#include "snmpsnap.h"
|
|
#include "snmppp.h"
|
|
#include "tregkey.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
extern CString g_strMachineName;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAgentPage property page
|
|
|
|
IMPLEMENT_DYNCREATE(CAgentPage, CPropertyPageBase)
|
|
|
|
CAgentPage::CAgentPage()
|
|
: CPropertyPageBase(CAgentPage::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CAgentPage)
|
|
#if 0
|
|
m_strClientComment = _T("");
|
|
#endif
|
|
//}}AFX_DATA_INIT
|
|
|
|
}
|
|
|
|
CAgentPage::~CAgentPage()
|
|
{
|
|
}
|
|
|
|
void CAgentPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPageBase::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAgentPage)
|
|
DDX_Control(pDX, IDC_CHECK_PHYSICAL, m_checkPhysical);
|
|
DDX_Control(pDX, IDC_CHECK_APPLICATIONS, m_checkApplications);
|
|
DDX_Control(pDX, IDC_CHECK_DATALINK, m_checkDatalink);
|
|
DDX_Control(pDX, IDC_CHECK_INTERNET, m_checkInternet);
|
|
DDX_Control(pDX, IDC_CHECK_ENDTOEND, m_checkEndToEnd);
|
|
DDX_Control(pDX, IDC_EDIT_CONTACT, m_editContact);
|
|
DDX_Control(pDX, IDC_EDIT_LOCATION, m_editLocation);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CAgentPage, CPropertyPageBase)
|
|
//{{AFX_MSG_MAP(CAgentPage)
|
|
ON_BN_CLICKED(IDC_CHECK_PHYSICAL, OnClickedCheckPhysical)
|
|
ON_BN_CLICKED(IDC_CHECK_APPLICATIONS, OnClickedCheckApplications)
|
|
ON_BN_CLICKED(IDC_CHECK_DATALINK, OnClickedCheckDatalink)
|
|
ON_BN_CLICKED(IDC_CHECK_INTERNET, OnClickedCheckInternet)
|
|
ON_BN_CLICKED(IDC_CHECK_ENDTOEND, OnClickedCheckEndToEnd)
|
|
ON_EN_CHANGE(IDC_EDIT_CONTACT, OnChangeEditContact)
|
|
ON_EN_CHANGE(IDC_EDIT_LOCATION, OnChangeEditLocation)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAgentPage message handlers
|
|
|
|
BOOL CAgentPage::OnInitDialog()
|
|
{
|
|
CPropertyPageBase::OnInitDialog();
|
|
|
|
m_bLocationChanged = FALSE;
|
|
m_bContactChanged = FALSE;
|
|
|
|
// Limit edit controls
|
|
m_editContact.SetLimitText(COMBO_EDIT_LEN);
|
|
m_editLocation.SetLimitText(COMBO_EDIT_LEN);
|
|
|
|
if (LoadRegistry() == FALSE)
|
|
{
|
|
AfxMessageBox(IDS_REGISTRY_LOAD_FAILED, MB_ICONSTOP|MB_OK);
|
|
// PostMessage(GetParent(*this), WM_COMMAND, IDCANCEL, 0);
|
|
}
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
BOOL CAgentPage::OnApply()
|
|
{
|
|
UpdateData();
|
|
|
|
if( SaveRegistry() == FALSE )
|
|
{
|
|
AfxMessageBox(IDS_REGISTRY_SAVE_FAILED, MB_ICONSTOP|MB_OK);
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL bRet = CPropertyPageBase::OnApply();
|
|
|
|
if (bRet == FALSE)
|
|
{
|
|
// Something bad happened... grab the error code
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
// ::DhcpMessageBox(GetHolder()->GetError());
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CAgentPage::LoadRegistry()
|
|
{
|
|
RegKey rk;
|
|
LONG err;
|
|
CString strContact;
|
|
CString strLocation;
|
|
DWORD dwServices = 0;
|
|
LPCTSTR lpcszMachineName = g_strMachineName.IsEmpty() ? NULL : (LPCTSTR)g_strMachineName;
|
|
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
AGENT_REG_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
err = rk.Create(HKEY_LOCAL_MACHINE,
|
|
AGENT_REG_KEY_NAME,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
}
|
|
|
|
err = rk.QueryValue(SNMP_CONTACT, strContact);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
err = rk.QueryValue(SNMP_LOCATION, strLocation);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
err = rk.QueryValue(SNMP_SERVICES, dwServices);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
// if no registry value, set it to default:
|
|
// applications, end-to-end, internet
|
|
dwServices = 0x40 | 0x8 | 0x4;
|
|
}
|
|
|
|
m_editContact.SetWindowText(strContact);
|
|
m_editLocation.SetWindowText(strLocation);
|
|
|
|
m_checkPhysical.SetCheck((dwServices & 0x1));
|
|
m_checkDatalink.SetCheck((dwServices & 0x2));
|
|
m_checkInternet.SetCheck((dwServices & 0x4));
|
|
m_checkEndToEnd.SetCheck((dwServices & 0x8));
|
|
m_checkApplications.SetCheck((dwServices & 0x40));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CAgentPage::SaveRegistry()
|
|
{
|
|
RegKey rk;
|
|
LONG err;
|
|
CString strContact;
|
|
CString strLocation;
|
|
DWORD dwServices = 0;
|
|
LPCTSTR lpcszMachineName = g_strMachineName.IsEmpty() ? NULL : (LPCTSTR)g_strMachineName;
|
|
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
AGENT_REG_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
err = rk.Create(HKEY_LOCAL_MACHINE,
|
|
AGENT_REG_KEY_NAME,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
}
|
|
|
|
dwServices |= (m_checkPhysical.GetCheck() ? 0x1 : 0 ) ;
|
|
dwServices |= (m_checkDatalink.GetCheck() ? 0x2 : 0 ) ;
|
|
dwServices |= (m_checkInternet.GetCheck() ? 0x4 : 0 ) ;
|
|
dwServices |= (m_checkEndToEnd.GetCheck() ? 0x8 : 0 ) ;
|
|
dwServices |= (m_checkApplications.GetCheck() ? 0x40 : 0 ) ;
|
|
|
|
err = rk.SetValue(SNMP_SERVICES, dwServices);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
m_editContact.GetWindowText(strContact);
|
|
err = rk.SetValue(SNMP_CONTACT, strContact);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
m_editLocation.GetWindowText(strLocation);
|
|
err = rk.SetValue(SNMP_LOCATION, strLocation);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CAgentPage::OnClickedCheckPhysical()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CAgentPage::OnClickedCheckApplications()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CAgentPage::OnClickedCheckDatalink()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
void CAgentPage::OnClickedCheckInternet()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CAgentPage::OnClickedCheckEndToEnd()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CAgentPage::OnChangeEditContact()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CAgentPage::OnChangeEditLocation()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTrapsPage property page
|
|
//
|
|
|
|
IMPLEMENT_DYNCREATE(CTrapsPage, CPropertyPageBase)
|
|
|
|
CTrapsPage::CTrapsPage()
|
|
: CPropertyPageBase(CTrapsPage::IDD)
|
|
{
|
|
m_pCommunityList = new CObList();
|
|
m_fPolicyTrapConfig = FALSE; // default to use service registry
|
|
//{{AFX_DATA_INIT(CTrapsPage)
|
|
#if 0
|
|
m_strServerNetbiosName = _T("");
|
|
#endif
|
|
//}}AFX_DATA_INIT
|
|
|
|
}
|
|
|
|
CTrapsPage::~CTrapsPage()
|
|
{
|
|
m_pCommunityList->RemoveAll();
|
|
delete m_pCommunityList;
|
|
}
|
|
|
|
void CTrapsPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPageBase::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CTrapsPage)
|
|
DDX_Control(pDX, IDC_COMBO_COMMUNITY, m_comboCommunityName);
|
|
DDX_Control(pDX, IDC_BUTTON_ADD_NAME, m_buttonAddName);
|
|
DDX_Control(pDX, IDC_BUTTON_REMOVE_NAME, m_buttonRemoveName);
|
|
DDX_Control(pDX, IDC_LIST_TRAP, m_listboxTrapDestinations);
|
|
DDX_Control(pDX, IDC_BUTTON_ADD_TRAP, m_buttonAddTrap);
|
|
DDX_Control(pDX, IDC_BUTTON_EDIT_TRAP, m_buttonEditTrap);
|
|
DDX_Control(pDX, IDC_BUTTON_REMOVE_TRAP, m_buttonRemoveTrap);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CTrapsPage, CPropertyPageBase)
|
|
//{{AFX_MSG_MAP(CTrapsPage)
|
|
ON_BN_CLICKED(IDC_BUTTON_ADD_NAME, OnClickedButtonAddName)
|
|
ON_BN_CLICKED(IDC_BUTTON_REMOVE_NAME, OnClickedButtonRemoveName)
|
|
ON_BN_CLICKED(IDC_BUTTON_ADD_TRAP, OnClickedButtonAddTrap)
|
|
ON_BN_CLICKED(IDC_BUTTON_EDIT_TRAP, OnClickedButtonEditTrap)
|
|
ON_BN_CLICKED(IDC_BUTTON_REMOVE_TRAP, OnClickedButtonRemoveTrap)
|
|
|
|
ON_CBN_EDITCHANGE(IDC_COMBO_COMMUNITY, OnEditChangeCommunityName)
|
|
ON_CBN_EDITUPDATE(IDC_COMBO_COMMUNITY, OnEditUpdateCommunityName)
|
|
ON_CBN_SELCHANGE(IDC_COMBO_COMMUNITY, OnSelectionChangeCommunityName)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTrapsPage message handlers
|
|
|
|
BOOL CTrapsPage::OnInitDialog()
|
|
{
|
|
CPropertyPageBase::OnInitDialog();
|
|
|
|
m_comboCommunityName.LimitText(COMBO_EDIT_LEN-1);
|
|
if( LoadRegistry() ) {
|
|
if( m_comboCommunityName.GetCount() ) {
|
|
m_comboCommunityName.SetCurSel(0);
|
|
LoadTrapDestination(0);
|
|
}
|
|
}
|
|
else {
|
|
AfxMessageBox(IDS_REGISTRY_LOAD_FAILED, MB_ICONSTOP|MB_OK);
|
|
}
|
|
|
|
UpdateCommunityAddButton(); // set state of Add button
|
|
UpdateCommunityRemoveButton(); // set state of Remove button
|
|
UpdateTrapDestinationButtons(); // set state of TRAP destination buttons
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
BOOL CTrapsPage::OnApply()
|
|
{
|
|
UpdateData();
|
|
|
|
if( SaveRegistry() == FALSE )
|
|
{
|
|
AfxMessageBox(IDS_REGISTRY_SAVE_FAILED, MB_ICONSTOP|MB_OK);
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL bRet = CPropertyPageBase::OnApply();
|
|
|
|
if (bRet == FALSE)
|
|
{
|
|
// Something bad happened... grab the error code
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
// ::DhcpMessageBox(GetHolder()->GetError());
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CTrapsPage::LoadRegistry()
|
|
{
|
|
RegKey rk;
|
|
RegKey rkTrap;
|
|
RegKeyIterator rkIter;
|
|
RegValueIterator rvIter;
|
|
HRESULT hr, hrIter;
|
|
LONG err;
|
|
CString stKey, stValue;
|
|
LPCTSTR lpcszMachineName = g_strMachineName.IsEmpty() ? NULL : (LPCTSTR)g_strMachineName;
|
|
BOOL fPolicy;
|
|
|
|
// we need to provide precedence to the parameters set through the policy
|
|
fPolicy = TRUE;
|
|
if (fPolicy)
|
|
{
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
POLICY_TRAP_CONFIG_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
fPolicy = FALSE;
|
|
else
|
|
{
|
|
// remember that we are loading from policy registry
|
|
m_fPolicyTrapConfig = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
if (fPolicy == FALSE)
|
|
{
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
TRAP_CONFIG_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
err = rk.Create(HKEY_LOCAL_MACHINE,
|
|
TRAP_CONFIG_KEY_NAME,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
err = rkIter.Init(&rk);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
|
|
for (hrIter = rkIter.Next(&stKey); hrIter == hrOK; hrIter = rkIter.Next(&stKey)) {
|
|
//
|
|
// open the key
|
|
//
|
|
err = rkTrap.Open(rk, stKey, KEY_READ);
|
|
|
|
int nIndex = m_comboCommunityName.InsertString(-1, stKey);
|
|
if (nIndex >= 0 ) {
|
|
CStringList * pstrList = new CStringList();
|
|
if (!pstrList) {
|
|
return FALSE;
|
|
}
|
|
|
|
m_comboCommunityName.SetItemData(nIndex, (ULONG_PTR) pstrList);
|
|
m_pCommunityList->AddHead(pstrList);
|
|
|
|
err = rvIter.Init(&rkTrap);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
|
|
for (hr = rvIter.Next(&stValue, NULL); hr == hrOK; hr = rvIter.Next(&stValue, NULL)) {
|
|
CString strTrap;
|
|
err = rkTrap.QueryValue(stValue, strTrap);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
CString * pstr = new CString(strTrap);
|
|
if (!pstr) {
|
|
return FALSE;
|
|
}
|
|
pstrList->AddHead(*pstr);
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CTrapsPage::SaveRegistry()
|
|
{
|
|
RegKey rk;
|
|
RegKey rkTrap;
|
|
LONG err;
|
|
LPCTSTR lpcszMachineName = g_strMachineName.IsEmpty() ? NULL : (LPCTSTR)g_strMachineName;
|
|
|
|
|
|
if (m_fPolicyTrapConfig)
|
|
{
|
|
// Group Policy enforced
|
|
return TRUE;
|
|
}
|
|
|
|
// Open the SNMP Parameters key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
SNMP_PARAMS_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// delete the Trap Configuration key first
|
|
err = rk.RecurseDeleteKey(TRAP_CONFIGURATION);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
|
|
// now create the key to add the new values
|
|
err = rk.Create(HKEY_LOCAL_MACHINE,
|
|
TRAP_CONFIG_KEY_NAME,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
CString strCommunityName;
|
|
|
|
int nMax = m_comboCommunityName.GetCount();
|
|
for (int nCount = 0; nCount < nMax; nCount++ ) {
|
|
|
|
m_comboCommunityName.GetLBText(nCount, strCommunityName);
|
|
|
|
ASSERT(strCommunityName.GetLength());
|
|
|
|
CStringList * pstrList = (CStringList *)m_comboCommunityName.GetItemData(nCount);
|
|
|
|
// For each community name create a key
|
|
err = rkTrap.Create(rk, strCommunityName);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
|
|
// for each community name get the TRAP destination values from the saved
|
|
// away list and write them as values to the registry
|
|
|
|
POSITION posTrap;
|
|
CString * pstr;
|
|
TCHAR buf[32];
|
|
int j;
|
|
|
|
for (j = 1, posTrap = pstrList->GetHeadPosition();
|
|
posTrap != NULL && (pstr = & (pstrList->GetNext( posTrap )));
|
|
j++ ) {
|
|
|
|
wsprintf(buf, TEXT("%d"), j);
|
|
err = rkTrap.SetValue(buf, *pstr);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CTrapsPage::LoadTrapDestination(int nIndex)
|
|
{
|
|
ASSERT (m_pCommunityList);
|
|
|
|
POSITION pos;
|
|
|
|
// empty list box and add trap destinations for this community name
|
|
m_listboxTrapDestinations.ResetContent();
|
|
|
|
CStringList * pstrList = (CStringList *)m_comboCommunityName.GetItemData(nIndex);
|
|
|
|
CString * pstr;
|
|
|
|
for (pos = pstrList->GetHeadPosition();
|
|
pos != NULL && (pstr = & pstrList->GetNext( pos )); /**/) {
|
|
|
|
m_listboxTrapDestinations.AddString(*pstr);
|
|
}
|
|
|
|
if (m_listboxTrapDestinations.GetCount()) {
|
|
m_listboxTrapDestinations.SetCurSel(0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CTrapsPage::UpdateCommunityAddButton()
|
|
{
|
|
CString strCommunityName;
|
|
|
|
m_comboCommunityName.GetWindowText(strCommunityName);
|
|
if (strCommunityName.GetLength()) {
|
|
// enable the button if the text doesn't match
|
|
BOOL bEnable = (m_comboCommunityName.FindStringExact(-1, strCommunityName) == CB_ERR);
|
|
if (!bEnable) {
|
|
// move focus to the combo box before disabling the Add button
|
|
m_comboCommunityName.SetFocus();
|
|
}
|
|
m_buttonAddName.EnableWindow(bEnable);
|
|
}
|
|
else
|
|
{
|
|
m_buttonAddName.EnableWindow(FALSE);
|
|
m_comboCommunityName.SetFocus();
|
|
}
|
|
|
|
if (m_fPolicyTrapConfig)
|
|
{
|
|
// Group Policy enforced
|
|
m_buttonAddName.EnableWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
void CTrapsPage::UpdateCommunityRemoveButton()
|
|
{
|
|
int nCount = m_comboCommunityName.GetCount();
|
|
|
|
if(nCount == 0)
|
|
m_comboCommunityName.SetFocus();
|
|
|
|
m_buttonRemoveName.EnableWindow(nCount? TRUE : FALSE);
|
|
|
|
if (m_fPolicyTrapConfig)
|
|
{
|
|
// Group Policy enforced
|
|
m_buttonRemoveName.EnableWindow(FALSE);
|
|
m_buttonAddName.EnableWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
void CTrapsPage::UpdateTrapDestinationButtons()
|
|
{
|
|
m_buttonAddTrap.EnableWindow(m_comboCommunityName.GetCount()? TRUE : FALSE);
|
|
|
|
int nCount = m_listboxTrapDestinations.GetCount();
|
|
|
|
m_buttonEditTrap.EnableWindow(nCount? TRUE: FALSE);
|
|
m_buttonRemoveTrap.EnableWindow(nCount? TRUE: FALSE);
|
|
|
|
if (m_fPolicyTrapConfig)
|
|
{
|
|
// Group Policy enforced
|
|
m_buttonAddTrap.EnableWindow(FALSE);
|
|
m_buttonEditTrap.EnableWindow(FALSE);
|
|
m_buttonRemoveTrap.EnableWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
/*
|
|
Handle the ON_CBN_EDITCHANGE message.
|
|
The user has taken an action that may have altered the text in the
|
|
edit-control portion of a combo box.
|
|
Unlike the CBN_EDITUPDATE message, this message is sent after Windows
|
|
updates the screen.
|
|
*/
|
|
|
|
void CTrapsPage::OnEditChangeCommunityName()
|
|
{
|
|
UpdateCommunityAddButton();
|
|
// UpdateTrapDestinationButtons();
|
|
}
|
|
|
|
/*
|
|
Handle the ON_CBN_EDITUPDATE message.
|
|
The user has taken an action that may have altered the text in the
|
|
edit-control portion of a combo box.
|
|
*/
|
|
|
|
void CTrapsPage::OnEditUpdateCommunityName()
|
|
{
|
|
UpdateCommunityAddButton();
|
|
m_buttonRemoveName.EnableWindow(FALSE);
|
|
m_buttonAddTrap.EnableWindow(FALSE);
|
|
}
|
|
|
|
void CTrapsPage::OnSelectionChangeCommunityName()
|
|
// User has changed the community name selection
|
|
// load the corresponding trap destination entries in the listbox
|
|
{
|
|
int nIndex = m_comboCommunityName.GetCurSel();
|
|
|
|
if (nIndex != CB_ERR) {
|
|
LoadTrapDestination(nIndex);
|
|
}
|
|
else // there are no items in the combobox
|
|
{
|
|
m_listboxTrapDestinations.ResetContent();
|
|
}
|
|
UpdateCommunityRemoveButton();
|
|
UpdateTrapDestinationButtons();
|
|
}
|
|
|
|
void CTrapsPage::OnClickedButtonAddName()
|
|
{
|
|
CString strCommunityName;
|
|
|
|
m_comboCommunityName.GetWindowText(strCommunityName);
|
|
|
|
int nIndex = m_comboCommunityName.InsertString(-1, strCommunityName);
|
|
|
|
if (nIndex >= 0 ) {
|
|
// Create a Trap list item and add to global list
|
|
// the items added to the trap destination will be inserted in
|
|
// this list - see OnClickedAddbuttonAddTrap
|
|
|
|
CStringList * pstrList = new CStringList;
|
|
|
|
m_pCommunityList->AddHead(pstrList);
|
|
|
|
// save list pointer with data
|
|
m_comboCommunityName.SetItemData(nIndex, (ULONG_PTR) pstrList);
|
|
m_comboCommunityName.SetCurSel(nIndex);
|
|
LoadTrapDestination(nIndex);
|
|
UpdateCommunityAddButton();
|
|
UpdateCommunityRemoveButton();
|
|
UpdateTrapDestinationButtons();
|
|
SetDirty(TRUE);
|
|
}
|
|
}
|
|
|
|
void CTrapsPage::OnClickedButtonRemoveName()
|
|
{
|
|
int nIndex = m_comboCommunityName.GetCurSel();
|
|
|
|
ASSERT(nIndex >= 0 );
|
|
|
|
POSITION pos;
|
|
|
|
if (nIndex != CB_ERR) {
|
|
ASSERT (m_pCommunityList);
|
|
|
|
CStringList * pstrList, * pstrList2;
|
|
|
|
pstrList = (CStringList *) m_comboCommunityName.GetItemData(nIndex);
|
|
|
|
pos = m_pCommunityList->Find( pstrList);
|
|
|
|
if( pos ) {
|
|
pstrList2 = (CStringList *) & m_pCommunityList->GetAt(pos);
|
|
// delete the item from the global list
|
|
m_pCommunityList->RemoveAt(pos);
|
|
delete pstrList;
|
|
}
|
|
|
|
// remove the item from the Combo Box
|
|
m_comboCommunityName.DeleteString(nIndex);
|
|
|
|
// select item 0 if there are any left
|
|
if (m_comboCommunityName.GetCount()) {
|
|
m_comboCommunityName.SetCurSel(0);
|
|
}
|
|
else
|
|
m_comboCommunityName.SetWindowText(_T(""));
|
|
|
|
OnSelectionChangeCommunityName();
|
|
UpdateCommunityRemoveButton();
|
|
UpdateTrapDestinationButtons();
|
|
SetDirty(TRUE);
|
|
}
|
|
}
|
|
|
|
void CTrapsPage::OnClickedButtonAddTrap()
|
|
{
|
|
if (m_dlgAdd.DoModal() == IDOK)
|
|
{
|
|
if (m_dlgAdd.m_strName.GetLength()) {
|
|
int nIndex = m_comboCommunityName.GetCurSel();
|
|
|
|
if (nIndex >= 0) {
|
|
|
|
ULONG_PTR dwData = m_comboCommunityName.GetItemData(nIndex);
|
|
|
|
if (dwData != CB_ERR) {
|
|
|
|
CStringList * pstrList = (CStringList *) dwData;
|
|
|
|
nIndex = m_listboxTrapDestinations.InsertString(-1, m_dlgAdd.m_strName);
|
|
if (nIndex >=0) {
|
|
SetDirty(TRUE);
|
|
|
|
m_listboxTrapDestinations.SetCurSel(nIndex);
|
|
|
|
CString * pstr = new CString(m_dlgAdd.m_strName);
|
|
pstrList->AddHead(*pstr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
UpdateTrapDestinationButtons();
|
|
}
|
|
|
|
void CTrapsPage::OnClickedButtonEditTrap()
|
|
{
|
|
int nLBIndex = m_listboxTrapDestinations.GetCurSel();
|
|
int nCBIndex = m_comboCommunityName.GetCurSel();
|
|
|
|
if (nCBIndex >=0 && nLBIndex >=0) {
|
|
CString strTrap;
|
|
|
|
m_listboxTrapDestinations.GetText(nLBIndex, strTrap);
|
|
ASSERT( strTrap.GetLength() != 0 );
|
|
m_dlgEdit.m_strName = strTrap;
|
|
|
|
// present dialog
|
|
|
|
if (m_dlgEdit.DoModal() == IDOK)
|
|
{
|
|
if (m_dlgEdit.m_strName.GetLength()) {
|
|
// remove item and then add it
|
|
OnClickedButtonRemoveTrap();
|
|
|
|
ULONG_PTR dwData = m_comboCommunityName.GetItemData(nCBIndex);
|
|
|
|
if (dwData != CB_ERR) {
|
|
|
|
CStringList * pstrList = (CStringList *) dwData;
|
|
|
|
nLBIndex = m_listboxTrapDestinations.InsertString(-1, m_dlgEdit.m_strName);
|
|
if (nLBIndex >=0) {
|
|
SetDirty(TRUE);
|
|
|
|
m_listboxTrapDestinations.SetCurSel(nLBIndex);
|
|
|
|
CString * pstr = new CString(m_dlgEdit.m_strName);
|
|
pstrList->AddHead(*pstr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
UpdateTrapDestinationButtons();
|
|
}
|
|
|
|
void CTrapsPage::OnClickedButtonRemoveTrap()
|
|
{
|
|
int nLBIndex = m_listboxTrapDestinations.GetCurSel();
|
|
int nCBIndex = m_comboCommunityName.GetCurSel();
|
|
|
|
if (nCBIndex >=0 && nLBIndex >=0) {
|
|
ULONG_PTR dwData = m_comboCommunityName.GetItemData(nCBIndex);
|
|
ASSERT (dwData != CB_ERR);
|
|
|
|
CString strTrap;
|
|
|
|
m_listboxTrapDestinations.GetText(nLBIndex, strTrap);
|
|
ASSERT( strTrap.GetLength() != 0 );
|
|
|
|
if (strTrap.GetLength() != NULL && dwData != CB_ERR) {
|
|
|
|
m_listboxTrapDestinations.DeleteString(nLBIndex);
|
|
SetDirty(TRUE);
|
|
|
|
CStringList * pStrList = (CStringList*) dwData;
|
|
|
|
// find the matching string and remove
|
|
POSITION pos = pStrList->Find(strTrap);
|
|
pStrList->RemoveAt(pos);
|
|
m_dlgAdd.m_strName = strTrap; // save off item removed
|
|
|
|
int nCount = m_listboxTrapDestinations.GetCount();
|
|
|
|
if (nCount) {
|
|
if (nCount != nLBIndex) {
|
|
m_listboxTrapDestinations.SetCurSel(nLBIndex);
|
|
}
|
|
else
|
|
{
|
|
m_listboxTrapDestinations.SetCurSel(nCount-1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
UpdateTrapDestinationButtons();
|
|
}
|
|
|
|
IMPLEMENT_DYNCREATE(CSecurityPage, CPropertyPageBase)
|
|
|
|
CSecurityPage::CSecurityPage()
|
|
: CPropertyPageBase(CSecurityPage::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CSecurityPage)
|
|
//}}AFX_DATA_INIT
|
|
m_fPolicyValidCommunities = m_fPolicyPermittedManagers = FALSE;
|
|
|
|
}
|
|
|
|
CSecurityPage::~CSecurityPage()
|
|
{
|
|
}
|
|
|
|
void CSecurityPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPageBase::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CSecurityPage)
|
|
DDX_Control(pDX, IDC_LIST_COMMUNITY, m_listboxCommunity);
|
|
DDX_Control(pDX, IDC_BUTTON_ADD_COMMUNITY, m_buttonAddCommunity);
|
|
DDX_Control(pDX, IDC_BUTTON_EDIT_COMMUNITY, m_buttonEditCommunity);
|
|
DDX_Control(pDX, IDC_BUTTON_REMOVE_COMMUNITY, m_buttonRemoveCommunity);
|
|
DDX_Control(pDX, IDC_BUTTON_ADD_HOSTS, m_buttonAddHost);
|
|
DDX_Control(pDX, IDC_BUTTON_EDIT_HOSTS, m_buttonEditHost);
|
|
DDX_Control(pDX, IDC_BUTTON_REMOVE_HOSTS, m_buttonRemoveHost);
|
|
DDX_Control(pDX, IDC_LIST_HOSTS, m_listboxHost);
|
|
DDX_Control(pDX, IDC_CHECK_SEND_AUTH_TRAP, m_checkSendAuthTrap);
|
|
DDX_Control(pDX, IDC_RADIO_ACCEPT_ANY, m_radioAcceptAnyHost);
|
|
DDX_Control(pDX, IDC_RADIO_ACCEPT_SPECIFIC_HOSTS, m_radioAcceptSpecificHost);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CSecurityPage, CPropertyPageBase)
|
|
//{{AFX_MSG_MAP(CSecurityPage)
|
|
ON_BN_CLICKED(IDC_BUTTON_ADD_COMMUNITY, OnClickedButtonAddCommunity)
|
|
ON_BN_CLICKED(IDC_BUTTON_EDIT_COMMUNITY, OnClickedButtonEditCommunity)
|
|
ON_BN_CLICKED(IDC_BUTTON_REMOVE_COMMUNITY, OnClickedButtonRemoveCommunity)
|
|
ON_BN_CLICKED(IDC_BUTTON_ADD_HOSTS, OnClickedButtonAddHost)
|
|
ON_BN_CLICKED(IDC_BUTTON_EDIT_HOSTS, OnClickedButtonEditHost)
|
|
ON_BN_CLICKED(IDC_BUTTON_REMOVE_HOSTS, OnClickedButtonRemoveHost)
|
|
ON_BN_CLICKED(IDC_CHECK_SEND_AUTH_TRAP, OnClickedCheckSendAuthTrap)
|
|
ON_BN_CLICKED(IDC_RADIO_ACCEPT_ANY, OnClickedRadioAcceptAnyHost)
|
|
ON_BN_CLICKED(IDC_RADIO_ACCEPT_SPECIFIC_HOSTS, OnClickedRadioAcceptSpecificHost)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_LIST_COMMUNITY, OnDblclkCtrlistCommunity)
|
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_COMMUNITY, OnCommunityListChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSecurityPage message handlers
|
|
|
|
BOOL CSecurityPage::OnInitDialog()
|
|
{
|
|
CPropertyPageBase::OnInitDialog();
|
|
m_listboxCommunity.OnInitList();
|
|
|
|
if (LoadRegistry() == FALSE) {
|
|
AfxMessageBox(IDS_REGISTRY_LOAD_FAILED, MB_ICONSTOP|MB_OK);
|
|
}
|
|
|
|
UpdateNameButtons();
|
|
UpdateHostButtons();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
BOOL CSecurityPage::OnApply()
|
|
{
|
|
UpdateData();
|
|
|
|
if (m_radioAcceptSpecificHost.GetCheck()) {
|
|
if (m_listboxHost.GetCount() == 0) {
|
|
AfxMessageBox(IDS_ACCEPTHOST_MISSING, MB_ICONSTOP|MB_OK);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
if( SaveRegistry() == FALSE )
|
|
{
|
|
AfxMessageBox(IDS_REGISTRY_SAVE_FAILED, MB_ICONSTOP|MB_OK);
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL bRet = CPropertyPageBase::OnApply();
|
|
|
|
if (bRet == FALSE)
|
|
{
|
|
// Something bad happened... grab the error code
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
// ::DhcpMessageBox(GetHolder()->GetError());
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
void CSecurityPage::OnClickedButtonAddCommunity()
|
|
{
|
|
CString strText;
|
|
|
|
strText.LoadString( IDS_SNMPCOMM_TEXT );
|
|
|
|
// change static text of dialog to "Community Name"
|
|
m_dlgAddName.m_bCommunity = TRUE;
|
|
m_dlgAddName.m_nChoice = PERM_BIT_READONLY;
|
|
|
|
if (m_dlgAddName.DoModal() == IDOK)
|
|
{
|
|
int nIndex;
|
|
|
|
if (m_dlgAddName.m_strName.GetLength()) {
|
|
if ((nIndex = m_listboxCommunity.InsertString(-1, m_dlgAddName.m_strName)) >=0 &&
|
|
m_listboxCommunity.SetItemText(nIndex, 1, m_dlgAddName.m_strChoice) &&
|
|
m_listboxCommunity.SetItemData(nIndex, m_dlgAddName.m_nChoice))
|
|
{
|
|
m_listboxCommunity.SetCurSel(nIndex);
|
|
UpdateNameButtons();
|
|
SetDirty(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CSecurityPage::OnClickedButtonEditCommunity()
|
|
{
|
|
int nIndex;
|
|
int nPermissions;
|
|
|
|
nIndex = m_listboxCommunity.GetCurSel();
|
|
ASSERT(nIndex >= 0);
|
|
|
|
if (nIndex < 0) {
|
|
return;
|
|
}
|
|
|
|
nPermissions = (int) m_listboxCommunity.GetItemData(nIndex);
|
|
CString strName;
|
|
|
|
m_listboxCommunity.GetText(nIndex, strName);
|
|
|
|
// save off old string
|
|
m_dlgAddName.m_strName = strName;
|
|
m_dlgAddName.m_nChoice = nPermissions;
|
|
|
|
m_dlgEditName.m_bCommunity = TRUE;
|
|
m_dlgEditName.m_strName = strName;
|
|
m_dlgEditName.m_nChoice = nPermissions;
|
|
|
|
if (m_dlgEditName.DoModal() == IDOK) {
|
|
// first delete the string from list box
|
|
m_listboxCommunity.DeleteString(nIndex);
|
|
|
|
SetDirty(TRUE);
|
|
|
|
if ((nIndex = m_listboxCommunity.InsertString(nIndex, m_dlgEditName.m_strName)) >= 0 &&
|
|
m_listboxCommunity.SetItemText(nIndex, 1, m_dlgEditName.m_strChoice) &&
|
|
m_listboxCommunity.SetItemData(nIndex, m_dlgEditName.m_nChoice))
|
|
{
|
|
m_listboxCommunity.SetCurSel(nIndex);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CSecurityPage::OnClickedButtonRemoveCommunity()
|
|
{
|
|
int nIndex = m_listboxCommunity.GetCurSel();
|
|
if (nIndex < 0)
|
|
return;
|
|
|
|
CString strName;
|
|
|
|
m_listboxCommunity.GetText(nIndex, strName);
|
|
// save off removed name for quick add
|
|
m_dlgAddName.m_strName = strName;
|
|
|
|
m_listboxCommunity.DeleteString(nIndex);
|
|
|
|
int nCount = m_listboxCommunity.GetCount();
|
|
|
|
if (nCount != nIndex) {
|
|
m_listboxCommunity.SetCurSel(nIndex);
|
|
}
|
|
else
|
|
{
|
|
m_listboxCommunity.SetCurSel(nCount -1);
|
|
}
|
|
|
|
UpdateNameButtons();
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CSecurityPage::UpdateNameButtons()
|
|
{
|
|
int nCount = m_listboxCommunity.GetCount();
|
|
|
|
m_buttonEditCommunity.EnableWindow(nCount? TRUE: FALSE);
|
|
m_buttonRemoveCommunity.EnableWindow(nCount? TRUE: FALSE);
|
|
|
|
if (m_fPolicyValidCommunities)
|
|
{
|
|
m_buttonEditCommunity.EnableWindow(FALSE);
|
|
m_buttonRemoveCommunity.EnableWindow(FALSE);
|
|
m_buttonAddCommunity.EnableWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
void CSecurityPage::OnClickedButtonAddHost()
|
|
{
|
|
CString strHostName;
|
|
|
|
if (m_dlgAddHost.DoModal() == IDOK) {
|
|
int nIndex;
|
|
|
|
if ((nIndex = m_listboxHost.InsertString(-1, m_dlgAddHost.m_strName)) >=0) {
|
|
m_listboxHost.SetCurSel(nIndex);
|
|
m_radioAcceptSpecificHost.SetCheck(1);
|
|
m_radioAcceptAnyHost.SetCheck(0);
|
|
UpdateHostButtons();
|
|
SetDirty(TRUE);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CSecurityPage::OnClickedButtonEditHost()
|
|
{
|
|
int nIndex;
|
|
|
|
nIndex = m_listboxHost.GetCurSel();
|
|
ASSERT( nIndex >= 0 );
|
|
|
|
if (nIndex < 0) {
|
|
return;
|
|
}
|
|
|
|
CString strHost;
|
|
|
|
m_listboxHost.GetText(nIndex, strHost);
|
|
// save off old host name for quick add
|
|
m_dlgAddHost.m_strName = strHost;
|
|
m_dlgEditHost.m_strName = strHost;
|
|
|
|
if (m_dlgEditHost.DoModal() == IDOK) {
|
|
|
|
m_listboxHost.DeleteString(nIndex);
|
|
SetDirty(TRUE);
|
|
|
|
if ((nIndex = m_listboxHost.InsertString(-1, m_dlgEditHost.m_strName)) >= 0) {
|
|
m_listboxHost.SetCurSel(nIndex);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CSecurityPage::OnClickedButtonRemoveHost()
|
|
{
|
|
int nIndex = m_listboxHost.GetCurSel();
|
|
ASSERT(nIndex >= 0);
|
|
|
|
CString strHost;
|
|
|
|
m_listboxHost.GetText(nIndex, strHost);
|
|
// save off removed host name for quick add
|
|
m_dlgAddHost.m_strName = strHost;
|
|
|
|
m_listboxHost.DeleteString(nIndex);
|
|
|
|
int nCount = m_listboxHost.GetCount();
|
|
|
|
if (nCount != nIndex) {
|
|
m_listboxHost.SetCurSel(nIndex);
|
|
}
|
|
else
|
|
{
|
|
m_listboxHost.SetCurSel(nCount - 1);
|
|
}
|
|
|
|
m_radioAcceptSpecificHost.SetCheck(nCount);
|
|
m_radioAcceptAnyHost.SetCheck(!nCount);
|
|
|
|
UpdateHostButtons();
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CSecurityPage::UpdateHostButtons()
|
|
{
|
|
int nCount = m_listboxHost.GetCount();
|
|
|
|
m_buttonEditHost.EnableWindow(nCount? TRUE: FALSE);
|
|
m_buttonRemoveHost.EnableWindow(nCount? TRUE: FALSE);
|
|
|
|
if (m_fPolicyPermittedManagers)
|
|
{
|
|
m_buttonEditHost.EnableWindow(FALSE);
|
|
m_buttonRemoveHost.EnableWindow(FALSE);
|
|
m_buttonAddHost.EnableWindow(FALSE);
|
|
m_radioAcceptAnyHost.EnableWindow(FALSE);
|
|
m_radioAcceptSpecificHost.EnableWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
void CSecurityPage::OnClickedCheckSendAuthTrap()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CSecurityPage::OnClickedRadioAcceptAnyHost()
|
|
{
|
|
m_listboxHost.ResetContent();
|
|
UpdateHostButtons();
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
void CSecurityPage::OnClickedRadioAcceptSpecificHost()
|
|
{
|
|
SetDirty(TRUE);
|
|
}
|
|
|
|
PACL CSecurityPage::AllocACL()
|
|
{
|
|
PACL pAcl = NULL;
|
|
PSID pSidAdmins = NULL;
|
|
SID_IDENTIFIER_AUTHORITY Authority = SECURITY_NT_AUTHORITY;
|
|
|
|
EXPLICIT_ACCESS ea[1];
|
|
|
|
// Create a SID for the BUILTIN\Administrators group.
|
|
if ( !AllocateAndInitializeSid( &Authority,
|
|
2,
|
|
SECURITY_BUILTIN_DOMAIN_RID,
|
|
DOMAIN_ALIAS_RID_ADMINS,
|
|
0, 0, 0, 0, 0, 0,
|
|
&pSidAdmins ))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
|
|
// Initialize an EXPLICIT_ACCESS structure for an ACE.
|
|
ZeroMemory(&ea, 1 * sizeof(EXPLICIT_ACCESS));
|
|
|
|
// The ACE will allow the Administrators group full access to the key.
|
|
ea[0].grfAccessPermissions = KEY_ALL_ACCESS;
|
|
ea[0].grfAccessMode = SET_ACCESS;
|
|
ea[0].grfInheritance = NO_INHERITANCE;
|
|
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
|
|
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
|
|
ea[0].Trustee.ptstrName = (LPTSTR) pSidAdmins;
|
|
|
|
// Create a new ACL that contains the new ACEs.
|
|
if (SetEntriesInAcl(1, ea, NULL, &pAcl) != ERROR_SUCCESS)
|
|
{
|
|
FreeSid(pSidAdmins);
|
|
return NULL;
|
|
}
|
|
FreeSid(pSidAdmins);
|
|
|
|
return pAcl;
|
|
}
|
|
|
|
void CSecurityPage::FreeACL( PACL pAcl)
|
|
{
|
|
if (pAcl != NULL)
|
|
LocalFree(pAcl);
|
|
}
|
|
BOOL CSecurityPage::SnmpAddAdminAclToKey(LPTSTR pszKey)
|
|
{
|
|
HKEY hKey = NULL;
|
|
LONG rc;
|
|
PACL pAcl = NULL;
|
|
SECURITY_DESCRIPTOR S_Desc;
|
|
|
|
if (pszKey == NULL)
|
|
return FALSE;
|
|
|
|
// open registy key
|
|
rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
|
pszKey, // subkey name
|
|
0, // reserved
|
|
KEY_ALL_ACCESS, // want WRITE_DAC,
|
|
&hKey // handle to open key
|
|
);
|
|
if (rc != ERROR_SUCCESS)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// Initialize a security descriptor.
|
|
if (InitializeSecurityDescriptor (&S_Desc, SECURITY_DESCRIPTOR_REVISION) == 0)
|
|
{
|
|
RegCloseKey(hKey);
|
|
return FALSE;
|
|
}
|
|
|
|
// get the ACL and put it into the security descriptor
|
|
if ( (pAcl = AllocACL()) != NULL )
|
|
{
|
|
if (!SetSecurityDescriptorDacl (&S_Desc, TRUE, pAcl, FALSE))
|
|
{
|
|
FreeACL(pAcl);
|
|
RegCloseKey(hKey);
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
RegCloseKey(hKey);
|
|
return FALSE;
|
|
}
|
|
|
|
if (RegSetKeySecurity (hKey, DACL_SECURITY_INFORMATION, &S_Desc) != ERROR_SUCCESS)
|
|
{
|
|
FreeACL(pAcl);
|
|
RegCloseKey(hKey);
|
|
return FALSE;
|
|
}
|
|
|
|
FreeACL(pAcl);
|
|
RegCloseKey(hKey);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CSecurityPage::LoadRegistry()
|
|
{
|
|
RegKey rk;
|
|
LONG err;
|
|
HRESULT hr, hrIter;
|
|
RegValueIterator rvIter;
|
|
LPCTSTR lpcszMachineName = g_strMachineName.IsEmpty() ? NULL : (LPCTSTR)g_strMachineName;
|
|
BOOL fPolicy;
|
|
|
|
// we need to provide precedence to the parameters set through the policy
|
|
fPolicy = TRUE;
|
|
if (fPolicy)
|
|
{
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
POLICY_VALID_COMMUNITIES_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
fPolicy = FALSE;
|
|
else
|
|
{
|
|
// remember that we are loading from policy registry
|
|
m_fPolicyValidCommunities = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
if (fPolicy == FALSE)
|
|
{
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
VALID_COMMUNITIES_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
err = rk.Create(HKEY_LOCAL_MACHINE,
|
|
VALID_COMMUNITIES_KEY_NAME,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
SnmpAddAdminAclToKey(VALID_COMMUNITIES_KEY_NAME);
|
|
}
|
|
}
|
|
|
|
err = rvIter.Init(&rk);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
|
|
CString stValue;
|
|
DWORD dwType;
|
|
|
|
for (hr = rvIter.Next(&stValue, &dwType); hr == hrOK; hr = rvIter.Next(&stValue, &dwType)) {
|
|
CString strCommunity;
|
|
DWORD dwRights;
|
|
int nIndex;
|
|
char log[128];
|
|
CString Log;
|
|
|
|
if (dwType == REG_SZ)
|
|
{
|
|
err = rk.QueryValue(stValue, strCommunity);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
dwRights = 1 << PERM_BIT_READCREATE;
|
|
}
|
|
else if (dwType == REG_DWORD)
|
|
{
|
|
strCommunity = stValue;
|
|
err = rk.QueryValue(stValue, dwRights);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
if ((nIndex = m_listboxCommunity.InsertString(-1, strCommunity)) >=0)
|
|
{
|
|
int nPermIndex = 0;
|
|
CString strPermName("?????");
|
|
|
|
for (nPermIndex = 0; (dwRights & ((DWORD)(-1)^1)) != 0; dwRights >>=1, nPermIndex++);
|
|
|
|
if (!strPermName.LoadString(IDS_PERM_NAME0 + nPermIndex))
|
|
return FALSE;
|
|
|
|
if (!m_listboxCommunity.SetItemText(nIndex, 1, strPermName) ||
|
|
!m_listboxCommunity.SetItemData(nIndex, nPermIndex))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
if (m_listboxCommunity.GetCount()) {
|
|
m_listboxCommunity.SetCurSel(0);
|
|
}
|
|
|
|
rk.Close();
|
|
|
|
|
|
|
|
// we need to provide precedence to the parameters set through the policy
|
|
fPolicy = TRUE;
|
|
if (fPolicy)
|
|
{
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
POLICY_PERMITTED_MANAGERS_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
fPolicy = FALSE;
|
|
else
|
|
{
|
|
// remember that we are loading from policy registry
|
|
m_fPolicyPermittedManagers = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
if (fPolicy == FALSE)
|
|
{
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
PERMITTED_MANAGERS_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
err = rk.Create(HKEY_LOCAL_MACHINE,
|
|
PERMITTED_MANAGERS_KEY_NAME,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
lpcszMachineName);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
SnmpAddAdminAclToKey(PERMITTED_MANAGERS_KEY_NAME);
|
|
}
|
|
}
|
|
|
|
err = rvIter.Init(&rk);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
|
|
for (hr = rvIter.Next(&stValue, NULL); hr == hrOK; hr = rvIter.Next(&stValue, NULL)) {
|
|
CString strHost;
|
|
|
|
err = rk.QueryValue(stValue, strHost);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
m_listboxHost.InsertString(-1, strHost);
|
|
}
|
|
|
|
if (m_listboxHost.GetCount()) {
|
|
m_radioAcceptSpecificHost.SetCheck(1);
|
|
m_listboxHost.SetCurSel(0);
|
|
}
|
|
else
|
|
{
|
|
m_radioAcceptAnyHost.SetCheck(1);
|
|
}
|
|
|
|
rk.Close();
|
|
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
SNMP_PARAMS_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
// This can't fail as far as all the other keys could be opened before
|
|
// however ... just to make sure
|
|
return FALSE;
|
|
}
|
|
|
|
DWORD dwSwitch;
|
|
|
|
// get the value for the authentication trap flag
|
|
err = rk.QueryValue(ENABLE_AUTH_TRAPS, dwSwitch);
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
m_checkSendAuthTrap.SetCheck(dwSwitch);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CSecurityPage::SaveRegistry()
|
|
{
|
|
RegKey rk;
|
|
LONG err;
|
|
CString strContact;
|
|
CString strLocation;
|
|
DWORD dwServices = 0;
|
|
LPCTSTR lpcszMachineName = g_strMachineName.IsEmpty() ? NULL : (LPCTSTR)g_strMachineName;
|
|
|
|
if (m_fPolicyValidCommunities == FALSE)
|
|
{
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
SNMP_PARAMS_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// If it already exists, delete the key first
|
|
err = rk.RecurseDeleteKey(VALID_COMMUNITIES);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
|
|
// recreate the key now
|
|
err = rk.Create(HKEY_LOCAL_MACHINE,
|
|
VALID_COMMUNITIES_KEY_NAME,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
SnmpAddAdminAclToKey(VALID_COMMUNITIES_KEY_NAME);
|
|
|
|
int nCount = m_listboxCommunity.GetCount();
|
|
|
|
for (int i = 0; i < nCount; i++) {
|
|
DWORD dwPermissions;
|
|
CString strCommunity;
|
|
|
|
m_listboxCommunity.GetText(i, strCommunity);
|
|
dwPermissions = 1 << (DWORD) m_listboxCommunity.GetItemData(i);
|
|
|
|
err = rk.SetValue(strCommunity, dwPermissions);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
rk.Close();
|
|
|
|
}
|
|
|
|
if (m_fPolicyPermittedManagers == FALSE)
|
|
{
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
SNMP_PARAMS_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
}
|
|
|
|
// delete the key first
|
|
err = rk.RecurseDeleteKey(PERMITTED_MANAGERS);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
|
|
// recreate the key now
|
|
err = rk.Create(HKEY_LOCAL_MACHINE,
|
|
PERMITTED_MANAGERS_KEY_NAME,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
SnmpAddAdminAclToKey(PERMITTED_MANAGERS_KEY_NAME);
|
|
|
|
int nCount = m_listboxHost.GetCount();
|
|
|
|
for (int i = 0; i < nCount; i++) {
|
|
TCHAR buffer[32];
|
|
CString strHost;
|
|
|
|
wsprintf(buffer, TEXT("%d"), i+1);
|
|
m_listboxHost.GetText(i, strHost);
|
|
err = rk.SetValue(buffer, strHost);
|
|
if (err != ERROR_SUCCESS) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
rk.Close();
|
|
}
|
|
|
|
// Open or create the registry key
|
|
err = rk.Open(HKEY_LOCAL_MACHINE,
|
|
SNMP_PARAMS_KEY_NAME,
|
|
KEY_ALL_ACCESS,
|
|
lpcszMachineName);
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
DWORD dwSwitch = (m_checkSendAuthTrap.GetCheck() ? 0x1 : 0 ) ;
|
|
|
|
err = rk.SetValue(ENABLE_AUTH_TRAPS, dwSwitch);
|
|
if (err != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddDialog dialog
|
|
|
|
|
|
CAddDialog::CAddDialog(CWnd* pParent /*=NULL*/)
|
|
: CBaseDialog(CAddDialog::IDD, pParent)
|
|
{
|
|
m_bCommunity = FALSE;
|
|
m_nChoice = 0;
|
|
//{{AFX_DATA_INIT(CAddDialog)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void CAddDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CBaseDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAddDialog)
|
|
DDX_Control(pDX, IDC_EDIT_NAME, m_editName);
|
|
DDX_Control(pDX, IDC_ADD, m_buttonAdd);
|
|
DDX_Control(pDX, IDCANCEL, m_buttonCancel);
|
|
DDX_Control(pDX, IDC_STATIC_ADD_TEXT, m_staticText);
|
|
DDX_Control(pDX, IDC_ST_PERMISSIONS, m_staticPermissions);
|
|
DDX_Control(pDX, IDC_CB_PERMISSIONS, m_comboPermissions);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CAddDialog, CBaseDialog)
|
|
//{{AFX_MSG_MAP(CAddDialog)
|
|
ON_BN_CLICKED(IDC_ADD, OnClickedButtonAdd)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddDialog message handlers
|
|
|
|
BOOL CAddDialog::OnInitDialog()
|
|
{
|
|
CBaseDialog::OnInitDialog();
|
|
|
|
m_editName.SetLimitText(COMBO_EDIT_LEN-1);
|
|
m_editName.SetWindowText(m_strName);
|
|
m_editName.SetFocus();
|
|
m_editName.SetSel(0, -1);
|
|
|
|
if (m_bCommunity) {
|
|
CString strText;
|
|
|
|
strText.LoadString( IDS_SNMPCOMM_TEXT );
|
|
m_staticPermissions.ShowWindow(SW_SHOW);
|
|
m_comboPermissions.ShowWindow(SW_SHOW);
|
|
m_comboPermissions.ResetContent();
|
|
for (int i = 0; i<N_PERMISSION_BITS; i++)
|
|
{
|
|
CString strPermName;
|
|
int idx;
|
|
|
|
if (!strPermName.LoadString(IDS_PERM_NAME0 + i) ||
|
|
(idx=m_comboPermissions.AddString(strPermName))<0 ||
|
|
!m_comboPermissions.SetItemData(idx, i))
|
|
return FALSE;
|
|
|
|
}
|
|
m_comboPermissions.SetCurSel(m_nChoice);
|
|
|
|
// change static text of dialog to "Community Name"
|
|
m_staticText.SetWindowText(strText);
|
|
}
|
|
return FALSE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CAddDialog::OnClickedButtonAdd()
|
|
{
|
|
m_editName.GetWindowText(m_strName);
|
|
|
|
if (!m_bCommunity && IsValidString(m_strName) == FALSE)
|
|
{
|
|
m_editName.SetFocus();
|
|
m_editName.SetSel(0,-1);
|
|
|
|
return ;
|
|
}
|
|
if (m_bCommunity)
|
|
{
|
|
m_nChoice = m_comboPermissions.GetCurSel();
|
|
m_comboPermissions.GetWindowText(m_strChoice);
|
|
}
|
|
|
|
CBaseDialog::OnOK();
|
|
}
|
|
|
|
DWORD * CAddDialog::GetHelpMap()
|
|
{
|
|
return m_bCommunity ?
|
|
(DWORD *) &g_aHelpIDs_IDD_DIALOG_ADD_COMM[0]:
|
|
(DWORD *) &g_aHelpIDs_IDD_DIALOG_ADD_ADDR[0];
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditDialog dialog
|
|
|
|
|
|
CEditDialog::CEditDialog(CWnd* pParent /*=NULL*/)
|
|
: CBaseDialog(CEditDialog::IDD, pParent)
|
|
{
|
|
m_bCommunity = FALSE;
|
|
m_nChoice = 0;
|
|
//{{AFX_DATA_INIT(CEditDialog)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CEditDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CBaseDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CEditDialog)
|
|
DDX_Control(pDX, IDC_EDIT_NAME, m_editName);
|
|
DDX_Control(pDX, IDOK, m_buttonOk);
|
|
DDX_Control(pDX, IDCANCEL, m_buttonCancel);
|
|
DDX_Control(pDX, IDC_STATIC_EDIT_TEXT, m_staticText);
|
|
DDX_Control(pDX, IDC_ST_PERMISSIONS, m_staticPermissions);
|
|
DDX_Control(pDX, IDC_CB_PERMISSIONS, m_comboPermissions);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CEditDialog, CBaseDialog)
|
|
//{{AFX_MSG_MAP(CEditDialog)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditDialog message handlers
|
|
|
|
BOOL CEditDialog::OnInitDialog()
|
|
{
|
|
CBaseDialog::OnInitDialog();
|
|
|
|
m_editName.SetLimitText(COMBO_EDIT_LEN-1);
|
|
m_editName.SetWindowText(m_strName);
|
|
m_editName.SetFocus();
|
|
// select the entire string in the edit control
|
|
m_editName.SetSel(0, -1);
|
|
|
|
if (m_bCommunity) {
|
|
CString strText;
|
|
|
|
strText.LoadString( IDS_SNMPCOMM_TEXT );
|
|
m_staticPermissions.ShowWindow(SW_SHOW);
|
|
m_comboPermissions.ShowWindow(SW_SHOW);
|
|
m_comboPermissions.ResetContent();
|
|
for (int i = 0; i<N_PERMISSION_BITS; i++)
|
|
{
|
|
CString strPermName;
|
|
int idx;
|
|
|
|
if (!strPermName.LoadString(IDS_PERM_NAME0 + i) ||
|
|
(idx=m_comboPermissions.AddString(strPermName))<0 ||
|
|
!m_comboPermissions.SetItemData(idx, i))
|
|
{
|
|
AfxMessageBox(strPermName);
|
|
return FALSE;
|
|
}
|
|
|
|
}
|
|
m_comboPermissions.SetCurSel(m_nChoice);
|
|
|
|
// change static text of dialog to "Community Name"
|
|
m_staticText.SetWindowText(strText);
|
|
}
|
|
|
|
return FALSE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CEditDialog::OnOK()
|
|
{
|
|
m_editName.GetWindowText(m_strName);
|
|
|
|
if (!m_bCommunity) {
|
|
if (IsValidString(m_strName) == FALSE)
|
|
{
|
|
m_editName.SetFocus();
|
|
return ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_comboPermissions.GetWindowText(m_strChoice);
|
|
m_nChoice = m_comboPermissions.GetCurSel();
|
|
}
|
|
CBaseDialog::OnOK();
|
|
}
|
|
|
|
DWORD * CEditDialog::GetHelpMap()
|
|
{
|
|
return m_bCommunity ?
|
|
(DWORD *) &g_aHelpIDs_IDD_DIALOG_EDIT_COMM[0] :
|
|
(DWORD *) &g_aHelpIDs_IDD_DIALOG_EDIT_ADDR[0];
|
|
}
|
|
|
|
BOOL IsValidString(CString & strName)
|
|
{
|
|
BOOL bResult = FALSE;
|
|
|
|
// check if this is a valid IP host name or address
|
|
if (ValidateDomain(strName) == TRUE)
|
|
return(TRUE);
|
|
|
|
int nLen = strName.GetLength();
|
|
|
|
if (nLen == 0 || nLen > 12) {
|
|
CString strMsg;
|
|
|
|
strMsg.FormatMessage(IDS_SNMP_INVALID_IP_IPX_ADD, strName);
|
|
AfxMessageBox(strMsg, MB_ICONEXCLAMATION|MB_OK);
|
|
return FALSE;
|
|
}
|
|
|
|
LPTSTR buffer = strName.GetBuffer(64);
|
|
|
|
for (int i = 0; i < nLen; i++) {
|
|
if (!iswxdigit((int) buffer[i])) {
|
|
CString strMsg;
|
|
|
|
strName.ReleaseBuffer();
|
|
strMsg.FormatMessage(IDS_SNMP_INVALID_IP_IPX_ADD, strName);
|
|
AfxMessageBox(strMsg, MB_ICONEXCLAMATION|MB_OK);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ValidateDomain(CString & strDomain)
|
|
{
|
|
int nLen;
|
|
|
|
if ((nLen = strDomain.GetLength()) != 0)
|
|
{
|
|
if (nLen < DOMAINNAME_LENGTH)
|
|
{
|
|
int i;
|
|
TCHAR ch;
|
|
BOOL fLet_Dig = FALSE;
|
|
BOOL fDot = FALSE;
|
|
int cHostname = 0;
|
|
LPTSTR buffer = strDomain.GetBuffer(64);
|
|
|
|
for (i = 0; i < nLen; i++)
|
|
{
|
|
// check each character
|
|
ch = buffer[i];
|
|
|
|
BOOL fAlNum = iswalpha(ch) || iswdigit(ch);
|
|
|
|
if (((i == 0) && !fAlNum) ||
|
|
// first letter must be a digit or a letter
|
|
(fDot && !fAlNum) ||
|
|
// first letter after dot must be a digit or a letter
|
|
((i == (nLen - 1)) && !fAlNum) ||
|
|
// last letter must be a letter or a digit
|
|
(!fAlNum && ( ch != _T('-') && ( ch != _T('.') && ( ch != _T('_'))))) ||
|
|
// must be letter, digit, - or "."
|
|
(( ch == _T('.')) && ( !fLet_Dig )))
|
|
// must be letter or digit before '.'
|
|
{
|
|
return FALSE;
|
|
}
|
|
fLet_Dig = fAlNum;
|
|
fDot = (ch == _T('.'));
|
|
cHostname++;
|
|
if ( cHostname > HOSTNAME_LENGTH )
|
|
{
|
|
return FALSE;
|
|
}
|
|
if ( fDot )
|
|
{
|
|
cHostname = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CSecurityPage::OnDblclkCtrlistCommunity(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
if (m_fPolicyValidCommunities == FALSE)
|
|
OnClickedButtonEditCommunity();
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CSecurityPage::OnCommunityListChanged(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
INT nIndex;
|
|
NMLVODSTATECHANGE* pStateChanged = (NMLVODSTATECHANGE*)pNMHDR;
|
|
// TODO: Add your control notification handler code here
|
|
|
|
nIndex = m_listboxCommunity.GetCurSel();
|
|
|
|
m_buttonEditCommunity.EnableWindow(nIndex >= 0);
|
|
m_buttonRemoveCommunity.EnableWindow(nIndex >= 0);
|
|
|
|
if (m_fPolicyValidCommunities)
|
|
{
|
|
m_buttonEditCommunity.EnableWindow(FALSE);
|
|
m_buttonRemoveCommunity.EnableWindow(FALSE);
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|