windows-nt/Source/XPSP1/NT/net/config/shell/lanui/eapolui.cpp
2020-09-26 16:20:57 +08:00

397 lines
13 KiB
C++

#include "pch.h"
#pragma hdrstop
#include "connutil.h"
#include "ncnetcon.h"
#include "ncperms.h"
#include "ncui.h"
#include "xpsp1res.h"
#include "lanui.h"
#include "eapolui.h"
#include "util.h"
#include "lanhelp.h"
#include "wzcprops.h"
#include "wzcpage.h"
#include "wzcui.h"
#include "wzcsapi.h"
////////////////////////////////////////////////////////////////////////
// CEapolConfig related stuff
//
//+---------------------------------------------------------------------------
// constructor
CEapolConfig::CEapolConfig()
{
m_dwCtlFlags = 0;
ZeroMemory(&m_EapolIntfParams, sizeof(EAPOL_INTF_PARAMS));
m_pListEapcfgs = NULL;
}
//+---------------------------------------------------------------------------
// destructor
CEapolConfig::~CEapolConfig()
{
ZeroMemory(&m_EapolIntfParams, sizeof(EAPOL_INTF_PARAMS));
if (m_pListEapcfgs)
{
DtlDestroyList (m_pListEapcfgs, DestroyEapcfgNode);
}
m_pListEapcfgs = NULL;
}
//+---------------------------------------------------------------------------
DWORD CEapolConfig::CopyEapolConfig(CEapolConfig *pEapolConfig)
{
DTLLIST *pListEapcfgs = NULL;
DTLNODE *pCopyNode = NULL, *pInNode = NULL;
DWORD dwRetCode = ERROR_SUCCESS;
if (pEapolConfig)
{
pListEapcfgs = ::ReadEapcfgList (EAPOL_MUTUAL_AUTH_EAP_ONLY);
if (pListEapcfgs)
{
for (pCopyNode = DtlGetFirstNode(pListEapcfgs);
pCopyNode;
pCopyNode = DtlGetNextNode(pCopyNode))
{
EAPCFG* pCopyEapcfg = (EAPCFG* )DtlGetData(pCopyNode);
for (pInNode = DtlGetFirstNode(pEapolConfig->m_pListEapcfgs);
pInNode;
pInNode = DtlGetNextNode(pInNode))
{
EAPCFG* pInEapcfg = (EAPCFG* )DtlGetData(pInNode);
if (pCopyEapcfg->dwKey == pInEapcfg->dwKey)
{
if ((pCopyEapcfg->pData = (PBYTE) MALLOC (pInEapcfg->cbData)) == NULL)
{
dwRetCode = ERROR_NOT_ENOUGH_MEMORY;
break;
}
memcpy (pCopyEapcfg->pData, pInEapcfg->pData, pInEapcfg->cbData);
pCopyEapcfg->cbData = pInEapcfg->cbData;
break;
}
}
if (dwRetCode != NO_ERROR)
{
goto LExit;
}
}
}
m_pListEapcfgs = pListEapcfgs;
memcpy (&m_EapolIntfParams, &pEapolConfig->m_EapolIntfParams, sizeof(EAPOL_INTF_PARAMS));
}
else
{
dwRetCode = ERROR_INVALID_DATA;
}
LExit:
if (dwRetCode != ERROR_SUCCESS)
{
if (pListEapcfgs)
{
DtlDestroyList (pListEapcfgs, DestroyEapcfgNode);
}
}
return dwRetCode;
}
//+---------------------------------------------------------------------------
DWORD CEapolConfig::LoadEapolConfig(LPWSTR wszIntfGuid, PNDIS_802_11_SSID pndSsid)
{
BYTE *pbData = NULL;
DWORD cbData = 0;
EAPOL_INTF_PARAMS EapolIntfParams;
DTLLIST *pListEapcfgs = NULL;
HRESULT hr = S_OK;
// 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;
// Read the EAPCFG information from the registry and find the node
// selected in the entry, or the default, if none.
pListEapcfgs = ::ReadEapcfgList (EAPOL_MUTUAL_AUTH_EAP_ONLY);
if (pListEapcfgs)
{
DTLNODE* pNodeEap;
DWORD dwkey = 0;
// Read the EAP params for this interface
ZeroMemory ((BYTE *)&EapolIntfParams, sizeof(EAPOL_INTF_PARAMS));
EapolIntfParams.dwEapFlags = DEFAULT_EAP_STATE;
EapolIntfParams.dwEapType = DEFAULT_EAP_TYPE;
if (pndSsid)
{
EapolIntfParams.dwSizeOfSSID = pndSsid->SsidLength;
memcpy (EapolIntfParams.bSSID, pndSsid->Ssid, pndSsid->SsidLength);
}
else
{
// If NULL SSID, this will get default EAPOL values
EapolIntfParams.dwSizeOfSSID = 1;
}
hr = HrElGetInterfaceParams (
wszIntfGuid,
&EapolIntfParams
);
if (FAILED (hr))
{
TraceTag (ttidLanUi, "HrElGetInterfaceParams failed with error %ld",
LresFromHr(hr));
break;
}
TraceTag (ttidLanUi, "HrElGetInterfaceParams: Got EAPtype=(%ld), EAPState =(%ld)", EapolIntfParams.dwEapType, EapolIntfParams.dwEapFlags);
memcpy (&m_EapolIntfParams, &EapolIntfParams, sizeof(EAPOL_INTF_PARAMS));
// Read the EAP configuration info for all EAP packages
for (pNodeEap = DtlGetFirstNode(pListEapcfgs);
pNodeEap;
pNodeEap = DtlGetNextNode(pNodeEap))
{
EAPCFG* pEapcfg = (EAPCFG* )DtlGetData(pNodeEap);
ASSERT( pEapcfg );
hr = S_OK;
pbData = NULL;
TraceTag (ttidLanUi, "Calling HrElGetCustomAuthData for EAP %ld",
pEapcfg->dwKey);
cbData = 0;
// Get the size of the EAP blob
hr = HrElGetCustomAuthData (
wszIntfGuid,
pEapcfg->dwKey,
EapolIntfParams.dwSizeOfSSID,
EapolIntfParams.bSSID,
NULL,
&cbData
);
if (!SUCCEEDED(hr))
{
if ((EapolIntfParams.dwSizeOfSSID != 0) &&
(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)))
{
TraceTag (ttidLanUi, "HrElGetCustomAuthData: SSID!= NULL, not found blob for SSID");
// The Last Used SSID did not have a connection
// blob created. Call again for size of blob with
// NULL SSID
EapolIntfParams.dwSizeOfSSID = 0;
// Get the size of the EAP blob
hr = HrElGetCustomAuthData (
wszIntfGuid,
pEapcfg->dwKey,
0,
NULL,
NULL,
&cbData
);
}
if (hr == E_OUTOFMEMORY)
{
if (cbData <= 0)
{
// No EAP blob stored in the registry
TraceTag (ttidLanUi, "HrElGetCustomAuthData: No blob stored in reg at all");
pbData = NULL;
// Will continue processing for errors
// Not exit
hr = S_OK;
}
else
{
TraceTag (ttidLanUi, "HrElGetCustomAuthData: Found auth blob in registry");
// Allocate memory to hold the blob
pbData = (PBYTE) MALLOC (cbData);
if (pbData == NULL)
{
hr = S_OK;
TraceTag (ttidLanUi, "HrElGetCustomAuthData: Error in memory allocation for EAP blob");
continue;
}
ZeroMemory (pbData, cbData);
hr = HrElGetCustomAuthData (
wszIntfGuid,
pEapcfg->dwKey,
EapolIntfParams.dwSizeOfSSID,
EapolIntfParams.bSSID,
pbData,
&cbData
);
if (!SUCCEEDED(hr))
{
TraceTag (ttidLanUi, "HrElGetCustomAuthData: HrElGetCustomAuthData failed with %ld",
LresFromHr(hr));
FREE ( pbData );
hr = S_OK;
continue;
}
TraceTag (ttidLanUi, "HrElGetCustomAuthData: HrElGetCustomAuthData successfully got blob of length %ld"
, cbData);
}
}
else
{
TraceTag (ttidLanUi, "HrElGetCustomAuthData: Not got ERROR_NOT_ENOUGH_MEMORY error; Unknown error !!!");
hr = S_OK;
continue;
}
}
else
{
// HrElGetCustomAuthData will always return
// error with cbData = 0
hr = S_OK;
}
if (pEapcfg->pData != NULL)
{
FREE ( pEapcfg->pData );
}
pEapcfg->pData = (UCHAR *)pbData;
pEapcfg->cbData = cbData;
}
m_pListEapcfgs = pListEapcfgs;
}
else
{
hr = E_FAIL;
}
} while (FALSE);
return LresFromHr(hr);
}
//+---------------------------------------------------------------------------
DWORD CEapolConfig::SaveEapolConfig(LPWSTR wszIntfGuid, PNDIS_802_11_SSID pndSsid)
{
WCHAR *pwszLastUsedSSID = NULL;
DWORD dwEapFlags = 0;
HRESULT hrOverall = S_OK;
HRESULT hr = S_OK;
// Save the EAP configuration data into the registry
DTLNODE* pNodeEap = NULL;
hr = S_OK;
// Save data for all EAP packages in the registry
if (m_pListEapcfgs == NULL)
{
return LresFromHr(S_OK);
}
if (pndSsid)
{
m_EapolIntfParams.dwSizeOfSSID = pndSsid->SsidLength;
memcpy (m_EapolIntfParams.bSSID, pndSsid->Ssid, pndSsid->SsidLength);
}
for (pNodeEap = DtlGetFirstNode(m_pListEapcfgs);
pNodeEap;
pNodeEap = DtlGetNextNode(pNodeEap))
{
EAPCFG* pcfg = (EAPCFG* )DtlGetData(pNodeEap);
if (pcfg == NULL)
{
continue;
}
hr = S_OK;
// ignore error and continue with next
hr = HrElSetCustomAuthData (
wszIntfGuid,
pcfg->dwKey,
m_EapolIntfParams.dwSizeOfSSID,
m_EapolIntfParams.bSSID,
pcfg->pData,
pcfg->cbData);
if (FAILED (hr))
{
TraceTag (ttidLanUi, "HrElSetCustomAuthData failed");
hrOverall = hr;
hr = S_OK;
}
}
if (m_dwCtlFlags & EAPOL_CTL_LOCKED)
m_EapolIntfParams.dwEapFlags &= ~EAPOL_ENABLED;
hr = HrElSetInterfaceParams (
wszIntfGuid,
&m_EapolIntfParams
);
if (FAILED(hr))
{
TraceTag (ttidLanUi, "HrElSetInterfaceParams enabled failed with error %ld",
LresFromHr(hr));
hrOverall = hr;
}
if (hrOverall != S_OK)
{
hr = hrOverall;
}
return LresFromHr(hr);
}
//+---------------------------------------------------------------------------
BOOL CEapolConfig::Is8021XEnabled()
{
return (IS_EAPOL_ENABLED(m_EapolIntfParams.dwEapFlags));
}
//+---------------------------------------------------------------------------
VOID CEapolConfig::Set8021XState(BOOLEAN fSet)
{
if (fSet)
m_EapolIntfParams.dwEapFlags |= EAPOL_ENABLED;
else
m_EapolIntfParams.dwEapFlags &= ~EAPOL_ENABLED;
}