848 lines
23 KiB
C++
848 lines
23 KiB
C++
//----------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2001.
|
|
//
|
|
// File: Nfaa.cpp
|
|
//
|
|
// Contents: Wireless Policy Snapin - IEEE 8021.x property page for each PS.
|
|
//
|
|
//
|
|
// History: TaroonM
|
|
// 10/30/01
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include "stdafx.h"
|
|
|
|
#include "NFAa.h"
|
|
#include "wzcsapi.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPS8021XPropPage property page
|
|
|
|
IMPLEMENT_DYNCREATE(CPS8021XPropPage, CWirelessBasePage)
|
|
|
|
CPS8021XPropPage::CPS8021XPropPage(UINT nIDTemplate) : CWirelessBasePage(nIDTemplate)
|
|
{
|
|
//{{AFX_DATA_INIT(CPS8021XPropPage)
|
|
m_dwEnable8021x = FALSE;
|
|
m_dwValidateServerCertificate = FALSE;
|
|
m_dwMachineAuthentication = FALSE;
|
|
m_dwGuestAuthentication = FALSE;
|
|
dwEAPUpdated = 0;
|
|
pListEapcfgs = NULL;
|
|
m_bHasApplied = FALSE;
|
|
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
CPS8021XPropPage::CPS8021XPropPage() : CWirelessBasePage(CPS8021XPropPage::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CPS8021XPropPage)
|
|
m_dwEnable8021x = FALSE;
|
|
m_dwValidateServerCertificate = FALSE;
|
|
m_dwMachineAuthentication = FALSE;
|
|
m_dwGuestAuthentication = FALSE;
|
|
dwEAPUpdated = 0;
|
|
pListEapcfgs = NULL;
|
|
m_bHasApplied = FALSE;
|
|
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
CPS8021XPropPage::~CPS8021XPropPage()
|
|
{
|
|
EAPCFG* pEapcfg = NULL;
|
|
DTLNODE *pNodeEap = NULL;
|
|
|
|
if (pListEapcfgs) {
|
|
|
|
// Delete the data allocated using AllocPolMem
|
|
for (pNodeEap = DtlGetFirstNode(pListEapcfgs);
|
|
pNodeEap;
|
|
pNodeEap = DtlGetNextNode(pNodeEap)
|
|
)
|
|
{
|
|
pEapcfg = (EAPCFG* )DtlGetData(pNodeEap);
|
|
ASSERT( pEapcfg );
|
|
|
|
if (pEapcfg->pData) {
|
|
FreePolMem(pEapcfg->pData);
|
|
}
|
|
pEapcfg->pData = NULL;
|
|
pEapcfg->cbData = 0;
|
|
}
|
|
DtlDestroyList (pListEapcfgs, DestroyEapcfgNode);
|
|
}
|
|
pListEapcfgs = NULL;
|
|
|
|
}
|
|
|
|
void CPS8021XPropPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CWirelessBasePage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CPS8021XPropPage)
|
|
DDX_Check(pDX, IDC_ENABLE_8021X, m_dwEnable8021x);
|
|
DDX_Control(pDX, IDC_COMBO_8021X_MODE, m_cb8021xMode);
|
|
DDX_Check(pDX, IDC_MACHINE_AUTHENTICATION, m_dwMachineAuthentication);
|
|
DDX_Check(pDX, IDC_GUEST_AUTHENTICATION, m_dwGuestAuthentication);
|
|
DDX_Control(pDX, IDC_COMBO_MC_AUTH_TYPE, m_cbMachineAuthenticationType);
|
|
DDX_Text(pDX, IDC_IEEE8021X_MAX_START, m_dwIEEE8021xMaxStart);
|
|
DDX_Text(pDX, IDC_IEEE8021X_START_PERIOD, m_dwIEEE8021xStartPeriod);
|
|
DDX_Text(pDX, IDC_IEEE8021X_AUTH_PERIOD, m_dwIEEE8021xAuthPeriod);
|
|
DDX_Text(pDX, IDC_IEEE8021X_HELD_PERIOD, m_dwIEEE8021xHeldPeriod);
|
|
DDX_Control(pDX, IDC_EAP_TYPE_COMBO, m_cbEapType);
|
|
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPS8021XPropPage, CWirelessBasePage)
|
|
//{{AFX_MSG_MAP(CPS8021XPropPage)
|
|
ON_CBN_SELENDOK(IDC_COMBO_8021X_MODE, OnSel8021xMode)
|
|
ON_BN_CLICKED(IDC_ENABLE_8021X, OnCheck8021x)
|
|
ON_CBN_SELENDOK(IDC_COMBO_MC_AUTH_TYPE, OnSelMachineAuthenticationType)
|
|
ON_BN_CLICKED(IDC_GUEST_AUTHENTICATION, OnCheckGuestAuthentication)
|
|
ON_BN_CLICKED(IDC_MACHINE_AUTHENTICATION, OnCheckMachineAuthentication)
|
|
ON_EN_CHANGE(IDC_IEEE8021X_MAX_START,OnIEEE8021xParams)
|
|
ON_EN_CHANGE(IDC_IEEE8021X_START_PERIOD,OnIEEE8021xParams)
|
|
ON_EN_CHANGE(IDC_IEEE8021X_HELD_PERIOD,OnIEEE8021xParams)
|
|
ON_EN_CHANGE(IDC_IEEE8021X_AUTH_PERIOD,OnIEEE8021xParams)
|
|
ON_CBN_SELENDOK(IDC_EAP_TYPE_COMBO, OnSelEapType)
|
|
ON_BN_CLICKED(IDC_EAP_CONFIGURE, OnProperties)
|
|
|
|
ON_WM_HELPINFO()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPS8021XPropPage message handlers
|
|
BOOL CPS8021XPropPage::OnInitDialog()
|
|
{
|
|
DWORD dwIEEE8021xMaxStart;
|
|
DWORD dwIEEE8021xStartPeriod;
|
|
DWORD dwIEEE8021xAuthPeriod;
|
|
DWORD dwIEEE8021xHeldPeriod;
|
|
CString pszIEEE8021xMaxStart;
|
|
CString pszIEEE8021xStartPeriod;
|
|
CString pszIEEE8021xAuthPeriod;
|
|
CString pszIEEE8021xHeldPeriod;
|
|
CString pszTemp;
|
|
DWORD dwEapIndex;
|
|
DWORD dw8021xModeIndex;
|
|
DWORD dwMachineAuthenticationTypeIndex;
|
|
DWORD dwCertTypeIndex;
|
|
DWORD dwEAPType = 0;
|
|
DWORD dwEAPDataLen = 0;
|
|
LPBYTE pbEAPData = NULL;
|
|
DTLNODE* pOriginalEapcfgNode = NULL;
|
|
BYTE *pbData = NULL;
|
|
DWORD cbData = 0;
|
|
DTLNODE* pNode = NULL;
|
|
DWORD i = 0;
|
|
DWORD dwEAPSel = 0;
|
|
|
|
|
|
m_bHasApplied = FALSE;
|
|
|
|
CWirelessBasePage::OnInitDialog();
|
|
|
|
|
|
|
|
ASSERT( NULL != WirelessPS() );
|
|
|
|
// get data from storage
|
|
|
|
PWIRELESS_PS_DATA pWirelessPSData = NULL;
|
|
|
|
pWirelessPSData = WirelessPS();
|
|
|
|
dwEAPType = pWirelessPSData->dwEapType;
|
|
dwEAPDataLen = pWirelessPSData->dwEAPDataLen;
|
|
pbEAPData = pWirelessPSData->pbEAPData;
|
|
|
|
// Initialize EAP package list
|
|
// Read the EAPCFG information from the registry and find the node
|
|
// selected in the entry, or the default, if none.
|
|
|
|
pListEapcfgs = NULL;
|
|
|
|
pListEapcfgs = ::ReadEapcfgList (EAPOL_MUTUAL_AUTH_EAP_ONLY);
|
|
|
|
if (pListEapcfgs)
|
|
{
|
|
|
|
for (pNode = DtlGetFirstNode(pListEapcfgs);
|
|
pNode;
|
|
pNode = DtlGetNextNode(pNode)
|
|
)
|
|
{
|
|
EAPCFG* pEapcfg = (EAPCFG* )DtlGetData(pNode);
|
|
ASSERT( pEapcfg );
|
|
|
|
cbData = 0;
|
|
pbData = NULL;
|
|
|
|
i = m_cbEapType.AddString(pEapcfg->pszFriendlyName);
|
|
m_cbEapType.SetItemDataPtr(i, pNode);
|
|
|
|
if (pEapcfg->dwKey == dwEAPType) {
|
|
cbData = dwEAPDataLen;
|
|
if (dwEAPDataLen) {
|
|
pbData = (LPBYTE) AllocPolMem(dwEAPDataLen);
|
|
if (!pbData) {
|
|
return FALSE;
|
|
}
|
|
memcpy(pbData, pbEAPData, dwEAPDataLen);
|
|
}
|
|
dwEAPSel = i;
|
|
}
|
|
|
|
pEapcfg->pData = pbData;
|
|
pEapcfg->cbData = cbData;
|
|
}
|
|
|
|
// Choose the EAP name that will appear in the combo box
|
|
|
|
m_cbEapType.SetCurSel(dwEAPSel);
|
|
|
|
}
|
|
|
|
|
|
m_dwIEEE8021xMaxStart =
|
|
pWirelessPSData->dwIEEE8021xMaxStart;
|
|
m_dwIEEE8021xStartPeriod =
|
|
pWirelessPSData->dwIEEE8021xStartPeriod;
|
|
m_dwIEEE8021xAuthPeriod =
|
|
pWirelessPSData->dwIEEE8021xAuthPeriod;
|
|
m_dwIEEE8021xHeldPeriod =
|
|
pWirelessPSData->dwIEEE8021xHeldPeriod;
|
|
|
|
m_dwGuestAuthentication =
|
|
pWirelessPSData->dwGuestAuthentication ? TRUE : FALSE;
|
|
|
|
m_dwEnable8021x =
|
|
pWirelessPSData->dwEnable8021x ? TRUE : FALSE;
|
|
|
|
pszTemp.LoadString(IDS_8021X_MODE_NO_TRANSMIT);
|
|
m_cb8021xMode.AddString(pszTemp);
|
|
|
|
pszTemp.LoadString(IDS_8021X_MODE_NAS_TRANSMIT);
|
|
m_cb8021xMode.AddString(pszTemp);
|
|
|
|
pszTemp.LoadString(IDS_8021X_MODE_TRANSMIT);
|
|
m_cb8021xMode.AddString(pszTemp);
|
|
|
|
switch (pWirelessPSData->dw8021xMode)
|
|
{
|
|
|
|
case WIRELESS_8021X_MODE_NO_TRANSMIT_EAPOLSTART_WIRED:
|
|
dw8021xModeIndex = 0;
|
|
break;
|
|
case WIRELESS_8021X_MODE_NAS_TRANSMIT_EAPOLSTART_WIRED:
|
|
dw8021xModeIndex = 1;
|
|
break;
|
|
case WIRELESS_8021X_MODE_TRANSMIT_EAPOLSTART_WIRED:
|
|
dw8021xModeIndex = 2;
|
|
break;
|
|
default:
|
|
dw8021xModeIndex = 0;
|
|
break;
|
|
}
|
|
|
|
m_cb8021xMode.SetCurSel(dw8021xModeIndex);
|
|
|
|
m_dwMachineAuthentication =
|
|
pWirelessPSData->dwMachineAuthentication ? TRUE : FALSE;
|
|
|
|
pszTemp.LoadString(IDS_MC_AUTH_TYPE_MC_NO_USER);
|
|
m_cbMachineAuthenticationType.AddString(pszTemp);
|
|
|
|
pszTemp.LoadString(IDS_MC_AUTH_TYPE_USER_DONTCARE_MC);
|
|
m_cbMachineAuthenticationType.AddString(pszTemp);
|
|
|
|
|
|
pszTemp.LoadString(IDS_MC_AUTH_TYPE_MC_ONLY);
|
|
m_cbMachineAuthenticationType.AddString(pszTemp);
|
|
|
|
|
|
switch (pWirelessPSData->dwMachineAuthenticationType)
|
|
{
|
|
case WIRELESS_MC_AUTH_TYPE_MC_NO_USER:
|
|
dwMachineAuthenticationTypeIndex = 0;
|
|
break;
|
|
case WIRELESS_MC_AUTH_TYPE_USER_DONTCARE_MC:
|
|
dwMachineAuthenticationTypeIndex = 1;
|
|
break;
|
|
case WIRELESS_MC_AUTH_TYPE_MC_ONLY:
|
|
dwMachineAuthenticationTypeIndex = 2;
|
|
break;
|
|
|
|
default:
|
|
dwMachineAuthenticationTypeIndex = 0;
|
|
break;
|
|
}
|
|
m_cbMachineAuthenticationType.SetCurSel(dwMachineAuthenticationTypeIndex);
|
|
|
|
|
|
DisplayEnable8021x();
|
|
|
|
if (m_bReadOnly) {
|
|
DisableControls();
|
|
}
|
|
|
|
|
|
// set radio correctly
|
|
UpdateData (FALSE);
|
|
|
|
// set radio controled edits correctly
|
|
//OnRadioAdapterType();
|
|
|
|
// OK, we can start paying attention to modifications made via dlg controls now.
|
|
// This should be the last call before returning from OnInitDialog.
|
|
OnFinishInitDialog();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
|
|
void
|
|
CPS8021XPropPage::DisplayEnable8021x()
|
|
{
|
|
if(m_dwEnable8021x) {
|
|
|
|
SAFE_ENABLEWINDOW(IDC_COMBO_8021X_MODE, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_MODE, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_EAP_TYPE_COMBO, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_EAP_TYPE, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_MAX_START, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_START_PERIOD, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_HELD_PERIOD, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_AUTH_PERIOD, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_MAX_START, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_START_PERIOD, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_HELD_PERIOD, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_PERIOD, TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_PARAMS, TRUE);
|
|
|
|
DisplayEapType();
|
|
|
|
|
|
} else {
|
|
|
|
SAFE_ENABLEWINDOW(IDC_COMBO_8021X_MODE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_MODE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_EAP_TYPE_COMBO,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_EAP_TYPE, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_MAX_START, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_START_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_HELD_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_AUTH_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_MAX_START, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_START_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_HELD_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_PARAMS, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_CERT_TYPE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_MACHINE_AUTHENTICATION,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_GUEST_AUTHENTICATION,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_EAP_CONFIGURE, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE,FALSE);
|
|
}
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
void
|
|
CPS8021XPropPage::DisplayEapType()
|
|
{
|
|
DWORD dwEapIndex = 0;
|
|
DTLNODE *pNode = NULL;
|
|
EAPCFG *pEapcfg = NULL;
|
|
DWORD dwEAPType = 0;
|
|
|
|
dwEapIndex = m_cbEapType.GetCurSel();
|
|
|
|
pNode = (DTLNODE *) m_cbEapType.GetItemDataPtr(dwEapIndex);
|
|
ASSERT( pNode );
|
|
|
|
pEapcfg = (EAPCFG* )DtlGetData( pNode );
|
|
ASSERT( pEapcfg );
|
|
|
|
dwEAPType = pEapcfg->dwKey;
|
|
|
|
switch (dwEAPType) {
|
|
case EAP_TYPE_MD5:
|
|
// dwEapType = WIRELESS_EAP_TYPE_MD5;
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_CERT_TYPE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_MACHINE_AUTHENTICATION,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_GUEST_AUTHENTICATION,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_EAP_CONFIGURE, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE,FALSE);
|
|
break;
|
|
|
|
default :
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_CERT_TYPE,TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_MACHINE_AUTHENTICATION,TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_GUEST_AUTHENTICATION,TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_EAP_CONFIGURE, TRUE);
|
|
DisplayMachineAuthentication();
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
CPS8021XPropPage::DisplayMachineAuthentication()
|
|
{
|
|
|
|
if (m_dwMachineAuthentication) {
|
|
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,TRUE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE, TRUE);
|
|
} else {
|
|
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE,FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL CPS8021XPropPage::OnWizardFinish()
|
|
{
|
|
// just transfer to our OnApply, as it does the right stuff
|
|
if (OnApply())
|
|
{
|
|
// go ahead and finish
|
|
return TRUE;
|
|
}
|
|
|
|
// don't allow us to finish
|
|
return FALSE;
|
|
}
|
|
|
|
LRESULT CPS8021XPropPage::OnWizardNext()
|
|
{
|
|
// just transfer to our OnApply, as it does the right stuff
|
|
if (ControlDataToWirelessPS())
|
|
{
|
|
// go ahead and move to next page
|
|
return CWirelessBasePage::OnWizardNext();
|
|
}
|
|
|
|
// don't allow us to go on to the next page
|
|
return -1;
|
|
}
|
|
|
|
BOOL CPS8021XPropPage::OnApply()
|
|
{
|
|
if (!m_bReadOnly) {
|
|
// Save data from page
|
|
if (!m_bHasApplied)
|
|
{
|
|
ControlDataToWirelessPS();
|
|
}
|
|
}
|
|
// ok, everything is cool
|
|
return CWirelessBasePage::OnApply();
|
|
}
|
|
|
|
void CPS8021XPropPage::OnCheck8021x()
|
|
{
|
|
UpdateData(TRUE);
|
|
SetModified();
|
|
DisplayEnable8021x();
|
|
}
|
|
|
|
|
|
void CPS8021XPropPage::OnSel8021xMode()
|
|
{
|
|
UpdateData(TRUE);
|
|
SetModified();
|
|
}
|
|
|
|
|
|
void CPS8021XPropPage::OnSelCertType()
|
|
{
|
|
UpdateData(TRUE);
|
|
SetModified();
|
|
}
|
|
|
|
void CPS8021XPropPage::OnCheckValidateServerCert()
|
|
{
|
|
UpdateData(TRUE);
|
|
SetModified();
|
|
//DisableWindow(m_hwnd8021xCheck);
|
|
}
|
|
|
|
void CPS8021XPropPage::OnSelMachineAuthenticationType()
|
|
{
|
|
UpdateData(TRUE);
|
|
SetModified();
|
|
}
|
|
|
|
void CPS8021XPropPage::OnCheckGuestAuthentication()
|
|
{
|
|
UpdateData (TRUE);
|
|
SetModified();
|
|
}
|
|
|
|
void CPS8021XPropPage::OnCheckMachineAuthentication()
|
|
{
|
|
UpdateData (TRUE);
|
|
SetModified();
|
|
DisplayMachineAuthentication();
|
|
}
|
|
|
|
void CPS8021XPropPage::OnIEEE8021xParams()
|
|
{
|
|
UpdateData (TRUE);
|
|
SetModified();
|
|
}
|
|
|
|
void CPS8021XPropPage::OnSelEapType()
|
|
{
|
|
UpdateData(TRUE);
|
|
SetModified();
|
|
dwEAPUpdated = 1;
|
|
DisplayEapType();
|
|
}
|
|
|
|
BOOL CPS8021XPropPage::OnHelpInfo(HELPINFO* pHelpInfo)
|
|
{
|
|
if (pHelpInfo->iContextType == HELPINFO_WINDOW)
|
|
{
|
|
DWORD* pdwHelp = (DWORD*) &g_aHelpIDs_IDD_8021X_PROPERTY_PAGE[0];
|
|
::WinHelp ((HWND)pHelpInfo->hItemHandle,
|
|
c_szWlsnpHelpFile,
|
|
HELP_WM_HELP,
|
|
(DWORD_PTR)(LPVOID)pdwHelp);
|
|
}
|
|
|
|
return CWirelessBasePage::OnHelpInfo(pHelpInfo);
|
|
}
|
|
|
|
BOOL CPS8021XPropPage::ControlDataToWirelessPS()
|
|
{
|
|
PWIRELESS_PS_DATA pWirelessPSData = NULL;
|
|
LPWSTR pszNewInterfaceName = NULL;
|
|
|
|
DWORD dwIEEE8021xMaxStart;
|
|
DWORD dwIEEE8021xStartPeriod;
|
|
DWORD dwIEEE8021xAuthPeriod;
|
|
DWORD dwIEEE8021xHeldPeriod;
|
|
|
|
CString pszIEEE8021xMaxStart;
|
|
CString pszIEEE8021xStartPeriod;
|
|
CString pszIEEE8021xAuthPeriod;
|
|
CString pszIEEE8021xHeldPeriod;
|
|
|
|
DWORD dwEnable8021x;
|
|
DWORD dw8021xMode;
|
|
DWORD dwEapType;
|
|
DWORD dwCertificateType;
|
|
DWORD dwValidateServerCertificate;
|
|
|
|
DWORD dwMachineAuthentication;
|
|
DWORD dwMachineAuthenticationType;
|
|
DWORD dwGuestAuthentication;
|
|
|
|
DWORD dwEapIndex;
|
|
DWORD dw8021xModeIndex;
|
|
DWORD dwMachineAuthenticationTypeIndex;
|
|
DWORD dwCertificateTypeIndex;
|
|
DTLNODE *pNode = NULL;
|
|
EAPCFG *pEapcfg = NULL;
|
|
|
|
|
|
pWirelessPSData = WirelessPS();
|
|
|
|
UpdateData (TRUE);
|
|
|
|
dwEnable8021x =
|
|
m_dwEnable8021x ? 1 : 0;
|
|
|
|
dw8021xModeIndex = m_cb8021xMode.GetCurSel();
|
|
|
|
switch (dw8021xModeIndex) {
|
|
case 0 :
|
|
dw8021xMode =
|
|
WIRELESS_8021X_MODE_NO_TRANSMIT_EAPOLSTART_WIRED;
|
|
break;
|
|
case 1 :
|
|
dw8021xMode =
|
|
WIRELESS_8021X_MODE_NAS_TRANSMIT_EAPOLSTART_WIRED;
|
|
break;
|
|
case 2 :
|
|
dw8021xMode =
|
|
WIRELESS_8021X_MODE_TRANSMIT_EAPOLSTART_WIRED;
|
|
break;
|
|
}
|
|
|
|
dwEapIndex = m_cbEapType.GetCurSel();
|
|
|
|
pNode = (DTLNODE *) m_cbEapType.GetItemDataPtr(dwEapIndex);
|
|
ASSERT( pNode );
|
|
|
|
pEapcfg = (EAPCFG* )DtlGetData( pNode );
|
|
ASSERT( pEapcfg );
|
|
|
|
dwEapType = pEapcfg->dwKey;
|
|
|
|
if (dwEAPUpdated) {
|
|
// since pEapcfg->pData is created by us, copy the pointer as is.
|
|
if (pWirelessPSData->pbEAPData) {
|
|
FreePolMem(pWirelessPSData->pbEAPData);
|
|
}
|
|
|
|
pWirelessPSData->dwEAPDataLen = pEapcfg->cbData;
|
|
pWirelessPSData->pbEAPData = pEapcfg->pData;
|
|
|
|
pEapcfg->cbData = 0;
|
|
pEapcfg->pData = NULL;
|
|
}
|
|
|
|
dwCertificateTypeIndex = m_cbCertificateType.GetCurSel();
|
|
|
|
|
|
switch (dwCertificateTypeIndex) {
|
|
case 0 :
|
|
dwCertificateType =
|
|
WIRELESS_CERT_TYPE_SMARTCARD;
|
|
break;
|
|
|
|
case 1 :
|
|
dwCertificateType =
|
|
WIRELESS_CERT_TYPE_MC_CERT;
|
|
break;
|
|
}
|
|
|
|
dwValidateServerCertificate =
|
|
m_dwValidateServerCertificate ? 1 : 0;
|
|
|
|
dwMachineAuthentication =
|
|
m_dwMachineAuthentication ? 1 : 0;
|
|
|
|
|
|
dwMachineAuthenticationTypeIndex = m_cbMachineAuthenticationType.GetCurSel();
|
|
|
|
switch (dwMachineAuthenticationTypeIndex)
|
|
{
|
|
case 0 :
|
|
dwMachineAuthenticationType =
|
|
WIRELESS_MC_AUTH_TYPE_MC_NO_USER;
|
|
break;
|
|
|
|
case 1 :
|
|
dwMachineAuthenticationType =
|
|
WIRELESS_MC_AUTH_TYPE_USER_DONTCARE_MC;
|
|
break;
|
|
|
|
case 2 :
|
|
dwMachineAuthenticationType =
|
|
WIRELESS_MC_AUTH_TYPE_MC_ONLY;
|
|
break;
|
|
}
|
|
|
|
dwGuestAuthentication =
|
|
m_dwGuestAuthentication ? 1 : 0;
|
|
|
|
|
|
pWirelessPSData->dwEnable8021x = dwEnable8021x;
|
|
pWirelessPSData->dw8021xMode = dw8021xMode;
|
|
pWirelessPSData->dwEapType = dwEapType;
|
|
pWirelessPSData->dwMachineAuthentication = dwMachineAuthentication;
|
|
pWirelessPSData->dwMachineAuthenticationType = dwMachineAuthenticationType;
|
|
pWirelessPSData->dwGuestAuthentication = dwGuestAuthentication;
|
|
|
|
pWirelessPSData->dwIEEE8021xMaxStart =
|
|
m_dwIEEE8021xMaxStart;
|
|
pWirelessPSData->dwIEEE8021xStartPeriod =
|
|
m_dwIEEE8021xStartPeriod;
|
|
pWirelessPSData->dwIEEE8021xAuthPeriod =
|
|
m_dwIEEE8021xAuthPeriod;
|
|
pWirelessPSData->dwIEEE8021xHeldPeriod =
|
|
m_dwIEEE8021xHeldPeriod;
|
|
|
|
m_bHasApplied = TRUE;
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void
|
|
CPS8021XPropPage::Initialize (
|
|
PWIRELESS_PS_DATA pWirelessPSData,
|
|
CComponentDataImpl* pComponentDataImpl,
|
|
BOOL dwFlags = WLSTORE_READWRITE
|
|
)
|
|
{
|
|
m_bReadOnly = dwFlags & WLSTORE_READONLY;
|
|
CWirelessBasePage::Initialize(pWirelessPSData, pComponentDataImpl);
|
|
}
|
|
|
|
void CPS8021XPropPage::DisableControls()
|
|
{
|
|
SAFE_ENABLEWINDOW(IDC_ENABLE_8021X, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_COMBO_8021X_MODE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_MODE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_EAP_TYPE_COMBO,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_EAP_TYPE, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_MAX_START, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_START_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_HELD_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_IEEE8021X_AUTH_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_MAX_START, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_START_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_HELD_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_PERIOD, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_PARAMS, FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_CERT_TYPE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_MACHINE_AUTHENTICATION,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_GUEST_AUTHENTICATION,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,FALSE);
|
|
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE,FALSE);
|
|
}
|
|
|
|
|
|
DWORD
|
|
CPS8021XPropPage::OnProperties(
|
|
)
|
|
{
|
|
|
|
DWORD dwError = 0;
|
|
DTLNODE* pNode = NULL;
|
|
EAPCFG* pEapcfg = NULL;
|
|
RASEAPINVOKECONFIGUI pInvokeConfigUi;
|
|
RASEAPFREE pFreeConfigUIData;
|
|
HINSTANCE h;
|
|
BYTE* pbEAPData = NULL;
|
|
DWORD cbEAPData = 0;
|
|
HWND hWnd;
|
|
LPBYTE pbNewEAPData = NULL;
|
|
|
|
DWORD dwEapTypeIndex = 0;
|
|
|
|
// Look up the selected package configuration and load the associated
|
|
// configuration DLL.
|
|
|
|
dwEapTypeIndex = m_cbEapType.GetCurSel();
|
|
pNode = (DTLNODE *) m_cbEapType.GetItemDataPtr(dwEapTypeIndex);
|
|
|
|
if (!pNode)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
pEapcfg = (EAPCFG* )DtlGetData( pNode );
|
|
ASSERT( pEapcfg );
|
|
if (!pEapcfg) {
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
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.
|
|
|
|
pbEAPData = NULL;
|
|
cbEAPData = 0;
|
|
hWnd = GetParent()->m_hWnd;
|
|
dwError = pInvokeConfigUi(
|
|
pEapcfg->dwKey,
|
|
hWnd,
|
|
0,
|
|
pEapcfg->pData,
|
|
pEapcfg->cbData,
|
|
&pbEAPData,
|
|
&cbEAPData
|
|
);
|
|
/*TAROON* User hitting cancel is also an error */
|
|
if (dwError)
|
|
{
|
|
FreeLibrary( h );
|
|
return E_FAIL;
|
|
}
|
|
|
|
|
|
if (pbEAPData && cbEAPData)
|
|
{
|
|
// Copy it into the eap node
|
|
pbNewEAPData = (LPBYTE) AllocPolMem(cbEAPData);
|
|
if (!pbNewEAPData)
|
|
{
|
|
dwError = GetLastError();
|
|
return(dwError);
|
|
}
|
|
memcpy(pbNewEAPData, pbEAPData, cbEAPData);
|
|
}
|
|
|
|
pFreeConfigUIData( pbEAPData );
|
|
if (pEapcfg->pData) {
|
|
FreePolMem(pEapcfg->pData);
|
|
}
|
|
|
|
pEapcfg->pData = pbNewEAPData;
|
|
pEapcfg->cbData = cbEAPData;
|
|
|
|
dwEAPUpdated = 1;
|
|
|
|
FreeLibrary( h );
|
|
|
|
return dwError;
|
|
}
|
|
|
|
void
|
|
CPS8021XPropPage::OnCancel()
|
|
{
|
|
EAPCFG* pEapcfg = NULL;
|
|
DTLNODE *pNodeEap = NULL;
|
|
|
|
if (pListEapcfgs) {
|
|
|
|
// Delete the data allocated using AllocPolMem
|
|
for (pNodeEap = DtlGetFirstNode(pListEapcfgs);
|
|
pNodeEap;
|
|
pNodeEap = DtlGetNextNode(pNodeEap)
|
|
)
|
|
{
|
|
pEapcfg = (EAPCFG* )DtlGetData(pNodeEap);
|
|
ASSERT( pEapcfg );
|
|
|
|
if (pEapcfg->pData) {
|
|
FreePolMem(pEapcfg->pData);
|
|
}
|
|
pEapcfg->pData = NULL;
|
|
pEapcfg->cbData = 0;
|
|
}
|
|
DtlDestroyList (pListEapcfgs, DestroyEapcfgNode);
|
|
}
|
|
pListEapcfgs = NULL;
|
|
|
|
}
|
|
|