Leaked source code of windows server 2003
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.
 
 
 
 
 
 

213 lines
5.9 KiB

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) Microsoft Corporation
//
// SYNOPSIS
//
// Defines the class MigrateEapConfig.
//
///////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MigrateEapConfig.h"
#include "raseapif.h"
#include "iasapi.h"
const wchar_t MigrateEapConfig::profilesPath[] =
L"Root\0"
L"Microsoft Internet Authentication Service\0"
L"RadiusProfiles\0";
MigrateEapConfig::MigrateEapConfig(
const CGlobalData& newGlobalData
)
: globalData(newGlobalData),
msNPAllowedEapType(L"msNPAllowedEapType"),
msEapConfig(L"msEAPConfiguration")
{
memset(cachedTypes, 0, sizeof(cachedTypes));
long status = eapKey.Open(
HKEY_LOCAL_MACHINE,
RAS_EAP_REGISTRY_LOCATION,
KEY_READ
);
if (status != NO_ERROR)
{
_com_issue_error(HRESULT_FROM_WIN32(status));
}
}
void MigrateEapConfig::Execute()
{
long profilesId;
globalData.m_pObjects->WalkPath(profilesPath, profilesId);
long profileId;
_bstr_t profileName;
HRESULT hr = globalData.m_pObjects->GetObject(
profileName,
profileId,
profilesId
);
for (long index = 1; SUCCEEDED(hr); ++index)
{
ReadProfile(profileId);
WriteProfile(profileId);
hr = globalData.m_pObjects->GetNextObject(
profileName,
profileId,
profilesId,
index
);
}
}
void MigrateEapConfig::ReadProfile(long profileId)
{
// Clear the data from the previous profile.
profileConfig.Clear();
_bstr_t propName, propValue;
long varType;
HRESULT hr = globalData.m_pProperties->GetProperty(
profileId,
propName,
varType,
propValue
);
for (long index = 1; SUCCEEDED(hr); ++index)
{
if (propName == msNPAllowedEapType)
{
if (varType != VT_I4)
{
_com_issue_error(E_UNEXPECTED);
}
AddConfigForType(propValue);
}
hr = globalData.m_pProperties->GetNextProperty(
profileId,
propName,
varType,
propValue,
index
);
}
}
void MigrateEapConfig::WriteProfile(long profileId)
{
if (profileConfig.IsEmpty())
{
return;
}
_variant_t configVariant;
_com_util::CheckError(
profileConfig.Store(configVariant)
);
const SAFEARRAY* sa = V_ARRAY(&configVariant);
VARIANT* begin = static_cast<VARIANT*>(sa->pvData);
VARIANT* end = begin + sa->rgsabound[0].cElements;
for (VARIANT* i = begin; i != end; ++i)
{
_com_util::CheckError(
IASVariantChangeType(i, i, 0, VT_BSTR)
);
globalData.m_pProperties->InsertProperty(
profileId,
msEapConfig,
(VT_UI1 | VT_ARRAY),
_bstr_t(V_BSTR(i))
);
}
}
void MigrateEapConfig::AddConfigForType(const wchar_t* typeName)
{
BYTE typeId = static_cast<BYTE>(_wtol(typeName));
GetGlobalConfig(typeId, typeName);
EapProfile::ConstConfigData data;
globalConfig.Get(typeId, data);
_com_util::CheckError(
profileConfig.Set(typeId, data)
);
}
void MigrateEapConfig::GetGlobalConfig(BYTE typeId, const wchar_t* typeName)
{
// Have we already retrieved the config for this type?
if (cachedTypes[typeId])
{
return;
}
long status;
CRegKey providerKey;
status = providerKey.Open(eapKey, typeName, KEY_READ);
if (status != NO_ERROR)
{
_com_issue_error(HRESULT_FROM_WIN32(status));
}
DWORD dataType;
wchar_t clsidString[40];
DWORD dataLength = sizeof(clsidString);
status = RegQueryValueExW(
providerKey,
RAS_EAP_VALUENAME_CONFIG_CLSID,
0,
&dataType,
reinterpret_cast<BYTE*>(clsidString),
&dataLength
);
if (status == NO_ERROR)
{
if ((dataType != REG_SZ) || (dataLength < sizeof(wchar_t)))
{
_com_issue_error(HRESULT_FROM_WIN32(ERROR_INVALID_DATA));
}
IEAPProviderConfig2Ptr configObj(clsidString);
if (configObj != 0)
{
EapProfile::ConfigData data;
_com_util::CheckError(
configObj->GetGlobalConfig(
typeId,
&(data.value),
&(data.length)
)
);
_com_util::CheckError(
globalConfig.Set(static_cast<BYTE>(typeId), data)
);
}
}
else if (status != ERROR_FILE_NOT_FOUND)
{
_com_issue_error(HRESULT_FROM_WIN32(status));
}
cachedTypes[typeId] = true;
}