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.

1213 lines
34 KiB

  1. /**********************************************************************/
  2. /** Microsoft Windows/NT **/
  3. /** Copyright(c) Microsoft Corporation **/
  4. /**********************************************************************/
  5. /*
  6. rasdial.cpp
  7. Definition of CRASProfile class and CRASUser class
  8. FILE HISTORY:
  9. */
  10. //////////////////////////////////////////////////////////////////////
  11. #include "stdafx.h"
  12. #include <sspi.h>
  13. #include <secext.h>
  14. #include <dsgetdc.h>
  15. #include "resource.h"
  16. #include "helper.h"
  17. #include "rasdial.h"
  18. #include "rasprof.h"
  19. #include "sharesdo.h"
  20. #include "iastrace.h"
  21. #ifdef _DEBUG
  22. #undef THIS_FILE
  23. static char THIS_FILE[]=__FILE__;
  24. #define new DEBUG_NEW
  25. #endif
  26. CRASUserMerge::CRASUserMerge(RasEnvType type, LPCWSTR location, LPCWSTR userPath)
  27. {
  28. // environment info
  29. m_type = type;
  30. m_strMachine = location;
  31. m_strUserPath = userPath;
  32. // Ip Addresses
  33. m_dwFramedIPAddress = 0;
  34. m_dwDefinedAttribMask = 0;
  35. };
  36. HRESULT CRASUserMerge::HrGetDCName(CString& DcName)
  37. {
  38. HRESULT hr = S_OK;
  39. VARIANT v;
  40. VariantInit(&v);
  41. CComPtr<IADs> spIADs;
  42. CComPtr<IADsObjectOptions> spOps;
  43. USES_CONVERSION;
  44. CHECK_HR( hr = ADsGetObject(T2W((LPTSTR)(LPCTSTR)m_strUserPath), IID_IADs, (void**)&spIADs));
  45. ASSERT(spIADs.p);
  46. CHECK_HR(hr = spIADs->QueryInterface(IID_IADsObjectOptions,(void**)&spOps));
  47. CHECK_HR(hr = spOps->GetOption(ADS_OPTION_SERVERNAME,&v));
  48. ASSERT(V_VT(&v) == VT_BSTR);
  49. DcName = V_BSTR(&v);
  50. VariantClear(&v);
  51. L_ERR:
  52. VariantClear(&v);
  53. return hr;
  54. };
  55. HRESULT CRASUserMerge::HrIsInMixedDomain()
  56. {
  57. HRESULT hr = S_OK;
  58. VARIANT v;
  59. VariantInit(&v);
  60. if(!m_strMachine.IsEmpty()) // local user, so not
  61. return S_FALSE;
  62. else
  63. {
  64. // try to use SDO
  65. IASDOMAINTYPE domainType;
  66. if((ISdoMachine*)m_spISdoServer != NULL) // already created
  67. {
  68. if(m_spISdoServer->GetDomainType(&domainType) == S_OK)
  69. {
  70. if (domainType == DOMAIN_TYPE_MIXED)
  71. return S_OK;
  72. else
  73. return S_FALSE;
  74. }
  75. }
  76. // if for any reason, SDO doesn't provide the information, do it myself
  77. // Canonical Name Format
  78. TCHAR szName[MAX_PATH * 2];
  79. ULONG size = MAX_PATH * 2;
  80. CString DomainPath;
  81. CString strTemp;
  82. CComPtr<IADs> spIADs;
  83. int i;
  84. USES_CONVERSION;
  85. CHECK_HR( hr = ADsGetObject(T2W((LPTSTR)(LPCTSTR)m_strUserPath), IID_IADs, (void**)&spIADs));
  86. ASSERT(spIADs.p);
  87. CHECK_HR( hr = spIADs->Get(L"distinguishedName", &v));
  88. ASSERT(V_VT(&v) == VT_BSTR);
  89. CHECK_HR(hr = ::TranslateName(V_BSTR(&v), NameFullyQualifiedDN, NameCanonical, szName, &size));
  90. VariantClear(&v);
  91. strTemp = szName;
  92. i = strTemp.Find(_T('/'));
  93. if(i != -1)
  94. strTemp = strTemp.Left(i);
  95. // DN of the domain
  96. DomainPath = _T("LDAP://");
  97. DomainPath += strTemp;
  98. spIADs.Release();
  99. CHECK_HR(hr = ADsGetObject(T2W((LPTSTR)(LPCTSTR)DomainPath), IID_IADs, (void**)&spIADs));
  100. ASSERT(spIADs.p);
  101. CHECK_HR(hr = spIADs->Get(L"nTMixedDomain", &v));
  102. ASSERT(V_VT(&v) == VT_BOOL || V_VT(&v) == VT_I4);
  103. if(V_BOOL(&v)) hr = S_OK;
  104. else hr = S_FALSE;
  105. }
  106. L_ERR:
  107. VariantClear(&v);
  108. return hr;
  109. }
  110. BOOL CRASUserMerge::IfAccessAttribute(ULONG id)
  111. {
  112. if(S_OK == HrIsInMixedDomain()) // only allow dialin bit and callback policy
  113. {
  114. switch(id)
  115. {
  116. case PROPERTY_USER_IAS_ATTRIBUTE_ALLOW_DIALIN: // allow dialin or not
  117. case PROPERTY_USER_msRADIUSCallbackNumber: // call back number
  118. case PROPERTY_USER_RADIUS_ATTRIBUTE_SERVICE_TYPE: // call back policy
  119. return TRUE;
  120. default:
  121. return FALSE;
  122. }
  123. }
  124. else // no restriction otherwise
  125. return TRUE;
  126. }
  127. HRESULT CRASUserMerge::SetRegistryFootPrint()
  128. {
  129. if(IsFocusOnLocalUser())
  130. {
  131. RegKey RemoteAccessParames;
  132. LONG lRes = RemoteAccessParames.Create(RAS_REG_ROOT, REGKEY_REMOTEACCESS_PARAMS,
  133. REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, (LPCTSTR)m_strMachine);
  134. if (lRes != ERROR_SUCCESS)
  135. return HRESULT_FROM_WIN32(lRes);
  136. //================================================
  137. // save the values to the key
  138. DWORD regValue = REGVAL_VAL_USERSCONFIGUREDWITHMMC;
  139. lRes = RemoteAccessParames.SetValue(REGVAL_NAME_USERSCONFIGUREDWITHMMC, regValue);
  140. }
  141. return S_OK;
  142. }
  143. //====================================================
  144. //
  145. // CRASUserMerge::Load
  146. //
  147. // load RASUser object from DS
  148. // pcwszUserPath: is the ADsPath of the DSuser object, the RASUser object is
  149. // object contained in DSUser object
  150. // when, the RASUser object doesn't exist, load will call
  151. // CreateDefault to create one object for this DSUser
  152. HRESULT CRASUserMerge::Load()
  153. {
  154. // new function added for no DS machine : weijiang 12/17/97
  155. USES_CONVERSION;
  156. // Load is not expected to be called more than once
  157. ASSERT(!m_spISdoServer.p);
  158. VARIANT var;
  159. HRESULT hr = S_OK;
  160. CComPtr<ISdo> spSdo;
  161. CComPtr<IUnknown> spUnk;
  162. BSTR bstrMachineName = NULL;
  163. BSTR bstrUserPath = NULL;
  164. UINT nServiceType = 0;
  165. IASDATASTORE storeFlags;
  166. CComPtr<ISdo> spIRasUser;
  167. VariantInit(&var);
  168. // one more function call to SDOSERver to set machine information
  169. // Get the user SDO
  170. if(m_strMachine.IsEmpty()) // focused on DS
  171. {
  172. storeFlags = DATA_STORE_DIRECTORY;
  173. CString sDCName;
  174. CHECK_HR(hr = HrGetDCName(sDCName));
  175. CBSTR bstrDomainController(sDCName);
  176. bstrMachineName = T2BSTR((LPTSTR)(LPCTSTR)sDCName);
  177. }
  178. else // local machine
  179. {
  180. storeFlags = DATA_STORE_LOCAL;
  181. bstrMachineName = T2BSTR((LPTSTR)(LPCTSTR)m_strMachine);
  182. }
  183. // connect to server
  184. #ifdef SINGLE_SDO_CONNECTION // for share the same sdo connection for multiple users
  185. // connection will NOT be necessary after SDO changes to RTM version.
  186. // connect once for each process
  187. CHECK_HR(hr = m_MarshalSdoServer.GetServer(&m_spISdoServer));
  188. {
  189. CWaitCursor wc;
  190. // if we get the server back from the shareSDO object, we use it to connect
  191. if ((ISdoMachine*)m_spISdoServer)
  192. {
  193. CHECK_HR(hr = m_MarshalSdoServer.Connect());
  194. }
  195. // otherwise, we make a new connection
  196. else
  197. {
  198. // try to Connect the old way
  199. // connect everytime a user page is requested
  200. CHECK_HR(hr = ConnectToSdoServer(bstrMachineName, NULL, NULL, &m_spISdoServer));
  201. }
  202. }
  203. #else
  204. // connect everytime a user page is requested
  205. CHECK_HR(hr = ConnectToSdoServer(bstrMachineName, NULL, NULL, &m_spISdoServer));
  206. #endif
  207. // If for local users, only NT5 servers are allowed to configure using this apge
  208. if(!m_strMachine.IsEmpty()) // not focused on DS
  209. {
  210. IASOSTYPE OSType;
  211. CHECK_HR(hr = m_spISdoServer->GetOSType(&OSType));
  212. if(OSType != SYSTEM_TYPE_NT5_SERVER)
  213. {
  214. hr = S_FALSE;
  215. goto L_ERR;
  216. }
  217. }
  218. // find the user object
  219. bstrUserPath = T2BSTR((LPTSTR)(LPCTSTR)m_strUserPath);
  220. IASTracePrintf("SdoServer::GetUserSDO(%x, %s, %x)", storeFlags, bstrUserPath, &spUnk);
  221. CHECK_HR(hr = m_spISdoServer->GetUserSDO( storeFlags, bstrUserPath, &spUnk));
  222. IASTracePrintf(" hr = %8x", hr);
  223. ASSERT(spUnk.p);
  224. CHECK_HR(hr = spUnk->QueryInterface(IID_ISdo, (void**)&spIRasUser));
  225. ASSERT(spIRasUser.p);
  226. // initialize the wrapper class
  227. CHECK_HR(hr = m_SdoWrapper.Init((ISdo*)spIRasUser));
  228. // Get All the properties
  229. // need to handle the case when the values don't exist
  230. m_dwDefinedAttribMask = 0;
  231. // m_dwDialinPermit
  232. VariantClear(&var);
  233. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_IAS_ATTRIBUTE_ALLOW_DIALIN, &var));
  234. if(V_VT(&var) == VT_I4 || V_VT(&var) == VT_BOOL)
  235. {
  236. if(V_BOOL(&var) != 0)
  237. m_dwDialinPermit = 1;
  238. else
  239. m_dwDialinPermit = 0;
  240. }
  241. else
  242. m_dwDialinPermit = -1; // the value is not defined in the user data, using policy to decide
  243. // FramedIPAddress
  244. VariantClear(&var);
  245. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msRADIUSFramedIPAddress, &var));
  246. if(V_VT(&var) == VT_I4)
  247. {
  248. m_dwDefinedAttribMask |= RAS_USE_STATICIP;
  249. m_dwFramedIPAddress = V_I4(&var);
  250. }
  251. else
  252. {
  253. VariantClear(&var);
  254. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msSavedRADIUSFramedIPAddress, &var));
  255. if(V_VT(&var) == VT_I4)
  256. m_dwFramedIPAddress = V_I4(&var);
  257. else
  258. m_dwFramedIPAddress = 0;
  259. }
  260. // Service Type -- to hold if this user has callback, if this user allowed to dialin
  261. VariantClear(&var);
  262. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_RADIUS_ATTRIBUTE_SERVICE_TYPE, &var));
  263. if(V_VT(&var) == VT_I4)
  264. {
  265. nServiceType = V_I4(&var);
  266. }
  267. // call back number
  268. VariantClear(&var);
  269. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msRADIUSCallbackNumber, &var));
  270. if(V_VT(&var) == VT_BSTR)
  271. {
  272. m_strCallbackNumber = V_BSTR(&var);
  273. if(nServiceType == RADUIS_SERVICETYPE_CALLBACK_FRAME && m_strCallbackNumber.IsEmpty())
  274. m_dwDefinedAttribMask |= RAS_CALLBACK_CALLERSET;
  275. else if (nServiceType == RADUIS_SERVICETYPE_CALLBACK_FRAME)
  276. m_dwDefinedAttribMask |= RAS_CALLBACK_SECURE;
  277. }
  278. else
  279. {
  280. if(nServiceType == RADUIS_SERVICETYPE_CALLBACK_FRAME)
  281. m_dwDefinedAttribMask |= RAS_CALLBACK_CALLERSET;
  282. else
  283. m_dwDefinedAttribMask |= RAS_CALLBACK_NOCALLBACK;
  284. VariantClear(&var);
  285. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msSavedRADIUSCallbackNumber, &var));
  286. if(V_VT(&var) == VT_BSTR)
  287. m_strCallbackNumber = V_BSTR(&var);
  288. }
  289. // calling station id
  290. VariantClear(&var);
  291. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msNPCallingStationID, &var));
  292. if(V_VT(&var) & VT_ARRAY)
  293. {
  294. m_strArrayCallingStationId = V_ARRAY(&var);
  295. m_dwDefinedAttribMask |= RAS_USE_CALLERID;
  296. }
  297. else
  298. {
  299. VariantClear(&var);
  300. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msSavedNPCallingStationID, &var));
  301. if(V_VT(&var) & VT_ARRAY)
  302. m_strArrayCallingStationId = V_ARRAY(&var);
  303. }
  304. // framed routes
  305. VariantClear(&var);
  306. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msRADIUSFramedRoute, &var));
  307. if(V_VT(&var) & VT_ARRAY)
  308. {
  309. m_strArrayFramedRoute = V_ARRAY(&var);
  310. m_dwDefinedAttribMask |= RAS_USE_STATICROUTES;
  311. }
  312. else
  313. {
  314. VariantClear(&var);
  315. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_USER_msSavedRADIUSFramedRoute, &var));
  316. if(V_VT(&var) & VT_ARRAY)
  317. m_strArrayFramedRoute = V_ARRAY(&var);
  318. }
  319. L_ERR:
  320. IASTracePrintf("hr = %8x", hr);
  321. VariantClear(&var);
  322. SysFreeString(bstrMachineName);
  323. SysFreeString(bstrUserPath);
  324. return hr;
  325. }
  326. //====================================================
  327. // CRASUserMerge::Save
  328. //
  329. // save ths RASUser object
  330. HRESULT CRASUserMerge::Save()
  331. {
  332. HRESULT hr = S_OK;
  333. VARIANT var;
  334. USES_CONVERSION;
  335. // restore SDO user from
  336. // otherwise, we could overwrite the other properties in usrparams field
  337. // fix bug: 86968
  338. m_SdoWrapper.Commit(FALSE);
  339. VariantInit(&var);
  340. //==========================
  341. // Dialin bit
  342. VariantClear(&var);
  343. V_VT(&var) = VT_BOOL;
  344. switch(m_dwDialinPermit)
  345. {
  346. case 1: // allow
  347. case 0: // deny
  348. if(m_dwDialinPermit == 1)
  349. V_I4(&var) = VARIANT_TRUE; // Variant TRUE
  350. else
  351. V_I4(&var) = VARIANT_FALSE;
  352. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_IAS_ATTRIBUTE_ALLOW_DIALIN, &var));
  353. break;
  354. case -1: // decide by policy -- remove attribute
  355. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_IAS_ATTRIBUTE_ALLOW_DIALIN));
  356. break;
  357. default:
  358. ASSERT(0); // if need to provide new code
  359. }
  360. //==========================
  361. // Service Type -- callback policy
  362. if(m_dwDefinedAttribMask & (RAS_CALLBACK_SECURE | RAS_CALLBACK_CALLERSET))
  363. {
  364. VariantClear(&var);
  365. V_VT(&var) = VT_I4;
  366. V_I4(&var) = RADUIS_SERVICETYPE_CALLBACK_FRAME;
  367. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_RADIUS_ATTRIBUTE_SERVICE_TYPE, &var));
  368. }
  369. else
  370. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_RADIUS_ATTRIBUTE_SERVICE_TYPE));
  371. //==========================
  372. // call back number
  373. if (!m_strCallbackNumber.IsEmpty() && (m_dwDefinedAttribMask & RAS_CALLBACK_SECURE))
  374. {
  375. VariantClear(&var);
  376. V_VT(&var) = VT_BSTR;
  377. V_BSTR(&var) = T2BSTR((LPTSTR)(LPCTSTR)m_strCallbackNumber);
  378. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msRADIUSCallbackNumber, &var));
  379. }
  380. else
  381. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msRADIUSCallbackNumber));
  382. if(S_OK != HrIsInMixedDomain())
  383. {
  384. //==========================
  385. // call back number
  386. if(!m_strCallbackNumber.IsEmpty())
  387. {
  388. VariantClear(&var);
  389. V_VT(&var) = VT_BSTR;
  390. V_BSTR(&var) = T2BSTR((LPTSTR)(LPCTSTR)m_strCallbackNumber);
  391. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msSavedRADIUSCallbackNumber, &var));
  392. }
  393. else
  394. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msSavedRADIUSCallbackNumber));
  395. //==========================
  396. // FramedIPAddress
  397. if(m_dwFramedIPAddress) // need to back up the data, no matter if it's used
  398. {
  399. VariantClear(&var);
  400. V_VT(&var) = VT_I4;
  401. V_I4(&var) = m_dwFramedIPAddress;
  402. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msSavedRADIUSFramedIPAddress, &var));
  403. }
  404. else // remove it
  405. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msSavedRADIUSFramedIPAddress));
  406. if(m_dwFramedIPAddress && (m_dwDefinedAttribMask & RAS_USE_STATICIP))
  407. {
  408. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msRADIUSFramedIPAddress, &var));
  409. }
  410. else
  411. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msRADIUSFramedIPAddress));
  412. }
  413. //==========================
  414. // calling station id
  415. if(S_OK != HrIsInMixedDomain())
  416. {
  417. if(m_strArrayCallingStationId.GetSize())
  418. {
  419. VariantClear(&var);
  420. V_VT(&var) = VT_VARIANT | VT_ARRAY;
  421. V_ARRAY(&var) = (SAFEARRAY*)m_strArrayCallingStationId;
  422. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msSavedNPCallingStationID, &var));
  423. }
  424. else
  425. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msSavedNPCallingStationID));
  426. if(m_strArrayCallingStationId.GetSize() && (m_dwDefinedAttribMask & RAS_USE_CALLERID))
  427. {
  428. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msNPCallingStationID, &var));
  429. }
  430. else
  431. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msNPCallingStationID));
  432. //==========================
  433. // framed routes
  434. if(m_strArrayFramedRoute.GetSize())
  435. {
  436. VariantClear(&var);
  437. V_VT(&var) = VT_VARIANT | VT_ARRAY;
  438. V_ARRAY(&var) = (SAFEARRAY*)m_strArrayFramedRoute;
  439. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msSavedRADIUSFramedRoute, &var));
  440. }
  441. else
  442. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msSavedRADIUSFramedRoute));
  443. if(m_strArrayFramedRoute.GetSize() && (m_dwDefinedAttribMask & RAS_USE_STATICROUTES))
  444. {
  445. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_USER_msRADIUSFramedRoute, &var));
  446. }
  447. else
  448. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_USER_msRADIUSFramedRoute));
  449. }
  450. CHECK_HR(hr = m_SdoWrapper.Commit());
  451. // touch the registry to make connection UI know.
  452. SetRegistryFootPrint();
  453. L_ERR:
  454. VariantClear(&var);
  455. return hr;
  456. }
  457. // to detect if driver level support 128 bit encryption,
  458. HRESULT CRASProfileMerge::GetRasNdiswanDriverCaps(RAS_NDISWAN_DRIVER_INFO *pInfo)
  459. {
  460. HANDLE hConn;
  461. RAS_NDISWAN_DRIVER_INFO pDriverInfo;
  462. DWORD dwErr = RasRpcConnectServer((LPTSTR)(LPCTSTR)m_strMachineName, &hConn);
  463. if (dwErr != NOERROR)
  464. return HRESULT_FROM_WIN32(dwErr);
  465. dwErr = RasGetNdiswanDriverCaps(hConn, pInfo);
  466. RasRpcDisconnectServer(hConn);
  467. return HRESULT_FROM_WIN32(dwErr);
  468. }
  469. #define EAP_TLS_ID 13
  470. HRESULT CRASProfileMerge::GetEapTypeList(
  471. CStrArray& EapTypes,
  472. CDWArray& EapIds,
  473. CDWArray& EAPTypeKeys,
  474. AuthProviderArray* pProvList)
  475. {
  476. AuthProviderArray __tmpArray;
  477. if (!pProvList) // if not provided
  478. {
  479. pProvList = &__tmpArray;
  480. }
  481. HRESULT hr = S_OK;
  482. CHECK_HR(hr = GetEapProviders(m_strMachineName, pProvList));
  483. // fill in the buffers for name, Id, and keys
  484. CString* pStr = NULL;
  485. for (int i = 0; i < pProvList->GetSize(); i++)
  486. {
  487. AuthProviderData* pProv = &(pProvList->ElementAt(i));
  488. try
  489. {
  490. pStr = new CString(pProv->m_stServerTitle);
  491. DWORD dwID = _ttol(pProv->m_stKey);
  492. DWORD dwKey = pProv->m_fSupportsEncryption;
  493. // put the above to the arrays
  494. EapIds.Add(dwID);
  495. EAPTypeKeys.Add(dwKey);
  496. EapTypes.Add(pStr);
  497. }
  498. catch(CMemoryException* pException)
  499. {
  500. pException->Delete();
  501. EapIds.DeleteAll();
  502. EAPTypeKeys.DeleteAll();
  503. EapTypes.DeleteAll();
  504. CHECK_HR(hr = E_OUTOFMEMORY);
  505. }
  506. }
  507. L_ERR:
  508. return hr;
  509. }
  510. HRESULT CRASProfileMerge::GetPortTypeList(CStrArray& Names, CDWArray& MediumIds)
  511. {
  512. ASSERT(m_spIDictionary.p);
  513. VARIANT vNames;
  514. VARIANT vIds;
  515. VariantInit(&vNames);
  516. VariantInit(&vIds);
  517. HRESULT hr = S_OK;
  518. CHECK_HR(hr = m_spIDictionary->EnumAttributeValues((ATTRIBUTEID)PROPERTY_PROFILE_msNPAllowedPortTypes, &vIds, &vNames));
  519. ASSERT(V_VT(&vNames) & VT_ARRAY);
  520. ASSERT(V_VT(&vIds) & VT_ARRAY);
  521. try{
  522. Names = (SAFEARRAY*)V_ARRAY(&vNames);
  523. MediumIds = (SAFEARRAY*)V_ARRAY(&vIds);
  524. }
  525. catch(CMemoryException* pException)
  526. {
  527. pException->Delete();
  528. hr = E_OUTOFMEMORY;
  529. }
  530. ASSERT(MediumIds.GetSize() == Names.GetSize()); // they need to be in pairs
  531. if(MediumIds.GetSize() != Names.GetSize())
  532. hr = E_FAIL;
  533. L_ERR:
  534. return hr;
  535. }
  536. //====================================================
  537. //
  538. // CRASProfileMerge::Load
  539. //
  540. // pcwszRelativePath -- the relative name for the profile object
  541. //
  542. HRESULT CRASProfileMerge::Load()
  543. {
  544. ASSERT(m_spIProfile.p);
  545. ASSERT(m_spIDictionary.p);
  546. VARIANT var;
  547. HRESULT hr = S_OK;
  548. // Init the flags to NULL, each bit of the flag is used tell if a particular
  549. // attribute is defined
  550. m_dwAttributeFlags = 0;
  551. VariantInit(&var);
  552. //==================================================
  553. // constraints dialog
  554. /*
  555. // Constraints Dialog
  556. PROPERTY_PROFILE_msNPTimeOfDay
  557. PROPERTY_PROFILE_msNPCalledStationId
  558. PROPERTY_PROFILE_msNPAllowedPortTypes
  559. PROPERTY_PROFILE_msRADIUSIdleTimeout
  560. PROPERTY_PROFILE_msRADIUSSessionTimeout
  561. */
  562. // Sessions Allowed
  563. CHECK_HR(hr = m_SdoWrapper.Init(PROPERTY_PROFILE_ATTRIBUTES_COLLECTION, m_spIProfile, m_spIDictionary));
  564. // Time Of Day
  565. VariantClear(&var);
  566. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPTimeOfDay, &var));
  567. if(V_VT(&var) & VT_ARRAY)
  568. {
  569. m_strArrayTimeOfDay = V_ARRAY(&var);
  570. m_dwAttributeFlags |= PABF_msNPTimeOfDay;
  571. }
  572. else
  573. m_strArrayTimeOfDay.DeleteAll();
  574. // called station id
  575. VariantClear(&var);
  576. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPCalledStationId, &var));
  577. if(V_VT(&var) & VT_ARRAY)
  578. {
  579. m_strArrayCalledStationId = V_ARRAY(&var);
  580. m_dwAttributeFlags |= PABF_msNPCalledStationId;
  581. }
  582. else
  583. m_strArrayCalledStationId.DeleteAll();
  584. // allowed port types
  585. VariantClear(&var);
  586. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPAllowedPortTypes, &var));
  587. if(V_VT(&var) & VT_ARRAY)
  588. {
  589. m_dwArrayAllowedPortTypes = V_ARRAY(&var);
  590. m_dwAttributeFlags |= PABF_msNPAllowedPortTypes;
  591. }
  592. else
  593. m_dwArrayAllowedPortTypes.DeleteAll();
  594. // idle timeout
  595. VariantClear(&var);
  596. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRADIUSIdleTimeout, &var));
  597. if(V_VT(&var) == VT_I4)
  598. {
  599. m_dwIdleTimeout = V_I4(&var);
  600. m_dwAttributeFlags |= PABF_msRADIUSIdleTimeout;
  601. }
  602. else
  603. m_dwIdleTimeout = RAS_DEF_IDLETIMEOUT;
  604. // session time out
  605. VariantClear(&var);
  606. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRADIUSSessionTimeout, &var));
  607. if(V_VT(&var) == VT_I4)
  608. {
  609. m_dwSessionTimeout = V_I4(&var);
  610. m_dwAttributeFlags |= PABF_msRADIUSSessionTimeout;
  611. }
  612. else
  613. m_dwSessionTimeout = RAS_DEF_SESSIONTIMEOUT;
  614. //============================================
  615. // networking
  616. /*
  617. // Networking Dialog
  618. PROPERTY_PROFILE_msRADIUSFramedIPAddress
  619. */
  620. // framedIPAddress -- ip address assignment poilcy
  621. VariantClear(&var);
  622. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRADIUSFramedIPAddress, &var));
  623. if(V_VT(&var) == VT_I4)
  624. {
  625. m_dwFramedIPAddress = V_I4(&var);
  626. m_dwAttributeFlags |= PABF_msRADIUSFramedIPAddress;
  627. }
  628. else
  629. m_dwFramedIPAddress = RAS_DEF_IPADDRESSPOLICY;
  630. // filters
  631. VariantClear(&var);
  632. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASFilter, &var));
  633. if(V_VT(&var) & VT_ARRAY)
  634. {
  635. CBYTEArray ba((SAFEARRAY*)V_ARRAY(&var));
  636. DWORD i = ba.GetSize();
  637. if(i > 0)
  638. {
  639. PBYTE pByte = (PBYTE)malloc(i);
  640. if(pByte == NULL)
  641. CHECK_HR(hr = E_OUTOFMEMORY); // jmp to error handling here
  642. DWORD j = i;
  643. ba.GetBlob(pByte, &i);
  644. ASSERT( i == j);
  645. m_cbstrFilters.AssignBlob((const char *)pByte, i);
  646. free(pByte);
  647. if((BSTR)m_cbstrFilters == NULL)
  648. CHECK_HR(hr = E_OUTOFMEMORY);
  649. m_nFiltersSize = i;
  650. m_dwAttributeFlags |= PAFB_msRASFilter;
  651. }
  652. }
  653. else
  654. {
  655. m_cbstrFilters.Clean();
  656. m_nFiltersSize = 0;
  657. }
  658. //==============================================
  659. // multilink
  660. /*
  661. // Multilink Dialog
  662. PROPERTY_PROFILE_msRADIUSPortLimit
  663. PROPERTY_PROFILE_msRASBapLinednLimit
  664. PROPERTY_PROFILE_msRASBapLinednTime
  665. PROPERTY_PROFILE_msRASBapRequired
  666. */
  667. // port limit
  668. VariantClear(&var);
  669. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRADIUSPortLimit, &var));
  670. if(V_VT(&var) == VT_I4)
  671. {
  672. m_dwPortLimit = V_I4(&var);
  673. m_dwAttributeFlags |= PABF_msRADIUSPortLimit;
  674. }
  675. else
  676. m_dwPortLimit = RAS_DEF_PORTLIMIT;
  677. // BAP required
  678. VariantClear(&var);
  679. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASBapRequired, &var));
  680. if(V_VT(&var) == VT_I4)
  681. {
  682. m_dwBapRequired = V_I4(&var);
  683. m_dwAttributeFlags |= PABF_msRASBapRequired;
  684. }
  685. else
  686. m_dwBapRequired = RAS_DEF_BAPREQUIRED;
  687. // line down limit
  688. VariantClear(&var);
  689. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASBapLinednLimit, &var));
  690. if(V_VT(&var) == VT_I4)
  691. {
  692. m_dwBapLineDnLimit = V_I4(&var);
  693. m_dwAttributeFlags |= PABF_msRASBapLinednLimit;
  694. }
  695. else
  696. m_dwBapLineDnLimit = RAS_DEF_BAPLINEDNLIMIT;
  697. // line down time
  698. VariantClear(&var);
  699. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASBapLinednTime, &var));
  700. if(V_VT(&var) == VT_I4)
  701. {
  702. m_dwBapLineDnTime = V_I4(&var);
  703. m_dwAttributeFlags |= PABF_msRASBapLinednTime;
  704. }
  705. else
  706. m_dwBapLineDnTime = RAS_DEF_BAPLINEDNTIME;
  707. //==================================
  708. // authentication
  709. /*
  710. // Authentication Dialog
  711. PROPERTY_PROFILE_msNPAuthenticationType
  712. PROPERTY_PROFILE_msNPAllowedEapType
  713. */
  714. // authentication type
  715. VariantClear(&var);
  716. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPAuthenticationType, &var));
  717. if (V_VT(&var) & VT_ARRAY)
  718. {
  719. m_dwArrayAuthenticationTypes = V_ARRAY(&var);
  720. m_dwAttributeFlags |= PABF_msNPAuthenticationType;
  721. }
  722. else
  723. {
  724. m_dwArrayAuthenticationTypes.DeleteAll();
  725. }
  726. // eap type
  727. VariantClear(&var);
  728. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msNPAllowedEapType, &var));
  729. if (V_VT(&var) & VT_ARRAY)
  730. {
  731. m_dwArrayEapTypes = V_ARRAY(&var);
  732. m_dwAttributeFlags |= PABF_msNPAllowedEapType;
  733. }
  734. else
  735. {
  736. m_dwArrayEapTypes.DeleteAll();
  737. }
  738. // EAP Configuration
  739. VariantClear(&var);
  740. CHECK_HR(hr = m_SdoWrapper.GetProperty(IAS_ATTRIBUTE_EAP_CONFIG, &var));
  741. if (V_VT(&var) != VT_ERROR)
  742. {
  743. CHECK_HR(hr = m_eapConfigData.Load(var));
  744. }
  745. //=====================================
  746. // encryption
  747. /*
  748. // Encryption Dialog
  749. PROPERTY_PROFILE_msRASAllowEncryption
  750. PROPERTY_PROFILE_msRASEncryptionType
  751. */
  752. // encryption type
  753. VariantClear(&var);
  754. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASEncryptionType, &var));
  755. if(V_VT(&var) == VT_I4)
  756. {
  757. m_dwEncryptionType = V_I4(&var);
  758. m_dwAttributeFlags |= PABF_msRASEncryptionType;
  759. }
  760. else
  761. m_dwEncryptionType = RAS_DEF_ENCRYPTIONTYPE;
  762. VariantClear(&var);
  763. CHECK_HR(hr = m_SdoWrapper.GetProperty(PROPERTY_PROFILE_msRASAllowEncryption, &var));
  764. if(V_VT(&var) == VT_I4)
  765. {
  766. m_dwEncryptionPolicy = V_I4(&var);
  767. m_dwAttributeFlags |= PABF_msRASAllowEncryption;
  768. }
  769. else
  770. m_dwEncryptionPolicy = RAS_DEF_ENCRYPTIONPOLICY;
  771. // specail code for error path
  772. L_ERR:
  773. VariantClear(&var);
  774. return hr;
  775. }
  776. //====================================================
  777. //
  778. // CRASProfile::Save
  779. //
  780. //
  781. HRESULT CRASProfileMerge::Save()
  782. {
  783. ASSERT(m_spIProfile.p);
  784. ASSERT(m_spIDictionary.p);
  785. VARIANT var;
  786. HRESULT hr = S_OK;
  787. VariantInit(&var);
  788. USES_CONVERSION;
  789. //==================================================
  790. // constraints dialog
  791. /*
  792. // Constraints Dialog
  793. PROPERTY_PROFILE_msNPTimeOfDay
  794. PROPERTY_PROFILE_msNPCalledStationId
  795. PROPERTY_PROFILE_msNPAllowedPortTypes
  796. PROPERTY_PROFILE_msRADIUSIdleTimeout
  797. PROPERTY_PROFILE_msRADIUSSessionTimeout
  798. */
  799. // idleTimeout
  800. if (m_dwAttributeFlags & PABF_msRADIUSIdleTimeout)
  801. {
  802. VariantClear(&var);
  803. V_VT(&var) = VT_I4;
  804. V_I4(&var) = m_dwIdleTimeout;
  805. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRADIUSIdleTimeout, &var));
  806. }
  807. else
  808. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRADIUSIdleTimeout));
  809. // sessionTimeout
  810. if (m_dwAttributeFlags & PABF_msRADIUSSessionTimeout)
  811. {
  812. VariantClear(&var);
  813. V_VT(&var) = VT_I4;
  814. V_I4(&var) = m_dwSessionTimeout;
  815. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRADIUSSessionTimeout, &var));
  816. }
  817. else
  818. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRADIUSSessionTimeout));
  819. // timeOfDay -- multivalue
  820. if (m_dwAttributeFlags & PABF_msNPTimeOfDay)
  821. {
  822. VariantClear(&var);
  823. V_VT(&var) = VT_VARIANT | VT_ARRAY;
  824. V_ARRAY(&var) = (SAFEARRAY*)m_strArrayTimeOfDay;
  825. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPTimeOfDay, &var));
  826. }
  827. else
  828. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPTimeOfDay));
  829. // calledStationId -- multivalue
  830. if (m_dwAttributeFlags & PABF_msNPCalledStationId)
  831. {
  832. VariantClear(&var);
  833. V_VT(&var) = VT_VARIANT | VT_ARRAY;
  834. V_ARRAY(&var) = (SAFEARRAY*)m_strArrayCalledStationId;
  835. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPCalledStationId, &var));
  836. }
  837. else
  838. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPCalledStationId));
  839. // allowedPortTypes
  840. if (m_dwAttributeFlags & PABF_msNPAllowedPortTypes)
  841. {
  842. VariantClear(&var);
  843. V_VT(&var) = VT_VARIANT | VT_ARRAY;
  844. V_ARRAY(&var) = (SAFEARRAY*)m_dwArrayAllowedPortTypes;
  845. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPAllowedPortTypes, &var));
  846. }
  847. else
  848. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPAllowedPortTypes));
  849. //==================================
  850. // authentication
  851. /*
  852. // Authentication Dialog
  853. PROPERTY_PROFILE_msNPAuthenticationType
  854. PROPERTY_PROFILE_msNPAllowedEapType
  855. */
  856. // authentication type -- must
  857. VariantClear(&var);
  858. if (m_dwAttributeFlags & PABF_msNPAuthenticationType)
  859. {
  860. VariantClear(&var);
  861. V_VT(&var) = VT_VARIANT | VT_ARRAY;
  862. V_ARRAY(&var) = (SAFEARRAY*)m_dwArrayAuthenticationTypes;
  863. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPAuthenticationType, &var));
  864. }
  865. else
  866. {
  867. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPAllowedEapType));
  868. }
  869. if (m_dwArrayAuthenticationTypes.Find(RAS_AT_EAP) != -1)
  870. {
  871. VariantClear(&var);
  872. V_VT(&var) = VT_VARIANT | VT_ARRAY;
  873. V_ARRAY(&var) = (SAFEARRAY*)m_dwArrayEapTypes;
  874. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msNPAllowedEapType, &var));
  875. }
  876. else
  877. {
  878. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msNPAllowedEapType));
  879. }
  880. if (m_eapConfigData.IsEmpty())
  881. {
  882. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(IAS_ATTRIBUTE_EAP_CONFIG));
  883. }
  884. else
  885. {
  886. VariantClear(&var);
  887. CHECK_HR(hr = m_eapConfigData.Store(var));
  888. CHECK_HR(hr = m_SdoWrapper.PutProperty(IAS_ATTRIBUTE_EAP_CONFIG, &var));
  889. }
  890. //=====================================
  891. // encryption
  892. /*
  893. // Encryption Dialog
  894. PROPERTY_PROFILE_msRASAllowEncryption
  895. PROPERTY_PROFILE_msRASEncryptionType
  896. */
  897. // encryption type -- must
  898. if (m_dwAttributeFlags & PABF_msRASEncryptionType)
  899. {
  900. VariantClear(&var);
  901. V_VT(&var) = VT_I4;
  902. V_I4(&var) = m_dwEncryptionType;
  903. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASEncryptionType, &var));
  904. }
  905. else
  906. {
  907. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASEncryptionType));
  908. }
  909. if (m_dwAttributeFlags & PABF_msRASAllowEncryption)
  910. {
  911. VariantClear(&var);
  912. V_VT(&var) = VT_I4;
  913. V_I4(&var) = m_dwEncryptionPolicy;
  914. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASAllowEncryption, &var));
  915. }
  916. else
  917. {
  918. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASAllowEncryption));
  919. }
  920. //=====================================
  921. // networking
  922. /*
  923. // Networking Dialog
  924. PROPERTY_PROFILE_msRADIUSFramedIPAddress
  925. */
  926. // framedIPAddress -- ip address assignment poilcy, must
  927. if (m_dwAttributeFlags & PABF_msRADIUSFramedIPAddress)
  928. {
  929. VariantClear(&var);
  930. V_VT(&var) = VT_I4;
  931. V_I4(&var) = m_dwFramedIPAddress;
  932. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRADIUSFramedIPAddress, &var));
  933. }
  934. else
  935. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRADIUSFramedIPAddress));
  936. // RAS filter
  937. if ((BSTR)m_cbstrFilters && m_nFiltersSize > 0)
  938. {
  939. VariantClear(&var);
  940. {
  941. CBYTEArray ba;
  942. ba.AssignBlob((PBYTE)(BSTR)m_cbstrFilters, m_nFiltersSize);
  943. V_VT(&var) = VT_ARRAY | VT_UI1;
  944. V_ARRAY(&var) = (SAFEARRAY*)ba;
  945. }
  946. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASFilter, &var));
  947. VariantInit(&var); // the CBSTR will clean the memory
  948. }
  949. else
  950. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASFilter));
  951. //=====================================
  952. // multilink
  953. /*
  954. // Multilink Dialog
  955. PROPERTY_PROFILE_msRADIUSPortLimit
  956. PROPERTY_PROFILE_msRASBapLinednLimit
  957. PROPERTY_PROFILE_msRASBapLinednTime
  958. PROPERTY_PROFILE_msRASBapRequired
  959. */
  960. //port limit
  961. if (m_dwAttributeFlags & PABF_msRADIUSPortLimit)
  962. {
  963. VariantClear(&var);
  964. V_VT(&var) = VT_I4;
  965. V_I4(&var) = m_dwPortLimit;
  966. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRADIUSPortLimit, &var));
  967. }
  968. else
  969. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRADIUSPortLimit));
  970. // BAP
  971. if (m_dwAttributeFlags & PABF_msRASBapRequired)
  972. {
  973. VariantClear(&var);
  974. V_VT(&var) = VT_I4;
  975. V_I4(&var) = m_dwBapRequired;
  976. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASBapRequired, &var));
  977. }
  978. else
  979. {
  980. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASBapRequired));
  981. }
  982. // line down limit
  983. if (m_dwAttributeFlags & PABF_msRASBapLinednLimit)
  984. {
  985. VariantClear(&var);
  986. V_VT(&var) = VT_I4;
  987. V_I4(&var) = m_dwBapLineDnLimit;
  988. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASBapLinednLimit, &var));
  989. }
  990. else
  991. {
  992. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASBapLinednLimit));
  993. }
  994. // line down time
  995. if (m_dwAttributeFlags & PABF_msRASBapLinednTime)
  996. {
  997. VariantClear(&var);
  998. V_VT(&var) = VT_I4;
  999. V_I4(&var) = m_dwBapLineDnTime;
  1000. CHECK_HR(hr = m_SdoWrapper.PutProperty(PROPERTY_PROFILE_msRASBapLinednTime, &var));
  1001. }
  1002. else
  1003. {
  1004. CHECK_HR(hr = m_SdoWrapper.RemoveProperty(PROPERTY_PROFILE_msRASBapLinednTime));
  1005. }
  1006. // specail code for error path
  1007. L_ERR:
  1008. VariantClear(&var);
  1009. return hr;
  1010. }