|
|
/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/
/*
rasdial.cpp Definition of CRASProfile class and CRASUser class
FILE HISTORY:
*/ //////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <sspi.h>
#include <secext.h>
#include <dsgetdc.h>
#include "resource.h"
#include "helper.h"
#include "rasdial.h"
#include "rasprof.h"
#include "sharesdo.h"
#define _WEI_DEBUG
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW
#endif
#define ERRORCODE_NOTFOUND ERROR_FILE_NOT_FOUND // win32 error
CRASUserMerge::CRASUserMerge(RasEnvType type, LPCWSTR location, LPCWSTR userPath) { // environment info
m_type = type; m_strMachine = location;
m_strUserPath = userPath;
// Ip Addresses
m_dwFramedIPAddress = 0; m_dwDefinedAttribMask = 0; };
HRESULT CRASUserMerge::HrGetDCName(CString& DcName) { HRESULT hr = S_OK; VARIANT v; VariantInit(&v); CComPtr<IADs> spIADs; CComPtr<IADsObjectOptions> spOps;
USES_CONVERSION; CHECK_HR( hr = ADsGetObject(T2W((LPTSTR)(LPCTSTR)m_strUserPath), IID_IADs, (void**)&spIADs)); ASSERT(spIADs.p); CHECK_HR(hr = spIADs->QueryInterface(IID_IADsObjectOptions,(void**)&spOps)); CHECK_HR(hr = spOps->GetOption(ADS_OPTION_SERVERNAME,&v));
ASSERT(V_VT(&v) == VT_BSTR);
DcName = V_BSTR(&v);
VariantClear(&v); L_ERR: VariantClear(&v); return hr; };
HRESULT CRASUserMerge::HrIsInMixedDomain() { HRESULT hr = S_OK; VARIANT v; VariantInit(&v); if(!m_strMachine.IsEmpty()) // local user, so not
return S_FALSE; else { // try to use SDO
IASDOMAINTYPE domainType; if((ISdoMachine*)m_spISdoServer != NULL) // already created
{ if(m_spISdoServer->GetDomainType(&domainType) == S_OK) { if (domainType == DOMAIN_TYPE_MIXED) return S_OK; else return S_FALSE; }
}
// if for any reason, SDO doesn't provide the information, do it myself
// Canonical Name Format
TCHAR szName[MAX_PATH * 2]; ULONG size = MAX_PATH * 2; CString DomainPath; CString strTemp; CComPtr<IADs> spIADs; int i;
USES_CONVERSION; CHECK_HR( hr = ADsGetObject(T2W((LPTSTR)(LPCTSTR)m_strUserPath), IID_IADs, (void**)&spIADs)); ASSERT(spIADs.p); CHECK_HR( hr = spIADs->Get(L"distinguishedName", &v));
ASSERT(V_VT(&v) == VT_BSTR);
CHECK_HR(hr = ::TranslateName(V_BSTR(&v), NameFullyQualifiedDN, NameCanonical, szName, &size));
VariantClear(&v); strTemp = szName; i = strTemp.Find(_T('/'));
if(i != -1) strTemp = strTemp.Left(i);
// DN of the domain
DomainPath = _T("LDAP://"); DomainPath += strTemp;
spIADs.Release();
CHECK_HR(hr = ADsGetObject(T2W((LPTSTR)(LPCTSTR)DomainPath), IID_IADs, (void**)&spIADs)); ASSERT(spIADs.p); CHECK_HR(hr = spIADs->Get(L"nTMixedDomain", &v));
ASSERT(V_VT(&v) == VT_BOOL || V_VT(&v) == VT_I4);
if(V_BOOL(&v)) hr = S_OK; else hr = S_FALSE; } L_ERR: VariantClear(&v); return hr; }
BOOL CRASUserMerge::IfAccessAttribute(ULONG id) { if(S_OK == HrIsInMixedDomain()) // only allow dialin bit and callback policy
{ switch(id) { case PROPERTY_USER_IAS_ATTRIBUTE_ALLOW_DIALIN: // allow dialin or not
case PROPERTY_USER_msRADIUSCallbackNumber: // call back number
case PROPERTY_USER_RADIUS_ATTRIBUTE_SERVICE_TYPE: // call back policy
return TRUE; default: return FALSE; } } else // no restriction otherwise
return TRUE; }
HRESULT CRASUserMerge::SetRegistryFootPrint() { if(IsFocusOnLocalUser()) { RegKey RemoteAccessParames; LONG lRes = RemoteAccessParames.Create(RAS_REG_ROOT, REGKEY_REMOTEACCESS_PARAMS, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, (LPCTSTR)m_strMachine); if (lRes != ERROR_SUCCESS) return HRESULT_FROM_WIN32(lRes); //================================================
// save the values to the key
DWORD regValue = REGVAL_VAL_USERSCONFIGUREDWITHMMC; lRes = RemoteAccessParames.SetValue(REGVAL_NAME_USERSCONFIGUREDWITHMMC, regValue); }
return S_OK; }
//====================================================
//
// CRASUserMerge::Load
//
// load RASUser object from DS
// pcwszUserPath: is the ADsPath of the DSuser object, the RASUser object is
// object contained in DSUser object
// when, the RASUser object doesn't exist, load will call
// CreateDefault to create one object for this DSUser
HRESULT CRASUserMerge::Load() { // new function added for no DS machine : weijiang 12/17/97
USES_CONVERSION; TRACE(_T("Enter CRASUserMerge::Load()\r\n"));
// Load is not expected to be called more than once
ASSERT(!m_spISdoServer.p);
VARIANT var; HRESULT hr = S_OK; CComPtr<ISdo> spSdo; CComPtr<IUnknown> spUnk; BSTR bstrMachineName = NULL; BSTR bstrUserPath = NULL; UINT nServiceType = 0; IASDATASTORE storeFlags; CComPtr<ISdo> spIRasUser; VariantInit(&var);
// one more function call to SDOSERver to set machine information
// Get the user SDO
if(m_strMachine.IsEmpty()) // focused on DS
{ storeFlags = DATA_STORE_DIRECTORY;
CString sDCName;
CHECK_HR(hr = HrGetDCName(sDCName));
CBSTR bstrDomainController(sDCName); bstrMachineName = T2BSTR((LPTSTR)(LPCTSTR)sDCName); } else // local machine
{ storeFlags = DATA_STORE_LOCAL; bstrMachineName = T2BSTR((LPTSTR)(LPCTSTR)m_strMachine);
}
// connect to server
#ifdef SINGLE_SDO_CONNECTION // for share the same sdo connection for multiple users
// connection will NOT be necessary after SDO changes to RTM version.
// connect once for each process
CHECK_HR(hr = m_MarshalSdoServer.GetServer(&m_spISdoServer)); { CWaitCursor wc;
// if we get the server back from the shareSDO object, we use it to connect
if ((ISdoMachine*)m_spISdoServer) { CHECK_HR(hr = m_MarshalSdoServer.Connect()); } // otherwise, we make a new connection
else { // try to Connect the old way
// connect everytime a user page is requested
CHECK_HR(hr = ConnectToSdoServer(bstrMachineName, NULL, NULL, &m_spISdoServer)); } }
#else
// connect everytime a user page is requested
CHECK_HR(hr = ConnectToSdoServer(bstrMachineName, NULL, NULL, &m_spISdoServer)); #endif
// If for local users, only NT5 servers are allowed to configure using this apge
if(!m_strMachine.IsEmpty()) // not focused on DS
{ IASOSTYPE OSType;
CHECK_HR(hr = m_spISdoServer->GetOSType(&OSType)); if(OSType != SYSTEM_TYPE_NT5_SERVER) { hr = S_FALSE; goto L_ERR; }
}
// find the user object
bstrUserPath = T2BSTR((LPTSTR)(LPCTSTR)m_strUserPath); TracePrintf(g_dwTraceHandle,_T("SdoServer::GetUserSDO(%x, %s, %x"), storeFlags, bstrUserPath, &spUnk); CHECK_HR(hr = m_spISdoServer->GetUserSDO( storeFlags, bstrUserPath, &spUnk)); TracePrintf(g_dwTraceHandle,_T(" hr = %8x\r\n"), hr); ASSERT(spUnk.p);
CHECK_HR(hr = spUnk->QueryInterface(IID_ISdo, (void**)&spIRasUser)); ASSERT(spIRasUser.p);
// initialize the wrapper class
CHECK_HR(hr = m_SdoWrapper.Init((ISdo*)spIRasUser)); // Get All the properties
// need to handle the case when the values don't exist
TRACE(_T("Getting Properties\r\n"));
m_dwDefinedAttribMask = 0; // m_dwDialinPermit
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_IAS_ATTRIBUTE_ALLOW_DIALIN, &var)); if(V_VT(&var) == VT_I4 || V_VT(&var) == VT_BOOL) { if(V_BOOL(&var) != 0) m_dwDialinPermit = 1; else m_dwDialinPermit = 0; } else m_dwDialinPermit = -1; // the value is not defined in the user data, using policy to decide
// FramedIPAddress
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msRADIUSFramedIPAddress, &var));
if(V_VT(&var) == VT_I4) { m_dwDefinedAttribMask |= RAS_USE_STATICIP; m_dwFramedIPAddress = V_I4(&var); } else { VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msSavedRADIUSFramedIPAddress, &var)); if(V_VT(&var) == VT_I4) m_dwFramedIPAddress = V_I4(&var); else m_dwFramedIPAddress = 0; }
// Service Type -- to hold if this user has callback, if this user allowed to dialin
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_RADIUS_ATTRIBUTE_SERVICE_TYPE, &var));
if(V_VT(&var) == VT_I4) { nServiceType = V_I4(&var); }
// call back number
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msRADIUSCallbackNumber, &var));
if(V_VT(&var) == VT_BSTR) { m_strCallbackNumber = V_BSTR(&var); if(nServiceType == RADUIS_SERVICETYPE_CALLBACK_FRAME && m_strCallbackNumber.IsEmpty()) m_dwDefinedAttribMask |= RAS_CALLBACK_CALLERSET; else if (nServiceType == RADUIS_SERVICETYPE_CALLBACK_FRAME) m_dwDefinedAttribMask |= RAS_CALLBACK_SECURE; } else { if(nServiceType == RADUIS_SERVICETYPE_CALLBACK_FRAME) m_dwDefinedAttribMask |= RAS_CALLBACK_CALLERSET; else m_dwDefinedAttribMask |= RAS_CALLBACK_NOCALLBACK;
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msSavedRADIUSCallbackNumber, &var)); if(V_VT(&var) == VT_BSTR) m_strCallbackNumber = V_BSTR(&var); }
// calling station id
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msNPCallingStationID, &var)); if(V_VT(&var) & VT_ARRAY) { m_strArrayCallingStationId = V_ARRAY(&var); m_dwDefinedAttribMask |= RAS_USE_CALLERID; } else { VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msSavedNPCallingStationID, &var)); if(V_VT(&var) & VT_ARRAY) m_strArrayCallingStationId = V_ARRAY(&var); } // framed routes
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msRADIUSFramedRoute, &var));
if(V_VT(&var) & VT_ARRAY) { m_strArrayFramedRoute = V_ARRAY(&var); m_dwDefinedAttribMask |= RAS_USE_STATICROUTES; } else { VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msSavedRADIUSFramedRoute, &var)); if(V_VT(&var) & VT_ARRAY) m_strArrayFramedRoute = V_ARRAY(&var); } L_ERR: TracePrintf(g_dwTraceHandle, _T("hr = %8x\r\n"), hr); VariantClear(&var); SysFreeString(bstrMachineName); SysFreeString(bstrUserPath);
TracePrintf(g_dwTraceHandle, _T("Leave CRASUserMerge::Load(), hr = %8x\r\n"), hr);
return hr; }
//====================================================
// CRASUserMerge::Save
//
// save ths RASUser object
HRESULT CRASUserMerge::Save() { TRACE(_T("Enter CRASUserMerge::Save()\r\n")); HRESULT hr = S_OK; VARIANT var;
USES_CONVERSION;
// restore SDO user from
// otherwise, we could overwrite the other properties in usrparams field
// fix bug: 86968
m_SdoWrapper.Commit(FALSE); VariantInit(&var);
//==========================
// Dialin bit
VariantClear(&var); V_VT(&var) = VT_BOOL; switch(m_dwDialinPermit) { case 1: // allow
case 0: // deny
if(m_dwDialinPermit == 1) V_I4(&var) = VARIANT_TRUE; // Variant TRUE
else V_I4(&var) = VARIANT_FALSE; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_IAS_ATTRIBUTE_ALLOW_DIALIN, &var)); break; case -1: // decide by policy -- remove attribute
CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_IAS_ATTRIBUTE_ALLOW_DIALIN)); break;
default: ASSERT(0); // if need to provide new code
}
//==========================
// Service Type -- callback policy
if(m_dwDefinedAttribMask & (RAS_CALLBACK_SECURE | RAS_CALLBACK_CALLERSET)) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = RADUIS_SERVICETYPE_CALLBACK_FRAME; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_RADIUS_ATTRIBUTE_SERVICE_TYPE, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_RADIUS_ATTRIBUTE_SERVICE_TYPE));
//==========================
// call back number
if (!m_strCallbackNumber.IsEmpty() && (m_dwDefinedAttribMask & RAS_CALLBACK_SECURE)) { VariantClear(&var); V_VT(&var) = VT_BSTR; V_BSTR(&var) = T2BSTR((LPTSTR)(LPCTSTR)m_strCallbackNumber); CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msRADIUSCallbackNumber, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msRADIUSCallbackNumber)); if(S_OK != HrIsInMixedDomain()) { //==========================
// call back number
if(!m_strCallbackNumber.IsEmpty()) { VariantClear(&var); V_VT(&var) = VT_BSTR; V_BSTR(&var) = T2BSTR((LPTSTR)(LPCTSTR)m_strCallbackNumber); CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msSavedRADIUSCallbackNumber, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msSavedRADIUSCallbackNumber));
//==========================
// FramedIPAddress
if(m_dwFramedIPAddress) // need to back up the data, no matter if it's used
{ VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwFramedIPAddress; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msSavedRADIUSFramedIPAddress, &var)); } else // remove it
CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msSavedRADIUSFramedIPAddress));
if(m_dwFramedIPAddress && (m_dwDefinedAttribMask & RAS_USE_STATICIP)) { CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msRADIUSFramedIPAddress, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msRADIUSFramedIPAddress));
} //==========================
// calling station id
if(S_OK != HrIsInMixedDomain()) { if(m_strArrayCallingStationId.GetSize()) { VariantClear(&var); V_VT(&var) = VT_VARIANT | VT_ARRAY; V_ARRAY(&var) = (SAFEARRAY*)m_strArrayCallingStationId; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msSavedNPCallingStationID, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msSavedNPCallingStationID));
if(m_strArrayCallingStationId.GetSize() && (m_dwDefinedAttribMask & RAS_USE_CALLERID)) { CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msNPCallingStationID, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msNPCallingStationID));
//==========================
// framed routes
if(m_strArrayFramedRoute.GetSize()) { VariantClear(&var); V_VT(&var) = VT_VARIANT | VT_ARRAY; V_ARRAY(&var) = (SAFEARRAY*)m_strArrayFramedRoute; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msSavedRADIUSFramedRoute, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msSavedRADIUSFramedRoute)); if(m_strArrayFramedRoute.GetSize() && (m_dwDefinedAttribMask & RAS_USE_STATICROUTES)) { CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msRADIUSFramedRoute, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msRADIUSFramedRoute));
} CHECK_HR(hr = m_SdoWrapper.Commit());
// touch the registry to make connection UI know.
SetRegistryFootPrint(); L_ERR: VariantClear(&var);
TRACE(_T("Leave CRASUserMerge::Save()\r\n"));
return hr; }
// to detect if driver level support 128 bit encryption,
HRESULT CRASProfileMerge::GetRasNdiswanDriverCaps(RAS_NDISWAN_DRIVER_INFO *pInfo) { HANDLE hConn; RAS_NDISWAN_DRIVER_INFO pDriverInfo;
DWORD dwErr = RasRpcConnectServer((LPTSTR)(LPCTSTR)m_strMachineName, &hConn);
if (dwErr != NOERROR) return HRESULT_FROM_WIN32(dwErr);
dwErr = RasGetNdiswanDriverCaps(hConn, pInfo);
RasRpcDisconnectServer(hConn);
return HRESULT_FROM_WIN32(dwErr); }
#define EAP_TLS_ID 13
// EAP type list -- !!! Need to implement
HRESULT CRASProfileMerge::GetEapTypeList( CStrArray& EapTypes, CDWArray& EapIds, CDWArray& EAPTypeKeys, AuthProviderArray* pProvList) { HRESULT hr = S_OK; #ifndef __EAPLIST_USES_SDO__
AuthProviderArray __tmpArray; CString* pStr = NULL; DWORD dwID; DWORD dwKey; int i;
if(!pProvList) // if not provided
pProvList = &__tmpArray;
CHECK_HR(hr = GetEapProviders(m_strMachineName, pProvList));
// fill in the buffers for name, Id, and keys
for(i = 0; i < pProvList->GetSize(); i++) { AuthProviderData* pProv = &(pProvList->ElementAt(i)); try { pStr = new CString(pProv->m_stTitle); dwID = _ttol(pProv->m_stKey); dwKey = pProv->m_fSupportsEncryption;
// put the above to the arrays
EapIds.Add(dwID); EAPTypeKeys.Add(dwKey); EapTypes.Add(pStr); } catch(CMemoryException&) { EapIds.DeleteAll(); EAPTypeKeys.DeleteAll(); EapTypes.DeleteAll(); CHECK_HR(hr = E_OUTOFMEMORY); } }
#else
ASSERT(m_spIDictionary.p);
VARIANT vNames; VARIANT vIds; int j, count;
VariantInit(&vNames); VariantInit(&vIds);
CString* pStr = NULL; DWORD dwKey = 0;
CHECK_HR(hr = m_spIDictionary->EnumAttributeValues((ATTRIBUTEID)PROPERTY_PROFILE_msNPAllowedEapType, &vIds, &vNames));
ASSERT(V_VT(&vNames) & VT_ARRAY); ASSERT(V_VT(&vIds) & VT_ARRAY);
EAPTypeKeys.DeleteAll();
try{ EapTypes = (SAFEARRAY*)V_ARRAY(&vNames); EapIds = (SAFEARRAY*)V_ARRAY(&vIds); } catch(CMemoryException&) { hr = E_OUTOFMEMORY; }
ASSERT(EapIds.GetSize() == EapTypes.GetSize()); // they need to be in pairs
count = EapTypes.GetSize();
if(EapIds.GetSize() != count) hr = E_FAIL;
// remove the leading charater for EapKey and put the key into a separate array
for(j = 0; j < count; j++) { CString* pStr = EapTypes.GetAt(j);
ASSERT(pStr); pStr->TrimLeft(); pStr->TrimRight();
dwKey = (pStr->GetAt(0) == _T('1'));
int i = pStr->Find(_T(':'));
if(i != -1) *pStr = pStr->Mid(i + 1);
EAPTypeKeys.Add(dwKey);
// append TLS string with RAS specific
if(EapIds.GetAt(j) == EAP_TLS_ID) { CString str; str.LoadString(IDS_RASSPECIFIC); *pStr += str; } }
#endif
L_ERR: return hr; }
// Medium Type list -- !! Need to implement
HRESULT CRASProfileMerge::GetPortTypeList(CStrArray& Names, CDWArray& MediumIds) { TRACE(_T("Enter CRASProfileMerge::GetPortTypeList\n")); ASSERT(m_spIDictionary.p);
VARIANT vNames; VARIANT vIds;
VariantInit(&vNames); VariantInit(&vIds);
HRESULT hr = S_OK;
CHECK_HR(hr = m_spIDictionary->EnumAttributeValues((ATTRIBUTEID)PROPERTY_PROFILE_msNPAllowedPortTypes, &vIds, &vNames));
ASSERT(V_VT(&vNames) & VT_ARRAY); ASSERT(V_VT(&vIds) & VT_ARRAY);
try{ Names = (SAFEARRAY*)V_ARRAY(&vNames); MediumIds = (SAFEARRAY*)V_ARRAY(&vIds); } catch(CMemoryException&) { hr = E_OUTOFMEMORY; }
ASSERT(MediumIds.GetSize() == Names.GetSize()); // they need to be in pairs
if(MediumIds.GetSize() != Names.GetSize()) hr = E_FAIL;
L_ERR: TRACE(_T("Leave CRASProfileMerge::GetPortTypeList\n")); return hr; } //====================================================
//
// CRASProfileMerge::Load
//
// pcwszRelativePath -- the relative name for the profile object
//
HRESULT CRASProfileMerge::Load() { TRACE(_T("Enter CRASProfileMerge::Load()\r\n"));
// ==
ASSERT(m_spIProfile.p); ASSERT(m_spIDictionary.p);
VARIANT var; HRESULT hr = S_OK;
// Init the flags to NULL, each bit of the flag is used tell if a particular
// attribute is defined
m_dwAttributeFlags = 0;
VariantInit(&var); //==================================================
// constraints dialog
/*
// Constraints Dialog
PROPERTY_PROFILE_msNPTimeOfDay PROPERTY_PROFILE_msNPCalledStationId PROPERTY_PROFILE_msNPAllowedPortTypes PROPERTY_PROFILE_msRADIUSIdleTimeout PROPERTY_PROFILE_msRADIUSSessionTimeout */
// Sessions Allowed
CHECK_HR(hr = m_SdoWrapper.Init(PROPERTY_PROFILE_ATTRIBUTES_COLLECTION, m_spIProfile, m_spIDictionary));
// Time Of Day
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPTimeOfDay, &var));
if(V_VT(&var) & VT_ARRAY) { m_strArrayTimeOfDay = V_ARRAY(&var); m_dwAttributeFlags |= PABF_msNPTimeOfDay; } else m_strArrayTimeOfDay.DeleteAll();
// called station id
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPCalledStationId, &var));
if(V_VT(&var) & VT_ARRAY) { m_strArrayCalledStationId = V_ARRAY(&var); m_dwAttributeFlags |= PABF_msNPCalledStationId; } else m_strArrayCalledStationId.DeleteAll();
// allowed port types
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPAllowedPortTypes, &var)); if(V_VT(&var) & VT_ARRAY) { m_dwArrayAllowedPortTypes = V_ARRAY(&var); m_dwAttributeFlags |= PABF_msNPAllowedPortTypes; } else m_dwArrayAllowedPortTypes.DeleteAll();
// idle timeout
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRADIUSIdleTimeout, &var)); if(V_VT(&var) == VT_I4) { m_dwIdleTimeout = V_I4(&var); m_dwAttributeFlags |= PABF_msRADIUSIdleTimeout; } else m_dwIdleTimeout = RAS_DEF_IDLETIMEOUT;
// session time out
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRADIUSSessionTimeout, &var)); if(V_VT(&var) == VT_I4) { m_dwSessionTimeout = V_I4(&var); m_dwAttributeFlags |= PABF_msRADIUSSessionTimeout; } else m_dwSessionTimeout = RAS_DEF_SESSIONTIMEOUT; //============================================
// networking
/*
// Networking Dialog
PROPERTY_PROFILE_msRADIUSFramedIPAddress */
// framedIPAddress -- ip address assignment poilcy
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRADIUSFramedIPAddress, &var)); if(V_VT(&var) == VT_I4) { m_dwFramedIPAddress = V_I4(&var); m_dwAttributeFlags |= PABF_msRADIUSFramedIPAddress; } else m_dwFramedIPAddress = RAS_DEF_IPADDRESSPOLICY;
// filters
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASFilter, &var)); #ifdef FILTERS_AS_BSTR
if(V_VT(&var) == VT_BSTR) { m_cbstrFilters.AssignBSTR(V_BSTR(&var)); m_dwAttributeFlags |= PAFB_msRASFilter; } #else // SAFEARRAY of UI1
if(V_VT(&var) & VT_ARRAY) { CBYTEArray ba((SAFEARRAY*)V_ARRAY(&var));
DWORD i = ba.GetSize(); if(i > 0) { PBYTE pByte = (PBYTE)malloc(i); if(pByte == NULL) CHECK_HR(hr = E_OUTOFMEMORY); // jmp to error handling here
DWORD j = i; ba.GetBlob(pByte, &i); ASSERT( i == j); m_cbstrFilters.AssignBlob((const char *)pByte, i); free(pByte); if((BSTR)m_cbstrFilters == NULL) CHECK_HR(hr = E_OUTOFMEMORY); m_nFiltersSize = i; m_dwAttributeFlags |= PAFB_msRASFilter; } } #endif
else { m_cbstrFilters.Clean(); m_nFiltersSize = 0; }
//==============================================
// multilink
/*
// Multilink Dialog
PROPERTY_PROFILE_msRADIUSPortLimit PROPERTY_PROFILE_msRASBapLinednLimit PROPERTY_PROFILE_msRASBapLinednTime PROPERTY_PROFILE_msRASBapRequired */
// port limit
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRADIUSPortLimit, &var)); if(V_VT(&var) == VT_I4) { m_dwPortLimit = V_I4(&var); m_dwAttributeFlags |= PABF_msRADIUSPortLimit; } else m_dwPortLimit = RAS_DEF_PORTLIMIT;
// BAP required
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASBapRequired, &var)); if(V_VT(&var) == VT_I4) { m_dwBapRequired = V_I4(&var); m_dwAttributeFlags |= PABF_msRASBapRequired; } else m_dwBapRequired = RAS_DEF_BAPREQUIRED;
// line down limit
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASBapLinednLimit, &var)); if(V_VT(&var) == VT_I4) { m_dwBapLineDnLimit = V_I4(&var); m_dwAttributeFlags |= PABF_msRASBapLinednLimit; } else m_dwBapLineDnLimit = RAS_DEF_BAPLINEDNLIMIT;
// line down time
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASBapLinednTime, &var)); if(V_VT(&var) == VT_I4) { m_dwBapLineDnTime = V_I4(&var); m_dwAttributeFlags |= PABF_msRASBapLinednTime; } else m_dwBapLineDnTime = RAS_DEF_BAPLINEDNTIME;
//==================================
// authentication
/*
// Authentication Dialog
PROPERTY_PROFILE_msNPAuthenticationType PROPERTY_PROFILE_msNPAllowedEapType */
// authentication type
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPAuthenticationType, &var)); if(V_VT(&var) & VT_ARRAY) { m_dwArrayAuthenticationTypes = V_ARRAY(&var); m_dwAttributeFlags |= PABF_msNPAuthenticationType; } else m_dwArrayAuthenticationTypes.DeleteAll();
// eap type
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPAllowedEapType, &var)); if(V_VT(&var) == VT_I4) { m_dwEapType = V_I4(&var); m_dwAttributeFlags |= PABF_msNPAllowedEapType; } else m_dwEapType = RAS_DEF_EAPTYPE;
//=====================================
// encryptioin
/*
// Encryption Dialog
PROPERTY_PROFILE_msRASAllowEncryption PROPERTY_PROFILE_msRASEncryptionType */
// encryption type
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASEncryptionType, &var)); if(V_VT(&var) == VT_I4) { m_dwEncryptionType = V_I4(&var); m_dwAttributeFlags |= PABF_msRASEncryptionType; } else m_dwEncryptionType = RAS_DEF_ENCRYPTIONTYPE;
VariantClear(&var); CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASAllowEncryption, &var)); if(V_VT(&var) == VT_I4) { m_dwEncryptionPolicy = V_I4(&var); m_dwAttributeFlags |= PABF_msRASAllowEncryption; } else m_dwEncryptionPolicy = RAS_DEF_ENCRYPTIONPOLICY;
// specail code for error path
L_ERR: VariantClear(&var); TRACE(_T("Leave CRASProfileMerge::Load()\r\n"));
return hr; }
//====================================================
//
// CRASProfile::Save
//
//
HRESULT CRASProfileMerge::Save() {
TRACE(_T("Enter CRASProfileMerge::Save()\r\n"));
// ==
ASSERT(m_spIProfile.p); ASSERT(m_spIDictionary.p);
VARIANT var; HRESULT hr = S_OK;
VariantInit(&var);
USES_CONVERSION;
//==================================================
// constraints dialog
/*
// Constraints Dialog
PROPERTY_PROFILE_msNPTimeOfDay PROPERTY_PROFILE_msNPCalledStationId PROPERTY_PROFILE_msNPAllowedPortTypes PROPERTY_PROFILE_msRADIUSIdleTimeout PROPERTY_PROFILE_msRADIUSSessionTimeout */
// idleTimeout
if (m_dwAttributeFlags & PABF_msRADIUSIdleTimeout) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwIdleTimeout; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRADIUSIdleTimeout, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRADIUSIdleTimeout));
// sessionTimeout
if (m_dwAttributeFlags & PABF_msRADIUSSessionTimeout) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwSessionTimeout; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRADIUSSessionTimeout, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRADIUSSessionTimeout));
// timeOfDay -- multivalue
if (m_dwAttributeFlags & PABF_msNPTimeOfDay) { VariantClear(&var); V_VT(&var) = VT_VARIANT | VT_ARRAY; V_ARRAY(&var) = (SAFEARRAY*)m_strArrayTimeOfDay; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPTimeOfDay, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPTimeOfDay));
// calledStationId -- multivalue
if (m_dwAttributeFlags & PABF_msNPCalledStationId) { VariantClear(&var); V_VT(&var) = VT_VARIANT | VT_ARRAY; V_ARRAY(&var) = (SAFEARRAY*)m_strArrayCalledStationId; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPCalledStationId, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPCalledStationId));
// allowedPortTypes
if (m_dwAttributeFlags & PABF_msNPAllowedPortTypes) { VariantClear(&var); V_VT(&var) = VT_VARIANT | VT_ARRAY; V_ARRAY(&var) = (SAFEARRAY*)m_dwArrayAllowedPortTypes;
CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPAllowedPortTypes, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPAllowedPortTypes));
//==================================
// authentication
/*
// Authentication Dialog
PROPERTY_PROFILE_msNPAuthenticationType PROPERTY_PROFILE_msNPAllowedEapType */
// authentication type -- must
VariantClear(&var); if (m_dwAttributeFlags & PABF_msNPAuthenticationType) { VariantClear(&var); V_VT(&var) = VT_VARIANT | VT_ARRAY; V_ARRAY(&var) = (SAFEARRAY*)m_dwArrayAuthenticationTypes; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPAuthenticationType, &var)); } else { CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPAllowedEapType)); }
if(m_dwArrayAuthenticationTypes.Find(RAS_AT_EAP) != -1) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwEapType; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPAllowedEapType, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPAllowedEapType));
//=====================================
// encryptioin
/*
// Encryption Dialog
PROPERTY_PROFILE_msRASAllowEncryption PROPERTY_PROFILE_msRASEncryptionType */
// encryption type -- must
if (m_dwAttributeFlags & PABF_msRASEncryptionType) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwEncryptionType; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASEncryptionType, &var)); } else { CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASEncryptionType)); }
if (m_dwAttributeFlags & PABF_msRASAllowEncryption) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwEncryptionPolicy; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASAllowEncryption, &var)); } else { CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASAllowEncryption)); }
//=====================================
// networking
/*
// Networking Dialog
PROPERTY_PROFILE_msRADIUSFramedIPAddress */
// framedIPAddress -- ip address assignment poilcy, must
if (m_dwAttributeFlags & PABF_msRADIUSFramedIPAddress) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwFramedIPAddress; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRADIUSFramedIPAddress, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRADIUSFramedIPAddress)); // RAS filter
if ((BSTR)m_cbstrFilters && m_nFiltersSize > 0) { VariantClear(&var); #ifdef FILTERS_AS_BSTR
V_VT(&var) = VT_BSTR; V_BSTR(&var) = (BSTR)m_cbstrFilters; #else // SAFEARRAY OF UI1
{ CBYTEArray ba;
ba.AssignBlob((PBYTE)(BSTR)m_cbstrFilters, m_nFiltersSize); V_VT(&var) = VT_ARRAY | VT_UI1; V_ARRAY(&var) = (SAFEARRAY*)ba; } #endif
CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASFilter, &var)); VariantInit(&var); // the CBSTR will clean the memory
} else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASFilter));
//=====================================
// multilink
/*
// Multilink Dialog
PROPERTY_PROFILE_msRADIUSPortLimit PROPERTY_PROFILE_msRASBapLinednLimit PROPERTY_PROFILE_msRASBapLinednTime PROPERTY_PROFILE_msRASBapRequired */
//port limit
if (m_dwAttributeFlags & PABF_msRADIUSPortLimit) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwPortLimit; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRADIUSPortLimit, &var)); } else CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRADIUSPortLimit));
// BAP
if (m_dwAttributeFlags & PABF_msRASBapRequired) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwBapRequired; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASBapRequired, &var)); } else { CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASBapRequired)); }
// line down limit
if (m_dwAttributeFlags & PABF_msRASBapLinednLimit) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwBapLineDnLimit; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASBapLinednLimit, &var)); } else { CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASBapLinednLimit)); }
// line down time
if (m_dwAttributeFlags & PABF_msRASBapLinednTime) { VariantClear(&var); V_VT(&var) = VT_I4; V_I4(&var) = m_dwBapLineDnTime; CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASBapLinednTime, &var)); } else { CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASBapLinednTime)); }
// specail code for error path
L_ERR: VariantClear(&var); TRACE(_T("Leave CRASProfileMerge::Save()\r\n"));
return hr; }
|