|
|
#include "pch.h"
#pragma hdrstop
#include "ncnetcon.h"
#include "ncperms.h"
#include "ncui.h"
#include "lanui.h"
#include "lanhelp.h"
#include <raseapif.h>
#include "eapolui.h"
#include "eapolpage.h"
#include "wzcpage.h"
#include "wzcui.h"
extern const WCHAR c_szNetCfgHelpFile[];
//
// CWLANAuthenticationPage
//
CWLANAuthenticationPage::CWLANAuthenticationPage( IUnknown* punk, INetCfg* pnc, INetConnection* pconn, const DWORD * adwHelpIDs) { TraceFileFunc(ttidLanUi);
m_pconn = pconn; m_pnc = pnc; m_fNetcfgInUse = FALSE; m_adwHelpIDs = adwHelpIDs;
m_pEapolConfig = NULL; m_pWzcPage = NULL; }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::~CWLANAuthenticationPage
//
// Purpose: Destroys the CWLANAuthenticationPage object
//
// Arguments:
// (none)
//
// Returns: Nothing
//
// Author: sachins
//
// Notes:
//
CWLANAuthenticationPage::~CWLANAuthenticationPage() { TraceFileFunc(ttidLanUi); }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::UploadEapolConfig
//
// Purpose: Initializes latest data stored with Wireless Configuration
//
// Arguments:
// (none)
//
// Returns: Nothing
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::UploadEapolConfig(CEapolConfig *pEapolConfig, CWZCConfigPage *pWzcPage) { m_pEapolConfig = pEapolConfig; m_pWzcPage = pWzcPage; return LresFromHr(S_OK); }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnInitDialog
//
// Purpose: Handles the WM_INITDIALOG message
//
// Arguments:
// uMsg []
// wParam []
// lParam []
// bHandled []
//
// Returns: error code
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { TraceFileFunc(ttidLanUi);
DTLNODE* pOriginalEapcfgNode = NULL; DTLLIST * pListEapcfgs = NULL; HRESULT hr = S_OK;
SetClassLongPtr(m_hWnd, GCLP_HCURSOR, NULL); SetClassLongPtr(GetParent(), GCLP_HCURSOR, NULL);
::SetWindowText(GetDlgItem(IDC_TXT_EAP_LABEL), SzLoadString(WZCGetSPResModule(), IDS_EAPOL_PAGE_LABEL));
::SendMessage(GetDlgItem(IDC_EAP_ICO_WARN), STM_SETICON, (WPARAM)LoadIcon(NULL, IDI_WARNING), (LPARAM)0);
// Initialize EAP package list
// Read the EAPCFG information from the registry and find the node
// selected in the entry, or the default, if none.
do { DTLNODE* pNode = NULL;
if (m_pEapolConfig != NULL) { // the state of CID_CA_RB_Eap is being set in RefreshControls()
Button_SetCheck(GetDlgItem(CID_CA_RB_MachineAuth), IS_MACHINE_AUTH_ENABLED(m_pEapolConfig->m_EapolIntfParams.dwEapFlags)); Button_SetCheck(GetDlgItem(CID_CA_RB_GuestAuth), IS_GUEST_AUTH_ENABLED(m_pEapolConfig->m_EapolIntfParams.dwEapFlags));
// Read the EAPCFG information from the registry and find the node
// selected in the entry, or the default, if none.
pListEapcfgs = m_pEapolConfig->m_pListEapcfgs; }
if (pListEapcfgs) {
DTLNODE* pNodeEap; DWORD dwkey = 0;
// Choose the EAP name that will appear in the combo box
pNode = EapcfgNodeFromKey( pListEapcfgs, m_pEapolConfig->m_EapolIntfParams.dwEapType );
pOriginalEapcfgNode = pNode;
// Fill the EAP packages listbox and select the previously identified
// selection. The Properties button is disabled by default, but may
// be enabled when the EAP list selection is set.
//::EnableWindow(GetDlgItem(CID_CA_PB_Properties), FALSE);
for (pNode = DtlGetFirstNode( pListEapcfgs ); pNode; pNode = DtlGetNextNode( pNode )) { EAPCFG* pEapcfg = NULL; INT i; TCHAR* pszBuf = NULL;
pEapcfg = (EAPCFG* )DtlGetData( pNode ); ASSERT( pEapcfg ); ASSERT( pEapcfg->pszFriendlyName );
pszBuf = (LPTSTR)MALLOC (sizeof(TCHAR) * (lstrlen(pEapcfg->pszFriendlyName) + 1)); if (!pszBuf) { continue; }
lstrcpy( pszBuf, pEapcfg->pszFriendlyName );
i = ComboBox_AddItem( GetDlgItem(CID_CA_LB_EapPackages), pszBuf, pNode );
if (pNode == pOriginalEapcfgNode) { // Select the EAP name that will appear in the
// combo box
ComboBox_SetCurSelNotify( GetDlgItem(CID_CA_LB_EapPackages), i ); }
FREE ( pszBuf ); } }
ComboBox_AutoSizeDroppedWidth( GetDlgItem(CID_CA_LB_EapPackages) );
// refresh the state for all the controls
RefreshControls();
} while (FALSE);
return LresFromHr(hr); }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnContextMenu
//
// Purpose: When right click a control, bring up help
//
// Arguments: Standard command parameters
//
// Returns:
//
// Author: sachins
//
LRESULT CWLANAuthenticationPage::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { TraceFileFunc(ttidLanUi);
if (m_adwHelpIDs != NULL) { ::WinHelp(m_hWnd, c_szNetCfgHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)m_adwHelpIDs); } return 0; }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnHelp
//
// Purpose: When drag context help icon over a control, bring up help
//
// Arguments: Standard command parameters
//
// Returns:
//
// Author: sachins
//
LRESULT CWLANAuthenticationPage::OnHelp( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { TraceFileFunc(ttidLanUi);
LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam); Assert(lphi);
if ((m_adwHelpIDs != NULL) && (HELPINFO_WINDOW == lphi->iContextType)) { ::WinHelp(static_cast<HWND>(lphi->hItemHandle), c_szNetCfgHelpFile, HELP_WM_HELP, (ULONG_PTR)m_adwHelpIDs); } return 0; }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnDestroy
//
// Purpose: Called when the dialog page is destroyed
//
// Arguments:
// uMsg []
// wParam []
// lParam []
// bHandled []
//
// Returns:
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { return 0; }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnProperties
//
// Purpose: Handles the clicking of the Properties button
//
// Arguments:
// wNotifyCode []
// wID []
// hWndCtl []
// bHandled []
//
// Returns: error code
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::OnProperties(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { TraceFileFunc(ttidLanUi);
DWORD dwErr = 0; DTLNODE* pNode = NULL; EAPCFG* pEapcfg = NULL; RASEAPINVOKECONFIGUI pInvokeConfigUi; RASEAPFREE pFreeConfigUIData; HINSTANCE h; BYTE* pConnectionData = NULL; DWORD cbConnectionData = 0; HRESULT hr = S_OK;
// Look up the selected package configuration and load the associated
// configuration DLL.
pNode = (DTLNODE* )ComboBox_GetItemDataPtr( GetDlgItem(CID_CA_LB_EapPackages), ComboBox_GetCurSel( GetDlgItem(CID_CA_LB_EapPackages) ) ); ASSERT( pNode ); if (!pNode) { return E_UNEXPECTED; }
pEapcfg = (EAPCFG* )DtlGetData( pNode ); ASSERT( pEapcfg );
h = NULL; if (!(h = LoadLibrary( pEapcfg->pszConfigDll )) || !(pInvokeConfigUi = (RASEAPINVOKECONFIGUI )GetProcAddress( h, "RasEapInvokeConfigUI" )) || !(pFreeConfigUIData = (RASEAPFREE) GetProcAddress( h, "RasEapFreeMemory" ))) { // Cannot load configuration DLL
if (h) { FreeLibrary( h ); } return E_FAIL; }
// Call the configuration DLL to popup it's custom configuration UI.
pConnectionData = NULL; cbConnectionData = 0;
dwErr = pInvokeConfigUi( pEapcfg->dwKey, GetParent(), RAS_EAP_FLAG_8021X_AUTH, pEapcfg->pData, pEapcfg->cbData, &pConnectionData, &cbConnectionData ); if (dwErr != 0) { FreeLibrary( h ); return E_FAIL; }
// Store the configuration information returned in the package descriptor.
FREE ( pEapcfg->pData ); pEapcfg->pData = NULL; pEapcfg->cbData = 0;
if (pConnectionData) { if (cbConnectionData > 0) { // Copy it into the eap node
pEapcfg->pData = (LPBYTE)MALLOC (sizeof(UCHAR) * cbConnectionData); if (pEapcfg->pData) { CopyMemory( pEapcfg->pData, pConnectionData, cbConnectionData ); pEapcfg->cbData = cbConnectionData; } } }
pFreeConfigUIData( pConnectionData );
// Note any "force user to configure" requirement on the package has been
// satisfied.
pEapcfg->fConfigDllCalled = TRUE;
FreeLibrary( h );
TraceError("CWLANAuthenticationPage::OnProperties", hr); return LresFromHr(hr); }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnEapSelection
//
// Purpose: Handles the clicking of the EAP checkbox
//
// Arguments:
// wNotifyCode []
// wID []
// hWndCtl []
// bHandled []
//
// Returns:
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::OnEapSelection(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { TraceFileFunc(ttidLanUi);
HRESULT hr = S_OK;
EAPCFG* pEapcfg = NULL; INT iSel = 0;
// Toggle buttons based on selection
if (BST_CHECKED == IsDlgButtonChecked(CID_CA_RB_Eap)) { ::EnableWindow(GetDlgItem(CID_CA_LB_EapPackages), TRUE); ::EnableWindow(GetDlgItem(IDC_TXT_EAP_TYPE), TRUE);
// Get the EAPCFG information for the currently selected EAP package.
iSel = ComboBox_GetCurSel(GetDlgItem(CID_CA_LB_EapPackages));
// iSel is the index in the displayed list as well as the
// index of the dll that are loaded.
// Get the cfgnode corresponding to this index
if (iSel >= 0) { DTLNODE* pNode;
pNode = (DTLNODE* )ComboBox_GetItemDataPtr( GetDlgItem(CID_CA_LB_EapPackages), iSel ); if (pNode) { pEapcfg = (EAPCFG* )DtlGetData( pNode ); } }
// Enable the Properties button if the selected package has a
// configuration entrypoint
// if (FIsUserAdmin())
{ ::EnableWindow ( GetDlgItem(CID_CA_PB_Properties), (pEapcfg && !!(pEapcfg->pszConfigDll)) ); }
::EnableWindow(GetDlgItem(CID_CA_RB_MachineAuth), TRUE); ::EnableWindow(GetDlgItem(CID_CA_RB_GuestAuth), TRUE);
m_pEapolConfig->m_EapolIntfParams.dwEapFlags |= EAPOL_ENABLED; } else { ::EnableWindow(GetDlgItem (IDC_TXT_EAP_TYPE), FALSE); ::EnableWindow(GetDlgItem (CID_CA_LB_EapPackages), FALSE); ::EnableWindow(GetDlgItem (CID_CA_PB_Properties), FALSE); ::EnableWindow(GetDlgItem(CID_CA_RB_MachineAuth), FALSE); ::EnableWindow(GetDlgItem(CID_CA_RB_GuestAuth), FALSE);
m_pEapolConfig->m_EapolIntfParams.dwEapFlags &= ~EAPOL_ENABLED; }
TraceError("CWLANAuthenticationPage::OnEapSelection", hr); return LresFromHr(hr); }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnEapPackages
//
// Purpose: Handles the clicking of the EAP packages combo box
//
// Arguments:
// wNotifyCode []
// wID []
// hWndCtl []
// bHandled []
//
// Returns:
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::OnEapPackages(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { TraceFileFunc(ttidLanUi);
HRESULT hr = S_OK;
EAPCFG* pEapcfg = NULL; INT iSel = 0;
// Get the EAPCFG information for the selected EAP package.
iSel = ComboBox_GetCurSel(GetDlgItem(CID_CA_LB_EapPackages));
// iSel is the index in the displayed list as well as the
// index of the dll that are loaded.
// Get the cfgnode corresponding to this index
if (iSel >= 0) { DTLNODE* pNode = NULL;
pNode = (DTLNODE* )ComboBox_GetItemDataPtr( GetDlgItem(CID_CA_LB_EapPackages), iSel ); if (pNode) { pEapcfg = (EAPCFG* )DtlGetData( pNode ); } }
// Enable the Properties button if the selected package has a
// configuration entrypoint
if (BST_CHECKED == IsDlgButtonChecked(CID_CA_RB_Eap)) { ::EnableWindow ( GetDlgItem(CID_CA_PB_Properties), (pEapcfg && !!(pEapcfg->pszConfigDll)) ); }
TraceError("CWLANAuthenticationPage::OnEapPackages", hr); return LresFromHr(hr); }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnKillActive
//
// Purpose: Called to check warning conditions before the security
// page is going away
//
// Arguments:
// idCtrl []
// pnmh []
// bHandled []
//
// Returns:
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { TraceFileFunc(ttidLanUi);
BOOL fError;
fError = m_fNetcfgInUse;
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, fError); return fError; }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnKillActive
//
// Purpose: Called to check warning conditions when the security
// page is showing up
//
// Arguments:
// idCtrl []
// pnmh []
// bHandled []
//
// Returns:
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::OnSetActive(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { RefreshControls(); return S_OK; }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnApply
//
// Purpose: Called when the Networking page is applied
//
// Arguments:
// idCtrl []
// pnmh []
// bHandled []
//
// Returns:
//
// Author: sachins
//
// Notes:
//
LRESULT CWLANAuthenticationPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { TraceFileFunc(ttidLanUi);
DWORD dwEapFlags = 0; DWORD dwDefaultEapType = 0; EAPOL_INTF_PARAMS EapolIntfParams; NETCON_PROPERTIES* pProps = NULL; HRESULT hrOverall = S_OK; DTLLIST * pListEapcfgs; HRESULT hr = S_OK;
// Retain data for all EAP packages
pListEapcfgs = m_pEapolConfig->m_pListEapcfgs;
if (pListEapcfgs == NULL) { return LresFromHr(S_OK); }
DTLNODE* pNode = NULL; EAPCFG* pEapcfg = NULL;
pNode = (DTLNODE* )ComboBox_GetItemDataPtr( GetDlgItem (CID_CA_LB_EapPackages), ComboBox_GetCurSel( GetDlgItem (CID_CA_LB_EapPackages) ) ); if (pNode == NULL) { return LresFromHr (E_FAIL); }
pEapcfg = (EAPCFG* )DtlGetData( pNode ); if (pEapcfg == NULL) { return LresFromHr (E_FAIL); } dwDefaultEapType = pEapcfg->dwKey;
// If CID_CA_RB_Eap is checked, EAPOL is enabled on the interface
// the memory image of CID_CA_RB_Eap is updated with each click on the control so
// update this bit from the in-memory flag.
dwEapFlags |= m_pEapolConfig->m_EapolIntfParams.dwEapFlags & EAPOL_ENABLED;
if (Button_GetCheck( GetDlgItem(CID_CA_RB_MachineAuth ))) dwEapFlags |= EAPOL_MACHINE_AUTH_ENABLED;
if (Button_GetCheck( GetDlgItem(CID_CA_RB_GuestAuth ))) dwEapFlags |= EAPOL_GUEST_AUTH_ENABLED;
// Save the params for this interface in registry
EapolIntfParams.dwEapType = dwDefaultEapType; EapolIntfParams.dwEapFlags = dwEapFlags;
memcpy (&m_pEapolConfig->m_EapolIntfParams, &EapolIntfParams, sizeof(EAPOL_INTF_PARAMS));
return LresFromHr(hr); }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnCancel
//
// Purpose: Called when the Networking page is cancelled.
//
// Arguments:
// idCtrl []
// pnmh []
// bHandled []
//
// Returns:
//
// Author: sachins
//
//
LRESULT CWLANAuthenticationPage::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { return LresFromHr(S_OK); }
//+---------------------------------------------------------------------------
//
// Member: CWLANAuthenticationPage::OnCancel
//
// Purpose: Called to update the state of all the controls.
//
// Arguments:
// idCtrl []
// pnmh []
// bHandled []
//
// Returns:
//
LRESULT CWLANAuthenticationPage::RefreshControls() { BOOL bLocked; BOOL bEnabled;
bEnabled = IS_EAPOL_ENABLED(m_pEapolConfig->m_EapolIntfParams.dwEapFlags); bLocked = (m_pEapolConfig->m_dwCtlFlags & EAPOL_CTL_LOCKED);
Button_SetCheck(GetDlgItem(CID_CA_RB_Eap), !bLocked && bEnabled);
::ShowWindow(GetDlgItem(IDC_EAP_ICO_WARN), bLocked? SW_SHOW : SW_HIDE); ::ShowWindow(GetDlgItem(IDC_EAP_LBL_WARN), bLocked? SW_SHOW : SW_HIDE);
// now set all the controls state
::EnableWindow(GetDlgItem(IDC_TXT_EAP_LABEL), !bLocked); ::EnableWindow(GetDlgItem(CID_CA_RB_Eap), !bLocked); ::EnableWindow(GetDlgItem(IDC_TXT_EAP_TYPE), !bLocked && bEnabled); ::EnableWindow(GetDlgItem(CID_CA_LB_EapPackages), !bLocked && bEnabled); ::EnableWindow(GetDlgItem(CID_CA_PB_Properties), !bLocked && bEnabled); ::EnableWindow(GetDlgItem(CID_CA_RB_MachineAuth), !bLocked && bEnabled); ::EnableWindow(GetDlgItem(CID_CA_RB_GuestAuth), !bLocked && bEnabled);
return LresFromHr(S_OK); }
|