Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

762 lines
19 KiB

#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);
}