/**********************************************************************/ /** 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 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; }