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.

516 lines
14 KiB

  1. /*++
  2. Copyright (c) 1999, Microsoft Corporation
  3. Module Name:
  4. elrpc.c
  5. Abstract:
  6. This module deals with RPC requests
  7. Revision History:
  8. sachins, Mar 19 2000, Created
  9. --*/
  10. #include "pcheapol.h"
  11. #pragma hdrstop
  12. DWORD
  13. RpcEapolGetCustomAuthData (
  14. STRING_HANDLE pSrvAddr,
  15. PWCHAR pwszGuid,
  16. DWORD dwEapTypeId,
  17. RAW_DATA rdSSID,
  18. PRAW_DATA prdConnInfo
  19. )
  20. {
  21. DWORD dwRetCode = NO_ERROR;
  22. InterlockedIncrement (&g_lWorkerThreads);
  23. do
  24. {
  25. if ((dwRetCode = WZCSvcCheckRPCAccess (WZC_ACCESS_QUERY)) != NO_ERROR)
  26. {
  27. break;
  28. }
  29. if (!(g_dwModulesStarted & ALL_MODULES_STARTED))
  30. {
  31. dwRetCode = ERROR_INVALID_STATE;
  32. break;
  33. }
  34. if ((pwszGuid == NULL) || (prdConnInfo == NULL))
  35. {
  36. dwRetCode = ERROR_INVALID_PARAMETER;
  37. break;
  38. }
  39. dwRetCode = ElGetCustomAuthData (
  40. pwszGuid,
  41. dwEapTypeId,
  42. rdSSID.dwDataLen,
  43. rdSSID.pData,
  44. prdConnInfo->pData,
  45. &(prdConnInfo->dwDataLen)
  46. );
  47. }
  48. while (FALSE);
  49. InterlockedDecrement (&g_lWorkerThreads);
  50. return dwRetCode;
  51. }
  52. DWORD
  53. RpcEapolSetCustomAuthData (
  54. STRING_HANDLE pSrvAddr,
  55. PWCHAR pwszGuid,
  56. DWORD dwEapTypeId,
  57. RAW_DATA rdSSID,
  58. PRAW_DATA prdConnInfo
  59. )
  60. {
  61. EAPOL_POLICY_DATA *pEAPOLPolicyData = NULL;
  62. BOOLEAN fPolicyFound = FALSE;
  63. PBYTE pbAuthData = NULL;
  64. DWORD dwSizeOfAuthData = 0;
  65. DWORD dwRetCode = NO_ERROR;
  66. InterlockedIncrement (&g_lWorkerThreads);
  67. do
  68. {
  69. if ((dwRetCode = WZCSvcCheckRPCAccess (WZC_ACCESS_SET)) != NO_ERROR)
  70. {
  71. break;
  72. }
  73. if (!(g_dwModulesStarted & ALL_MODULES_STARTED))
  74. {
  75. dwRetCode = ERROR_INVALID_STATE;
  76. break;
  77. }
  78. if ((pwszGuid == NULL) || (prdConnInfo == NULL))
  79. {
  80. dwRetCode = ERROR_INVALID_PARAMETER;
  81. break;
  82. }
  83. ACQUIRE_WRITE_LOCK (&g_PolicyLock);
  84. if (ElFindPolicyData (
  85. rdSSID.dwDataLen,
  86. rdSSID.pData,
  87. g_pEAPOLPolicyList,
  88. &pEAPOLPolicyData
  89. ) == NO_ERROR)
  90. {
  91. fPolicyFound = TRUE;
  92. }
  93. RELEASE_WRITE_LOCK (&g_PolicyLock);
  94. if (fPolicyFound)
  95. {
  96. if ((dwRetCode = ElGetCustomAuthData (
  97. pwszGuid,
  98. dwEapTypeId,
  99. rdSSID.dwDataLen,
  100. rdSSID.pData,
  101. NULL,
  102. &dwSizeOfAuthData
  103. )) == ERROR_BUFFER_TOO_SMALL)
  104. {
  105. if (dwSizeOfAuthData != prdConnInfo->dwDataLen)
  106. {
  107. TRACE0 (RPC, "RpcEapolSetCustomAuthData: POLICY: Cannot change data for global setting data: unequal size");
  108. dwRetCode = ERROR_ACCESS_DENIED;
  109. break;
  110. }
  111. else
  112. {
  113. pbAuthData = MALLOC (dwSizeOfAuthData);
  114. if (pbAuthData == NULL)
  115. {
  116. dwRetCode = ERROR_NOT_ENOUGH_MEMORY;
  117. TRACE0 (RPC, "RpcEapolSetCustomAuthData: Error in memory allocation for EAP blob");
  118. break;
  119. }
  120. if ((dwRetCode = ElGetCustomAuthData (
  121. pwszGuid,
  122. dwEapTypeId,
  123. rdSSID.dwDataLen,
  124. rdSSID.pData,
  125. pbAuthData,
  126. &dwSizeOfAuthData
  127. )) != NO_ERROR)
  128. {
  129. TRACE1 (USER, "ElReadPerPortRegistryParams: ElGetCustomAuthData failed with %ld",
  130. dwRetCode);
  131. break;
  132. }
  133. if (memcmp (prdConnInfo->pData, pbAuthData,
  134. dwSizeOfAuthData) != 0)
  135. {
  136. TRACE0 (RPC, "RpcEapolSetCustomAuthData: POLICY: Cannot change data for global setting data: Content change");
  137. dwRetCode = ERROR_ACCESS_DENIED;
  138. break;
  139. }
  140. // ignore setting
  141. dwRetCode = NO_ERROR;
  142. break;
  143. }
  144. }
  145. else
  146. {
  147. break;
  148. }
  149. }
  150. if ((dwRetCode = ElSetCustomAuthData (
  151. pwszGuid,
  152. dwEapTypeId,
  153. rdSSID.dwDataLen,
  154. rdSSID.pData,
  155. prdConnInfo->pData,
  156. &(prdConnInfo->dwDataLen)
  157. )) != NO_ERROR)
  158. {
  159. break;
  160. }
  161. }
  162. while (FALSE);
  163. if (pbAuthData != NULL)
  164. {
  165. FREE (pbAuthData);
  166. }
  167. InterlockedDecrement (&g_lWorkerThreads);
  168. return dwRetCode;
  169. }
  170. DWORD
  171. RpcEapolGetInterfaceParams (
  172. STRING_HANDLE pSrvAddr,
  173. PWCHAR pwszGuid,
  174. PEAPOL_INTF_PARAMS pIntfParams
  175. )
  176. {
  177. DWORD dwRetCode = NO_ERROR;
  178. InterlockedIncrement (&g_lWorkerThreads);
  179. do
  180. {
  181. if ((dwRetCode = WZCSvcCheckRPCAccess (WZC_ACCESS_QUERY)) != NO_ERROR)
  182. {
  183. break;
  184. }
  185. if (!(g_dwModulesStarted & ALL_MODULES_STARTED))
  186. {
  187. dwRetCode = ERROR_INVALID_STATE;
  188. break;
  189. }
  190. if ((pwszGuid == NULL) || (pIntfParams == NULL))
  191. {
  192. dwRetCode = ERROR_INVALID_PARAMETER;
  193. break;
  194. }
  195. dwRetCode = ElGetInterfaceParams (
  196. pwszGuid,
  197. pIntfParams
  198. );
  199. }
  200. while (FALSE);
  201. InterlockedDecrement (&g_lWorkerThreads);
  202. return dwRetCode;
  203. }
  204. DWORD
  205. RpcEapolSetInterfaceParams (
  206. STRING_HANDLE pSrvAddr,
  207. PWCHAR pwszGuid,
  208. PEAPOL_INTF_PARAMS pIntfParams
  209. )
  210. {
  211. EAPOL_POLICY_DATA *pEAPOLPolicyData = NULL;
  212. EAPOL_INTF_PARAMS PolicyIntfParams = {0};
  213. BOOLEAN fPolicyFound = FALSE;
  214. DWORD dwRetCode = NO_ERROR;
  215. InterlockedIncrement (&g_lWorkerThreads);
  216. do
  217. {
  218. if ((dwRetCode = WZCSvcCheckRPCAccess (WZC_ACCESS_SET)) != NO_ERROR)
  219. {
  220. break;
  221. }
  222. if (!(g_dwModulesStarted & ALL_MODULES_STARTED))
  223. {
  224. dwRetCode = ERROR_INVALID_STATE;
  225. break;
  226. }
  227. if ((pwszGuid == NULL) || (pIntfParams == NULL))
  228. {
  229. dwRetCode = ERROR_INVALID_PARAMETER;
  230. break;
  231. }
  232. ACQUIRE_WRITE_LOCK (&g_PolicyLock);
  233. if (ElFindPolicyData (
  234. pIntfParams->dwSizeOfSSID,
  235. pIntfParams->bSSID,
  236. g_pEAPOLPolicyList,
  237. &pEAPOLPolicyData
  238. ) == NO_ERROR)
  239. {
  240. fPolicyFound = TRUE;
  241. }
  242. RELEASE_WRITE_LOCK (&g_PolicyLock);
  243. if (fPolicyFound)
  244. {
  245. memcpy (PolicyIntfParams.bSSID, pIntfParams->bSSID, pIntfParams->dwSizeOfSSID);
  246. PolicyIntfParams.dwSizeOfSSID = pIntfParams->dwSizeOfSSID;
  247. if ((dwRetCode = ElGetInterfaceParams (
  248. pwszGuid,
  249. &PolicyIntfParams
  250. )) == NO_ERROR)
  251. {
  252. if (memcmp ((PVOID)pIntfParams, (PVOID)&PolicyIntfParams,
  253. sizeof(EAPOL_INTF_PARAMS)) != 0)
  254. {
  255. TRACE0 (RPC, "RpcEapolSetInterfaceParams: POLICY: Cannot change data for global setting data");
  256. dwRetCode = ERROR_ACCESS_DENIED;
  257. break;
  258. }
  259. else
  260. {
  261. // ignore setting
  262. break;
  263. }
  264. }
  265. else
  266. {
  267. break;
  268. }
  269. }
  270. if ((dwRetCode = ElSetInterfaceParams (
  271. pwszGuid,
  272. pIntfParams
  273. )) != NO_ERROR)
  274. {
  275. break;
  276. }
  277. // Setting interface params will be the only action that will
  278. // cause 802.1X to restart state machine
  279. if ((dwRetCode = ElPostEapConfigChanged (
  280. pwszGuid,
  281. pIntfParams))
  282. != NO_ERROR)
  283. {
  284. break;
  285. }
  286. }
  287. while (FALSE);
  288. InterlockedDecrement (&g_lWorkerThreads);
  289. return dwRetCode;
  290. }
  291. DWORD
  292. RpcEapolReAuthenticateInterface (
  293. STRING_HANDLE pSrvAddr,
  294. PWCHAR pwszGuid
  295. )
  296. {
  297. DWORD dwRetCode = NO_ERROR;
  298. InterlockedIncrement (&g_lWorkerThreads);
  299. do
  300. {
  301. if ((dwRetCode = ElValidateInteractiveRPCClient ()) != NO_ERROR)
  302. {
  303. TRACE1 (RPC, "RpcEapolReAuthenticateInterface: ElValidateInteractiveRPCClient failed with error (%ld)",
  304. dwRetCode);
  305. break;
  306. }
  307. if (!(g_dwModulesStarted & ALL_MODULES_STARTED))
  308. {
  309. dwRetCode = ERROR_INVALID_STATE;
  310. break;
  311. }
  312. if (pwszGuid == NULL)
  313. {
  314. dwRetCode = ERROR_INVALID_PARAMETER;
  315. break;
  316. }
  317. if ((dwRetCode = ElReAuthenticateInterface (
  318. pwszGuid))
  319. != NO_ERROR)
  320. {
  321. TRACE1 (RPC, "RpcEapolReAuthenticateInterface: ElEnumAndOpenInterfaces returned error %ld",
  322. dwRetCode);
  323. }
  324. }
  325. while (FALSE);
  326. InterlockedDecrement (&g_lWorkerThreads);
  327. return dwRetCode;
  328. }
  329. DWORD
  330. RpcEapolQueryInterfaceState (
  331. STRING_HANDLE pSrvAddr,
  332. PWCHAR pwszGuid,
  333. PEAPOL_INTF_STATE pIntfState
  334. )
  335. {
  336. DWORD dwRetCode = NO_ERROR;
  337. InterlockedIncrement (&g_lWorkerThreads);
  338. do
  339. {
  340. if ((dwRetCode = WZCSvcCheckRPCAccess (WZC_ACCESS_QUERY)) != NO_ERROR)
  341. {
  342. break;
  343. }
  344. if (!(g_dwModulesStarted & ALL_MODULES_STARTED))
  345. {
  346. dwRetCode = ERROR_INVALID_STATE;
  347. break;
  348. }
  349. if (pwszGuid == NULL)
  350. {
  351. dwRetCode = ERROR_INVALID_PARAMETER;
  352. break;
  353. }
  354. if ((dwRetCode = ElQueryInterfaceState (
  355. pwszGuid,
  356. pIntfState
  357. )) != NO_ERROR)
  358. {
  359. TRACE1 (RPC, "RpcEapolQueryInterfaceState: ElQueryInterfaceState failed with error %ld",
  360. dwRetCode);
  361. }
  362. }
  363. while (FALSE);
  364. InterlockedDecrement (&g_lWorkerThreads);
  365. return dwRetCode;
  366. }
  367. DWORD
  368. RpcEapolUIResponse (
  369. IN LPWSTR pSrvAddr,
  370. IN EAPOL_EAP_UI_CONTEXT EapolUIContext,
  371. IN EAPOLUI_RESP EapolUIResp
  372. )
  373. {
  374. EAPOLUIRESPFUNC *pEapolUIRespFunc = NULL;
  375. DWORD dwIndex = 0;
  376. DWORD dwBlob = 0;
  377. DWORD dwRetCode = NO_ERROR;
  378. InterlockedIncrement (&g_lWorkerThreads);
  379. do
  380. {
  381. if ((dwRetCode = ElValidateInteractiveRPCClient ()) != NO_ERROR)
  382. {
  383. TRACE1 (RPC, "RpcEapolUIResponse: ElValidateInteractiveRPCClient failed with error (%ld)",
  384. dwRetCode);
  385. break;
  386. }
  387. if (!(g_dwModulesStarted & ALL_MODULES_STARTED))
  388. {
  389. dwRetCode = ERROR_INVALID_STATE;
  390. break;
  391. }
  392. for (dwIndex=0; dwIndex < NUM_EAPOL_DLG_MSGS; dwIndex++)
  393. {
  394. if (EapolUIContext.dwEAPOLUIMsgType ==
  395. EapolUIRespFuncMap[dwIndex].dwEAPOLUIMsgType)
  396. {
  397. if (EapolUIRespFuncMap[dwIndex].EapolRespUIFunc)
  398. {
  399. // Verify if right number of data blobs are passed
  400. // Blobs may have '0' length
  401. for (dwBlob=0; dwBlob < EapolUIRespFuncMap[dwIndex].dwNumBlobs; dwBlob++)
  402. {
  403. #if 0
  404. if (IsBadReadPtr (EapolUIResp.rdData[dwBlob].pData,
  405. EapolUIResp.rdData[dwBlob].dwDataLen))
  406. {
  407. TRACE1 (RPC, "RpcEapolUIResponse: Bad blob %ld",
  408. dwBlob);
  409. dwRetCode = ERROR_INVALID_DATA;
  410. goto Error;
  411. }
  412. #endif
  413. }
  414. TRACE1 (RPC, "RpcEapolUIResponse: Response function found, msg (%ld)",
  415. EapolUIContext.dwEAPOLUIMsgType);
  416. if ((dwRetCode =
  417. EapolUIRespFuncMap[dwIndex].EapolRespUIFunc (
  418. EapolUIContext,
  419. EapolUIResp
  420. )) != NO_ERROR)
  421. {
  422. TRACE1 (RPC, "RpcEapolUIResponse: Response function failed with error %ld",
  423. dwRetCode);
  424. }
  425. }
  426. else
  427. {
  428. TRACE1 (RPC, "RpcEapolUIResponse: No response function, msg (%ld)",
  429. EapolUIContext.dwEAPOLUIMsgType);
  430. }
  431. break;
  432. }
  433. }
  434. }
  435. while (FALSE);
  436. InterlockedDecrement (&g_lWorkerThreads);
  437. return dwRetCode;
  438. }