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.

6311 lines
160 KiB

  1. ////////////////////////////////////////////////////////////////////////
  2. //
  3. // Module : Dynamic/Dynamic.cpp
  4. //
  5. // Purpose : Dynamic Module Implementation.
  6. //
  7. //
  8. // Developers Name : Bharat/Radhika
  9. //
  10. // Description : All functions are netshell dynamic context interface and
  11. // calls appropriate functions.
  12. //
  13. // History :
  14. //
  15. // Date Author Comments
  16. // 8-10-2001 Bharat Initial Version. V1.0
  17. //
  18. ////////////////////////////////////////////////////////////////////////
  19. #include "nshipsec.h"
  20. #include "nshcertmgmt.h"
  21. extern HINSTANCE g_hModule;
  22. extern HKEY g_hGlobalRegistryKey;
  23. extern _TCHAR* g_szDynamicMachine;
  24. extern STORAGELOCATION g_StorageLocation;
  25. ///////////////////////////////////////////////////////////////////////////////////////////
  26. //
  27. // Function : HandleDynamicAddQMPolicy
  28. //
  29. // Date of Creation: 9-23-2001
  30. //
  31. // Parameters :
  32. // IN LPCWSTR pwszMachine,
  33. // IN OUT LPWSTR *ppwcArguments,
  34. // IN DWORD dwCurrentIndex,
  35. // IN DWORD dwArgCount,
  36. // IN DWORD dwFlags,
  37. // IN LPCVOID pvData,
  38. // OUT BOOL *pbDone
  39. // Return : DWORD
  40. //
  41. // Description : Netshell Dynamic handle for add quick mode policy.
  42. //
  43. // Revision History:
  44. //
  45. // Date Author Comments
  46. // 8-10-2001 Bharat Initial Version. V1.0
  47. //
  48. //////////////////////////////////////////////////////////////////////////////////////////
  49. DWORD WINAPI
  50. HandleDynamicAddQMPolicy(
  51. IN LPCWSTR pwszMachine,
  52. IN OUT LPWSTR *ppwcArguments,
  53. IN DWORD dwCurrentIndex,
  54. IN DWORD dwArgCount,
  55. IN DWORD dwFlags,
  56. IN LPCVOID pvData,
  57. OUT BOOL *pbDone
  58. )
  59. {
  60. IPSEC_QM_POLICY QMPol;
  61. LPTSTR pszPolicyName = NULL;
  62. DWORD dwReturn = ERROR_SHOW_USAGE;
  63. DWORD dwPFSGr = 0;
  64. DWORD dwNameLen = 0;
  65. DWORD dwCount = 0, j=0;
  66. BOOL bSoft=FALSE, bDefault=FALSE, bQmpfs=FALSE;
  67. const TAG_TYPE vcmdDynamicAddQMPolicy[] =
  68. {
  69. { CMD_TOKEN_STR_NAME, NS_REQ_PRESENT, FALSE },
  70. { CMD_TOKEN_STR_SOFT, NS_REQ_ZERO, FALSE },
  71. { CMD_TOKEN_STR_PFSGROUP, NS_REQ_ZERO, FALSE },
  72. { CMD_TOKEN_STR_DEFRESPONSE, NS_REQ_ZERO, FALSE },
  73. { CMD_TOKEN_STR_NEGOTIATION, NS_REQ_ZERO, FALSE }
  74. };
  75. const TOKEN_VALUE vtokDynamicAddQMPolicy[] =
  76. {
  77. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  78. { CMD_TOKEN_STR_SOFT, CMD_TOKEN_SOFT },
  79. { CMD_TOKEN_STR_PFSGROUP, CMD_TOKEN_PFSGROUP },
  80. { CMD_TOKEN_STR_DEFRESPONSE, CMD_TOKEN_DEFRESPONSE },
  81. { CMD_TOKEN_STR_NEGOTIATION, CMD_TOKEN_NEGOTIATION }
  82. };
  83. PARSER_PKT parser;
  84. ZeroMemory(&parser, sizeof(parser));
  85. memset(&QMPol, 0, sizeof(IPSEC_QM_POLICY));
  86. QMPol.pOffers = NULL;
  87. //
  88. // Bail out as user has not given sufficient arguments.
  89. //
  90. if(dwArgCount <= 3)
  91. {
  92. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  93. BAIL_OUT;
  94. }
  95. parser.ValidTok = vtokDynamicAddQMPolicy;
  96. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicAddQMPolicy);
  97. parser.ValidCmd = vcmdDynamicAddQMPolicy;
  98. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicAddQMPolicy);
  99. //
  100. // Get the user input after parsing the data
  101. //
  102. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  103. if(dwReturn != ERROR_SUCCESS)
  104. {
  105. if(dwReturn == RETURN_NO_ERROR)
  106. {
  107. dwReturn = ERROR_NO_DISPLAY;
  108. BAIL_OUT;
  109. }
  110. else
  111. {
  112. dwReturn = ERROR_SHOW_USAGE;
  113. BAIL_OUT;
  114. }
  115. }
  116. //
  117. // Check for user given tokens from the parser and copy into local variables
  118. //
  119. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  120. {
  121. switch(vtokDynamicAddQMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  122. {
  123. case CMD_TOKEN_NAME :
  124. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  125. {
  126. //allocate memory for QMPolicy name
  127. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  128. pszPolicyName = new _TCHAR[dwNameLen];
  129. if(pszPolicyName == NULL)
  130. {
  131. dwReturn = ERROR_OUTOFMEMORY;
  132. BAIL_OUT;
  133. }
  134. _tcsncpy(pszPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  135. }
  136. break;
  137. case CMD_TOKEN_SOFT :
  138. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  139. {
  140. bSoft = *(BOOL *)parser.Cmd[dwCount].pArg;
  141. }
  142. break;
  143. case CMD_TOKEN_DEFRESPONSE :
  144. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  145. {
  146. bDefault = *(BOOL *)parser.Cmd[dwCount].pArg;
  147. }
  148. break;
  149. case CMD_TOKEN_PFSGROUP :
  150. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  151. {
  152. //
  153. // Make the pfs required flag true.Since only group is accepted from the user.
  154. //
  155. bQmpfs = TRUE;
  156. dwPFSGr = *(DWORD *)parser.Cmd[dwCount].pArg;
  157. }
  158. break;
  159. case CMD_TOKEN_NEGOTIATION :
  160. IPSEC_QM_OFFER *SecMethod;
  161. if (parser.Cmd[dwCount].dwStatus != 0)
  162. {
  163. if(QMPol.pOffers)
  164. {
  165. //
  166. // Default loads deleted
  167. //
  168. delete [] QMPol.pOffers;
  169. QMPol.pOffers = NULL;
  170. }
  171. QMPol.dwOfferCount = parser.Cmd[dwCount].dwStatus;
  172. QMPol.pOffers = new IPSEC_QM_OFFER[QMPol.dwOfferCount];
  173. if(QMPol.pOffers == NULL)
  174. {
  175. dwReturn = ERROR_OUTOFMEMORY;
  176. BAIL_OUT;
  177. }
  178. for(j=0;j<QMPol.dwOfferCount;j++)
  179. {
  180. //
  181. // Copy the QM offers given by the user or defaults provided by parser
  182. //
  183. SecMethod = ((IPSEC_QM_OFFER **)parser.Cmd[dwCount].pArg)[j];
  184. memcpy(&(QMPol.pOffers[j]), SecMethod, sizeof(IPSEC_QM_OFFER));
  185. }
  186. }
  187. break;
  188. default :
  189. break;
  190. }
  191. }
  192. for(j=0;j<QMPol.dwOfferCount;j++)
  193. {
  194. // Check for the user given pfsgroup
  195. if(bQmpfs)
  196. {
  197. switch(dwPFSGr)
  198. {
  199. case 0:
  200. QMPol.pOffers[j].dwPFSGroup = 0;
  201. QMPol.pOffers[j].bPFSRequired = FALSE;
  202. break;
  203. case 1:
  204. QMPol.pOffers[j].dwPFSGroup = PFS_GROUP_1;
  205. QMPol.pOffers[j].bPFSRequired = TRUE;
  206. break;
  207. case 2:
  208. QMPol.pOffers[j].dwPFSGroup = PFS_GROUP_2;
  209. QMPol.pOffers[j].bPFSRequired = TRUE;
  210. break;
  211. case 3:
  212. QMPol.pOffers[j].dwPFSGroup = PFS_GROUP_2048;
  213. QMPol.pOffers[j].bPFSRequired = TRUE;
  214. break;
  215. case 4:
  216. QMPol.pOffers[j].dwPFSGroup = PFS_GROUP_MM;
  217. QMPol.pOffers[j].bPFSRequired = TRUE;
  218. break;
  219. default:
  220. break;
  221. }
  222. }
  223. else
  224. {
  225. QMPol.pOffers[j].dwPFSGroup = dwPFSGr;
  226. QMPol.pOffers[j].bPFSRequired = bQmpfs;
  227. }
  228. }
  229. //
  230. // Add the quick mode policy to SPD.
  231. //
  232. dwReturn = AddQuickModePolicy( pszPolicyName, bDefault, bSoft, QMPol);
  233. error:
  234. //clean up heap used...
  235. if(dwArgCount > 3)
  236. {
  237. CleanUp();
  238. }
  239. if(pszPolicyName)
  240. {
  241. delete [] pszPolicyName;
  242. }
  243. if(QMPol.pOffers)
  244. {
  245. if(QMPol.dwOfferCount)
  246. {
  247. delete [] (QMPol.pOffers);
  248. }
  249. else
  250. {
  251. delete QMPol.pOffers;
  252. }
  253. }
  254. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE) &&(dwReturn != ERROR_NO_DISPLAY))
  255. {
  256. //api errors
  257. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  258. dwReturn = ERROR_SUCCESS;
  259. }
  260. //already one error displayed.
  261. if(dwReturn == ERROR_NO_DISPLAY)
  262. {
  263. dwReturn = ERROR_SUCCESS;
  264. }
  265. return dwReturn;
  266. }
  267. ///////////////////////////////////////////////////////////////////////////////////////////
  268. //
  269. // Function : HandleDynamicSetQMPolicy
  270. //
  271. // Date of Creation: 9-23-2001
  272. //
  273. // Parameters :
  274. // IN LPCWSTR pwszMachine,
  275. // IN OUT LPWSTR *ppwcArguments,
  276. // IN DWORD dwCurrentIndex,
  277. // IN DWORD dwArgCount,
  278. // IN DWORD dwFlags,
  279. // IN LPCVOID pvData,
  280. // OUT BOOL *pbDone
  281. // Return : DWORD
  282. //
  283. // Description : Netshell Dynamic handle for set quick mode policy
  284. //
  285. // Revision History:
  286. //
  287. // Date Author Comments
  288. //
  289. //////////////////////////////////////////////////////////////////////////////////////////
  290. DWORD WINAPI
  291. HandleDynamicSetQMPolicy(
  292. IN LPCWSTR pwszMachine,
  293. IN OUT LPWSTR *ppwcArguments,
  294. IN DWORD dwCurrentIndex,
  295. IN DWORD dwArgCount,
  296. IN DWORD dwFlags,
  297. IN LPCVOID pvData,
  298. OUT BOOL *pbDone
  299. )
  300. {
  301. LPTSTR pszPolicyName = NULL;
  302. DWORD dwReturn = ERROR_SHOW_USAGE;
  303. DWORD dwNameLen = 0;
  304. DWORD dwCount = 0, j=0;
  305. DWORD dwPFSGr = 0;
  306. DWORD dwOldPFSGr = 0;
  307. DWORD dwVersion = 0;
  308. BOOL bQmpfs = FALSE, bOldQmpfs = FALSE;
  309. PIPSEC_QM_POLICY pOldQMPol = NULL;
  310. PIPSEC_QM_POLICY pQMPol = NULL;
  311. const TAG_TYPE vcmdDynamicSetQMPolicy[] =
  312. {
  313. { CMD_TOKEN_STR_NAME, NS_REQ_PRESENT, FALSE },
  314. { CMD_TOKEN_STR_SOFT, NS_REQ_ZERO, FALSE },
  315. { CMD_TOKEN_STR_PFSGROUP, NS_REQ_ZERO, FALSE },
  316. { CMD_TOKEN_STR_DEFRESPONSE, NS_REQ_ZERO, FALSE },
  317. { CMD_TOKEN_STR_NEGOTIATION, NS_REQ_ZERO, FALSE }
  318. };
  319. const TOKEN_VALUE vtokDynamicSetQMPolicy[] =
  320. {
  321. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  322. { CMD_TOKEN_STR_SOFT, CMD_TOKEN_SOFT },
  323. { CMD_TOKEN_STR_PFSGROUP, CMD_TOKEN_PFSGROUP },
  324. { CMD_TOKEN_STR_DEFRESPONSE, CMD_TOKEN_DEFRESPONSE },
  325. { CMD_TOKEN_STR_NEGOTIATION, CMD_TOKEN_NEGOTIATION }
  326. };
  327. PARSER_PKT parser;
  328. ZeroMemory(&parser, sizeof(parser));
  329. //
  330. // Bail out as user has not given sufficient arguments.
  331. //
  332. if(dwArgCount <= 3)
  333. {
  334. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  335. BAIL_OUT;
  336. }
  337. parser.ValidTok = vtokDynamicSetQMPolicy;
  338. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicSetQMPolicy);
  339. parser.ValidCmd = vcmdDynamicSetQMPolicy;
  340. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicSetQMPolicy);
  341. //
  342. // Get the user input after parsing the data
  343. //
  344. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  345. if(dwReturn != ERROR_SUCCESS)
  346. {
  347. if(dwReturn == RETURN_NO_ERROR)
  348. {
  349. dwReturn = ERROR_NO_DISPLAY;
  350. BAIL_OUT;
  351. }
  352. else
  353. {
  354. dwReturn = ERROR_SHOW_USAGE;
  355. BAIL_OUT;
  356. }
  357. }
  358. //
  359. // Check for user given tokens from the parser and copy into local variables
  360. //
  361. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  362. {
  363. switch(vtokDynamicSetQMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  364. {
  365. case CMD_TOKEN_NAME :
  366. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  367. {
  368. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  369. pszPolicyName = new _TCHAR[dwNameLen];
  370. if(pszPolicyName == NULL)
  371. {
  372. dwReturn = ERROR_OUTOFMEMORY;
  373. BAIL_OUT;
  374. }
  375. _tcsncpy(pszPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  376. }
  377. break;
  378. }
  379. }
  380. //
  381. // Get the user given QMpolicy from SPD
  382. //
  383. dwReturn = GetQMPolicy(g_szDynamicMachine, dwVersion, pszPolicyName, 0, &pOldQMPol, NULL);
  384. if((dwReturn != ERROR_SUCCESS) || !pOldQMPol)
  385. {
  386. BAIL_OUT;
  387. }
  388. pQMPol = new IPSEC_QM_POLICY;
  389. if(pQMPol == NULL)
  390. {
  391. dwReturn = ERROR_OUTOFMEMORY;
  392. BAIL_OUT;
  393. }
  394. //
  395. // Copy old record into the local pointer
  396. //
  397. memcpy(pQMPol, pOldQMPol, sizeof(IPSEC_QM_POLICY));
  398. dwNameLen = _tcslen(pOldQMPol->pszPolicyName) + 1;
  399. pQMPol->pszPolicyName = new _TCHAR[dwNameLen];
  400. if(pQMPol->pszPolicyName == NULL)
  401. {
  402. dwReturn = ERROR_OUTOFMEMORY;
  403. BAIL_OUT;
  404. }
  405. _tcsncpy(pQMPol->pszPolicyName, pOldQMPol->pszPolicyName, dwNameLen);
  406. //
  407. // Copy old qmoffer
  408. //
  409. pQMPol->pOffers = new IPSEC_QM_OFFER[pQMPol->dwOfferCount];
  410. if(pQMPol->pOffers == NULL)
  411. {
  412. dwReturn = ERROR_OUTOFMEMORY;
  413. BAIL_OUT;
  414. }
  415. for(j=0; j<pQMPol->dwOfferCount; j++)
  416. {
  417. memcpy(&(pQMPol->pOffers[j]), &(pOldQMPol->pOffers[j]), sizeof(IPSEC_QM_OFFER));
  418. }
  419. SPDApiBufferFree(pOldQMPol);
  420. pOldQMPol = NULL;
  421. //
  422. // Check for user given tokens from the parser and copy into local variables
  423. //
  424. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  425. {
  426. switch(vtokDynamicSetQMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  427. {
  428. case CMD_TOKEN_SOFT :
  429. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  430. {
  431. //
  432. // Set the soft flag
  433. //
  434. if(*(BOOL *)parser.Cmd[dwCount].pArg)
  435. {
  436. pQMPol->dwFlags |= IPSEC_QM_POLICY_ALLOW_SOFT;
  437. }
  438. else
  439. {
  440. pQMPol->dwFlags &= ~IPSEC_QM_POLICY_ALLOW_SOFT;
  441. }
  442. }
  443. break;
  444. case CMD_TOKEN_DEFRESPONSE :
  445. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  446. {
  447. //
  448. // Set the default_rule flag.
  449. //
  450. if(*(BOOL *)parser.Cmd[dwCount].pArg)
  451. {
  452. pQMPol->dwFlags |= IPSEC_MM_POLICY_DEFAULT_POLICY;
  453. }
  454. else
  455. {
  456. pQMPol->dwFlags &= ~IPSEC_MM_POLICY_DEFAULT_POLICY;
  457. }
  458. }
  459. break;
  460. case CMD_TOKEN_PFSGROUP :
  461. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  462. {
  463. //
  464. // Check if pfsgroup is given, as pfs required parameter also needs to be set.
  465. //
  466. bQmpfs = TRUE;
  467. dwPFSGr = *(DWORD *)parser.Cmd[dwCount].pArg;
  468. }
  469. break;
  470. case CMD_TOKEN_NEGOTIATION :
  471. IPSEC_QM_OFFER *SecMethod;
  472. if (parser.Cmd[dwCount].dwStatus > 0)
  473. {
  474. if((pQMPol->pOffers)&&(pQMPol->dwOfferCount))
  475. {
  476. dwOldPFSGr = pQMPol->pOffers[0].dwPFSGroup;
  477. bOldQmpfs = pQMPol->pOffers[0].bPFSRequired;
  478. if(pQMPol->dwOfferCount)
  479. {
  480. delete [] pQMPol->pOffers;
  481. }
  482. else
  483. {
  484. delete pQMPol->pOffers;
  485. }
  486. }
  487. pQMPol->dwOfferCount = parser.Cmd[dwCount].dwStatus;
  488. pQMPol->pOffers = new IPSEC_QM_OFFER[pQMPol->dwOfferCount];
  489. if(pQMPol->pOffers == NULL)
  490. {
  491. dwReturn = ERROR_OUTOFMEMORY;
  492. BAIL_OUT;
  493. }
  494. //
  495. // Copy user given offer.
  496. //
  497. for(j=0;j<pQMPol->dwOfferCount;j++)
  498. {
  499. SecMethod = ((IPSEC_QM_OFFER **)parser.Cmd[dwCount].pArg)[j];
  500. if(SecMethod->dwNumAlgos > 0)
  501. {
  502. pQMPol->pOffers[j].dwNumAlgos = SecMethod->dwNumAlgos;
  503. memcpy(&(pQMPol->pOffers[j].Algos), &(SecMethod->Algos), sizeof(IPSEC_QM_ALGO[QM_MAX_ALGOS]));
  504. }
  505. pQMPol->pOffers[j].Lifetime.uKeyExpirationKBytes = SecMethod->Lifetime.uKeyExpirationKBytes;
  506. pQMPol->pOffers[j].Lifetime.uKeyExpirationTime = SecMethod->Lifetime.uKeyExpirationTime;
  507. pQMPol->pOffers[j].bPFSRequired = bOldQmpfs;
  508. pQMPol->pOffers[j].dwPFSGroup = dwOldPFSGr;
  509. }
  510. }
  511. break;
  512. default :
  513. break;
  514. }
  515. }
  516. //
  517. // If only pfs group is given without the qm offer then copy it separately.
  518. //
  519. for(j=0;j<pQMPol->dwOfferCount;j++)
  520. {
  521. if(bQmpfs)
  522. {
  523. pQMPol->pOffers[j].bPFSRequired = bQmpfs;
  524. switch(dwPFSGr)
  525. {
  526. case 0:
  527. pQMPol->pOffers[j].dwPFSGroup = 0;
  528. pQMPol->pOffers[j].bPFSRequired = FALSE;
  529. break;
  530. case 1:
  531. pQMPol->pOffers[j].dwPFSGroup = PFS_GROUP_1;
  532. pQMPol->pOffers[j].bPFSRequired = TRUE;
  533. break;
  534. case 2:
  535. pQMPol->pOffers[j].dwPFSGroup = PFS_GROUP_2;
  536. pQMPol->pOffers[j].bPFSRequired = TRUE;
  537. break;
  538. case 3:
  539. pQMPol->pOffers[j].dwPFSGroup = PFS_GROUP_2048;
  540. pQMPol->pOffers[j].bPFSRequired = TRUE;
  541. break;
  542. case 4:
  543. pQMPol->pOffers[j].dwPFSGroup = PFS_GROUP_MM;
  544. pQMPol->pOffers[j].bPFSRequired = TRUE;
  545. break;
  546. }
  547. }
  548. }
  549. //
  550. // Set the quick mode policy
  551. //
  552. dwReturn = SetQuickModePolicy( pszPolicyName, pQMPol);
  553. error:
  554. if(dwArgCount > 3)
  555. {
  556. CleanUp();
  557. }
  558. if(pszPolicyName)
  559. {
  560. delete [] pszPolicyName;
  561. }
  562. //
  563. // error clean up path.
  564. //
  565. if((pQMPol) && (pQMPol->pOffers))
  566. {
  567. if(pQMPol->dwOfferCount)
  568. {
  569. delete [] pQMPol->pOffers;
  570. }
  571. else
  572. {
  573. delete pQMPol->pOffers;
  574. }
  575. }
  576. if((pQMPol) && (pQMPol->pszPolicyName))
  577. {
  578. delete [] pQMPol->pszPolicyName;
  579. }
  580. if(pOldQMPol)
  581. {
  582. SPDApiBufferFree(pOldQMPol);
  583. pOldQMPol = NULL;
  584. }
  585. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE) &&(dwReturn != ERROR_NO_DISPLAY))
  586. {
  587. //api errors
  588. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  589. dwReturn = ERROR_SUCCESS;
  590. }
  591. //already one error displayed.
  592. if(dwReturn == ERROR_NO_DISPLAY)
  593. {
  594. dwReturn = ERROR_SUCCESS;
  595. }
  596. return dwReturn;
  597. }
  598. ///////////////////////////////////////////////////////////////////////////////////////////
  599. //
  600. // Function : HandleDynamicAddMMPolicy
  601. //
  602. // Date of Creation: 9-23-2001
  603. //
  604. // Parameters :
  605. // IN LPCWSTR pwszMachine,
  606. // IN OUT LPWSTR *ppwcArguments,
  607. // IN DWORD dwCurrentIndex,
  608. // IN DWORD dwArgCount,
  609. // IN DWORD dwFlags,
  610. // IN LPCVOID pvData,
  611. // OUT BOOL *pbDone
  612. // Return : DWORD
  613. //
  614. // Description : Netshell Dynamic handle for add main mode policy
  615. //
  616. // Revision History:
  617. //
  618. // Date Author Comments
  619. //
  620. //////////////////////////////////////////////////////////////////////////////////////////
  621. DWORD WINAPI
  622. HandleDynamicAddMMPolicy(
  623. IN LPCWSTR pwszMachine,
  624. IN OUT LPWSTR *ppwcArguments,
  625. IN DWORD dwCurrentIndex,
  626. IN DWORD dwArgCount,
  627. IN DWORD dwFlags,
  628. IN LPCVOID pvData,
  629. OUT BOOL *pbDone
  630. )
  631. {
  632. DWORD dwReturn = ERROR_SHOW_USAGE;
  633. DWORD dwNameLen = 0;
  634. DWORD dwCount = 0;
  635. IPSEC_MM_POLICY MMPol;
  636. LPTSTR pszPolicyName = NULL;
  637. DWORD dwQmperMM = 0;
  638. DWORD dwKbLife = 0;
  639. DWORD dwSecLife = POTF_DEFAULT_P1REKEY_TIME, j=0;
  640. const TAG_TYPE vcmdDynamicAddMMPolicy[] =
  641. {
  642. { CMD_TOKEN_STR_NAME, NS_REQ_PRESENT, FALSE },
  643. { CMD_TOKEN_STR_QMPERMM, NS_REQ_ZERO, FALSE },
  644. { CMD_TOKEN_STR_MMLIFETIME, NS_REQ_ZERO, FALSE },
  645. { CMD_TOKEN_STR_SOFTSAEXPTIME, NS_REQ_ZERO, FALSE },
  646. { CMD_TOKEN_STR_DEFRESPONSE, NS_REQ_ZERO, FALSE },
  647. { CMD_TOKEN_STR_MMSECMETHODS, NS_REQ_ZERO, FALSE }
  648. };
  649. const TOKEN_VALUE vtokDynamicAddMMPolicy[] =
  650. {
  651. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  652. { CMD_TOKEN_STR_QMPERMM, CMD_TOKEN_QMPERMM },
  653. { CMD_TOKEN_STR_MMLIFETIME, CMD_TOKEN_MMLIFETIME },
  654. { CMD_TOKEN_STR_SOFTSAEXPTIME, CMD_TOKEN_SOFTSAEXPTIME },
  655. { CMD_TOKEN_STR_DEFRESPONSE, CMD_TOKEN_DEFRESPONSE },
  656. { CMD_TOKEN_STR_MMSECMETHODS, CMD_TOKEN_MMSECMETHODS }
  657. };
  658. PARSER_PKT parser;
  659. ZeroMemory(&parser, sizeof(parser));
  660. memset(&MMPol, 0, sizeof(IPSEC_MM_POLICY));
  661. MMPol.uSoftExpirationTime = POTF_DEF_P1SOFT_TIME;
  662. //
  663. // Bail out as user has not given sufficient arguments.
  664. //
  665. if(dwArgCount <= 3)
  666. {
  667. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  668. BAIL_OUT;
  669. }
  670. parser.ValidTok = vtokDynamicAddMMPolicy;
  671. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicAddMMPolicy);
  672. parser.ValidCmd = vcmdDynamicAddMMPolicy;
  673. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicAddMMPolicy);
  674. //
  675. // Get the user input after parsing the data
  676. //
  677. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  678. if(dwReturn != ERROR_SUCCESS)
  679. {
  680. if(dwReturn == RETURN_NO_ERROR)
  681. {
  682. dwReturn = ERROR_NO_DISPLAY;
  683. BAIL_OUT;
  684. }
  685. else
  686. {
  687. dwReturn = ERROR_SHOW_USAGE;
  688. BAIL_OUT;
  689. }
  690. }
  691. //
  692. // Check for user given tokens from the parser and copy into local variables
  693. //
  694. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  695. {
  696. switch(vtokDynamicAddMMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  697. {
  698. case CMD_TOKEN_NAME :
  699. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  700. {
  701. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  702. pszPolicyName = new _TCHAR[dwNameLen];
  703. if(pszPolicyName == NULL)
  704. {
  705. dwReturn = ERROR_OUTOFMEMORY;
  706. BAIL_OUT;
  707. }
  708. _tcsncpy(pszPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  709. }
  710. break;
  711. case CMD_TOKEN_DEFRESPONSE :
  712. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  713. {
  714. if(*(BOOL *)parser.Cmd[dwCount].pArg)
  715. {
  716. MMPol.dwFlags |= IPSEC_MM_POLICY_DEFAULT_POLICY;
  717. }
  718. }
  719. break;
  720. case CMD_TOKEN_MMLIFETIME :
  721. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  722. {
  723. dwSecLife = ((*(DWORD *)parser.Cmd[dwCount].pArg ) * 60);
  724. }
  725. break;
  726. case CMD_TOKEN_QMPERMM :
  727. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  728. {
  729. dwQmperMM = *(DWORD *)parser.Cmd[dwCount].pArg;
  730. }
  731. break;
  732. case CMD_TOKEN_SOFTSAEXPTIME :
  733. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  734. {
  735. MMPol.uSoftExpirationTime = ((*(DWORD *)parser.Cmd[dwCount].pArg) * 60);
  736. }
  737. break;
  738. case CMD_TOKEN_MMSECMETHODS :
  739. IPSEC_MM_OFFER *SecMethod;
  740. if (parser.Cmd[dwCount].dwStatus != 0)
  741. {
  742. MMPol.dwOfferCount = parser.Cmd[dwCount].dwStatus;
  743. MMPol.pOffers = new IPSEC_MM_OFFER[MMPol.dwOfferCount];
  744. if(MMPol.pOffers == NULL)
  745. {
  746. dwReturn = ERROR_OUTOFMEMORY;
  747. BAIL_OUT;
  748. }
  749. //
  750. // Copy security methods.
  751. //
  752. for(j=0;j<MMPol.dwOfferCount;j++)
  753. {
  754. SecMethod = ((IPSEC_MM_OFFER **)parser.Cmd[dwCount].pArg)[j];
  755. memcpy(&(MMPol.pOffers[j]), SecMethod, sizeof(IPSEC_MM_OFFER));
  756. }
  757. }
  758. break;
  759. default :
  760. break;
  761. }
  762. }
  763. for(j=0;j<MMPol.dwOfferCount;j++)
  764. {
  765. MMPol.pOffers[j].dwQuickModeLimit = dwQmperMM;
  766. MMPol.pOffers[j].Lifetime.uKeyExpirationKBytes = dwKbLife;
  767. MMPol.pOffers[j].Lifetime.uKeyExpirationTime = dwSecLife;
  768. }
  769. dwReturn = AddMainModePolicy( pszPolicyName, MMPol);
  770. error:
  771. if(dwArgCount > 3)
  772. {
  773. CleanUp();
  774. }
  775. //
  776. // Error cleanup path
  777. //
  778. if(pszPolicyName)
  779. {
  780. delete [] pszPolicyName;
  781. }
  782. if(MMPol.pOffers)
  783. {
  784. if(MMPol.dwOfferCount > 1)
  785. {
  786. delete [] (MMPol.pOffers);
  787. }
  788. else
  789. {
  790. delete MMPol.pOffers;
  791. }
  792. }
  793. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  794. {
  795. //api errors
  796. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  797. dwReturn = ERROR_SUCCESS;
  798. }
  799. //already one error displayed.
  800. if(dwReturn == ERROR_NO_DISPLAY)
  801. {
  802. dwReturn = ERROR_SUCCESS;
  803. }
  804. return dwReturn;
  805. }
  806. ///////////////////////////////////////////////////////////////////////////////////////////
  807. //
  808. // Function : HandleDynamicSetMMPolicy
  809. //
  810. // Date of Creation: 9-23-2001
  811. //
  812. // Parameters :
  813. // IN LPCWSTR pwszMachine,
  814. // IN OUT LPWSTR *ppwcArguments,
  815. // IN DWORD dwCurrentIndex,
  816. // IN DWORD dwArgCount,
  817. // IN DWORD dwFlags,
  818. // IN LPCVOID pvData,
  819. // OUT BOOL *pbDone
  820. // Return : DWORD
  821. //
  822. // Description : Netshell Dynamic handle for set main mode policy
  823. //
  824. // Revision History:
  825. //
  826. // Date Author Comments
  827. //
  828. //////////////////////////////////////////////////////////////////////////////////////////
  829. DWORD WINAPI
  830. HandleDynamicSetMMPolicy(
  831. IN LPCWSTR pwszMachine,
  832. IN OUT LPWSTR *ppwcArguments,
  833. IN DWORD dwCurrentIndex,
  834. IN DWORD dwArgCount,
  835. IN DWORD dwFlags,
  836. IN LPCVOID pvData,
  837. OUT BOOL *pbDone
  838. )
  839. {
  840. DWORD dwReturn = ERROR_SHOW_USAGE;
  841. DWORD dwCount = 0, j=0;
  842. DWORD dwNameLen = 0;
  843. LPTSTR pszPolicyName = NULL;
  844. IPSEC_MM_POLICY MMPol;
  845. PIPSEC_MM_POLICY pMMPol = NULL;
  846. BOOL bSeclife = FALSE, bQmpermm = FALSE;
  847. DWORD dwQmperMM = 0;
  848. DWORD dwSecLife = POTF_DEFAULT_P1REKEY_TIME;
  849. DWORD dwOldQmperMM = 0;
  850. DWORD dwOldKbLife = 0;
  851. DWORD dwOldSecLife = 0;
  852. DWORD dwVersion = 0;
  853. const TAG_TYPE vcmdDynamicSetMMPolicy[] =
  854. {
  855. { CMD_TOKEN_STR_NAME, NS_REQ_PRESENT, FALSE },
  856. { CMD_TOKEN_STR_QMPERMM, NS_REQ_ZERO, FALSE },
  857. { CMD_TOKEN_STR_MMLIFETIME, NS_REQ_ZERO, FALSE },
  858. { CMD_TOKEN_STR_SOFTSAEXPTIME, NS_REQ_ZERO, FALSE },
  859. { CMD_TOKEN_STR_DEFRESPONSE, NS_REQ_ZERO, FALSE },
  860. { CMD_TOKEN_STR_MMSECMETHODS, NS_REQ_ZERO, FALSE }
  861. };
  862. const TOKEN_VALUE vtokDynamicSetMMPolicy[] =
  863. {
  864. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  865. { CMD_TOKEN_STR_QMPERMM, CMD_TOKEN_QMPERMM },
  866. { CMD_TOKEN_STR_MMLIFETIME, CMD_TOKEN_MMLIFETIME },
  867. { CMD_TOKEN_STR_SOFTSAEXPTIME, CMD_TOKEN_SOFTSAEXPTIME },
  868. { CMD_TOKEN_STR_DEFRESPONSE, CMD_TOKEN_DEFRESPONSE },
  869. { CMD_TOKEN_STR_MMSECMETHODS, CMD_TOKEN_MMSECMETHODS }
  870. };
  871. PARSER_PKT parser;
  872. ZeroMemory(&parser, sizeof(parser));
  873. memset(&MMPol, 0, sizeof(IPSEC_MM_POLICY));
  874. MMPol.uSoftExpirationTime = POTF_DEF_P1SOFT_TIME;
  875. //
  876. // Bail out as user has not given sufficient arguments.
  877. //
  878. if(dwArgCount <= 3)
  879. {
  880. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  881. BAIL_OUT;
  882. }
  883. parser.ValidTok = vtokDynamicSetMMPolicy;
  884. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicSetMMPolicy);
  885. parser.ValidCmd = vcmdDynamicSetMMPolicy;
  886. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicSetMMPolicy);
  887. //
  888. // Get the user input after parsing the data
  889. //
  890. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  891. if(dwReturn != ERROR_SUCCESS)
  892. {
  893. if(dwReturn == RETURN_NO_ERROR)
  894. {
  895. dwReturn = ERROR_NO_DISPLAY;
  896. BAIL_OUT;
  897. }
  898. else
  899. {
  900. dwReturn = ERROR_SHOW_USAGE;
  901. BAIL_OUT;
  902. }
  903. }
  904. //
  905. // Check for user given tokens from the parser and copy into local variables
  906. //
  907. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  908. {
  909. switch(vtokDynamicSetMMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  910. {
  911. case CMD_TOKEN_NAME :
  912. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  913. {
  914. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  915. pszPolicyName = new _TCHAR[dwNameLen];
  916. if(pszPolicyName == NULL)
  917. {
  918. dwReturn = ERROR_OUTOFMEMORY;
  919. BAIL_OUT;
  920. }
  921. _tcsncpy(pszPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  922. }
  923. break;
  924. default :
  925. break;
  926. }
  927. }
  928. //
  929. // Get the corresponding MMPolicy for the user given mmpolicy name
  930. //
  931. dwReturn = GetMMPolicy(g_szDynamicMachine,dwVersion, pszPolicyName, &pMMPol, NULL);
  932. if((dwReturn != ERROR_SUCCESS) || (!pMMPol))
  933. {
  934. BAIL_OUT;
  935. }
  936. //
  937. // Copy old data into local variables
  938. //
  939. memcpy( &MMPol, pMMPol, sizeof(IPSEC_MM_POLICY));
  940. dwNameLen = _tcslen(pMMPol->pszPolicyName)+1;
  941. MMPol.pszPolicyName = new _TCHAR[dwNameLen];
  942. if(MMPol.pszPolicyName == NULL)
  943. {
  944. dwReturn = ERROR_OUTOFMEMORY;
  945. BAIL_OUT;
  946. }
  947. _tcsncpy(MMPol.pszPolicyName, pMMPol->pszPolicyName, dwNameLen);
  948. MMPol.pOffers = new IPSEC_MM_OFFER[MMPol.dwOfferCount];
  949. if(MMPol.pOffers == NULL)
  950. {
  951. dwReturn = ERROR_OUTOFMEMORY;
  952. BAIL_OUT;
  953. }
  954. for(j=0; j<MMPol.dwOfferCount; j++)
  955. {
  956. memcpy(&(MMPol.pOffers[j]), &(pMMPol->pOffers[j]), sizeof(IPSEC_MM_OFFER));
  957. }
  958. SPDApiBufferFree(pMMPol);
  959. pMMPol = NULL;
  960. //
  961. // Check for user given tokens from the parser and copy into local variables
  962. //
  963. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  964. {
  965. switch(vtokDynamicSetMMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  966. {
  967. case CMD_TOKEN_DEFRESPONSE :
  968. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  969. {
  970. if(*(BOOL *)parser.Cmd[dwCount].pArg)
  971. {
  972. MMPol.dwFlags |= IPSEC_MM_POLICY_DEFAULT_POLICY;
  973. }
  974. else
  975. {
  976. MMPol.dwFlags &= ~IPSEC_MM_POLICY_DEFAULT_POLICY;
  977. }
  978. }
  979. break;
  980. case CMD_TOKEN_MMLIFETIME :
  981. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  982. {
  983. dwSecLife = ((*(DWORD *)parser.Cmd[dwCount].pArg ) * 60);
  984. bSeclife = TRUE;
  985. }
  986. break;
  987. case CMD_TOKEN_QMPERMM :
  988. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  989. {
  990. dwQmperMM = *(DWORD *)parser.Cmd[dwCount].pArg;
  991. bQmpermm = TRUE;
  992. }
  993. break;
  994. case CMD_TOKEN_SOFTSAEXPTIME :
  995. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  996. {
  997. MMPol.uSoftExpirationTime = ((*(DWORD *)parser.Cmd[dwCount].pArg) * 60);
  998. }
  999. break;
  1000. case CMD_TOKEN_MMSECMETHODS :
  1001. IPSEC_MM_OFFER *SecMethod;
  1002. if (parser.Cmd[dwCount].dwStatus != 0)
  1003. {
  1004. if((MMPol.pOffers)&&(MMPol.dwOfferCount))
  1005. {
  1006. dwOldQmperMM = MMPol.pOffers[0].dwQuickModeLimit;
  1007. dwOldKbLife = MMPol.pOffers[0].Lifetime.uKeyExpirationKBytes;
  1008. dwOldSecLife = MMPol.pOffers[0].Lifetime.uKeyExpirationTime;
  1009. if(MMPol.dwOfferCount)
  1010. {
  1011. delete [] (MMPol.pOffers);
  1012. }
  1013. else
  1014. {
  1015. delete (MMPol.pOffers);
  1016. }
  1017. }
  1018. MMPol.dwOfferCount = parser.Cmd[dwCount].dwStatus;
  1019. MMPol.pOffers = new IPSEC_MM_OFFER[MMPol.dwOfferCount];
  1020. if(MMPol.pOffers == NULL)
  1021. {
  1022. dwReturn = ERROR_OUTOFMEMORY;
  1023. BAIL_OUT;
  1024. }
  1025. //
  1026. // Copy user given new security methods
  1027. //
  1028. for(j=0;j<MMPol.dwOfferCount;j++)
  1029. {
  1030. SecMethod = ((IPSEC_MM_OFFER **)parser.Cmd[dwCount].pArg)[j];
  1031. MMPol.pOffers[j].dwDHGroup = SecMethod->dwDHGroup;
  1032. MMPol.pOffers[j].EncryptionAlgorithm = SecMethod->EncryptionAlgorithm;
  1033. MMPol.pOffers[j].HashingAlgorithm = SecMethod->HashingAlgorithm;
  1034. MMPol.pOffers[j].dwQuickModeLimit = dwOldQmperMM;
  1035. MMPol.pOffers[j].Lifetime.uKeyExpirationKBytes = dwOldKbLife;
  1036. MMPol.pOffers[j].Lifetime.uKeyExpirationTime = dwOldSecLife;
  1037. }
  1038. }
  1039. break;
  1040. default :
  1041. break;
  1042. }
  1043. }
  1044. //
  1045. // Copy qmpermm and lifetime separately if mm offer is not given by user.
  1046. //
  1047. for(j=0;j<MMPol.dwOfferCount;j++)
  1048. {
  1049. if(bQmpermm)
  1050. {
  1051. MMPol.pOffers[j].dwQuickModeLimit = dwQmperMM;
  1052. }
  1053. if(bSeclife)
  1054. {
  1055. MMPol.pOffers[j].Lifetime.uKeyExpirationTime = dwSecLife;
  1056. }
  1057. }
  1058. dwReturn = SetMainModePolicy( pszPolicyName, MMPol);
  1059. error:
  1060. if(dwArgCount > 3)
  1061. {
  1062. CleanUp();
  1063. }
  1064. //
  1065. // error cleanup path.
  1066. //
  1067. if(pszPolicyName)
  1068. {
  1069. delete [] pszPolicyName;
  1070. }
  1071. if(MMPol.pszPolicyName)
  1072. delete [] MMPol.pszPolicyName;
  1073. if(MMPol.pOffers)
  1074. {
  1075. if(MMPol.dwOfferCount)
  1076. {
  1077. delete [] (MMPol.pOffers);
  1078. }
  1079. else
  1080. {
  1081. delete (MMPol.pOffers);
  1082. }
  1083. }
  1084. if(pMMPol)
  1085. {
  1086. SPDApiBufferFree(pMMPol);
  1087. pMMPol = NULL;
  1088. }
  1089. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  1090. {
  1091. //api errors
  1092. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1093. dwReturn = ERROR_SUCCESS;
  1094. }
  1095. //already one error displayed.
  1096. if(dwReturn == ERROR_NO_DISPLAY)
  1097. {
  1098. dwReturn = ERROR_SUCCESS;
  1099. }
  1100. return dwReturn;
  1101. }
  1102. ///////////////////////////////////////////////////////////////////////////////////////////
  1103. //
  1104. // Function : HandleDynamicShowAll
  1105. //
  1106. // Date of Creation: 9-23-2001
  1107. //
  1108. // Parameters :
  1109. // IN LPCWSTR pwszMachine,
  1110. // IN OUT LPWSTR *ppwcArguments,
  1111. // IN DWORD dwCurrentIndex,
  1112. // IN DWORD dwArgCount,
  1113. // IN DWORD dwFlags,
  1114. // IN LPCVOID pvData,
  1115. // OUT BOOL *pbDone
  1116. // Return : DWORD
  1117. //
  1118. // Description : Netshell Dynamic handle for show all
  1119. //
  1120. // Revision History:
  1121. //
  1122. // Date Author Comments
  1123. //
  1124. //////////////////////////////////////////////////////////////////////////////////////////
  1125. DWORD WINAPI
  1126. HandleDynamicShowAll(
  1127. IN LPCWSTR pwszMachine,
  1128. IN OUT LPWSTR *ppwcArguments,
  1129. IN DWORD dwCurrentIndex,
  1130. IN DWORD dwArgCount,
  1131. IN DWORD dwFlags,
  1132. IN LPCVOID pvData,
  1133. OUT BOOL *pbDone
  1134. )
  1135. {
  1136. DWORD dwReturn = ERROR_SHOW_USAGE,dwCount;
  1137. ADDR SrcAddr,DesAddr;
  1138. BOOL bResolveDNS = FALSE;
  1139. BOOL bSrcMask = FALSE;
  1140. BOOL bDstMask = FALSE;
  1141. SrcAddr.uIpAddr = 0xFFFFFFFF;
  1142. DesAddr.uIpAddr = 0xFFFFFFFF;
  1143. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  1144. DesAddr.AddrType = IP_ADDR_UNIQUE;
  1145. DWORD dwProtocol = 0xFFFFFFFF;
  1146. QM_FILTER_VALUE_BOOL QMBoolValue;
  1147. QMBoolValue.bSrcPort = FALSE;
  1148. QMBoolValue.bDstPort= FALSE;
  1149. QMBoolValue.bProtocol= FALSE;
  1150. QMBoolValue.bActionInbound = FALSE;
  1151. QMBoolValue.bActionOutbound= FALSE;
  1152. NshHashTable addressHash;
  1153. //
  1154. // To take care of PASS in test tool, as show is being tested only for parser output.
  1155. //
  1156. UpdateGetLastError(NULL);
  1157. const TAG_TYPE vcmdDynamicShowAll[] =
  1158. {
  1159. { CMD_TOKEN_STR_RESDNS, NS_REQ_ZERO, FALSE }
  1160. };
  1161. const TOKEN_VALUE vtokDynamicShowAll[] =
  1162. {
  1163. { CMD_TOKEN_STR_RESDNS, CMD_TOKEN_RESDNS }
  1164. };
  1165. PARSER_PKT parser;
  1166. ZeroMemory(&parser, sizeof(parser));
  1167. if(dwArgCount == 3)
  1168. {
  1169. //if no argument specified print with default options
  1170. goto PRINT;
  1171. }
  1172. else if(dwArgCount < 3)
  1173. {
  1174. //
  1175. // Bail out as user has not given sufficient arguments.
  1176. //
  1177. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  1178. BAIL_OUT;
  1179. }
  1180. parser.ValidTok = vtokDynamicShowAll;
  1181. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowAll);
  1182. parser.ValidCmd = vcmdDynamicShowAll;
  1183. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowAll);
  1184. //
  1185. // Get the user input after parsing the data
  1186. //
  1187. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  1188. if(dwReturn != ERROR_SUCCESS)
  1189. {
  1190. if(dwReturn == RETURN_NO_ERROR)
  1191. {
  1192. dwReturn = ERROR_NO_DISPLAY;
  1193. BAIL_OUT;
  1194. }
  1195. else
  1196. {
  1197. dwReturn = ERROR_SHOW_USAGE;
  1198. BAIL_OUT;
  1199. }
  1200. }
  1201. //
  1202. // Check for user given tokens from the parser and copy into local variables
  1203. //
  1204. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  1205. {
  1206. switch(vtokDynamicShowAll[parser.Cmd[dwCount].dwCmdToken].dwValue)
  1207. {
  1208. case CMD_TOKEN_RESDNS :
  1209. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  1210. {
  1211. bResolveDNS = *(BOOL *)parser.Cmd[dwCount].pArg;
  1212. }
  1213. break;
  1214. default :
  1215. break;
  1216. }
  1217. }
  1218. PRINT:
  1219. // Show all GPO information
  1220. POLICY_INFO policyInfo;
  1221. ZeroMemory(&policyInfo, sizeof(POLICY_INFO));
  1222. policyInfo.dwLocation=IPSEC_REGISTRY_PROVIDER;
  1223. PGPO pGPO=new GPO;
  1224. if(pGPO==NULL)
  1225. {
  1226. PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
  1227. dwReturn = ERROR_SUCCESS;
  1228. BAIL_OUT;
  1229. }
  1230. ZeroMemory(pGPO, sizeof(GPO));
  1231. ShowLocalGpoPolicy(policyInfo, pGPO);
  1232. //
  1233. // Show all mmpolicy details
  1234. //
  1235. dwReturn = ShowMMPolicy(NULL);
  1236. if(dwReturn != ERROR_SUCCESS)
  1237. {
  1238. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1239. }
  1240. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1241. //
  1242. // Show all qmpolicy details
  1243. //
  1244. dwReturn = ShowQMPolicy(NULL);
  1245. if(dwReturn != ERROR_SUCCESS)
  1246. {
  1247. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1248. }
  1249. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1250. //
  1251. // Show all generic mmfilter details
  1252. //
  1253. dwReturn = ShowMMFilters(NULL, TRUE, SrcAddr, DesAddr, addressHash, bResolveDNS, bSrcMask, bDstMask);
  1254. if(dwReturn != ERROR_SUCCESS)
  1255. {
  1256. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1257. }
  1258. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1259. //
  1260. // Show all specific mmfilter details
  1261. //
  1262. dwReturn = ShowMMFilters(NULL, FALSE, SrcAddr, DesAddr, addressHash, bResolveDNS, bSrcMask, bDstMask);
  1263. if(dwReturn != ERROR_SUCCESS)
  1264. {
  1265. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1266. }
  1267. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1268. //
  1269. // Show all generic qmfilter details
  1270. //
  1271. dwReturn = ShowQMFilters(NULL, TRUE, SrcAddr, DesAddr, addressHash, bResolveDNS, bSrcMask, bDstMask, QMBoolValue);
  1272. if(dwReturn != ERROR_SUCCESS)
  1273. {
  1274. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1275. }
  1276. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1277. //
  1278. // Show all specific qmfilter details
  1279. //
  1280. dwReturn = ShowQMFilters(NULL, FALSE, SrcAddr, DesAddr, addressHash, bResolveDNS, bSrcMask, bDstMask, QMBoolValue);
  1281. if(dwReturn != ERROR_SUCCESS)
  1282. {
  1283. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1284. }
  1285. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1286. //
  1287. // Show all main mode security associations
  1288. //
  1289. dwReturn = ShowMMSas(SrcAddr, DesAddr, FALSE, addressHash, bResolveDNS);
  1290. if(dwReturn != ERROR_SUCCESS)
  1291. {
  1292. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1293. }
  1294. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1295. //
  1296. // Show all quick mode security associations
  1297. //
  1298. dwReturn = ShowQMSas(SrcAddr,DesAddr, dwProtocol, addressHash, bResolveDNS);
  1299. if(dwReturn != ERROR_SUCCESS)
  1300. {
  1301. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1302. }
  1303. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1304. //
  1305. // Show all Ipsec related registry keys
  1306. //
  1307. dwReturn = ShowRegKeys();
  1308. if(dwReturn != ERROR_SUCCESS)
  1309. {
  1310. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1311. }
  1312. PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
  1313. //
  1314. // Show all IPSec and IKE statistics
  1315. //
  1316. dwReturn = ShowStats(STATS_ALL);
  1317. if(dwReturn != ERROR_SUCCESS)
  1318. {
  1319. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1320. }
  1321. // all the errors have been displayed...
  1322. // as such send ERROR_SUCCESS to netsh
  1323. dwReturn = ERROR_SUCCESS;
  1324. error:
  1325. if(pGPO) // clean up the GPO structure
  1326. {
  1327. if(pGPO->pszGPODisplayName) delete [] pGPO->pszGPODisplayName;
  1328. if(pGPO->pszGPODNName) delete [] pGPO->pszGPODNName;
  1329. if(pGPO->pszPolicyName) delete [] pGPO->pszPolicyName;
  1330. if(pGPO->pszLocalPolicyName) delete [] pGPO->pszLocalPolicyName;
  1331. if(pGPO->pszPolicyDNName) delete [] pGPO->pszPolicyDNName;
  1332. if(pGPO->pszDomainName) delete [] pGPO->pszDomainName;
  1333. if(pGPO->pszDCName) delete [] pGPO->pszDCName;
  1334. if(pGPO->pszOULink) delete [] pGPO->pszOULink;
  1335. delete pGPO;
  1336. pGPO = NULL;
  1337. }
  1338. return dwReturn;
  1339. }
  1340. ///////////////////////////////////////////////////////////////////////////////////////////
  1341. //
  1342. // Function : HandleDynamicShowRegKeys
  1343. //
  1344. // Date of Creation: 9-23-2001
  1345. //
  1346. // Parameters :
  1347. // IN LPCWSTR pwszMachine,
  1348. // IN OUT LPWSTR *ppwcArguments,
  1349. // IN DWORD dwCurrentIndex,
  1350. // IN DWORD dwArgCount,
  1351. // IN DWORD dwFlags,
  1352. // IN LPCVOID pvData,
  1353. // OUT BOOL *pbDone
  1354. // Return : DWORD
  1355. //
  1356. // Description : Netshell Dynamic handle for show registry keys of ipsec driver.
  1357. //
  1358. // Revision History:
  1359. //
  1360. // Date Author Comments
  1361. //
  1362. //////////////////////////////////////////////////////////////////////////////////////////
  1363. DWORD WINAPI
  1364. HandleDynamicShowRegKeys(
  1365. IN LPCWSTR pwszMachine,
  1366. IN OUT LPWSTR *ppwcArguments,
  1367. IN DWORD dwCurrentIndex,
  1368. IN DWORD dwArgCount,
  1369. IN DWORD dwFlags,
  1370. IN LPCVOID pvData,
  1371. OUT BOOL *pbDone
  1372. )
  1373. {
  1374. DWORD dwReturn = ERROR_SHOW_USAGE;
  1375. //No errors should be displayed in test tool,
  1376. //as show commands are only tested for parser output.
  1377. UpdateGetLastError(NULL);
  1378. if(dwArgCount > 2)
  1379. {
  1380. dwReturn = ShowRegKeys();
  1381. }
  1382. else
  1383. {
  1384. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  1385. }
  1386. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  1387. {
  1388. //api errors
  1389. PrintErrorMessage(WIN32_ERR, dwReturn, ERRCODE_SHOW_REG_16);
  1390. dwReturn = ERROR_SUCCESS;
  1391. }
  1392. //already one error displayed.
  1393. if(dwReturn == ERROR_NO_DISPLAY)
  1394. {
  1395. dwReturn = ERROR_SUCCESS;
  1396. }
  1397. return dwReturn;
  1398. }
  1399. ///////////////////////////////////////////////////////////////////////////////////////////
  1400. //
  1401. // Function : HandleDynamicShowStats
  1402. //
  1403. // Date of Creation: 9-23-2001
  1404. //
  1405. // Parameters :
  1406. // IN LPCWSTR pwszMachine,
  1407. // IN OUT LPWSTR *ppwcArguments,
  1408. // IN DWORD dwCurrentIndex,
  1409. // IN DWORD dwArgCount,
  1410. // IN DWORD dwFlags,
  1411. // IN LPCVOID pvData,
  1412. // OUT BOOL *pbDone
  1413. // Return : DWORD
  1414. //
  1415. // Description : Netshell Dynamic handle for show statistics
  1416. //
  1417. // Revision History:
  1418. //
  1419. // Date Author Comments
  1420. //
  1421. //////////////////////////////////////////////////////////////////////////////////////////
  1422. DWORD WINAPI
  1423. HandleDynamicShowStats(
  1424. IN LPCWSTR pwszMachine,
  1425. IN OUT LPWSTR *ppwcArguments,
  1426. IN DWORD dwCurrentIndex,
  1427. IN DWORD dwArgCount,
  1428. IN DWORD dwFlags,
  1429. IN LPCVOID pvData,
  1430. OUT BOOL *pbDone
  1431. )
  1432. {
  1433. DWORD dwReturn = ERROR_SHOW_USAGE;
  1434. DWORD dwShow = STATS_ALL;
  1435. DWORD dwCount = 0;
  1436. const TAG_TYPE vcmdDynamicShowStatistics[] =
  1437. {
  1438. { CMD_TOKEN_STR_TYPE, NS_REQ_ZERO, FALSE }
  1439. };
  1440. const TOKEN_VALUE vtokDynamicShowStatistics[] =
  1441. {
  1442. { CMD_TOKEN_STR_TYPE, CMD_TOKEN_TYPE }
  1443. };
  1444. PARSER_PKT parser;
  1445. ZeroMemory(&parser, sizeof(parser));
  1446. if(dwArgCount == 3)
  1447. {
  1448. dwReturn = ShowStats(dwShow);
  1449. BAIL_OUT;
  1450. }
  1451. //
  1452. // Bail out as user has not given sufficient arguments.
  1453. //
  1454. else if(dwArgCount < 3)
  1455. {
  1456. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  1457. BAIL_OUT;
  1458. }
  1459. parser.ValidTok = vtokDynamicShowStatistics;
  1460. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowStatistics);
  1461. parser.ValidCmd = vcmdDynamicShowStatistics;
  1462. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowStatistics);
  1463. //
  1464. // Get the user input after parsing the data
  1465. //
  1466. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  1467. if(dwReturn != ERROR_SUCCESS)
  1468. {
  1469. if(dwReturn == RETURN_NO_ERROR)
  1470. {
  1471. dwReturn = ERROR_NO_DISPLAY;
  1472. BAIL_OUT;
  1473. }
  1474. else
  1475. {
  1476. dwReturn = ERROR_SHOW_USAGE;
  1477. BAIL_OUT;
  1478. }
  1479. }
  1480. //
  1481. // Check for user given tokens from the parser and copy into local variables
  1482. //
  1483. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  1484. {
  1485. switch(vtokDynamicShowStatistics[parser.Cmd[dwCount].dwCmdToken].dwValue)
  1486. {
  1487. case CMD_TOKEN_TYPE :
  1488. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  1489. {
  1490. dwShow = *(DWORD *)parser.Cmd[dwCount].pArg;
  1491. }
  1492. break;
  1493. default :
  1494. break;
  1495. }
  1496. }
  1497. switch(dwShow)
  1498. {
  1499. case STATS_ALL:
  1500. case STATS_IKE:
  1501. case STATS_IPSEC:
  1502. dwReturn = ShowStats(dwShow);
  1503. break;
  1504. default:
  1505. PrintMessageFromModule(g_hModule, ERROR_PARSER_STATS);
  1506. dwReturn = ERROR_NO_DISPLAY;
  1507. BAIL_OUT;
  1508. break;
  1509. }
  1510. error:
  1511. if(dwArgCount > 3)
  1512. {
  1513. CleanUp();
  1514. }
  1515. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  1516. {
  1517. //api errors
  1518. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1519. dwReturn = ERROR_SUCCESS;
  1520. }
  1521. //already one error displayed.
  1522. if(dwReturn == ERROR_NO_DISPLAY)
  1523. {
  1524. dwReturn = ERROR_SUCCESS;
  1525. }
  1526. return dwReturn;
  1527. }
  1528. ///////////////////////////////////////////////////////////////////////////////////////////
  1529. //
  1530. // Function : HandleDynamicShowMMSas
  1531. //
  1532. // Date of Creation: 9-23-2001
  1533. //
  1534. // Parameters :
  1535. // IN LPCWSTR pwszMachine,
  1536. // IN OUT LPWSTR *ppwcArguments,
  1537. // IN DWORD dwCurrentIndex,
  1538. // IN DWORD dwArgCount,
  1539. // IN DWORD dwFlags,
  1540. // IN LPCVOID pvData,
  1541. // OUT BOOL *pbDone
  1542. // Return : DWORD
  1543. //
  1544. // Description : Netshell Dynamic handle for show main mode security associations
  1545. //
  1546. // Revision History:
  1547. //
  1548. // Date Author Comments
  1549. //
  1550. //////////////////////////////////////////////////////////////////////////////////////////
  1551. DWORD WINAPI
  1552. HandleDynamicShowMMSas(
  1553. IN LPCWSTR pwszMachine,
  1554. IN OUT LPWSTR *ppwcArguments,
  1555. IN DWORD dwCurrentIndex,
  1556. IN DWORD dwArgCount,
  1557. IN DWORD dwFlags,
  1558. IN LPCVOID pvData,
  1559. OUT BOOL *pbDone
  1560. )
  1561. {
  1562. DWORD dwReturn = ERROR_SHOW_USAGE;
  1563. DWORD dwCount = 0;
  1564. BOOL bFormat = FALSE;
  1565. BOOL bResolveDNS = FALSE;
  1566. ADDR SrcAddr,DesAddr;
  1567. NshHashTable addressHash;
  1568. //
  1569. // Default values
  1570. //
  1571. SrcAddr.uIpAddr = 0xFFFFFFFF;
  1572. DesAddr.uIpAddr = 0xFFFFFFFF;
  1573. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  1574. DesAddr.AddrType = IP_ADDR_UNIQUE;
  1575. const TAG_TYPE vcmdDynamicShowMMSAs[] =
  1576. {
  1577. { CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE },
  1578. { CMD_TOKEN_STR_SRCADDR, NS_REQ_ZERO, FALSE },
  1579. { CMD_TOKEN_STR_DSTADDR, NS_REQ_ZERO, FALSE },
  1580. { CMD_TOKEN_STR_FORMAT, NS_REQ_ZERO, FALSE },
  1581. { CMD_TOKEN_STR_RESDNS, NS_REQ_ZERO, FALSE }
  1582. };
  1583. const TOKEN_VALUE vtokDynamicShowMMSAs[] =
  1584. {
  1585. { CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL },
  1586. { CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
  1587. { CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
  1588. { CMD_TOKEN_STR_FORMAT, CMD_TOKEN_FORMAT },
  1589. { CMD_TOKEN_STR_RESDNS, CMD_TOKEN_RESDNS }
  1590. };
  1591. PARSER_PKT parser;
  1592. ZeroMemory(&parser, sizeof(parser));
  1593. if(dwArgCount == 3)
  1594. {
  1595. //
  1596. // all the records are to be displayed
  1597. //
  1598. dwReturn = ShowMMSas(SrcAddr, DesAddr, bFormat, addressHash, bResolveDNS);
  1599. BAIL_OUT;
  1600. }
  1601. //
  1602. // Bail out as user has not given sufficient arguments.
  1603. //
  1604. else if(dwArgCount < 3)
  1605. {
  1606. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  1607. BAIL_OUT;
  1608. }
  1609. parser.ValidTok = vtokDynamicShowMMSAs;
  1610. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowMMSAs);
  1611. parser.ValidCmd = vcmdDynamicShowMMSAs;
  1612. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowMMSAs);
  1613. //
  1614. // Get the user input after parsing the data
  1615. //
  1616. dwReturn = Parser(pwszMachine, ppwcArguments, dwCurrentIndex, dwArgCount, &parser);
  1617. if(dwReturn != ERROR_SUCCESS)
  1618. {
  1619. if(dwReturn == RETURN_NO_ERROR)
  1620. {
  1621. dwReturn = ERROR_NO_DISPLAY;
  1622. BAIL_OUT;
  1623. }
  1624. else
  1625. {
  1626. dwReturn = ERROR_SHOW_USAGE;
  1627. BAIL_OUT;
  1628. }
  1629. }
  1630. //
  1631. // Check for user given tokens from the parser and copy into local variables
  1632. //
  1633. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  1634. {
  1635. switch(vtokDynamicShowMMSAs[parser.Cmd[dwCount].dwCmdToken].dwValue)
  1636. {
  1637. case CMD_TOKEN_ALL :
  1638. break;
  1639. case CMD_TOKEN_RESDNS :
  1640. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  1641. {
  1642. bResolveDNS = *(BOOL *)parser.Cmd[dwCount].pArg;
  1643. }
  1644. break;
  1645. case CMD_TOKEN_SRCADDR :
  1646. if (parser.Cmd[dwCount].dwStatus)
  1647. {
  1648. //
  1649. // special servers id is available in dwStatus
  1650. //
  1651. switch(parser.Cmd[dwCount].dwStatus)
  1652. {
  1653. case SERVER_WINS:
  1654. SrcAddr.AddrType = IP_ADDR_WINS_SERVER;
  1655. break;
  1656. case SERVER_DHCP:
  1657. SrcAddr.AddrType = IP_ADDR_DHCP_SERVER;
  1658. break;
  1659. case SERVER_DNS:
  1660. SrcAddr.AddrType = IP_ADDR_DNS_SERVER;
  1661. break;
  1662. case SERVER_GATEWAY:
  1663. SrcAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  1664. break;
  1665. case IP_ME:
  1666. case IP_ANY:
  1667. AddSplAddr(SrcAddr, parser.Cmd[dwCount].dwStatus);
  1668. break;
  1669. case NOT_SPLSERVER:
  1670. //
  1671. // If it is not special server get the user given IP address
  1672. //
  1673. SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  1674. break;
  1675. default:
  1676. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  1677. dwReturn = ERROR_NO_DISPLAY;
  1678. BAIL_OUT;
  1679. break;
  1680. }
  1681. }
  1682. break;
  1683. case CMD_TOKEN_DSTADDR :
  1684. if (parser.Cmd[dwCount].dwStatus)
  1685. {
  1686. //
  1687. // Special servers id is available in dwStatus
  1688. //
  1689. switch(parser.Cmd[dwCount].dwStatus)
  1690. {
  1691. case SERVER_WINS:
  1692. DesAddr.AddrType = IP_ADDR_WINS_SERVER;
  1693. break;
  1694. case SERVER_DHCP:
  1695. DesAddr.AddrType = IP_ADDR_DHCP_SERVER;
  1696. break;
  1697. case SERVER_DNS:
  1698. DesAddr.AddrType = IP_ADDR_DNS_SERVER;
  1699. break;
  1700. case SERVER_GATEWAY:
  1701. DesAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  1702. break;
  1703. case IP_ME:
  1704. case IP_ANY:
  1705. AddSplAddr(DesAddr, parser.Cmd[dwCount].dwStatus);
  1706. break;
  1707. case NOT_SPLSERVER:
  1708. //
  1709. // If it is not special server get the user given IP address
  1710. //
  1711. DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  1712. break;
  1713. default:
  1714. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  1715. dwReturn = ERROR_NO_DISPLAY;
  1716. BAIL_OUT;
  1717. break;
  1718. }
  1719. }
  1720. break;
  1721. case CMD_TOKEN_FORMAT :
  1722. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  1723. {
  1724. bFormat = *(BOOL *)parser.Cmd[dwCount].pArg;
  1725. }
  1726. break;
  1727. default :
  1728. break;
  1729. }
  1730. }
  1731. dwReturn = ShowMMSas(SrcAddr, DesAddr, bFormat, addressHash, bResolveDNS);
  1732. error:
  1733. if(dwArgCount > 3)
  1734. {
  1735. CleanUp();
  1736. }
  1737. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  1738. {
  1739. //api errors
  1740. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1741. dwReturn = ERROR_SUCCESS;
  1742. }
  1743. //already one error displayed.
  1744. if(dwReturn == ERROR_NO_DISPLAY)
  1745. {
  1746. dwReturn = ERROR_SUCCESS;
  1747. }
  1748. return dwReturn;
  1749. }
  1750. ///////////////////////////////////////////////////////////////////////////////////////////
  1751. //
  1752. //Function: HandleDynamicShowQMSas
  1753. //
  1754. //Date of Creation: 9-23-2001
  1755. //
  1756. //Parameters:
  1757. // IN LPCWSTR pwszMachine,
  1758. // IN OUT LPWSTR *ppwcArguments,
  1759. // IN DWORD dwCurrentIndex,
  1760. // IN DWORD dwArgCount,
  1761. // IN DWORD dwFlags,
  1762. // IN LPCVOID pvData,
  1763. // OUT BOOL *pbDone
  1764. //Return: DWORD
  1765. //
  1766. //Description: Netshell Dynamic handle for show quick mode security associations.
  1767. //
  1768. //Revision History:
  1769. //
  1770. // Date Author Comments
  1771. //
  1772. //////////////////////////////////////////////////////////////////////////////////////////
  1773. DWORD WINAPI
  1774. HandleDynamicShowQMSas(
  1775. IN LPCWSTR pwszMachine,
  1776. IN OUT LPWSTR *ppwcArguments,
  1777. IN DWORD dwCurrentIndex,
  1778. IN DWORD dwArgCount,
  1779. IN DWORD dwFlags,
  1780. IN LPCVOID pvData,
  1781. OUT BOOL *pbDone
  1782. )
  1783. {
  1784. DWORD dwReturn = ERROR_SHOW_USAGE;
  1785. DWORD dwCount = 0;
  1786. BOOL bFormat = FALSE;
  1787. BOOL bResolveDNS = FALSE;
  1788. ADDR SrcAddr,DesAddr;
  1789. //
  1790. // Default values
  1791. //
  1792. SrcAddr.uIpAddr = 0xFFFFFFFF;
  1793. DesAddr.uIpAddr = 0xFFFFFFFF;
  1794. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  1795. DesAddr.AddrType = IP_ADDR_UNIQUE;
  1796. SrcAddr.uSubNetMask = 0x55555555;
  1797. DesAddr.uSubNetMask = 0x55555555;
  1798. DWORD dwProtocol = 0xFFFFFFFF;
  1799. NshHashTable addressHash;
  1800. const TAG_TYPE vcmdDynamicShowQMSAs[] =
  1801. {
  1802. { CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE },
  1803. { CMD_TOKEN_STR_SRCADDR, NS_REQ_ZERO, FALSE },
  1804. { CMD_TOKEN_STR_DSTADDR, NS_REQ_ZERO, FALSE },
  1805. { CMD_TOKEN_STR_PROTO, NS_REQ_ZERO, FALSE },
  1806. { CMD_TOKEN_STR_FORMAT, NS_REQ_ZERO, FALSE },
  1807. { CMD_TOKEN_STR_RESDNS, NS_REQ_ZERO, FALSE }
  1808. };
  1809. const TOKEN_VALUE vtokDynamicShowQMSAs[] =
  1810. {
  1811. { CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL },
  1812. { CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
  1813. { CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
  1814. { CMD_TOKEN_STR_PROTO, CMD_TOKEN_PROTO },
  1815. { CMD_TOKEN_STR_FORMAT, CMD_TOKEN_FORMAT },
  1816. { CMD_TOKEN_STR_RESDNS, CMD_TOKEN_RESDNS }
  1817. };
  1818. PARSER_PKT parser;
  1819. ZeroMemory(&parser, sizeof(parser));
  1820. parser.ValidTok = vtokDynamicShowQMSAs;
  1821. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowQMSAs);
  1822. parser.ValidCmd = vcmdDynamicShowQMSAs;
  1823. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowQMSAs);
  1824. //
  1825. // Get the user input after parsing the data
  1826. //
  1827. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  1828. if(dwReturn != ERROR_SUCCESS)
  1829. {
  1830. if(dwReturn == RETURN_NO_ERROR)
  1831. {
  1832. dwReturn = ERROR_NO_DISPLAY;
  1833. BAIL_OUT;
  1834. }
  1835. else
  1836. {
  1837. dwReturn = ERROR_SHOW_USAGE;
  1838. BAIL_OUT;
  1839. }
  1840. }
  1841. //
  1842. // Check for user given tokens from the parser and copy into local variables
  1843. //
  1844. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  1845. {
  1846. switch(vtokDynamicShowQMSAs[parser.Cmd[dwCount].dwCmdToken].dwValue)
  1847. {
  1848. case CMD_TOKEN_ALL :
  1849. break;
  1850. case CMD_TOKEN_SRCADDR :
  1851. if (parser.Cmd[dwCount].dwStatus)
  1852. {
  1853. //
  1854. // Special servers id is available in dwStatus
  1855. //
  1856. switch(parser.Cmd[dwCount].dwStatus)
  1857. {
  1858. case SERVER_WINS:
  1859. SrcAddr.AddrType = IP_ADDR_WINS_SERVER;
  1860. break;
  1861. case SERVER_DHCP:
  1862. SrcAddr.AddrType = IP_ADDR_DHCP_SERVER;
  1863. break;
  1864. case SERVER_DNS:
  1865. SrcAddr.AddrType = IP_ADDR_DNS_SERVER;
  1866. break;
  1867. case SERVER_GATEWAY:
  1868. SrcAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  1869. break;
  1870. case IP_ME:
  1871. case IP_ANY:
  1872. AddSplAddr(SrcAddr, parser.Cmd[dwCount].dwStatus);
  1873. break;
  1874. case NOT_SPLSERVER:
  1875. //
  1876. // If it is not special server get the user given IP address
  1877. //
  1878. SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  1879. break;
  1880. default:
  1881. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  1882. dwReturn = ERROR_NO_DISPLAY;
  1883. BAIL_OUT;
  1884. break;
  1885. }
  1886. }
  1887. break;
  1888. case CMD_TOKEN_DSTADDR :
  1889. if (parser.Cmd[dwCount].dwStatus)
  1890. {
  1891. //
  1892. // Special servers id is available in dwStatus
  1893. //
  1894. switch(parser.Cmd[dwCount].dwStatus)
  1895. {
  1896. case SERVER_WINS:
  1897. DesAddr.AddrType = IP_ADDR_WINS_SERVER;
  1898. break;
  1899. case SERVER_DHCP:
  1900. DesAddr.AddrType = IP_ADDR_DHCP_SERVER;
  1901. break;
  1902. case SERVER_DNS:
  1903. DesAddr.AddrType = IP_ADDR_DNS_SERVER;
  1904. break;
  1905. case SERVER_GATEWAY:
  1906. DesAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  1907. break;
  1908. case IP_ME:
  1909. case IP_ANY:
  1910. AddSplAddr(DesAddr, parser.Cmd[dwCount].dwStatus);
  1911. break;
  1912. case NOT_SPLSERVER:
  1913. //
  1914. // If it is not special server get the user given IP address
  1915. //
  1916. DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  1917. break;
  1918. default:
  1919. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  1920. dwReturn = ERROR_NO_DISPLAY;
  1921. BAIL_OUT;
  1922. break;
  1923. }
  1924. }
  1925. break;
  1926. case CMD_TOKEN_PROTO :
  1927. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  1928. {
  1929. dwProtocol = *(DWORD *)parser.Cmd[dwCount].pArg;
  1930. }
  1931. break;
  1932. case CMD_TOKEN_FORMAT :
  1933. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  1934. {
  1935. bFormat = *(BOOL *)parser.Cmd[dwCount].pArg;
  1936. }
  1937. break;
  1938. case CMD_TOKEN_RESDNS :
  1939. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  1940. {
  1941. bResolveDNS = *(BOOL *)parser.Cmd[dwCount].pArg;
  1942. }
  1943. break;
  1944. default :
  1945. break;
  1946. }
  1947. }
  1948. dwReturn = ShowQMSas(SrcAddr, DesAddr, dwProtocol, addressHash, bResolveDNS);
  1949. error:
  1950. if(dwArgCount > 3)
  1951. {
  1952. CleanUp();
  1953. }
  1954. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  1955. {
  1956. //api errors
  1957. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  1958. dwReturn = ERROR_SUCCESS;
  1959. }
  1960. //already one error displayed.
  1961. if(dwReturn == ERROR_NO_DISPLAY)
  1962. {
  1963. dwReturn = ERROR_SUCCESS;
  1964. }
  1965. return dwReturn;
  1966. }
  1967. ///////////////////////////////////////////////////////////////////////////////////////////
  1968. //
  1969. // Function : HandleDynamicShowMMPolicy
  1970. //
  1971. // Date of Creation: 9-23-2001
  1972. //
  1973. // Parameters :
  1974. // IN LPCWSTR pwszMachine,
  1975. // IN OUT LPWSTR *ppwcArguments,
  1976. // IN DWORD dwCurrentIndex,
  1977. // IN DWORD dwArgCount,
  1978. // IN DWORD dwFlags,
  1979. // IN LPCVOID pvData,
  1980. // OUT BOOL *pbDone
  1981. // Return : DWORD
  1982. //
  1983. // Description : Netshell Dynamic handle for show main mode policy.
  1984. //
  1985. // Revision History:
  1986. //
  1987. // Date Author Comments
  1988. //
  1989. //////////////////////////////////////////////////////////////////////////////////////////
  1990. DWORD WINAPI
  1991. HandleDynamicShowMMPolicy(
  1992. IN LPCWSTR pwszMachine,
  1993. IN OUT LPWSTR *ppwcArguments,
  1994. IN DWORD dwCurrentIndex,
  1995. IN DWORD dwArgCount,
  1996. IN DWORD dwFlags,
  1997. IN LPCVOID pvData,
  1998. OUT BOOL *pbDone
  1999. )
  2000. {
  2001. DWORD dwReturn = ERROR_SHOW_USAGE;
  2002. DWORD dwCount = 0;
  2003. DWORD dwNameLen = 0;
  2004. LPTSTR pszPolicyName = NULL;
  2005. BOOL bAll = FALSE;
  2006. const TAG_TYPE vcmdDynamicShowMMPolicy[] =
  2007. {
  2008. { CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
  2009. { CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE }
  2010. };
  2011. const TOKEN_VALUE vtokDynamicShowMMPolicy[] =
  2012. {
  2013. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  2014. { CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL }
  2015. };
  2016. PARSER_PKT parser;
  2017. ZeroMemory(&parser, sizeof(parser));
  2018. //
  2019. // Bail out as user has not given sufficient arguments.
  2020. //
  2021. if(dwArgCount <= 3)
  2022. {
  2023. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  2024. BAIL_OUT;
  2025. }
  2026. parser.ValidTok = vtokDynamicShowMMPolicy;
  2027. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowMMPolicy);
  2028. parser.ValidCmd = vcmdDynamicShowMMPolicy;
  2029. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowMMPolicy);
  2030. //
  2031. // Get the user input after parsing the data
  2032. //
  2033. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  2034. if(dwReturn != ERROR_SUCCESS)
  2035. {
  2036. if(dwReturn == RETURN_NO_ERROR)
  2037. {
  2038. dwReturn = ERROR_NO_DISPLAY;
  2039. BAIL_OUT;
  2040. }
  2041. else
  2042. {
  2043. dwReturn = ERROR_SHOW_USAGE;
  2044. BAIL_OUT;
  2045. }
  2046. }
  2047. //
  2048. // Check for user given tokens from the parser and copy into local variables
  2049. //
  2050. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  2051. {
  2052. switch(vtokDynamicShowMMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  2053. {
  2054. case CMD_TOKEN_NAME :
  2055. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2056. {
  2057. if((LPTSTR)parser.Cmd[dwCount].pArg != NULL)
  2058. {
  2059. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  2060. pszPolicyName = new _TCHAR[dwNameLen];
  2061. if(pszPolicyName == NULL)
  2062. {
  2063. dwReturn = ERROR_OUTOFMEMORY;
  2064. BAIL_OUT;
  2065. }
  2066. _tcsncpy(pszPolicyName, (PTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  2067. }
  2068. }
  2069. break;
  2070. case CMD_TOKEN_ALL :
  2071. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2072. {
  2073. bAll = *(BOOL *)parser.Cmd[dwCount].pArg;
  2074. }
  2075. break;
  2076. default:
  2077. break;
  2078. }
  2079. }
  2080. dwReturn = ShowMMPolicy(pszPolicyName);
  2081. error:
  2082. if(dwArgCount > 3)
  2083. {
  2084. CleanUp();
  2085. }
  2086. if(pszPolicyName)
  2087. {
  2088. delete [] pszPolicyName;
  2089. }
  2090. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  2091. {
  2092. //api errors
  2093. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  2094. dwReturn = ERROR_SUCCESS;
  2095. }
  2096. //already one error displayed.
  2097. if(dwReturn == ERROR_NO_DISPLAY)
  2098. {
  2099. dwReturn = ERROR_SUCCESS;
  2100. }
  2101. return dwReturn;
  2102. }
  2103. ///////////////////////////////////////////////////////////////////////////////////////////
  2104. //
  2105. // Function : HandleDynamicShowQMPolicy
  2106. //
  2107. // Date of Creation: 9-23-2001
  2108. //
  2109. // Parameters :
  2110. // IN LPCWSTR pwszMachine,
  2111. // IN OUT LPWSTR *ppwcArguments,
  2112. // IN DWORD dwCurrentIndex,
  2113. // IN DWORD dwArgCount,
  2114. // IN DWORD dwFlags,
  2115. // IN LPCVOID pvData,
  2116. // OUT BOOL *pbDone
  2117. // Return : DWORD
  2118. //
  2119. // Description : Netshell Dynamic handle for show quick mode policy
  2120. //
  2121. // Revision History:
  2122. //
  2123. // Date Author Comments
  2124. //
  2125. //////////////////////////////////////////////////////////////////////////////////////////
  2126. DWORD WINAPI
  2127. HandleDynamicShowQMPolicy(
  2128. IN LPCWSTR pwszMachine,
  2129. IN OUT LPWSTR *ppwcArguments,
  2130. IN DWORD dwCurrentIndex,
  2131. IN DWORD dwArgCount,
  2132. IN DWORD dwFlags,
  2133. IN LPCVOID pvData,
  2134. OUT BOOL *pbDone
  2135. )
  2136. {
  2137. DWORD dwReturn = ERROR_SHOW_USAGE;
  2138. DWORD dwNameLen = 0;
  2139. DWORD dwCount = 0;
  2140. LPTSTR pszPolicyName = NULL;
  2141. BOOL bAll = FALSE;
  2142. const TAG_TYPE vcmdDynamicShowQMPolicy[] =
  2143. {
  2144. { CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
  2145. { CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE }
  2146. };
  2147. const TOKEN_VALUE vtokDynamicShowQMPolicy[] =
  2148. {
  2149. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  2150. { CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL }
  2151. };
  2152. PARSER_PKT parser;
  2153. ZeroMemory(&parser, sizeof(parser));
  2154. //
  2155. // Bail out as user has not given sufficient arguments.
  2156. //
  2157. if(dwArgCount <= 3)
  2158. {
  2159. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  2160. BAIL_OUT;
  2161. }
  2162. parser.ValidTok = vtokDynamicShowQMPolicy;
  2163. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowQMPolicy);
  2164. parser.ValidCmd = vcmdDynamicShowQMPolicy;
  2165. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowQMPolicy);
  2166. //
  2167. // Get the user input after parsing the data
  2168. //
  2169. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  2170. if(dwReturn != ERROR_SUCCESS)
  2171. {
  2172. if(dwReturn == RETURN_NO_ERROR)
  2173. {
  2174. dwReturn = ERROR_NO_DISPLAY;
  2175. BAIL_OUT;
  2176. }
  2177. else
  2178. {
  2179. dwReturn = ERROR_SHOW_USAGE;
  2180. BAIL_OUT;
  2181. }
  2182. }
  2183. //
  2184. // Check for user given tokens from the parser and copy into local variables
  2185. //
  2186. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  2187. {
  2188. switch(vtokDynamicShowQMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  2189. {
  2190. case CMD_TOKEN_NAME:
  2191. //
  2192. // Dynamic variables initialization
  2193. //
  2194. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2195. {
  2196. if((LPTSTR)parser.Cmd[dwCount].pArg != NULL)
  2197. {
  2198. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  2199. pszPolicyName = new _TCHAR[dwNameLen];
  2200. if(pszPolicyName == NULL)
  2201. {
  2202. dwReturn = ERROR_OUTOFMEMORY;
  2203. BAIL_OUT;
  2204. }
  2205. _tcsncpy(pszPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  2206. }
  2207. }
  2208. break;
  2209. case CMD_TOKEN_ALL :
  2210. //
  2211. // Dynamic variables initialization
  2212. //
  2213. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2214. {
  2215. bAll = *(BOOL *)parser.Cmd[dwCount].pArg;
  2216. }
  2217. break;
  2218. default:
  2219. break;
  2220. }
  2221. }
  2222. dwReturn = ShowQMPolicy(pszPolicyName);
  2223. error:
  2224. if(dwArgCount > 3)
  2225. {
  2226. CleanUp();
  2227. }
  2228. if(pszPolicyName)
  2229. {
  2230. delete [] pszPolicyName;
  2231. }
  2232. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  2233. {
  2234. //api errors
  2235. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  2236. dwReturn = ERROR_SUCCESS;
  2237. }
  2238. //already one error displayed.
  2239. if(dwReturn == ERROR_NO_DISPLAY)
  2240. {
  2241. dwReturn = ERROR_SUCCESS;
  2242. }
  2243. return dwReturn;
  2244. }
  2245. ///////////////////////////////////////////////////////////////////////////////////////////
  2246. //
  2247. // Function : HandleDynamicShowMMFilter
  2248. //
  2249. // Date of Creation: 9-23-2001
  2250. //
  2251. // Parameters :
  2252. // IN LPCWSTR pwszMachine,
  2253. // IN OUT LPWSTR *ppwcArguments,
  2254. // IN DWORD dwCurrentIndex,
  2255. // IN DWORD dwArgCount,
  2256. // IN DWORD dwFlags,
  2257. // IN LPCVOID pvData,
  2258. // OUT BOOL *pbDone
  2259. // Return : DWORD
  2260. //
  2261. // Description : Netshell Dynamic handle for show main mode filter.
  2262. //
  2263. // Revision History:
  2264. //
  2265. // Date Author Comments
  2266. //
  2267. //////////////////////////////////////////////////////////////////////////////////////////
  2268. DWORD WINAPI
  2269. HandleDynamicShowMMFilter(
  2270. IN LPCWSTR pwszMachine,
  2271. IN OUT LPWSTR *ppwcArguments,
  2272. IN DWORD dwCurrentIndex,
  2273. IN DWORD dwArgCount,
  2274. IN DWORD dwFlags,
  2275. IN LPCVOID pvData,
  2276. OUT BOOL *pbDone
  2277. )
  2278. {
  2279. DWORD dwReturn = ERROR_SHOW_USAGE;
  2280. DWORD dwCount = 0;
  2281. DWORD dwNameLen = 0;
  2282. LPTSTR pszFilterName = NULL;
  2283. LPTSTR pszPolicyName = NULL;
  2284. BOOL bAll = FALSE;
  2285. BOOL bType = TRUE;
  2286. DWORD dwType = FILTER_GENERIC; //default initialization to GENERIC,
  2287. BOOL bResolveDNS = FALSE;
  2288. ADDR DesAddr, SrcAddr;
  2289. BOOL bSrcMask = FALSE;
  2290. BOOL bDstMask = FALSE;
  2291. NshHashTable addressHash;
  2292. const TAG_TYPE vcmdDynamicShowMMFilter[] =
  2293. {
  2294. { CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
  2295. { CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE },
  2296. { CMD_TOKEN_STR_TYPE, NS_REQ_ZERO, FALSE },
  2297. { CMD_TOKEN_STR_SRCADDR, NS_REQ_ZERO, FALSE },
  2298. { CMD_TOKEN_STR_DSTADDR, NS_REQ_ZERO, FALSE },
  2299. { CMD_TOKEN_STR_SRCMASK, NS_REQ_ZERO, FALSE },
  2300. { CMD_TOKEN_STR_DSTMASK, NS_REQ_ZERO, FALSE },
  2301. { CMD_TOKEN_STR_RESDNS, NS_REQ_ZERO, FALSE }
  2302. };
  2303. const TOKEN_VALUE vtokDynamicShowMMFilter[] =
  2304. {
  2305. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  2306. { CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL },
  2307. { CMD_TOKEN_STR_TYPE, CMD_TOKEN_TYPE },
  2308. { CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
  2309. { CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
  2310. { CMD_TOKEN_STR_SRCMASK, CMD_TOKEN_SRCMASK },
  2311. { CMD_TOKEN_STR_DSTMASK, CMD_TOKEN_DSTMASK },
  2312. { CMD_TOKEN_STR_RESDNS, CMD_TOKEN_RESDNS }
  2313. };
  2314. PARSER_PKT parser;
  2315. ZeroMemory(&parser, sizeof(parser));
  2316. //
  2317. // Bail out as user has not given sufficient arguments.
  2318. //
  2319. if(dwArgCount <= 3)
  2320. {
  2321. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  2322. BAIL_OUT;
  2323. }
  2324. SrcAddr.uIpAddr = 0xFFFFFFFF;
  2325. DesAddr.uIpAddr = 0xFFFFFFFF;
  2326. SrcAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  2327. DesAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  2328. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  2329. DesAddr.AddrType = IP_ADDR_UNIQUE;
  2330. parser.ValidTok = vtokDynamicShowMMFilter;
  2331. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowMMFilter);
  2332. parser.ValidCmd = vcmdDynamicShowMMFilter;
  2333. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowMMFilter);
  2334. //
  2335. // Get the user input after parsing the data
  2336. //
  2337. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  2338. if(dwReturn != ERROR_SUCCESS)
  2339. {
  2340. if(dwReturn == RETURN_NO_ERROR)
  2341. {
  2342. dwReturn = ERROR_NO_DISPLAY;
  2343. BAIL_OUT;
  2344. }
  2345. else
  2346. {
  2347. dwReturn = ERROR_SHOW_USAGE;
  2348. BAIL_OUT;
  2349. }
  2350. }
  2351. //
  2352. // Check for user given tokens from the parser and copy into local variables
  2353. //
  2354. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  2355. {
  2356. switch(vtokDynamicShowMMFilter[parser.Cmd[dwCount].dwCmdToken].dwValue)
  2357. {
  2358. case CMD_TOKEN_NAME :
  2359. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2360. {
  2361. if((LPTSTR)parser.Cmd[dwCount].pArg != NULL)
  2362. {
  2363. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  2364. pszFilterName = new _TCHAR[dwNameLen];
  2365. if(pszFilterName == NULL)
  2366. {
  2367. dwReturn = ERROR_OUTOFMEMORY;
  2368. BAIL_OUT;
  2369. }
  2370. _tcsncpy(pszFilterName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  2371. }
  2372. }
  2373. break;
  2374. case CMD_TOKEN_ALL :
  2375. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2376. {
  2377. bAll = *(BOOL *)parser.Cmd[dwCount].pArg;
  2378. }
  2379. break;
  2380. case CMD_TOKEN_TYPE :
  2381. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2382. {
  2383. dwType = *(DWORD *)parser.Cmd[dwCount].pArg;
  2384. if(dwType == FILTER_GENERIC)
  2385. {
  2386. bType = TRUE;
  2387. }
  2388. else if(dwType == FILTER_SPECIFIC)
  2389. {
  2390. bType = FALSE;
  2391. }
  2392. }
  2393. break;
  2394. case CMD_TOKEN_SRCADDR :
  2395. if (parser.Cmd[dwCount].dwStatus)
  2396. {
  2397. //
  2398. // special servers id is available in dwStatus
  2399. //
  2400. switch(parser.Cmd[dwCount].dwStatus)
  2401. {
  2402. case SERVER_WINS:
  2403. SrcAddr.AddrType = IP_ADDR_WINS_SERVER;
  2404. break;
  2405. case SERVER_DHCP:
  2406. SrcAddr.AddrType = IP_ADDR_DHCP_SERVER;
  2407. break;
  2408. case SERVER_DNS:
  2409. SrcAddr.AddrType = IP_ADDR_DNS_SERVER;
  2410. break;
  2411. case SERVER_GATEWAY:
  2412. SrcAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  2413. break;
  2414. case IP_ME:
  2415. case IP_ANY:
  2416. AddSplAddr(SrcAddr, parser.Cmd[dwCount].dwStatus);
  2417. bSrcMask = TRUE;
  2418. break;
  2419. case NOT_SPLSERVER:
  2420. //
  2421. // if it is not special server get the user given IP address
  2422. //
  2423. SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  2424. break;
  2425. default:
  2426. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  2427. dwReturn = ERROR_NO_DISPLAY;
  2428. BAIL_OUT;
  2429. break;
  2430. }
  2431. }
  2432. break;
  2433. case CMD_TOKEN_SRCMASK :
  2434. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2435. {
  2436. SrcAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  2437. bSrcMask = TRUE;
  2438. }
  2439. break;
  2440. case CMD_TOKEN_DSTADDR :
  2441. if (parser.Cmd[dwCount].dwStatus)
  2442. {
  2443. // special servers id is available in dwStatus
  2444. switch(parser.Cmd[dwCount].dwStatus)
  2445. {
  2446. case SERVER_WINS:
  2447. DesAddr.AddrType = IP_ADDR_WINS_SERVER;
  2448. break;
  2449. case SERVER_DHCP:
  2450. DesAddr.AddrType = IP_ADDR_DHCP_SERVER;
  2451. break;
  2452. case SERVER_DNS:
  2453. DesAddr.AddrType = IP_ADDR_DNS_SERVER;
  2454. break;
  2455. case SERVER_GATEWAY:
  2456. DesAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  2457. break;
  2458. case IP_ME:
  2459. case IP_ANY:
  2460. AddSplAddr(DesAddr, parser.Cmd[dwCount].dwStatus);
  2461. bDstMask = TRUE;
  2462. break;
  2463. case NOT_SPLSERVER:
  2464. //
  2465. // if it is not special server get the user given IP address
  2466. //
  2467. DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  2468. break;
  2469. default:
  2470. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  2471. dwReturn = ERROR_NO_DISPLAY;
  2472. BAIL_OUT;
  2473. break;
  2474. }
  2475. }
  2476. break;
  2477. case CMD_TOKEN_DSTMASK :
  2478. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2479. {
  2480. DesAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  2481. bDstMask = TRUE;
  2482. }
  2483. break;
  2484. case CMD_TOKEN_RESDNS :
  2485. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2486. {
  2487. bResolveDNS = *(BOOL *)parser.Cmd[dwCount].pArg;
  2488. }
  2489. break;
  2490. default:
  2491. break;
  2492. }
  2493. }
  2494. //
  2495. // if name is NULL then all the filters are displayed.
  2496. //
  2497. dwReturn = ShowMMFilters(pszFilterName, bType, SrcAddr, DesAddr, addressHash, bResolveDNS, bSrcMask, bDstMask);
  2498. error:
  2499. if(dwArgCount > 3)
  2500. {
  2501. CleanUp();
  2502. }
  2503. if(pszFilterName)
  2504. {
  2505. delete [] pszFilterName;
  2506. }
  2507. if(pszPolicyName)
  2508. {
  2509. delete [] pszPolicyName;
  2510. }
  2511. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  2512. {
  2513. //api errors
  2514. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  2515. dwReturn = ERROR_SUCCESS;
  2516. }
  2517. //already one error displayed.
  2518. if(dwReturn == ERROR_NO_DISPLAY)
  2519. {
  2520. dwReturn = ERROR_SUCCESS;
  2521. }
  2522. return dwReturn;
  2523. }
  2524. ///////////////////////////////////////////////////////////////////////////////////////////
  2525. //
  2526. // Function : HandleDynamicShowQMFilter
  2527. //
  2528. // Date of Creation: 9-23-2001
  2529. //
  2530. // Parameters :
  2531. // IN LPCWSTR pwszMachine,
  2532. // IN OUT LPWSTR *ppwcArguments,
  2533. // IN DWORD dwCurrentIndex,
  2534. // IN DWORD dwArgCount,
  2535. // IN DWORD dwFlags,
  2536. // IN LPCVOID pvData,
  2537. // OUT BOOL *pbDone
  2538. // Return : DWORD
  2539. //
  2540. // Description : Netshell Dynamic handle for quick mode filter.
  2541. //
  2542. // Revision History:
  2543. //
  2544. // Date Author Comments
  2545. //
  2546. //////////////////////////////////////////////////////////////////////////////////////////
  2547. DWORD WINAPI
  2548. HandleDynamicShowQMFilter(
  2549. IN LPCWSTR pwszMachine,
  2550. IN OUT LPWSTR *ppwcArguments,
  2551. IN DWORD dwCurrentIndex,
  2552. IN DWORD dwArgCount,
  2553. IN DWORD dwFlags,
  2554. IN LPCVOID pvData,
  2555. OUT BOOL *pbDone
  2556. )
  2557. {
  2558. DWORD dwReturn = ERROR_SHOW_USAGE;
  2559. DWORD dwCount = 0;
  2560. DWORD dwNameLen = 0;
  2561. LPTSTR pszFilterName = NULL;
  2562. BOOL bAll = FALSE;
  2563. BOOL bType = TRUE;
  2564. DWORD dwType = FILTER_GENERIC; // Default initialization to GENERIC
  2565. BOOL bResolveDNS = FALSE;
  2566. ADDR DesAddr, SrcAddr;
  2567. BOOL bSrcMask = FALSE;
  2568. BOOL bDstMask = FALSE;
  2569. QM_FILTER_VALUE_BOOL QmBoolValue;
  2570. NshHashTable addressHash;
  2571. const TAG_TYPE vcmdDynamicShowQMFilter[] =
  2572. {
  2573. { CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
  2574. { CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE },
  2575. { CMD_TOKEN_STR_TYPE, NS_REQ_ZERO, FALSE },
  2576. { CMD_TOKEN_STR_SRCADDR, NS_REQ_ZERO, FALSE },
  2577. { CMD_TOKEN_STR_DSTADDR, NS_REQ_ZERO, FALSE },
  2578. { CMD_TOKEN_STR_SRCMASK, NS_REQ_ZERO, FALSE },
  2579. { CMD_TOKEN_STR_DSTMASK, NS_REQ_ZERO, FALSE },
  2580. { CMD_TOKEN_STR_PROTO, NS_REQ_ZERO, FALSE },
  2581. { CMD_TOKEN_STR_SRCPORT, NS_REQ_ZERO, FALSE },
  2582. { CMD_TOKEN_STR_DSTPORT, NS_REQ_ZERO, FALSE },
  2583. { CMD_TOKEN_STR_INBOUND, NS_REQ_ZERO, FALSE },
  2584. { CMD_TOKEN_STR_OUTBOUND, NS_REQ_ZERO, FALSE },
  2585. { CMD_TOKEN_STR_RESDNS, NS_REQ_ZERO, FALSE }
  2586. };
  2587. const TOKEN_VALUE vtokDynamicShowQMFilter[] =
  2588. {
  2589. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  2590. { CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL },
  2591. { CMD_TOKEN_STR_TYPE, CMD_TOKEN_TYPE },
  2592. { CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
  2593. { CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
  2594. { CMD_TOKEN_STR_SRCMASK, CMD_TOKEN_SRCMASK },
  2595. { CMD_TOKEN_STR_DSTMASK, CMD_TOKEN_DSTMASK },
  2596. { CMD_TOKEN_STR_PROTO, CMD_TOKEN_PROTO },
  2597. { CMD_TOKEN_STR_SRCPORT, CMD_TOKEN_SRCPORT },
  2598. { CMD_TOKEN_STR_DSTPORT, CMD_TOKEN_DSTPORT },
  2599. { CMD_TOKEN_STR_INBOUND, CMD_TOKEN_INBOUND },
  2600. { CMD_TOKEN_STR_OUTBOUND, CMD_TOKEN_OUTBOUND },
  2601. { CMD_TOKEN_STR_RESDNS, CMD_TOKEN_RESDNS }
  2602. };
  2603. PARSER_PKT parser;
  2604. ZeroMemory(&parser, sizeof(parser));
  2605. QmBoolValue.bSrcPort = FALSE;
  2606. QmBoolValue.bDstPort = FALSE;
  2607. QmBoolValue.bProtocol = FALSE;
  2608. QmBoolValue.bActionInbound = FALSE;
  2609. QmBoolValue.bActionOutbound = FALSE;
  2610. //
  2611. // Bail out as user has not given sufficient arguments.
  2612. //
  2613. if(dwArgCount <= 3)
  2614. {
  2615. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  2616. BAIL_OUT;
  2617. }
  2618. SrcAddr.uIpAddr = 0xFFFFFFFF;
  2619. DesAddr.uIpAddr = 0xFFFFFFFF;
  2620. SrcAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  2621. DesAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  2622. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  2623. DesAddr.AddrType = IP_ADDR_UNIQUE;
  2624. parser.ValidTok = vtokDynamicShowQMFilter;
  2625. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowQMFilter);
  2626. parser.ValidCmd = vcmdDynamicShowQMFilter;
  2627. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowQMFilter);
  2628. //
  2629. // Get the user input after parsing the data
  2630. //
  2631. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  2632. if(dwReturn != ERROR_SUCCESS)
  2633. {
  2634. if(dwReturn == RETURN_NO_ERROR)
  2635. {
  2636. dwReturn = ERROR_NO_DISPLAY;
  2637. BAIL_OUT;
  2638. }
  2639. else
  2640. {
  2641. dwReturn = ERROR_SHOW_USAGE;
  2642. BAIL_OUT;
  2643. }
  2644. }
  2645. //
  2646. // Check for user given tokens from the parser and copy into local variables
  2647. //
  2648. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  2649. {
  2650. switch(vtokDynamicShowQMFilter[parser.Cmd[dwCount].dwCmdToken].dwValue)
  2651. {
  2652. case CMD_TOKEN_NAME :
  2653. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2654. {
  2655. if((LPTSTR)parser.Cmd[dwCount].pArg != NULL)
  2656. {
  2657. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  2658. pszFilterName = new _TCHAR[dwNameLen];
  2659. if(pszFilterName == NULL)
  2660. {
  2661. dwReturn = ERROR_OUTOFMEMORY;
  2662. BAIL_OUT;
  2663. }
  2664. _tcsncpy(pszFilterName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  2665. }
  2666. }
  2667. break;
  2668. case CMD_TOKEN_ALL :
  2669. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2670. {
  2671. bAll = *(BOOL *)parser.Cmd[dwCount].pArg;
  2672. }
  2673. break;
  2674. case CMD_TOKEN_TYPE :
  2675. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2676. {
  2677. dwType = *(DWORD *)parser.Cmd[dwCount].pArg;
  2678. if(dwType == FILTER_GENERIC)
  2679. {
  2680. bType = TRUE;
  2681. }
  2682. else if(dwType == FILTER_SPECIFIC)
  2683. {
  2684. bType = FALSE;
  2685. }
  2686. }
  2687. break;
  2688. case CMD_TOKEN_SRCADDR :
  2689. if (parser.Cmd[dwCount].dwStatus)
  2690. {
  2691. //
  2692. // special servers id is available in dwStatus
  2693. //
  2694. switch(parser.Cmd[dwCount].dwStatus)
  2695. {
  2696. case SERVER_WINS:
  2697. SrcAddr.AddrType = IP_ADDR_WINS_SERVER;
  2698. break;
  2699. case SERVER_DHCP:
  2700. SrcAddr.AddrType = IP_ADDR_DHCP_SERVER;
  2701. break;
  2702. case SERVER_DNS:
  2703. SrcAddr.AddrType = IP_ADDR_DNS_SERVER;
  2704. break;
  2705. case SERVER_GATEWAY:
  2706. SrcAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  2707. break;
  2708. case IP_ME:
  2709. case IP_ANY:
  2710. AddSplAddr(SrcAddr, parser.Cmd[dwCount].dwStatus);
  2711. bSrcMask = TRUE;
  2712. break;
  2713. case NOT_SPLSERVER:
  2714. //
  2715. // if it is not special server get the user given IP address
  2716. //
  2717. SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  2718. break;
  2719. default:
  2720. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  2721. dwReturn = ERROR_NO_DISPLAY;
  2722. BAIL_OUT;
  2723. break;
  2724. }
  2725. }
  2726. break;
  2727. case CMD_TOKEN_SRCMASK :
  2728. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2729. {
  2730. SrcAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  2731. bSrcMask = TRUE;
  2732. }
  2733. break;
  2734. case CMD_TOKEN_DSTADDR :
  2735. if (parser.Cmd[dwCount].dwStatus)
  2736. {
  2737. //
  2738. // special servers id is available in dwStatus
  2739. //
  2740. switch(parser.Cmd[dwCount].dwStatus)
  2741. {
  2742. case SERVER_WINS:
  2743. DesAddr.AddrType = IP_ADDR_WINS_SERVER;
  2744. break;
  2745. case SERVER_DHCP:
  2746. DesAddr.AddrType = IP_ADDR_DHCP_SERVER;
  2747. break;
  2748. case SERVER_DNS:
  2749. DesAddr.AddrType = IP_ADDR_DNS_SERVER;
  2750. break;
  2751. case SERVER_GATEWAY:
  2752. DesAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  2753. break;
  2754. case IP_ME:
  2755. case IP_ANY:
  2756. AddSplAddr(DesAddr, parser.Cmd[dwCount].dwStatus);
  2757. bDstMask = TRUE;
  2758. break;
  2759. case NOT_SPLSERVER:
  2760. //
  2761. // if it is not special server get the user given IP address
  2762. //
  2763. DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  2764. break;
  2765. default:
  2766. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  2767. dwReturn = ERROR_NO_DISPLAY;
  2768. BAIL_OUT;
  2769. break;
  2770. }
  2771. }
  2772. break;
  2773. case CMD_TOKEN_DSTMASK :
  2774. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2775. {
  2776. DesAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  2777. bDstMask = TRUE;
  2778. }
  2779. break;
  2780. case CMD_TOKEN_RESDNS :
  2781. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2782. {
  2783. bResolveDNS = *(BOOL *)parser.Cmd[dwCount].pArg;
  2784. }
  2785. break;
  2786. case CMD_TOKEN_INBOUND :
  2787. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2788. {
  2789. if(*(DWORD *)parser.Cmd[dwCount].pArg==1)
  2790. {
  2791. QmBoolValue.dwActionInbound = PASS_THRU;
  2792. }
  2793. else if(*(DWORD *)parser.Cmd[dwCount].pArg==2)
  2794. {
  2795. QmBoolValue.dwActionInbound = BLOCKING;
  2796. }
  2797. else if(*(DWORD *)parser.Cmd[dwCount].pArg==3)
  2798. {
  2799. QmBoolValue.dwActionInbound = NEGOTIATE_SECURITY;
  2800. }
  2801. QmBoolValue.bActionOutbound = TRUE;
  2802. }
  2803. break;
  2804. case CMD_TOKEN_OUTBOUND :
  2805. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2806. {
  2807. if(*(DWORD *)parser.Cmd[dwCount].pArg==1)
  2808. {
  2809. QmBoolValue.dwActionOutbound = PASS_THRU;
  2810. }
  2811. else if(*(DWORD *)parser.Cmd[dwCount].pArg==2)
  2812. {
  2813. QmBoolValue.dwActionOutbound = BLOCKING;
  2814. }
  2815. else if(*(DWORD *)parser.Cmd[dwCount].pArg==3)
  2816. {
  2817. QmBoolValue.dwActionOutbound = NEGOTIATE_SECURITY;
  2818. }
  2819. QmBoolValue.bActionInbound = TRUE;
  2820. }
  2821. break;
  2822. case CMD_TOKEN_SRCPORT :
  2823. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2824. {
  2825. QmBoolValue.dwSrcPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  2826. QmBoolValue.bSrcPort = TRUE;
  2827. }
  2828. break;
  2829. case CMD_TOKEN_DSTPORT :
  2830. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2831. {
  2832. QmBoolValue.dwDstPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  2833. QmBoolValue.bDstPort = TRUE;
  2834. }
  2835. break;
  2836. case CMD_TOKEN_PROTO :
  2837. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  2838. {
  2839. QmBoolValue.dwProtocol = *(DWORD *)parser.Cmd[dwCount].pArg;
  2840. QmBoolValue.bProtocol = TRUE;
  2841. }
  2842. break;
  2843. default:
  2844. break;
  2845. }
  2846. }
  2847. //
  2848. // if pszFilterName is null then all the qmfilters will be displayed
  2849. //
  2850. dwReturn = ShowQMFilters(pszFilterName, bType, SrcAddr, DesAddr, addressHash, bResolveDNS, bSrcMask, bDstMask, QmBoolValue);
  2851. error:
  2852. if(dwArgCount > 3)
  2853. {
  2854. CleanUp();
  2855. }
  2856. if(pszFilterName)
  2857. {
  2858. delete [] pszFilterName;
  2859. }
  2860. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  2861. {
  2862. //api errors
  2863. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  2864. dwReturn = ERROR_SUCCESS;
  2865. }
  2866. //already one error displayed.
  2867. if(dwReturn == ERROR_NO_DISPLAY)
  2868. {
  2869. dwReturn = ERROR_SUCCESS;
  2870. }
  2871. return dwReturn;
  2872. }
  2873. ///////////////////////////////////////////////////////////////////////////////////////////
  2874. //
  2875. // Function : HandleDynamicShowRule
  2876. //
  2877. // Date of Creation: 9-23-2001
  2878. //
  2879. // Parameters :
  2880. // IN LPCWSTR pwszMachine,
  2881. // IN OUT LPWSTR *ppwcArguments,
  2882. // IN DWORD dwCurrentIndex,
  2883. // IN DWORD dwArgCount,
  2884. // IN DWORD dwFlags,
  2885. // IN LPCVOID pvData,
  2886. // OUT BOOL *pbDone
  2887. // Return : DWORD
  2888. //
  2889. // Description : Netshell Dynamic handle for quick mode filter.
  2890. //
  2891. // Revision History:
  2892. //
  2893. // Date Author Comments
  2894. //
  2895. //////////////////////////////////////////////////////////////////////////////////////////
  2896. DWORD WINAPI
  2897. HandleDynamicShowRule(
  2898. IN LPCWSTR pwszMachine,
  2899. IN OUT LPWSTR *ppwcArguments,
  2900. IN DWORD dwCurrentIndex,
  2901. IN DWORD dwArgCount,
  2902. IN DWORD dwFlags,
  2903. IN LPCVOID pvData,
  2904. OUT BOOL *pbDone
  2905. )
  2906. {
  2907. DWORD dwReturn = ERROR_SHOW_USAGE;
  2908. DWORD dwCount = 0;
  2909. DWORD dwType = 0; // Default initialization to show both Transport and tunnel
  2910. BOOL bResolveDNS = FALSE;
  2911. ADDR DesAddr, SrcAddr;
  2912. BOOL bSrcMask = FALSE;
  2913. BOOL bDstMask = FALSE;
  2914. QM_FILTER_VALUE_BOOL QmBoolValue;
  2915. NshHashTable addressHash;
  2916. const TAG_TYPE vcmdDynamicShowRule[] =
  2917. {
  2918. { CMD_TOKEN_STR_TYPE, NS_REQ_ZERO, FALSE },
  2919. { CMD_TOKEN_STR_SRCADDR, NS_REQ_ZERO, FALSE },
  2920. { CMD_TOKEN_STR_DSTADDR, NS_REQ_ZERO, FALSE },
  2921. { CMD_TOKEN_STR_SRCMASK, NS_REQ_ZERO, FALSE },
  2922. { CMD_TOKEN_STR_DSTMASK, NS_REQ_ZERO, FALSE },
  2923. { CMD_TOKEN_STR_PROTO, NS_REQ_ZERO, FALSE },
  2924. { CMD_TOKEN_STR_SRCPORT, NS_REQ_ZERO, FALSE },
  2925. { CMD_TOKEN_STR_DSTPORT, NS_REQ_ZERO, FALSE },
  2926. { CMD_TOKEN_STR_INBOUND, NS_REQ_ZERO, FALSE },
  2927. { CMD_TOKEN_STR_OUTBOUND, NS_REQ_ZERO, FALSE },
  2928. { CMD_TOKEN_STR_RESDNS, NS_REQ_ZERO, FALSE }
  2929. };
  2930. const TOKEN_VALUE vtokDynamicShowRule[] =
  2931. {
  2932. { CMD_TOKEN_STR_TYPE, CMD_TOKEN_TYPE },
  2933. { CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
  2934. { CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
  2935. { CMD_TOKEN_STR_SRCMASK, CMD_TOKEN_SRCMASK },
  2936. { CMD_TOKEN_STR_DSTMASK, CMD_TOKEN_DSTMASK },
  2937. { CMD_TOKEN_STR_PROTO, CMD_TOKEN_PROTO },
  2938. { CMD_TOKEN_STR_SRCPORT, CMD_TOKEN_SRCPORT },
  2939. { CMD_TOKEN_STR_DSTPORT, CMD_TOKEN_DSTPORT },
  2940. { CMD_TOKEN_STR_INBOUND, CMD_TOKEN_INBOUND },
  2941. { CMD_TOKEN_STR_OUTBOUND, CMD_TOKEN_OUTBOUND },
  2942. { CMD_TOKEN_STR_RESDNS, CMD_TOKEN_RESDNS }
  2943. };
  2944. PARSER_PKT parser;
  2945. ZeroMemory(&parser, sizeof(parser));
  2946. QmBoolValue.bSrcPort = FALSE;
  2947. QmBoolValue.bDstPort = FALSE;
  2948. QmBoolValue.bProtocol = FALSE;
  2949. QmBoolValue.bActionInbound = FALSE;
  2950. QmBoolValue.bActionOutbound = FALSE;
  2951. SrcAddr.uIpAddr = 0xFFFFFFFF;
  2952. DesAddr.uIpAddr = 0xFFFFFFFF;
  2953. SrcAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  2954. DesAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  2955. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  2956. DesAddr.AddrType = IP_ADDR_UNIQUE;
  2957. //
  2958. // if no arguments are given show all the rules
  2959. //
  2960. if(dwArgCount == 3)
  2961. {
  2962. dwReturn = ShowRule(dwType, SrcAddr, DesAddr, addressHash, bResolveDNS, bSrcMask, bDstMask, QmBoolValue);
  2963. BAIL_OUT;
  2964. }
  2965. //
  2966. // Bail out as user has not given sufficient arguments.
  2967. //
  2968. else if(dwArgCount < 3)
  2969. {
  2970. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  2971. BAIL_OUT;
  2972. }
  2973. parser.ValidTok = vtokDynamicShowRule;
  2974. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicShowRule);
  2975. parser.ValidCmd = vcmdDynamicShowRule;
  2976. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicShowRule);
  2977. //
  2978. // Get the user input after parsing the data
  2979. //
  2980. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  2981. if(dwReturn != ERROR_SUCCESS)
  2982. {
  2983. if(dwReturn == RETURN_NO_ERROR)
  2984. {
  2985. dwReturn = ERROR_NO_DISPLAY;
  2986. BAIL_OUT;
  2987. }
  2988. else
  2989. {
  2990. dwReturn = ERROR_SHOW_USAGE;
  2991. BAIL_OUT;
  2992. }
  2993. }
  2994. //
  2995. // Check for user given tokens from the parser and copy into local variables
  2996. //
  2997. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  2998. {
  2999. switch(vtokDynamicShowRule[parser.Cmd[dwCount].dwCmdToken].dwValue)
  3000. {
  3001. case CMD_TOKEN_TYPE :
  3002. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3003. {
  3004. dwType = *(DWORD *)parser.Cmd[dwCount].pArg;
  3005. }
  3006. break;
  3007. case CMD_TOKEN_SRCADDR :
  3008. if (parser.Cmd[dwCount].dwStatus)
  3009. {
  3010. //
  3011. // special servers id is available in dwStatus
  3012. //
  3013. switch(parser.Cmd[dwCount].dwStatus)
  3014. {
  3015. case SERVER_WINS:
  3016. SrcAddr.AddrType = IP_ADDR_WINS_SERVER;
  3017. break;
  3018. case SERVER_DHCP:
  3019. SrcAddr.AddrType = IP_ADDR_DHCP_SERVER;
  3020. break;
  3021. case SERVER_DNS:
  3022. SrcAddr.AddrType = IP_ADDR_DNS_SERVER;
  3023. break;
  3024. case SERVER_GATEWAY:
  3025. SrcAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  3026. break;
  3027. case IP_ME:
  3028. case IP_ANY:
  3029. AddSplAddr(SrcAddr, parser.Cmd[dwCount].dwStatus);
  3030. bSrcMask = TRUE;
  3031. break;
  3032. case NOT_SPLSERVER:
  3033. //
  3034. // if it is not special server get the user given IP address
  3035. //
  3036. SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  3037. break;
  3038. default:
  3039. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  3040. dwReturn = ERROR_NO_DISPLAY;
  3041. BAIL_OUT;
  3042. break;
  3043. }
  3044. }
  3045. break;
  3046. case CMD_TOKEN_SRCMASK :
  3047. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3048. {
  3049. SrcAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  3050. bSrcMask = TRUE;
  3051. }
  3052. break;
  3053. case CMD_TOKEN_DSTADDR :
  3054. if (parser.Cmd[dwCount].dwStatus)
  3055. {
  3056. //
  3057. // special servers id is available in dwStatus
  3058. //
  3059. switch(parser.Cmd[dwCount].dwStatus)
  3060. {
  3061. case SERVER_WINS:
  3062. DesAddr.AddrType = IP_ADDR_WINS_SERVER;
  3063. break;
  3064. case SERVER_DHCP:
  3065. DesAddr.AddrType = IP_ADDR_DHCP_SERVER;
  3066. break;
  3067. case SERVER_DNS:
  3068. DesAddr.AddrType = IP_ADDR_DNS_SERVER;
  3069. break;
  3070. case SERVER_GATEWAY:
  3071. DesAddr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  3072. break;
  3073. case IP_ME:
  3074. case IP_ANY:
  3075. AddSplAddr(DesAddr, parser.Cmd[dwCount].dwStatus);
  3076. bDstMask = TRUE;
  3077. break;
  3078. case NOT_SPLSERVER:
  3079. //
  3080. // if it is not special server get the user given IP address
  3081. //
  3082. DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  3083. break;
  3084. default:
  3085. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  3086. dwReturn = ERROR_NO_DISPLAY;
  3087. BAIL_OUT;
  3088. break;
  3089. }
  3090. }
  3091. break;
  3092. case CMD_TOKEN_DSTMASK :
  3093. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3094. {
  3095. DesAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  3096. bDstMask = TRUE;
  3097. }
  3098. break;
  3099. case CMD_TOKEN_RESDNS :
  3100. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3101. {
  3102. bResolveDNS = *(BOOL *)parser.Cmd[dwCount].pArg;
  3103. }
  3104. break;
  3105. case CMD_TOKEN_INBOUND :
  3106. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3107. {
  3108. if(*(DWORD *)parser.Cmd[dwCount].pArg==1)
  3109. {
  3110. QmBoolValue.dwActionInbound = PASS_THRU;
  3111. }
  3112. else if(*(DWORD *)parser.Cmd[dwCount].pArg==2)
  3113. {
  3114. QmBoolValue.dwActionInbound = BLOCKING;
  3115. }
  3116. else if(*(DWORD *)parser.Cmd[dwCount].pArg==3)
  3117. {
  3118. QmBoolValue.dwActionInbound = NEGOTIATE_SECURITY;
  3119. }
  3120. QmBoolValue.bActionOutbound = TRUE;
  3121. }
  3122. break;
  3123. case CMD_TOKEN_OUTBOUND :
  3124. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3125. {
  3126. if(*(DWORD *)parser.Cmd[dwCount].pArg==1)
  3127. {
  3128. QmBoolValue.dwActionOutbound = PASS_THRU;
  3129. }
  3130. else if(*(DWORD *)parser.Cmd[dwCount].pArg==2)
  3131. {
  3132. QmBoolValue.dwActionOutbound = BLOCKING;
  3133. }
  3134. else if(*(DWORD *)parser.Cmd[dwCount].pArg==3)
  3135. {
  3136. QmBoolValue.dwActionOutbound = NEGOTIATE_SECURITY;
  3137. }
  3138. QmBoolValue.bActionInbound = TRUE;
  3139. }
  3140. break;
  3141. case CMD_TOKEN_SRCPORT :
  3142. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3143. {
  3144. QmBoolValue.dwSrcPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  3145. QmBoolValue.bSrcPort = TRUE;
  3146. }
  3147. break;
  3148. case CMD_TOKEN_DSTPORT :
  3149. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3150. {
  3151. QmBoolValue.dwDstPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  3152. QmBoolValue.bDstPort = TRUE;
  3153. }
  3154. break;
  3155. case CMD_TOKEN_PROTO :
  3156. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3157. {
  3158. QmBoolValue.dwProtocol = *(DWORD *)parser.Cmd[dwCount].pArg;
  3159. QmBoolValue.bProtocol = TRUE;
  3160. }
  3161. break;
  3162. default:
  3163. break;
  3164. }
  3165. }
  3166. dwReturn = ShowRule(dwType, SrcAddr, DesAddr, addressHash, bResolveDNS, bSrcMask, bDstMask, QmBoolValue);
  3167. error:
  3168. if(dwArgCount > 3)
  3169. {
  3170. CleanUp();
  3171. }
  3172. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  3173. {
  3174. //api errors
  3175. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3176. dwReturn = ERROR_SUCCESS;
  3177. }
  3178. //already one error displayed.
  3179. if(dwReturn == ERROR_NO_DISPLAY)
  3180. {
  3181. dwReturn = ERROR_SUCCESS;
  3182. }
  3183. return dwReturn;
  3184. }
  3185. ///////////////////////////////////////////////////////////////////////////////////////////
  3186. //
  3187. // Function : HandleDynamicDeleteQMPolicy
  3188. //
  3189. // Date of Creation: 9-23-2001
  3190. //
  3191. // Parameters :
  3192. // IN LPCWSTR pwszMachine,
  3193. // IN OUT LPWSTR *ppwcArguments,
  3194. // IN DWORD dwCurrentIndex,
  3195. // IN DWORD dwArgCount,
  3196. // IN DWORD dwFlags,
  3197. // IN LPCVOID pvData,
  3198. // OUT BOOL *pbDone
  3199. // Return : DWORD
  3200. //
  3201. // Description : Netshell Dynamic handle for quick mode policy.
  3202. //
  3203. // Revision History:
  3204. //
  3205. // Date Author Comments
  3206. //
  3207. //////////////////////////////////////////////////////////////////////////////////////////
  3208. DWORD WINAPI
  3209. HandleDynamicDeleteQMPolicy(
  3210. IN LPCWSTR pwszMachine,
  3211. IN OUT LPWSTR *ppwcArguments,
  3212. IN DWORD dwCurrentIndex,
  3213. IN DWORD dwArgCount,
  3214. IN DWORD dwFlags,
  3215. IN LPCVOID pvData,
  3216. OUT BOOL *pbDone
  3217. )
  3218. {
  3219. DWORD dwReturn = ERROR_SHOW_USAGE;
  3220. DWORD dwNameLen = 0;
  3221. DWORD dwCount = 0;
  3222. LPTSTR pPolicyName = NULL;
  3223. const TAG_TYPE vcmdDynamicDeleteQMPolicy[] =
  3224. {
  3225. { CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
  3226. { CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE }
  3227. };
  3228. const TOKEN_VALUE vtokDynamicDeleteQMPolicy[] =
  3229. {
  3230. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  3231. { CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL }
  3232. };
  3233. PARSER_PKT parser;
  3234. ZeroMemory(&parser, sizeof(parser));
  3235. //
  3236. // Bail out as user has not given sufficient arguments.
  3237. //
  3238. if(dwArgCount <= 3)
  3239. {
  3240. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  3241. BAIL_OUT;
  3242. }
  3243. parser.ValidTok = vtokDynamicDeleteQMPolicy;
  3244. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicDeleteQMPolicy);
  3245. parser.ValidCmd = vcmdDynamicDeleteQMPolicy;
  3246. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicDeleteQMPolicy);
  3247. //
  3248. // Get the user input after parsing the data
  3249. //
  3250. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  3251. if(dwReturn != ERROR_SUCCESS)
  3252. {
  3253. if(dwReturn == RETURN_NO_ERROR)
  3254. {
  3255. dwReturn = ERROR_NO_DISPLAY;
  3256. BAIL_OUT;
  3257. }
  3258. else
  3259. {
  3260. dwReturn = ERROR_SHOW_USAGE;
  3261. BAIL_OUT;
  3262. }
  3263. }
  3264. //
  3265. // Check for user given tokens from the parser and copy into local variables
  3266. //
  3267. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  3268. {
  3269. switch(vtokDynamicDeleteQMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  3270. {
  3271. case CMD_TOKEN_NAME :
  3272. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3273. {
  3274. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  3275. pPolicyName = new _TCHAR[dwNameLen];
  3276. if(pPolicyName == NULL)
  3277. {
  3278. dwReturn = ERROR_OUTOFMEMORY;
  3279. BAIL_OUT;
  3280. }
  3281. _tcsncpy(pPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  3282. }
  3283. break;
  3284. case CMD_TOKEN_ALL : // if pPolicyName is NULL, deletes all
  3285. break;
  3286. default :
  3287. break;
  3288. }
  3289. }
  3290. dwReturn = DeleteQMPolicy(pPolicyName);
  3291. if(dwReturn == ERROR_NO_DISPLAY)
  3292. {
  3293. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_NO_QMPOLICY);
  3294. }
  3295. error:
  3296. if(dwArgCount > 3)
  3297. {
  3298. CleanUp();
  3299. }
  3300. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  3301. {
  3302. //api errors
  3303. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3304. dwReturn = ERROR_SUCCESS;
  3305. }
  3306. //already one error displayed.
  3307. if(dwReturn == ERROR_NO_DISPLAY)
  3308. {
  3309. dwReturn = ERROR_SUCCESS;
  3310. }
  3311. return dwReturn;
  3312. }
  3313. ///////////////////////////////////////////////////////////////////////////////////////////
  3314. //
  3315. // Function : HandleDynamicDeleteMMPolicy
  3316. //
  3317. // Date of Creation: 9-23-2001
  3318. //
  3319. // Parameters:
  3320. // IN LPCWSTR pwszMachine,
  3321. // IN OUT LPWSTR *ppwcArguments,
  3322. // IN DWORD dwCurrentIndex,
  3323. // IN DWORD dwArgCount,
  3324. // IN DWORD dwFlags,
  3325. // IN LPCVOID pvData,
  3326. // OUT BOOL *pbDone
  3327. // Return : DWORD
  3328. //
  3329. // Description : Netshell Dynamic handle for delete main mode policy
  3330. //
  3331. // Revision History:
  3332. //
  3333. // Date Author Comments
  3334. //
  3335. //////////////////////////////////////////////////////////////////////////////////////////
  3336. DWORD WINAPI
  3337. HandleDynamicDeleteMMPolicy(
  3338. IN LPCWSTR pwszMachine,
  3339. IN OUT LPWSTR *ppwcArguments,
  3340. IN DWORD dwCurrentIndex,
  3341. IN DWORD dwArgCount,
  3342. IN DWORD dwFlags,
  3343. IN LPCVOID pvData,
  3344. OUT BOOL *pbDone
  3345. )
  3346. {
  3347. DWORD dwReturn = ERROR_SHOW_USAGE;
  3348. DWORD dwNameLen = 0;
  3349. DWORD dwCount = 0;
  3350. LPTSTR pPolicyName = NULL;
  3351. const TAG_TYPE vcmdDynamicDeleteMMPolicy[] =
  3352. {
  3353. { CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
  3354. { CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE }
  3355. };
  3356. const TOKEN_VALUE vtokDynamicDeleteMMPolicy[] =
  3357. {
  3358. { CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
  3359. { CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL }
  3360. };
  3361. PARSER_PKT parser;
  3362. ZeroMemory(&parser, sizeof(parser));
  3363. //
  3364. // Bail out as user has not given sufficient arguments.
  3365. //
  3366. if(dwArgCount <= 3)
  3367. {
  3368. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  3369. BAIL_OUT;
  3370. }
  3371. parser.ValidTok = vtokDynamicDeleteMMPolicy;
  3372. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicDeleteMMPolicy);
  3373. parser.ValidCmd = vcmdDynamicDeleteMMPolicy;
  3374. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicDeleteMMPolicy);
  3375. //
  3376. // Get the user input after parsing the data
  3377. //
  3378. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  3379. if(dwReturn != ERROR_SUCCESS)
  3380. {
  3381. if(dwReturn == RETURN_NO_ERROR)
  3382. {
  3383. //
  3384. // This is to avoid multiple error messages display
  3385. //
  3386. dwReturn = ERROR_NO_DISPLAY;
  3387. BAIL_OUT;
  3388. }
  3389. else
  3390. {
  3391. dwReturn = ERROR_SHOW_USAGE;
  3392. BAIL_OUT;
  3393. }
  3394. }
  3395. //
  3396. // Check for user given tokens from the parser and copy into local variables
  3397. //
  3398. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  3399. {
  3400. switch(vtokDynamicDeleteMMPolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
  3401. {
  3402. case CMD_TOKEN_NAME :
  3403. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3404. {
  3405. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  3406. pPolicyName = new _TCHAR[dwNameLen];
  3407. if(pPolicyName == NULL)
  3408. {
  3409. dwReturn = ERROR_OUTOFMEMORY;
  3410. BAIL_OUT;
  3411. }
  3412. _tcsncpy(pPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  3413. }
  3414. break;
  3415. case CMD_TOKEN_ALL : // if pPolicyName is NULL, deletes all
  3416. break;
  3417. default :
  3418. break;
  3419. }
  3420. }
  3421. dwReturn = DeleteMMPolicy(pPolicyName);
  3422. if(dwReturn == ERROR_NO_DISPLAY)
  3423. {
  3424. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_NO_MMPOLICY);
  3425. }
  3426. error:
  3427. if(dwArgCount > 3)
  3428. {
  3429. CleanUp();
  3430. }
  3431. if(pPolicyName)
  3432. {
  3433. delete [] pPolicyName;
  3434. }
  3435. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  3436. {
  3437. //api errors
  3438. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3439. dwReturn = ERROR_SUCCESS;
  3440. }
  3441. //already one error displayed.
  3442. if(dwReturn == ERROR_NO_DISPLAY)
  3443. {
  3444. dwReturn = ERROR_SUCCESS;
  3445. }
  3446. return dwReturn;
  3447. }
  3448. ///////////////////////////////////////////////////////////////////////////////////////////
  3449. //
  3450. // Function : HandleDynamicDeleteAll
  3451. //
  3452. // Date of Creation: 9-23-2001
  3453. //
  3454. // Parameters :
  3455. // IN LPCWSTR pwszMachine,
  3456. // IN OUT LPWSTR *ppwcArguments,
  3457. // IN DWORD dwCurrentIndex,
  3458. // IN DWORD dwArgCount,
  3459. // IN DWORD dwFlags,
  3460. // IN LPCVOID pvData,
  3461. // OUT BOOL *pbDone
  3462. // Return : DWORD
  3463. //
  3464. // Description : Netshell Dynamic handle for delete all.
  3465. //
  3466. // Revision History:
  3467. //
  3468. // Date Author Comments
  3469. //
  3470. //////////////////////////////////////////////////////////////////////////////////////////
  3471. DWORD WINAPI
  3472. HandleDynamicDeleteAll(
  3473. IN LPCWSTR pwszMachine,
  3474. IN OUT LPWSTR *ppwcArguments,
  3475. IN DWORD dwCurrentIndex,
  3476. IN DWORD dwArgCount,
  3477. IN DWORD dwFlags,
  3478. IN LPCVOID pvData,
  3479. OUT BOOL *pbDone
  3480. )
  3481. {
  3482. DWORD dwReturn = ERROR_SHOW_USAGE;
  3483. //to take care no errors at test tool
  3484. UpdateGetLastError(NULL);
  3485. dwReturn = DeleteTunnelFilters();
  3486. if(dwReturn != ERROR_SUCCESS)
  3487. {
  3488. //api errors
  3489. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3490. dwReturn = ERROR_SUCCESS;
  3491. }
  3492. dwReturn = DeleteTransportFilters();
  3493. if(dwReturn != ERROR_SUCCESS)
  3494. {
  3495. //api errors
  3496. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3497. dwReturn = ERROR_SUCCESS;
  3498. }
  3499. dwReturn = DeleteQMPolicy(NULL);
  3500. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_NO_DISPLAY))
  3501. {
  3502. //api errors
  3503. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3504. dwReturn = ERROR_SUCCESS;
  3505. }
  3506. dwReturn = DeleteMMFilters();
  3507. if(dwReturn != ERROR_SUCCESS)
  3508. {
  3509. //api errors
  3510. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3511. dwReturn = ERROR_SUCCESS;
  3512. }
  3513. dwReturn = DeleteMMPolicy(NULL);
  3514. if((dwReturn != ERROR_SUCCESS)&& (dwReturn != ERROR_NO_DISPLAY))
  3515. {
  3516. //api errors
  3517. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3518. dwReturn = ERROR_SUCCESS;
  3519. }
  3520. dwReturn = DeleteAuthMethods();
  3521. if(dwReturn != ERROR_SUCCESS)
  3522. {
  3523. //api errors
  3524. if(dwReturn == WIN32_AUTH_BEING_USED) //Win32 Error [13012] message is same as 13002.
  3525. { //So, it is converted to meaningful IPSec error code
  3526. PrintErrorMessage(IPSEC_ERR, dwReturn, ERRCODE_DELETE_AUTH_BEING_USED);
  3527. }
  3528. else
  3529. {
  3530. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  3531. }
  3532. dwReturn = ERROR_SUCCESS;
  3533. }
  3534. return dwReturn;
  3535. }
  3536. //////////////////////////////////////////////////////////////////////////////////////////
  3537. //
  3538. // WriteRegKey
  3539. //
  3540. //////////////////////////////////////////////////////////////////////////////////////////
  3541. DWORD
  3542. WriteRegKey(
  3543. LPTSTR lpValueName,
  3544. BYTE* data,
  3545. size_t uiDataSize,
  3546. DWORD dwDataType
  3547. )
  3548. {
  3549. DWORD dwReturn = 0;
  3550. HKEY hRegistryKey;
  3551. DWORD dwDisposition = 0;
  3552. dwReturn = RegCreateKeyEx(
  3553. g_hGlobalRegistryKey,
  3554. REGKEY_GLOBAL,
  3555. 0,
  3556. NULL,
  3557. 0,
  3558. KEY_ALL_ACCESS,
  3559. NULL,
  3560. &hRegistryKey,
  3561. &dwDisposition
  3562. );
  3563. if(dwReturn != ERROR_SUCCESS)
  3564. {
  3565. BAIL_OUT;
  3566. }
  3567. dwReturn = RegSetValueEx(
  3568. hRegistryKey,
  3569. lpValueName,
  3570. 0,
  3571. dwDataType,
  3572. data,
  3573. uiDataSize
  3574. );
  3575. if(dwReturn != ERROR_SUCCESS)
  3576. {
  3577. BAIL_OUT;
  3578. }
  3579. error:
  3580. if(hRegistryKey)
  3581. {
  3582. RegCloseKey(hRegistryKey);
  3583. }
  3584. return dwReturn;
  3585. }
  3586. DWORD
  3587. WriteRegKey(
  3588. LPTSTR lpValueName,
  3589. DWORD dwData
  3590. )
  3591. {
  3592. return WriteRegKey(lpValueName, (BYTE*)&dwData, sizeof(DWORD), REG_DWORD);
  3593. }
  3594. DWORD
  3595. ParseProtocol(
  3596. LPTSTR lpData,
  3597. BYTE* pProtocol
  3598. )
  3599. {
  3600. DWORD dwReturn = ERROR_SUCCESS;
  3601. BYTE value = 0;
  3602. // get protocol
  3603. if (_tcsicmp(lpData, IF_TYPE_UDP) == 0)
  3604. {
  3605. value = PROT_ID_UDP;
  3606. }
  3607. else if (_tcsicmp(lpData, IF_TYPE_TCP) == 0)
  3608. {
  3609. value = PROT_ID_TCP;
  3610. }
  3611. else if (_tcsicmp(lpData, IF_TYPE_ICMP) == 0)
  3612. {
  3613. value = PROT_ID_ICMP;
  3614. }
  3615. else if (_tcsicmp(lpData, IF_TYPE_RAW) == 0)
  3616. {
  3617. value = PROT_ID_RAW;
  3618. }
  3619. else // try to parse it as an integer
  3620. {
  3621. DWORD dwValue = 0;
  3622. dwReturn = ConvertStringToDword(lpData, &dwValue);
  3623. if ((dwReturn != ERROR_SUCCESS) || (dwValue < 1) || (dwValue > 255))
  3624. {
  3625. dwReturn = ERRCODE_INVALID_ARGS;
  3626. BAIL_OUT;
  3627. }
  3628. value = (BYTE)dwValue;
  3629. }
  3630. *pProtocol = value;
  3631. error:
  3632. return dwReturn;
  3633. }
  3634. DWORD
  3635. ParsePort(
  3636. LPTSTR lpData,
  3637. USHORT* pPort
  3638. )
  3639. {
  3640. DWORD dwReturn = ERROR_SUCCESS;
  3641. DWORD dwValue = 0;
  3642. dwReturn = ConvertStringToDword(lpData, &dwValue);
  3643. if ((dwReturn != ERROR_SUCCESS) || (dwValue > 65535))
  3644. {
  3645. dwReturn = ERRCODE_INVALID_ARGS;
  3646. BAIL_OUT;
  3647. }
  3648. *pPort = (USHORT)dwValue;
  3649. error:
  3650. return dwReturn;
  3651. }
  3652. DWORD
  3653. ParseDirection(
  3654. LPTSTR lpData,
  3655. BYTE* pDirection
  3656. )
  3657. {
  3658. DWORD dwReturn = ERROR_SUCCESS;
  3659. BYTE value = 0;
  3660. // get direction
  3661. if (_tcsicmp(lpData, TOKEN_STR_INBOUND) == 0)
  3662. {
  3663. value = EXEMPT_DIRECTION_INBOUND;
  3664. }
  3665. else if (_tcsicmp(lpData, TOKEN_STR_OUTBOUND) == 0)
  3666. {
  3667. value = EXEMPT_DIRECTION_OUTBOUND;
  3668. }
  3669. else
  3670. {
  3671. dwReturn = ERRCODE_INVALID_ARGS;
  3672. BAIL_OUT;
  3673. }
  3674. *pDirection = value;
  3675. error:
  3676. return dwReturn;
  3677. }
  3678. DWORD
  3679. ParseBootExemptions(
  3680. IN LPTSTR lpData
  3681. )
  3682. {
  3683. DWORD dwReturn = ERROR_SUCCESS;
  3684. // allocate 1024 tuples
  3685. PIPSEC_EXEMPT_ENTRY aEntries = new IPSEC_EXEMPT_ENTRY[MAX_EXEMPTION_ENTRIES];
  3686. ZeroMemory(aEntries, sizeof(*aEntries));
  3687. size_t uiNumExemptions = 0;
  3688. // check for keyword 'none', skip loop in this case
  3689. if (_tcsicmp(lpData, TOKEN_STR_NONE) != 0)
  3690. {
  3691. LPTSTR lpDelimiter = TOKEN_FIELD_DELIMITER;
  3692. LPTSTR lpCurrentToken = _tcstok(lpData, lpDelimiter);
  3693. size_t i = 0;
  3694. size_t state = 0;
  3695. // while not at end of string...
  3696. while ((lpCurrentToken != NULL) && (i < MAX_EXEMPTION_ENTRIES))
  3697. {
  3698. switch (state)
  3699. {
  3700. case 0:
  3701. // set the constant values (type and size)
  3702. aEntries[i].Type = EXEMPT_ENTRY_TYPE_DEFAULT;
  3703. aEntries[i].Size = EXEMPT_ENTRY_SIZE_DEFAULT;
  3704. dwReturn = ParseProtocol(lpCurrentToken, &(aEntries[i].Protocol));
  3705. if (dwReturn != ERROR_SUCCESS)
  3706. {
  3707. BAIL_OUT;
  3708. }
  3709. if ((aEntries[i].Protocol != PROT_ID_TCP) && (aEntries[i].Protocol != PROT_ID_UDP))
  3710. {
  3711. // unless TCP or UDP are specified, we don't support
  3712. // srcport or destport, fill them in with 0
  3713. aEntries[i].SrcPort = 0;
  3714. aEntries[i].DestPort = 0;
  3715. state += 2;
  3716. }
  3717. break;
  3718. case 1:
  3719. dwReturn = ParsePort(lpCurrentToken, &(aEntries[i].SrcPort));
  3720. break;
  3721. case 2:
  3722. dwReturn = ParsePort(lpCurrentToken, &(aEntries[i].DestPort));
  3723. break;
  3724. case 3:
  3725. dwReturn = ParseDirection(lpCurrentToken, &(aEntries[i].Direction));
  3726. if (dwReturn == ERROR_SUCCESS)
  3727. {
  3728. if (((aEntries[i].Protocol != PROT_ID_TCP) && (aEntries[i].Protocol != PROT_ID_UDP))
  3729. && ((aEntries[i].SrcPort != 0) || (aEntries[i].DestPort != 0)))
  3730. {
  3731. dwReturn = ERRCODE_INVALID_ARGS;
  3732. }
  3733. }
  3734. ++i;
  3735. break;
  3736. }
  3737. if (dwReturn != ERROR_SUCCESS)
  3738. {
  3739. BAIL_OUT;
  3740. }
  3741. state = (state + 1) % 4;
  3742. if (state == 3)
  3743. {
  3744. lpDelimiter = TOKEN_TUPLE_DELIMITER;
  3745. }
  3746. else
  3747. {
  3748. lpDelimiter = TOKEN_FIELD_DELIMITER;
  3749. }
  3750. lpCurrentToken = _tcstok(NULL, lpDelimiter);
  3751. }
  3752. // on exiting the loop, make sure we have only had complete tuples
  3753. if ((state % 4) != 0)
  3754. {
  3755. dwReturn = ERRCODE_INVALID_ARGS;
  3756. BAIL_OUT;
  3757. }
  3758. // were we given more than we can handle?
  3759. if (i == MAX_EXEMPTION_ENTRIES)
  3760. {
  3761. dwReturn = ERRCODE_TOO_MANY_EXEMPTS;
  3762. BAIL_OUT;
  3763. }
  3764. uiNumExemptions = i;
  3765. }
  3766. if (dwReturn == ERROR_SUCCESS)
  3767. {
  3768. dwReturn = WriteRegKey(
  3769. BOOTEXEMPTKEY,
  3770. (BYTE*)aEntries,
  3771. sizeof(IPSEC_EXEMPT_ENTRY) * uiNumExemptions,
  3772. REG_BINARY
  3773. );
  3774. }
  3775. error:
  3776. delete [] aEntries;
  3777. return dwReturn;
  3778. }
  3779. ///////////////////////////////////////////////////////////////////////////////////////////
  3780. //
  3781. // Function : HandleDynamicSetConfig
  3782. //
  3783. // Date of Creation: 9-23-2001
  3784. //
  3785. // Parameters :
  3786. // IN LPCWSTR pwszMachine,
  3787. // IN OUT LPWSTR *ppwcArguments,
  3788. // IN DWORD dwCurrentIndex,
  3789. // IN DWORD dwArgCount,
  3790. // IN DWORD dwFlags,
  3791. // IN LPCVOID pvData,
  3792. // OUT BOOL *pbDone
  3793. // Return : DWORD
  3794. //
  3795. // Description : This command sets the IPSec registry keys
  3796. //
  3797. // Revision History:
  3798. //
  3799. // Date Author Comments
  3800. //
  3801. //////////////////////////////////////////////////////////////////////////////////////////
  3802. DWORD WINAPI
  3803. HandleDynamicSetConfig(
  3804. IN LPCWSTR pwszMachine,
  3805. IN OUT LPWSTR *ppwcArguments,
  3806. IN DWORD dwCurrentIndex,
  3807. IN DWORD dwArgCount,
  3808. IN DWORD dwFlags,
  3809. IN LPCVOID pvData,
  3810. OUT BOOL *pbDone
  3811. )
  3812. {
  3813. DWORD dwReturn = ERROR_SHOW_USAGE;
  3814. DWORD dwKeyType = 0;
  3815. DWORD dwKeyValue = 0;
  3816. DWORD dwCount = 0;
  3817. LPTSTR lpKeyValue = NULL;
  3818. IKE_CONFIG IKEConfig;
  3819. const TAG_TYPE vcmdDynamicSetConfig[] =
  3820. {
  3821. { CMD_TOKEN_STR_PROPERTY, NS_REQ_PRESENT, FALSE },
  3822. { CMD_TOKEN_STR_VALUE, NS_REQ_PRESENT, FALSE }
  3823. };
  3824. const TOKEN_VALUE vtokDynamicSetConfig[] =
  3825. {
  3826. { CMD_TOKEN_STR_PROPERTY, CMD_TOKEN_PROPERTY },
  3827. { CMD_TOKEN_STR_VALUE, CMD_TOKEN_VALUE }
  3828. };
  3829. PARSER_PKT parser;
  3830. ZeroMemory(&parser, sizeof(parser));
  3831. ZeroMemory( &IKEConfig, sizeof(IKE_CONFIG) );
  3832. //
  3833. // Bail out as user has not given sufficient arguments.
  3834. //
  3835. if(dwArgCount <= 3)
  3836. {
  3837. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  3838. BAIL_OUT;
  3839. }
  3840. parser.ValidTok = vtokDynamicSetConfig;
  3841. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicSetConfig);
  3842. parser.ValidCmd = vcmdDynamicSetConfig;
  3843. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicSetConfig);
  3844. //
  3845. // Get the user input after parsing the data
  3846. //
  3847. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  3848. if(dwReturn != ERROR_SUCCESS)
  3849. {
  3850. if(dwReturn == RETURN_NO_ERROR)
  3851. {
  3852. dwReturn = ERROR_NO_DISPLAY;
  3853. BAIL_OUT;
  3854. }
  3855. else
  3856. {
  3857. dwReturn = ERROR_SHOW_USAGE;
  3858. BAIL_OUT;
  3859. }
  3860. }
  3861. //
  3862. // Check for user given tokens from the parser and copy into local variables
  3863. //
  3864. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  3865. {
  3866. switch(vtokDynamicSetConfig[parser.Cmd[dwCount].dwCmdToken].dwValue)
  3867. {
  3868. case CMD_TOKEN_PROPERTY :
  3869. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  3870. {
  3871. dwKeyType = *(DWORD*)parser.Cmd[dwCount].pArg;
  3872. }
  3873. break;
  3874. case CMD_TOKEN_VALUE :
  3875. lpKeyValue = (LPTSTR)parser.Cmd[dwCount].pArg;
  3876. // if it's supposed to be numeric, convert now
  3877. switch (dwKeyType)
  3878. {
  3879. case PROPERTY_BOOTMODE:
  3880. break;
  3881. case PROPERTY_BOOTEXEMP:
  3882. break;
  3883. default:
  3884. dwReturn = ConvertStringToDword(lpKeyValue, &dwKeyValue);
  3885. if (dwReturn)
  3886. {
  3887. dwReturn = ERROR_SHOW_USAGE;
  3888. BAIL_OUT;
  3889. }
  3890. else
  3891. {
  3892. parser.Cmd[dwCount].dwStatus = VALID_TOKEN;
  3893. }
  3894. break;
  3895. }
  3896. break;
  3897. default :
  3898. break;
  3899. }
  3900. }
  3901. dwReturn = GetConfigurationVariables(g_szDynamicMachine, &IKEConfig);
  3902. if(dwReturn != ERROR_SUCCESS)
  3903. {
  3904. BAIL_OUT;
  3905. }
  3906. switch(dwKeyType)
  3907. {
  3908. case PROPERTY_ENABLEDIGNO:
  3909. //
  3910. // range is from 0-7 for enable diagnostics
  3911. //
  3912. if( dwKeyValue > 7)
  3913. {
  3914. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_CONFIG_1);
  3915. dwReturn = ERROR_NO_DISPLAY;
  3916. BAIL_OUT;
  3917. }
  3918. dwReturn = WriteRegKey(ENABLE_DIAG, dwKeyValue);
  3919. if(dwReturn != ERROR_SUCCESS)
  3920. {
  3921. BAIL_OUT;
  3922. }
  3923. break;
  3924. case PROPERTY_IKELOG:
  3925. //
  3926. // range is from 0-2 for IKE dwEnableLogging
  3927. //
  3928. if( dwKeyValue >2)
  3929. {
  3930. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_CONFIG_2);
  3931. dwReturn = ERROR_NO_DISPLAY;
  3932. BAIL_OUT;
  3933. }
  3934. IKEConfig.dwEnableLogging = dwKeyValue;
  3935. dwReturn = SetConfigurationVariables(g_szDynamicMachine, IKEConfig);
  3936. if(dwReturn != ERROR_SUCCESS)
  3937. {
  3938. BAIL_OUT;
  3939. }
  3940. break;
  3941. case PROPERTY_CRLCHK:
  3942. //
  3943. // range is from 0-2 for dwStrongCRLCheck
  3944. //
  3945. if( dwKeyValue >2)
  3946. {
  3947. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_CONFIG_3);
  3948. dwReturn = ERROR_NO_DISPLAY;
  3949. BAIL_OUT;
  3950. }
  3951. IKEConfig.dwStrongCRLCheck = dwKeyValue;
  3952. dwReturn = SetConfigurationVariables(g_szDynamicMachine, IKEConfig);
  3953. if(dwReturn != ERROR_SUCCESS)
  3954. {
  3955. BAIL_OUT;
  3956. }
  3957. break;
  3958. case PROPERTY_LOGINTER:
  3959. //
  3960. // range is from 60-86400 for ENABLE_LOGINT
  3961. //
  3962. if(dwKeyValue < 60 || dwKeyValue > 86400)
  3963. {
  3964. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_CONFIG_4);
  3965. dwReturn = ERROR_NO_DISPLAY;
  3966. BAIL_OUT;
  3967. }
  3968. dwReturn = WriteRegKey(ENABLE_LOGINT, dwKeyValue);
  3969. if(dwReturn != ERROR_SUCCESS)
  3970. {
  3971. BAIL_OUT;
  3972. }
  3973. break;
  3974. case PROPERTY_EXEMPT:
  3975. //
  3976. // range is from 0-3 for ENABLE_EXEMPT
  3977. //
  3978. if( dwKeyValue >3)
  3979. {
  3980. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_CONFIG_5);
  3981. dwReturn = ERROR_NO_DISPLAY;
  3982. BAIL_OUT;
  3983. }
  3984. dwReturn = WriteRegKey(ENABLE_EXEMPT, dwKeyValue);
  3985. if(dwReturn != ERROR_SUCCESS)
  3986. {
  3987. BAIL_OUT;
  3988. }
  3989. break;
  3990. case PROPERTY_BOOTMODE:
  3991. // valid values are stateful, block, permit
  3992. if( _tcsicmp(lpKeyValue, VALUE_TYPE_STATEFUL) == 0)
  3993. {
  3994. dwKeyValue = VALUE_STATEFUL;
  3995. }
  3996. else if( _tcsicmp(lpKeyValue, VALUE_TYPE_BLOCK) == 0)
  3997. {
  3998. dwKeyValue = VALUE_BLOCK;
  3999. }
  4000. else if( _tcsicmp(lpKeyValue, VALUE_TYPE_PERMIT) == 0)
  4001. {
  4002. dwKeyValue = VALUE_PERMIT;
  4003. }
  4004. else
  4005. {
  4006. dwReturn = ERROR_SHOW_USAGE;
  4007. BAIL_OUT;
  4008. }
  4009. dwReturn = WriteRegKey(BOOTMODEKEY, dwKeyValue);
  4010. if (dwReturn != ERROR_SUCCESS)
  4011. {
  4012. BAIL_OUT;
  4013. }
  4014. break;
  4015. case PROPERTY_BOOTEXEMP:
  4016. dwReturn = ParseBootExemptions(lpKeyValue);
  4017. if (dwReturn != ERROR_SUCCESS)
  4018. {
  4019. PrintErrorMessage(IPSEC_ERR, 0, dwReturn);
  4020. dwReturn = ERROR_SHOW_USAGE;
  4021. BAIL_OUT;
  4022. }
  4023. break;
  4024. default :
  4025. break;
  4026. }
  4027. error:
  4028. if(dwArgCount > 3)
  4029. {
  4030. CleanUp();
  4031. }
  4032. else if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  4033. {
  4034. //api errors
  4035. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  4036. dwReturn = ERROR_SUCCESS;
  4037. }
  4038. //already one error displayed.
  4039. if(dwReturn == ERROR_NO_DISPLAY)
  4040. {
  4041. dwReturn = ERROR_SUCCESS;
  4042. }
  4043. return dwReturn;
  4044. }
  4045. ///////////////////////////////////////////////////////////////////////////////////////////
  4046. //
  4047. // Function : HandleDynamicAddRule
  4048. //
  4049. // Date of Creation: 9-23-2001
  4050. //
  4051. // Parameters :
  4052. // IN LPCWSTR pwszMachine,
  4053. // IN OUT LPWSTR *ppwcArguments,
  4054. // IN DWORD dwCurrentIndex,
  4055. // IN DWORD dwArgCount,
  4056. // IN DWORD dwFlags,
  4057. // IN LPCVOID pvData,
  4058. // OUT BOOL *pbDone
  4059. // Return : DWORD
  4060. //
  4061. // Description : Function adds a rule (As good as Adding QMF+MMF)
  4062. //
  4063. // Revision History:
  4064. //
  4065. // Date Author Comments
  4066. //
  4067. //////////////////////////////////////////////////////////////////////////////////////////
  4068. DWORD WINAPI
  4069. HandleDynamicAddRule(
  4070. IN LPCWSTR pwszMachine,
  4071. IN OUT LPWSTR *ppwcArguments,
  4072. IN DWORD dwCurrentIndex,
  4073. IN DWORD dwArgCount,
  4074. IN DWORD dwFlags,
  4075. IN LPCVOID pvData,
  4076. OUT BOOL *pbDone
  4077. )
  4078. {
  4079. TRANSPORT_FILTER ParserTransportlFltr;
  4080. TUNNEL_FILTER ParserTunnelFltr;
  4081. MM_FILTER MMFilter;
  4082. ADDR DesAddr, SrcAddr;
  4083. FILTER_ACTION Inbound = NEGOTIATE_SECURITY, Outbound = NEGOTIATE_SECURITY;
  4084. DWORD dwReturn = ERROR_SHOW_USAGE;
  4085. DWORD dwNameLen = 0;
  4086. DWORD dwCount = 0, j = 0;
  4087. DWORD dwProtocol = 0;
  4088. DWORD dwSrcPort = 0;
  4089. DWORD dwDstPort = 0;
  4090. DWORD dwSrcSplServer = NOT_SPLSERVER;
  4091. DWORD dwDstSplServer = NOT_SPLSERVER;
  4092. BOOL bTunnel = FALSE;
  4093. BOOL bPort = FALSE;
  4094. BOOL bAuth = FALSE;
  4095. BOOL bFailMMIfExists = FALSE;
  4096. BOOL bSrcMe = FALSE;
  4097. BOOL bIsOutboundBroadcast = FALSE;
  4098. LPTSTR pszMMPolicyName = NULL;
  4099. LPTSTR pszFilterActionName = NULL;
  4100. LPTSTR pszMMFilterName = NULL;
  4101. LPTSTR pszQMFilterName = NULL;
  4102. PRULEDATA pRuleData = new RULEDATA;
  4103. if (pRuleData == NULL)
  4104. {
  4105. dwReturn = ERROR_OUTOFMEMORY;
  4106. BAIL_OUT;
  4107. }
  4108. ZeroMemory(pRuleData, sizeof(RULEDATA));
  4109. PSTA_AUTH_METHODS pKerbAuth = NULL;
  4110. PSTA_AUTH_METHODS pPskAuth = NULL;
  4111. PSTA_MM_AUTH_METHODS *ppRootcaMMAuth = NULL;
  4112. const TAG_TYPE vcmdDynamicAddRule[] =
  4113. {
  4114. { CMD_TOKEN_STR_SRCADDR, NS_REQ_PRESENT, FALSE },
  4115. { CMD_TOKEN_STR_DSTADDR, NS_REQ_PRESENT, FALSE },
  4116. { CMD_TOKEN_STR_MMPOLICY, NS_REQ_PRESENT, FALSE },
  4117. { CMD_TOKEN_STR_QMPOLICY, NS_REQ_ZERO, FALSE },
  4118. { CMD_TOKEN_STR_PROTO, NS_REQ_ZERO, FALSE },
  4119. { CMD_TOKEN_STR_SRCPORT, NS_REQ_ZERO, FALSE },
  4120. { CMD_TOKEN_STR_DSTPORT, NS_REQ_ZERO, FALSE },
  4121. { CMD_TOKEN_STR_MIRROR, NS_REQ_ZERO, FALSE },
  4122. { CMD_TOKEN_STR_CONNTYPE, NS_REQ_ZERO, FALSE },
  4123. { CMD_TOKEN_STR_INBOUND, NS_REQ_ZERO, FALSE },
  4124. { CMD_TOKEN_STR_OUTBOUND, NS_REQ_ZERO, FALSE },
  4125. { CMD_TOKEN_STR_SRCMASK, NS_REQ_ZERO, FALSE },
  4126. { CMD_TOKEN_STR_DSTMASK, NS_REQ_ZERO, FALSE },
  4127. { CMD_TOKEN_STR_TUNNELDST, NS_REQ_ZERO, FALSE },
  4128. { CMD_TOKEN_STR_FAILMMIFEXISTS, NS_REQ_ZERO, FALSE },
  4129. { CMD_TOKEN_STR_KERB, NS_REQ_ZERO, FALSE },
  4130. { CMD_TOKEN_STR_PSK, NS_REQ_ZERO, FALSE }
  4131. };
  4132. const TOKEN_VALUE vtokDynamicAddRule[] =
  4133. {
  4134. { CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
  4135. { CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
  4136. { CMD_TOKEN_STR_MMPOLICY, CMD_TOKEN_MMPOLICY },
  4137. { CMD_TOKEN_STR_QMPOLICY, CMD_TOKEN_QMPOLICY },
  4138. { CMD_TOKEN_STR_PROTO, CMD_TOKEN_PROTO },
  4139. { CMD_TOKEN_STR_SRCPORT, CMD_TOKEN_SRCPORT },
  4140. { CMD_TOKEN_STR_DSTPORT, CMD_TOKEN_DSTPORT },
  4141. { CMD_TOKEN_STR_MIRROR, CMD_TOKEN_MIRROR },
  4142. { CMD_TOKEN_STR_CONNTYPE, CMD_TOKEN_CONNTYPE },
  4143. { CMD_TOKEN_STR_INBOUND, CMD_TOKEN_INBOUND },
  4144. { CMD_TOKEN_STR_OUTBOUND, CMD_TOKEN_OUTBOUND },
  4145. { CMD_TOKEN_STR_SRCMASK, CMD_TOKEN_SRCMASK },
  4146. { CMD_TOKEN_STR_DSTMASK, CMD_TOKEN_DSTMASK },
  4147. { CMD_TOKEN_STR_TUNNELDST, CMD_TOKEN_TUNNELDST },
  4148. { CMD_TOKEN_STR_FAILMMIFEXISTS, CMD_TOKEN_FAILMMIFEXISTS},
  4149. { CMD_TOKEN_STR_KERB, CMD_TOKEN_KERB },
  4150. { CMD_TOKEN_STR_PSK, CMD_TOKEN_PSK }
  4151. };
  4152. const TOKEN_VALUE vlistDynamicAddRule[] =
  4153. {
  4154. { CMD_TOKEN_STR_ROOTCA, CMD_TOKEN_ROOTCA }
  4155. };
  4156. PARSER_PKT parser;
  4157. ZeroMemory(&parser, sizeof(parser));
  4158. memset(&MMFilter, 0, sizeof(MM_FILTER));
  4159. memset(&ParserTunnelFltr, 0, sizeof(TUNNEL_FILTER));
  4160. memset(&ParserTransportlFltr, 0, sizeof(TRANSPORT_FILTER));
  4161. SrcAddr.uIpAddr = 0x0;
  4162. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  4163. SrcAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4164. DesAddr.uIpAddr = 0x0;
  4165. DesAddr.AddrType = IP_ADDR_UNIQUE;
  4166. DesAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4167. ParserTunnelFltr.SrcTunnelAddr.AddrType = IP_ADDR_UNIQUE;
  4168. ParserTunnelFltr.SrcTunnelAddr.uIpAddr = SUBNET_ADDRESS_ANY;
  4169. ParserTunnelFltr.SrcTunnelAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4170. ParserTunnelFltr.DesTunnelAddr.AddrType = IP_ADDR_UNIQUE;
  4171. ParserTunnelFltr.DesTunnelAddr.uIpAddr = SUBNET_ADDRESS_ANY;
  4172. ParserTunnelFltr.DesTunnelAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4173. //
  4174. // Bail out as user has not given sufficient arguments.
  4175. //
  4176. if(dwArgCount <= 3)
  4177. {
  4178. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  4179. BAIL_OUT;
  4180. }
  4181. dwReturn = LoadMMFilterDefaults(MMFilter);
  4182. parser.ValidTok = vtokDynamicAddRule;
  4183. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicAddRule);
  4184. parser.ValidCmd = vcmdDynamicAddRule;
  4185. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicAddRule);
  4186. parser.ValidList = vlistDynamicAddRule;
  4187. parser.MaxList = SIZEOF_TOKEN_VALUE(vlistDynamicAddRule);
  4188. //
  4189. // Get the user input after parsing the data
  4190. //
  4191. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  4192. if(dwReturn != ERROR_SUCCESS)
  4193. {
  4194. if(dwReturn == RETURN_NO_ERROR)
  4195. {
  4196. dwReturn = ERROR_NO_DISPLAY;
  4197. BAIL_OUT;
  4198. }
  4199. else
  4200. {
  4201. dwReturn = ERROR_SHOW_USAGE;
  4202. BAIL_OUT;
  4203. }
  4204. }
  4205. //Check for user given tokens from the parser and copy into local variables
  4206. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  4207. {
  4208. switch(vtokDynamicAddRule[parser.Cmd[dwCount].dwCmdToken].dwValue)
  4209. {
  4210. case CMD_TOKEN_FAILMMIFEXISTS:
  4211. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4212. {
  4213. bFailMMIfExists = *(BOOL *)parser.Cmd[dwCount].pArg;
  4214. }
  4215. break;
  4216. case CMD_TOKEN_MMPOLICY :
  4217. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN && (LPTSTR)parser.Cmd[dwCount].pArg)
  4218. {
  4219. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  4220. pszMMPolicyName = new _TCHAR[dwNameLen];
  4221. if(pszMMPolicyName == NULL)
  4222. {
  4223. dwReturn = ERROR_OUTOFMEMORY;
  4224. BAIL_OUT;
  4225. }
  4226. _tcsncpy(pszMMPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  4227. }
  4228. break;
  4229. case CMD_TOKEN_QMPOLICY :
  4230. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN && (LPTSTR)parser.Cmd[dwCount].pArg)
  4231. {
  4232. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  4233. pszFilterActionName = new _TCHAR[dwNameLen];
  4234. if(pszFilterActionName == NULL)
  4235. {
  4236. dwReturn = ERROR_OUTOFMEMORY;
  4237. BAIL_OUT;
  4238. }
  4239. _tcsncpy(pszFilterActionName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  4240. }
  4241. break;
  4242. case CMD_TOKEN_MIRROR :
  4243. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4244. {
  4245. MMFilter.bCreateMirror = *(BOOL *)parser.Cmd[dwCount].pArg;
  4246. }
  4247. break;
  4248. case CMD_TOKEN_CONNTYPE :
  4249. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4250. {
  4251. switch(*(DWORD *)parser.Cmd[dwCount].pArg)
  4252. {
  4253. case INTERFACE_TYPE_ALL:
  4254. MMFilter.InterfaceType = INTERFACE_TYPE_ALL;
  4255. break;
  4256. case INTERFACE_TYPE_LAN:
  4257. MMFilter.InterfaceType = INTERFACE_TYPE_LAN;
  4258. break;
  4259. case INTERFACE_TYPE_DIALUP:
  4260. MMFilter.InterfaceType = INTERFACE_TYPE_DIALUP;
  4261. break;
  4262. default :
  4263. break;
  4264. }
  4265. }
  4266. break;
  4267. case CMD_TOKEN_DSTADDR :
  4268. if (parser.Cmd[dwCount].dwStatus)
  4269. {
  4270. // special servers id is available in dwStatus
  4271. switch(parser.Cmd[dwCount].dwStatus)
  4272. {
  4273. case SERVER_WINS:
  4274. case SERVER_DHCP:
  4275. case SERVER_DNS:
  4276. case SERVER_GATEWAY:
  4277. case IP_ME:
  4278. case IP_ANY:
  4279. dwDstSplServer = parser.Cmd[dwCount].dwStatus;
  4280. break;
  4281. case NOT_SPLSERVER:
  4282. //if it is not special server get the user given IP address
  4283. MMFilter.DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4284. DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4285. break;
  4286. default:
  4287. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  4288. dwReturn = ERROR_NO_DISPLAY;
  4289. BAIL_OUT;
  4290. break;
  4291. }
  4292. }
  4293. break;
  4294. case CMD_TOKEN_DSTMASK :
  4295. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4296. {
  4297. MMFilter.DesAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4298. DesAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4299. }
  4300. break;
  4301. case CMD_TOKEN_SRCADDR :
  4302. if (parser.Cmd[dwCount].dwStatus)
  4303. {
  4304. // special servers id is available in dwStatus
  4305. switch(parser.Cmd[dwCount].dwStatus)
  4306. {
  4307. case IP_ME:
  4308. bSrcMe = TRUE;
  4309. // fallthrough
  4310. case SERVER_WINS:
  4311. case SERVER_DHCP:
  4312. case SERVER_DNS:
  4313. case SERVER_GATEWAY:
  4314. case IP_ANY:
  4315. dwSrcSplServer = parser.Cmd[dwCount].dwStatus;
  4316. break;
  4317. case NOT_SPLSERVER:
  4318. //if it is not special server get the user given IP address
  4319. MMFilter.SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4320. SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4321. break;
  4322. default:
  4323. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  4324. dwReturn = ERROR_NO_DISPLAY;
  4325. BAIL_OUT;
  4326. break;
  4327. }
  4328. }
  4329. break;
  4330. case CMD_TOKEN_SRCMASK :
  4331. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4332. {
  4333. MMFilter.SrcAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4334. SrcAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4335. }
  4336. break;
  4337. case CMD_TOKEN_INBOUND :
  4338. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4339. {
  4340. if(*(DWORD *)parser.Cmd[dwCount].pArg==1)
  4341. {
  4342. Inbound = PASS_THRU;
  4343. }
  4344. else if(*(DWORD *)parser.Cmd[dwCount].pArg==2)
  4345. {
  4346. Inbound = BLOCKING;
  4347. }
  4348. else if(*(DWORD *)parser.Cmd[dwCount].pArg==3)
  4349. {
  4350. Inbound = NEGOTIATE_SECURITY;
  4351. }
  4352. }
  4353. break;
  4354. case CMD_TOKEN_OUTBOUND :
  4355. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4356. {
  4357. if(*(DWORD *)parser.Cmd[dwCount].pArg==1)
  4358. {
  4359. Outbound = PASS_THRU;
  4360. }
  4361. else if(*(DWORD *)parser.Cmd[dwCount].pArg==2)
  4362. {
  4363. Outbound = BLOCKING;
  4364. }
  4365. else if(*(DWORD *)parser.Cmd[dwCount].pArg==3)
  4366. {
  4367. Outbound = NEGOTIATE_SECURITY;
  4368. }
  4369. }
  4370. break;
  4371. case CMD_TOKEN_SRCPORT :
  4372. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4373. {
  4374. dwSrcPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  4375. bPort = TRUE;
  4376. }
  4377. break;
  4378. case CMD_TOKEN_DSTPORT :
  4379. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4380. {
  4381. dwDstPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  4382. bPort = TRUE;
  4383. }
  4384. break;
  4385. case CMD_TOKEN_PROTO :
  4386. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4387. {
  4388. dwProtocol = *(DWORD *)parser.Cmd[dwCount].pArg;
  4389. }
  4390. break;
  4391. case CMD_TOKEN_TUNNELDST :
  4392. if (parser.Cmd[dwCount].dwStatus)
  4393. {
  4394. //
  4395. // Special servers id is available in dwStatus
  4396. //
  4397. switch(parser.Cmd[dwCount].dwStatus)
  4398. {
  4399. case NOT_SPLSERVER:
  4400. //
  4401. // If it is not special server get the user given IP address
  4402. //
  4403. ParserTunnelFltr.DesTunnelAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4404. bTunnel = TRUE;
  4405. ADDR addr;
  4406. addr.uIpAddr = htonl(ParserTunnelFltr.DesTunnelAddr.uIpAddr);
  4407. addr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4408. if (!IsValidTunnelEndpointAddress(&addr))
  4409. {
  4410. dwReturn = ERROR_INVALID_PARAMETER;
  4411. BAIL_OUT;
  4412. }
  4413. break;
  4414. case SERVER_WINS:
  4415. case SERVER_DHCP:
  4416. case SERVER_DNS:
  4417. case SERVER_GATEWAY:
  4418. case IP_ME:
  4419. case IP_ANY:
  4420. default:
  4421. PrintMessageFromModule(g_hModule, ADD_STATIC_RULE_INVALID_TUNNEL);
  4422. dwReturn = ERROR_NO_DISPLAY;
  4423. BAIL_OUT;
  4424. break;
  4425. }
  4426. }
  4427. break;
  4428. case CMD_TOKEN_KERB :
  4429. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4430. {
  4431. pRuleData->bAuthMethodSpecified = TRUE;
  4432. ++pRuleData->AuthInfos.dwNumAuthInfos;
  4433. pKerbAuth = (PSTA_AUTH_METHODS)parser.Cmd[dwCount].pArg;
  4434. }
  4435. break;
  4436. case CMD_TOKEN_PSK :
  4437. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4438. {
  4439. pRuleData->bAuthMethodSpecified = TRUE;
  4440. ++pRuleData->AuthInfos.dwNumAuthInfos;
  4441. pPskAuth = (PSTA_AUTH_METHODS)parser.Cmd[dwCount].pArg;
  4442. }
  4443. break;
  4444. case CMD_TOKEN_ROOTCA :
  4445. // this case is special, handled below...
  4446. break;
  4447. default :
  4448. break;
  4449. }
  4450. }
  4451. size_t uiRootcaIndex = parser.MaxTok;
  4452. if (parser.Cmd[uiRootcaIndex].dwStatus > 0)
  4453. {
  4454. pRuleData->bAuthMethodSpecified = TRUE;
  4455. pRuleData->AuthInfos.dwNumAuthInfos += parser.Cmd[uiRootcaIndex].dwStatus;
  4456. ppRootcaMMAuth = (PSTA_MM_AUTH_METHODS *)(parser.Cmd[uiRootcaIndex].pArg);
  4457. }
  4458. dwReturn = AddAllAuthMethods(pRuleData, pKerbAuth, pPskAuth, ppRootcaMMAuth, TRUE);
  4459. if (dwReturn != ERROR_SUCCESS)
  4460. {
  4461. BAIL_OUT;
  4462. }
  4463. //
  4464. // Checking Invalid conditions.
  4465. //
  4466. if((dwSrcSplServer != NOT_SPLSERVER) && (dwDstSplServer != NOT_SPLSERVER)
  4467. && (dwSrcSplServer != IP_ME) && (dwSrcSplServer != IP_ANY)
  4468. && (dwDstSplServer != IP_ME) && (dwDstSplServer != IP_ANY) )
  4469. {
  4470. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_PARSER_ADDRTYPE);
  4471. dwReturn = ERROR_NO_DISPLAY;
  4472. BAIL_OUT;
  4473. }
  4474. //
  4475. // If qmpolicy name is not given and inbound and outbound are negotiate security, then bail out
  4476. //
  4477. if((Inbound == NEGOTIATE_SECURITY || Outbound == NEGOTIATE_SECURITY) && !pszFilterActionName)
  4478. {
  4479. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADD_RULE_WARNING_3);
  4480. dwReturn = ERROR_NO_DISPLAY;
  4481. BAIL_OUT;
  4482. }
  4483. //
  4484. // If tunnel rule is added with mirror = yes, bail out
  4485. //
  4486. if(bTunnel && MMFilter.bCreateMirror)
  4487. {
  4488. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADD_RULE_WARNING_4);
  4489. dwReturn = ERROR_NO_DISPLAY;
  4490. BAIL_OUT;
  4491. }
  4492. if(dwReturn != ERROR_SUCCESS)
  4493. {
  4494. BAIL_OUT;
  4495. }
  4496. ADDR srcAddr;
  4497. ADDR dstAddr;
  4498. srcAddr.uIpAddr = ntohl(SrcAddr.uIpAddr);
  4499. srcAddr.uSubNetMask = ntohl(SrcAddr.uSubNetMask);
  4500. dstAddr.uIpAddr = ntohl(DesAddr.uIpAddr);
  4501. dstAddr.uSubNetMask = ntohl(DesAddr.uSubNetMask);
  4502. if (IsBroadcastAddress(&dstAddr) || IsMulticastAddress(&dstAddr))
  4503. {
  4504. if (MMFilter.bCreateMirror || !bSrcMe ||
  4505. ((Inbound == NEGOTIATE_SECURITY) || (Outbound == NEGOTIATE_SECURITY))
  4506. )
  4507. {
  4508. dwReturn = ERROR_INVALID_PARAMETER;
  4509. BAIL_OUT;
  4510. }
  4511. if (IsBroadcastAddress(&dstAddr))
  4512. {
  4513. bIsOutboundBroadcast = TRUE;
  4514. }
  4515. }
  4516. // don't accept subnetX <-> subnetX (same subnet) if mirrored=no
  4517. // reject subnetx-subnetx
  4518. if (!MMFilter.bCreateMirror)
  4519. {
  4520. if (IsValidSubnet(&srcAddr) && IsValidSubnet(&dstAddr) && (srcAddr.uIpAddr == dstAddr.uIpAddr))
  4521. {
  4522. dwReturn = ERROR_INVALID_PARAMETER;
  4523. BAIL_OUT;
  4524. }
  4525. }
  4526. //Src Dst addr's of MM filter should be tunnel end points if present
  4527. //
  4528. if(bTunnel)
  4529. {
  4530. AddSplAddr(MMFilter.SrcAddr, IP_ME);
  4531. MMFilter.DesAddr.uIpAddr = ParserTunnelFltr.DesTunnelAddr.uIpAddr;
  4532. MMFilter.DesAddr.AddrType = IP_ADDR_UNIQUE;
  4533. MMFilter.DesAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4534. MMFilter.bCreateMirror = TRUE;
  4535. }
  4536. else
  4537. {
  4538. if(dwSrcSplServer == NOT_SPLSERVER)
  4539. {
  4540. MMFilter.SrcAddr.AddrType = (MMFilter.SrcAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  4541. }
  4542. else
  4543. {
  4544. AddSplAddr(MMFilter.SrcAddr, dwSrcSplServer);
  4545. }
  4546. if(dwDstSplServer == NOT_SPLSERVER)
  4547. {
  4548. MMFilter.DesAddr.AddrType = (MMFilter.DesAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  4549. }
  4550. else
  4551. {
  4552. AddSplAddr(MMFilter.DesAddr, dwDstSplServer);
  4553. }
  4554. }
  4555. dwReturn = CreateName(&pszMMFilterName);
  4556. if(dwReturn != ERROR_SUCCESS)
  4557. {
  4558. BAIL_OUT;
  4559. }
  4560. // we create a MM filter for any tunnel rule and for any non-tunnel rule that is not to broadcast
  4561. if (!bIsOutboundBroadcast || bTunnel)
  4562. {
  4563. dwReturn = AddMainModeFilter( pszMMFilterName, pszMMPolicyName, MMFilter, pRuleData->AuthInfos);
  4564. if (!bFailMMIfExists && (dwReturn == ERROR_IPSEC_MM_AUTH_EXISTS || dwReturn == ERROR_IPSEC_MM_FILTER_EXISTS))
  4565. {
  4566. dwReturn = ERROR_SUCCESS; // it's not actually an error, functionality requires.
  4567. // Even if MMFilter already exists, continue for QMFilter creation.
  4568. }
  4569. else if(dwReturn != ERROR_SUCCESS)
  4570. {
  4571. BAIL_OUT;
  4572. }
  4573. }
  4574. if(dwSrcSplServer == NOT_SPLSERVER)
  4575. {
  4576. SrcAddr.AddrType = (SrcAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  4577. }
  4578. else
  4579. {
  4580. AddSplAddr(SrcAddr, dwSrcSplServer);
  4581. }
  4582. //
  4583. // Destination address setting up
  4584. //
  4585. if(dwDstSplServer == NOT_SPLSERVER)
  4586. {
  4587. DesAddr.AddrType = (DesAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  4588. }
  4589. else
  4590. {
  4591. AddSplAddr(DesAddr, dwDstSplServer);
  4592. }
  4593. //
  4594. // Transport Filter data setup
  4595. //
  4596. if(!bTunnel)
  4597. {
  4598. ParserTransportlFltr.Protocol.ProtocolType = PROTOCOL_UNIQUE;
  4599. ParserTransportlFltr.Protocol.dwProtocol = dwProtocol;
  4600. ParserTransportlFltr.SrcPort.PortType = PORT_UNIQUE;
  4601. ParserTransportlFltr.SrcPort.wPort = (WORD)dwSrcPort;
  4602. ParserTransportlFltr.DesPort.PortType = PORT_UNIQUE;
  4603. ParserTransportlFltr.DesPort.wPort = (WORD)dwDstPort;
  4604. ParserTransportlFltr.SrcAddr.AddrType = SrcAddr.AddrType;
  4605. ParserTransportlFltr.SrcAddr.uIpAddr = SrcAddr.uIpAddr;
  4606. ParserTransportlFltr.SrcAddr.uSubNetMask = SrcAddr.uSubNetMask;
  4607. ParserTransportlFltr.DesAddr.AddrType = DesAddr.AddrType;
  4608. ParserTransportlFltr.DesAddr.uIpAddr = DesAddr.uIpAddr;
  4609. ParserTransportlFltr.DesAddr.uSubNetMask = DesAddr.uSubNetMask;
  4610. ParserTransportlFltr.InterfaceType = MMFilter.InterfaceType;
  4611. ParserTransportlFltr.bCreateMirror = MMFilter.bCreateMirror;
  4612. ParserTransportlFltr.InboundFilterAction = Inbound;
  4613. ParserTransportlFltr.OutboundFilterAction = Outbound;
  4614. if(!((ParserTransportlFltr.Protocol.dwProtocol == PROT_ID_TCP) || (ParserTransportlFltr.Protocol.dwProtocol == PROT_ID_UDP)))
  4615. {
  4616. ParserTransportlFltr.SrcPort.wPort = 0;
  4617. ParserTransportlFltr.DesPort.wPort = 0;
  4618. if(bPort)
  4619. {
  4620. PrintMessageFromModule(g_hModule, ERR_DYN_INVALID_PORT);
  4621. }
  4622. }
  4623. dwReturn = CreateName(&pszQMFilterName);
  4624. if(dwReturn != ERROR_SUCCESS)
  4625. {
  4626. BAIL_OUT;
  4627. }
  4628. dwReturn = AddQuickModeFilter( pszQMFilterName, pszFilterActionName, ParserTransportlFltr);
  4629. }
  4630. //
  4631. // Tunnel filter data setup
  4632. //
  4633. else
  4634. {
  4635. ParserTunnelFltr.Protocol.ProtocolType = PROTOCOL_UNIQUE;
  4636. ParserTunnelFltr.Protocol.dwProtocol = dwProtocol;
  4637. ParserTunnelFltr.SrcPort.PortType = PORT_UNIQUE;
  4638. ParserTunnelFltr.SrcPort.wPort = (WORD)dwSrcPort;
  4639. ParserTunnelFltr.DesPort.PortType = PORT_UNIQUE;
  4640. ParserTunnelFltr.DesPort.wPort = (WORD)dwDstPort;
  4641. ParserTunnelFltr.InterfaceType = MMFilter.InterfaceType;
  4642. ParserTunnelFltr.bCreateMirror = FALSE;
  4643. ParserTunnelFltr.InboundFilterAction = Inbound;
  4644. ParserTunnelFltr.OutboundFilterAction = Outbound;
  4645. ParserTunnelFltr.SrcAddr.AddrType = SrcAddr.AddrType;
  4646. ParserTunnelFltr.SrcAddr.uIpAddr = SrcAddr.uIpAddr;
  4647. ParserTunnelFltr.SrcAddr.uSubNetMask = SrcAddr.uSubNetMask;
  4648. ParserTunnelFltr.DesAddr.AddrType = DesAddr.AddrType;
  4649. ParserTunnelFltr.DesAddr.uIpAddr = DesAddr.uIpAddr;
  4650. ParserTunnelFltr.DesAddr.uSubNetMask = DesAddr.uSubNetMask;
  4651. //
  4652. // Fill addr type, mask and uIpaddr for special server for tunnel source
  4653. //
  4654. AddSplAddr(ParserTunnelFltr.SrcTunnelAddr, IP_ANY);
  4655. ParserTunnelFltr.SrcTunnelAddr.pgInterfaceID = NULL;
  4656. //
  4657. // Fill addr type, mask and uIpaddr for special server for tunnel destination
  4658. //
  4659. ParserTunnelFltr.DesTunnelAddr.AddrType = (ParserTunnelFltr.DesTunnelAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  4660. ParserTunnelFltr.DesTunnelAddr.pgInterfaceID = NULL;
  4661. if(!((ParserTunnelFltr.Protocol.dwProtocol == PROT_ID_TCP) || (ParserTunnelFltr.Protocol.dwProtocol == PROT_ID_UDP)))
  4662. {
  4663. ParserTunnelFltr.SrcPort.wPort = 0;
  4664. ParserTunnelFltr.DesPort.wPort = 0;
  4665. if(bPort)
  4666. {
  4667. PrintMessageFromModule(g_hModule, ERR_DYN_INVALID_PORT);
  4668. }
  4669. }
  4670. dwReturn = CreateName(&pszQMFilterName);
  4671. if(dwReturn == ERROR_SUCCESS)
  4672. {
  4673. dwReturn = AddQuickModeFilter( pszQMFilterName, pszFilterActionName, ParserTunnelFltr);
  4674. }
  4675. }
  4676. error:
  4677. CleanupAuthData(&pKerbAuth, &pPskAuth, ppRootcaMMAuth);
  4678. CleanUpLocalRuleDataStructure(pRuleData);
  4679. pRuleData = NULL;
  4680. if(ParserTransportlFltr.pszFilterName)
  4681. {
  4682. delete [] ParserTransportlFltr.pszFilterName;
  4683. }
  4684. if(ParserTunnelFltr.pszFilterName)
  4685. {
  4686. delete[] ParserTunnelFltr.pszFilterName;
  4687. }
  4688. if(MMFilter.pszFilterName)
  4689. {
  4690. delete [] MMFilter.pszFilterName;
  4691. }
  4692. if(pszMMPolicyName)
  4693. {
  4694. delete [] pszMMPolicyName;
  4695. }
  4696. if(pszFilterActionName)
  4697. {
  4698. delete [] pszFilterActionName;
  4699. }
  4700. if(pszMMFilterName)
  4701. {
  4702. delete [] pszMMFilterName;
  4703. }
  4704. if(pszQMFilterName)
  4705. {
  4706. delete [] pszQMFilterName;
  4707. }
  4708. if(dwArgCount > 3)
  4709. {
  4710. CleanUp();
  4711. }
  4712. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE) && (dwReturn != ERROR_NO_DISPLAY))
  4713. {
  4714. //api errors
  4715. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  4716. dwReturn = ERROR_SUCCESS;
  4717. }
  4718. //already one error displayed.
  4719. if(dwReturn == ERROR_NO_DISPLAY)
  4720. {
  4721. dwReturn = ERROR_SUCCESS;
  4722. }
  4723. return dwReturn;
  4724. }
  4725. ///////////////////////////////////////////////////////////////////////////////////////////
  4726. //
  4727. // Function : HandleDynamicSetRule
  4728. //
  4729. // Date of Creation: 9-23-2001
  4730. //
  4731. // Parameters :
  4732. // IN LPCWSTR pwszMachine,
  4733. // IN OUT LPWSTR *ppwcArguments,
  4734. // IN DWORD dwCurrentIndex,
  4735. // IN DWORD dwArgCount,
  4736. // IN DWORD dwFlags,
  4737. // IN LPCVOID pvData,
  4738. // OUT BOOL *pbDone
  4739. // Return : DWORD
  4740. //
  4741. // Description :
  4742. //
  4743. // Revision History:
  4744. //
  4745. // Date Author Comments
  4746. //
  4747. //////////////////////////////////////////////////////////////////////////////////////////
  4748. DWORD WINAPI
  4749. HandleDynamicSetRule(
  4750. IN LPCWSTR pwszMachine,
  4751. IN OUT LPWSTR *ppwcArguments,
  4752. IN DWORD dwCurrentIndex,
  4753. IN DWORD dwArgCount,
  4754. IN DWORD dwFlags,
  4755. IN LPCVOID pvData,
  4756. OUT BOOL *pbDone
  4757. )
  4758. {
  4759. PTRANSPORT_FILTER pTransportFltr = NULL;
  4760. PTUNNEL_FILTER pTunnelFltr = NULL;
  4761. PMM_FILTER pMMFltr = NULL;
  4762. ADDR DesAddr, SrcAddr, SrcTunnel, DstTunnel;
  4763. FILTER_ACTION Inbound = FILTER_ACTION_MAX, Outbound = FILTER_ACTION_MAX;
  4764. IF_TYPE InterfaceType = INTERFACE_TYPE_ALL;
  4765. DWORD dwReturn = ERROR_SHOW_USAGE;
  4766. DWORD dwNameLen = 0;
  4767. DWORD dwCount = 0, j = 0;
  4768. DWORD dwProtocol = 0;
  4769. DWORD dwSrcPort = 0;
  4770. DWORD dwDstPort = 0;
  4771. DWORD dwSrcSplServer = NOT_SPLSERVER;
  4772. DWORD dwDstSplServer = NOT_SPLSERVER;
  4773. BOOL bTunnel = FALSE;
  4774. BOOL bSrcMask = FALSE;
  4775. BOOL bDstMask = FALSE;
  4776. BOOL bInbound = FALSE;
  4777. BOOL bOutbound = FALSE;
  4778. BOOL bAuth = FALSE;
  4779. BOOL bMirror = TRUE;
  4780. BOOL bSrcMe = FALSE;
  4781. BOOL bIsOutboundBroadcast = FALSE;
  4782. LPTSTR pszMMPolicyName = NULL;
  4783. LPTSTR pszFilterActionName = NULL;
  4784. PRULEDATA pRuleData = new RULEDATA;
  4785. if (pRuleData == NULL)
  4786. {
  4787. dwReturn = ERROR_OUTOFMEMORY;
  4788. BAIL_OUT;
  4789. }
  4790. ZeroMemory(pRuleData, sizeof(RULEDATA));
  4791. PSTA_AUTH_METHODS pKerbAuth = NULL;
  4792. PSTA_AUTH_METHODS pPskAuth = NULL;
  4793. PSTA_MM_AUTH_METHODS *ppRootcaMMAuth = NULL;
  4794. const TAG_TYPE vcmdDynamicSetRule[] =
  4795. {
  4796. { CMD_TOKEN_STR_SRCADDR, NS_REQ_PRESENT, FALSE },
  4797. { CMD_TOKEN_STR_DSTADDR, NS_REQ_PRESENT, FALSE },
  4798. { CMD_TOKEN_STR_PROTO, NS_REQ_PRESENT, FALSE },
  4799. { CMD_TOKEN_STR_SRCPORT, NS_REQ_PRESENT, FALSE },
  4800. { CMD_TOKEN_STR_DSTPORT, NS_REQ_PRESENT, FALSE },
  4801. { CMD_TOKEN_STR_MIRROR, NS_REQ_PRESENT, FALSE },
  4802. { CMD_TOKEN_STR_CONNTYPE, NS_REQ_PRESENT, FALSE },
  4803. { CMD_TOKEN_STR_SRCMASK, NS_REQ_ZERO, FALSE },
  4804. { CMD_TOKEN_STR_DSTMASK, NS_REQ_ZERO, FALSE },
  4805. { CMD_TOKEN_STR_TUNNELDST, NS_REQ_ZERO, FALSE },
  4806. { CMD_TOKEN_STR_MMPOLICY, NS_REQ_ZERO, FALSE },
  4807. { CMD_TOKEN_STR_QMPOLICY, NS_REQ_ZERO, FALSE },
  4808. { CMD_TOKEN_STR_INBOUND, NS_REQ_ZERO, FALSE },
  4809. { CMD_TOKEN_STR_OUTBOUND, NS_REQ_ZERO, FALSE },
  4810. { CMD_TOKEN_STR_KERB, NS_REQ_ZERO, FALSE },
  4811. { CMD_TOKEN_STR_PSK, NS_REQ_ZERO, FALSE }
  4812. };
  4813. const TOKEN_VALUE vtokDynamicSetRule[] =
  4814. {
  4815. { CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
  4816. { CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
  4817. { CMD_TOKEN_STR_PROTO, CMD_TOKEN_PROTO },
  4818. { CMD_TOKEN_STR_SRCPORT, CMD_TOKEN_SRCPORT },
  4819. { CMD_TOKEN_STR_DSTPORT, CMD_TOKEN_DSTPORT },
  4820. { CMD_TOKEN_STR_MIRROR, CMD_TOKEN_MIRROR },
  4821. { CMD_TOKEN_STR_CONNTYPE, CMD_TOKEN_CONNTYPE },
  4822. { CMD_TOKEN_STR_SRCMASK, CMD_TOKEN_SRCMASK },
  4823. { CMD_TOKEN_STR_DSTMASK, CMD_TOKEN_DSTMASK },
  4824. { CMD_TOKEN_STR_TUNNELDST, CMD_TOKEN_TUNNELDST },
  4825. { CMD_TOKEN_STR_MMPOLICY, CMD_TOKEN_MMPOLICY },
  4826. { CMD_TOKEN_STR_QMPOLICY, CMD_TOKEN_QMPOLICY },
  4827. { CMD_TOKEN_STR_INBOUND, CMD_TOKEN_INBOUND },
  4828. { CMD_TOKEN_STR_OUTBOUND, CMD_TOKEN_OUTBOUND },
  4829. { CMD_TOKEN_STR_KERB, CMD_TOKEN_KERB },
  4830. { CMD_TOKEN_STR_PSK, CMD_TOKEN_PSK }
  4831. };
  4832. const TOKEN_VALUE vlistDynamicSetRule[] =
  4833. {
  4834. { CMD_TOKEN_STR_ROOTCA, CMD_TOKEN_ROOTCA },
  4835. };
  4836. PARSER_PKT parser;
  4837. ZeroMemory(&parser, sizeof(parser));
  4838. SrcAddr.uIpAddr = 0x0;
  4839. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  4840. SrcAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4841. DesAddr.uIpAddr = 0x0;
  4842. DesAddr.AddrType = IP_ADDR_UNIQUE;
  4843. DesAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4844. SrcTunnel.uIpAddr = 0x0;
  4845. SrcTunnel.AddrType = IP_ADDR_UNIQUE;
  4846. SrcTunnel.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4847. DstTunnel.uIpAddr = 0x0;
  4848. DstTunnel.AddrType = IP_ADDR_UNIQUE;
  4849. DstTunnel.uSubNetMask = IP_ADDRESS_MASK_NONE;
  4850. // Bail out as user has not given sufficient arguments.
  4851. if(dwArgCount <= 3)
  4852. {
  4853. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  4854. BAIL_OUT;
  4855. }
  4856. parser.ValidTok = vtokDynamicSetRule;
  4857. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicSetRule);
  4858. parser.ValidCmd = vcmdDynamicSetRule;
  4859. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicSetRule);
  4860. parser.ValidList = vlistDynamicSetRule;
  4861. parser.MaxList = SIZEOF_TOKEN_VALUE(vlistDynamicSetRule);
  4862. //
  4863. // Get the user input after parsing the data
  4864. //
  4865. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  4866. if(dwReturn != ERROR_SUCCESS)
  4867. {
  4868. if(dwReturn == RETURN_NO_ERROR)
  4869. {
  4870. dwReturn = ERROR_NO_DISPLAY;
  4871. BAIL_OUT;
  4872. }
  4873. else
  4874. {
  4875. dwReturn = ERROR_SHOW_USAGE;
  4876. BAIL_OUT;
  4877. }
  4878. }
  4879. //
  4880. // Check for user given tokens from the parser and copy into local variables
  4881. //
  4882. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  4883. {
  4884. switch(vtokDynamicSetRule[parser.Cmd[dwCount].dwCmdToken].dwValue)
  4885. {
  4886. case CMD_TOKEN_MMPOLICY :
  4887. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN && (LPTSTR)parser.Cmd[dwCount].pArg)
  4888. {
  4889. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  4890. pszMMPolicyName = new _TCHAR[dwNameLen];
  4891. if(pszMMPolicyName == NULL)
  4892. {
  4893. dwReturn = ERROR_OUTOFMEMORY;
  4894. BAIL_OUT;
  4895. }
  4896. _tcsncpy(pszMMPolicyName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  4897. }
  4898. break;
  4899. case CMD_TOKEN_QMPOLICY :
  4900. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN && (LPTSTR)parser.Cmd[dwCount].pArg)
  4901. {
  4902. dwNameLen = _tcslen((LPTSTR)parser.Cmd[dwCount].pArg)+1;
  4903. pszFilterActionName = new _TCHAR[dwNameLen];
  4904. if(pszFilterActionName == NULL)
  4905. {
  4906. dwReturn = ERROR_OUTOFMEMORY;
  4907. BAIL_OUT;
  4908. }
  4909. _tcsncpy(pszFilterActionName, (LPTSTR)parser.Cmd[dwCount].pArg, dwNameLen);
  4910. }
  4911. break;
  4912. case CMD_TOKEN_MIRROR :
  4913. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4914. {
  4915. bMirror = *(BOOL *)parser.Cmd[dwCount].pArg;
  4916. }
  4917. break;
  4918. case CMD_TOKEN_CONNTYPE :
  4919. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4920. {
  4921. switch(*(DWORD *)parser.Cmd[dwCount].pArg)
  4922. {
  4923. case INTERFACE_TYPE_ALL:
  4924. InterfaceType = INTERFACE_TYPE_ALL;
  4925. break;
  4926. case INTERFACE_TYPE_LAN:
  4927. InterfaceType = INTERFACE_TYPE_LAN;
  4928. break;
  4929. case INTERFACE_TYPE_DIALUP:
  4930. InterfaceType = INTERFACE_TYPE_DIALUP;
  4931. break;
  4932. default :
  4933. break;
  4934. }
  4935. }
  4936. break;
  4937. case CMD_TOKEN_DSTADDR :
  4938. if (parser.Cmd[dwCount].dwStatus)
  4939. {
  4940. //
  4941. // special servers id is available in dwStatus
  4942. //
  4943. switch(parser.Cmd[dwCount].dwStatus)
  4944. {
  4945. case SERVER_WINS:
  4946. case SERVER_DHCP:
  4947. case SERVER_DNS:
  4948. case SERVER_GATEWAY:
  4949. case IP_ME:
  4950. case IP_ANY:
  4951. dwDstSplServer = parser.Cmd[dwCount].dwStatus;
  4952. break;
  4953. case NOT_SPLSERVER:
  4954. //
  4955. // if it is not special server get the user given IP address
  4956. //
  4957. DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4958. break;
  4959. default:
  4960. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  4961. dwReturn = ERROR_NO_DISPLAY;
  4962. BAIL_OUT;
  4963. break;
  4964. }
  4965. }
  4966. break;
  4967. case CMD_TOKEN_DSTMASK :
  4968. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  4969. {
  4970. DesAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4971. bDstMask = TRUE;
  4972. }
  4973. break;
  4974. case CMD_TOKEN_SRCADDR :
  4975. if (parser.Cmd[dwCount].dwStatus)
  4976. {
  4977. //
  4978. // special servers id is available in dwStatus
  4979. //
  4980. switch(parser.Cmd[dwCount].dwStatus)
  4981. {
  4982. case IP_ME:
  4983. bSrcMe = TRUE;
  4984. // fallthrough
  4985. case SERVER_WINS:
  4986. case SERVER_DHCP:
  4987. case SERVER_DNS:
  4988. case SERVER_GATEWAY:
  4989. case IP_ANY:
  4990. dwSrcSplServer = parser.Cmd[dwCount].dwStatus;
  4991. break;
  4992. case NOT_SPLSERVER:
  4993. //
  4994. // if it is not special server get the user given IP address
  4995. //
  4996. SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  4997. break;
  4998. default:
  4999. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  5000. dwReturn = ERROR_NO_DISPLAY;
  5001. BAIL_OUT;
  5002. break;
  5003. }
  5004. }
  5005. break;
  5006. case CMD_TOKEN_SRCMASK :
  5007. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5008. {
  5009. SrcAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  5010. bSrcMask = TRUE;
  5011. }
  5012. break;
  5013. case CMD_TOKEN_INBOUND :
  5014. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5015. {
  5016. bInbound = TRUE;
  5017. if(*(DWORD *)parser.Cmd[dwCount].pArg==1)
  5018. {
  5019. Inbound = PASS_THRU;
  5020. }
  5021. else if(*(DWORD *)parser.Cmd[dwCount].pArg==2)
  5022. {
  5023. Inbound = BLOCKING;
  5024. }
  5025. else if(*(DWORD *)parser.Cmd[dwCount].pArg==3)
  5026. {
  5027. Inbound = NEGOTIATE_SECURITY;
  5028. }
  5029. else
  5030. {
  5031. bInbound = FALSE;
  5032. }
  5033. }
  5034. break;
  5035. case CMD_TOKEN_OUTBOUND :
  5036. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5037. {
  5038. bOutbound = TRUE;
  5039. if(*(DWORD *)parser.Cmd[dwCount].pArg==1)
  5040. {
  5041. Outbound = PASS_THRU;
  5042. }
  5043. else if(*(DWORD *)parser.Cmd[dwCount].pArg==2)
  5044. {
  5045. Outbound = BLOCKING;
  5046. }
  5047. else if(*(DWORD *)parser.Cmd[dwCount].pArg==3)
  5048. {
  5049. Outbound = NEGOTIATE_SECURITY;
  5050. }
  5051. else
  5052. {
  5053. bOutbound = FALSE;
  5054. }
  5055. }
  5056. break;
  5057. case CMD_TOKEN_SRCPORT :
  5058. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5059. {
  5060. dwSrcPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  5061. }
  5062. break;
  5063. case CMD_TOKEN_DSTPORT :
  5064. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5065. {
  5066. dwDstPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  5067. }
  5068. break;
  5069. case CMD_TOKEN_PROTO :
  5070. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5071. {
  5072. dwProtocol = *(DWORD *)parser.Cmd[dwCount].pArg;
  5073. }
  5074. break;
  5075. case CMD_TOKEN_TUNNELDST :
  5076. if (parser.Cmd[dwCount].dwStatus)
  5077. {
  5078. //
  5079. // special servers id is available in dwStatus
  5080. //
  5081. switch(parser.Cmd[dwCount].dwStatus)
  5082. {
  5083. case NOT_SPLSERVER:
  5084. //
  5085. // if it is not special server get the user given IP address
  5086. //
  5087. DstTunnel.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  5088. ADDR addr;
  5089. addr.uIpAddr = htonl(DstTunnel.uIpAddr);
  5090. addr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5091. bTunnel = TRUE;
  5092. if (!IsValidTunnelEndpointAddress(&addr))
  5093. {
  5094. dwReturn = ERROR_INVALID_PARAMETER;
  5095. BAIL_OUT;
  5096. }
  5097. break;
  5098. case SERVER_WINS:
  5099. case SERVER_DHCP:
  5100. case SERVER_DNS:
  5101. case SERVER_GATEWAY:
  5102. case IP_ME:
  5103. case IP_ANY:
  5104. default:
  5105. PrintMessageFromModule(g_hModule, ADD_STATIC_RULE_INVALID_TUNNEL);
  5106. dwReturn = ERROR_NO_DISPLAY;
  5107. BAIL_OUT;
  5108. break;
  5109. }
  5110. }
  5111. break;
  5112. case CMD_TOKEN_KERB :
  5113. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5114. {
  5115. pRuleData->bAuthMethodSpecified = TRUE;
  5116. ++pRuleData->AuthInfos.dwNumAuthInfos;
  5117. pKerbAuth = (PSTA_AUTH_METHODS)parser.Cmd[dwCount].pArg;
  5118. }
  5119. break;
  5120. case CMD_TOKEN_PSK :
  5121. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5122. {
  5123. pRuleData->bAuthMethodSpecified = TRUE;
  5124. ++pRuleData->AuthInfos.dwNumAuthInfos;
  5125. pPskAuth = (PSTA_AUTH_METHODS)parser.Cmd[dwCount].pArg;
  5126. }
  5127. break;
  5128. case CMD_TOKEN_ROOTCA :
  5129. // this case is special, handled below...
  5130. break;
  5131. default :
  5132. break;
  5133. }
  5134. }
  5135. size_t uiRootcaIndex = parser.MaxTok;
  5136. if (parser.Cmd[uiRootcaIndex].dwStatus > 0)
  5137. {
  5138. pRuleData->bAuthMethodSpecified = TRUE;
  5139. pRuleData->AuthInfos.dwNumAuthInfos += parser.Cmd[uiRootcaIndex].dwStatus;
  5140. ppRootcaMMAuth = (PSTA_MM_AUTH_METHODS *)(parser.Cmd[uiRootcaIndex].pArg);
  5141. }
  5142. dwReturn = AddAllAuthMethods(pRuleData, pKerbAuth, pPskAuth, ppRootcaMMAuth, FALSE);
  5143. if (dwReturn != ERROR_SUCCESS)
  5144. {
  5145. BAIL_OUT;
  5146. }
  5147. //
  5148. // Invalid conditions
  5149. //
  5150. if((dwSrcSplServer != NOT_SPLSERVER) && (dwDstSplServer != NOT_SPLSERVER)
  5151. && (dwSrcSplServer != IP_ME) && (dwSrcSplServer != IP_ANY)
  5152. && (dwDstSplServer != IP_ME) && (dwDstSplServer != IP_ANY))
  5153. {
  5154. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_PARSER_ADDRTYPE);
  5155. dwReturn = ERROR_NO_DISPLAY;
  5156. BAIL_OUT;
  5157. }
  5158. //
  5159. // Source address setting up
  5160. //
  5161. if(dwSrcSplServer == NOT_SPLSERVER)
  5162. {
  5163. SrcAddr.AddrType = (SrcAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  5164. }
  5165. else
  5166. {
  5167. AddSplAddr(SrcAddr, dwSrcSplServer);
  5168. }
  5169. //
  5170. // Destination address setting up
  5171. //
  5172. if(dwDstSplServer == NOT_SPLSERVER)
  5173. {
  5174. DesAddr.AddrType = (DesAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  5175. }
  5176. else
  5177. {
  5178. AddSplAddr(DesAddr, dwDstSplServer);
  5179. }
  5180. ADDR tmpAddr;
  5181. tmpAddr.uIpAddr = ntohl(DesAddr.uIpAddr);
  5182. tmpAddr.uSubNetMask = ntohl(DesAddr.uSubNetMask);
  5183. if (IsBroadcastAddress(&tmpAddr) || IsMulticastAddress(&tmpAddr))
  5184. {
  5185. if (bMirror || !bSrcMe ||
  5186. ((Inbound == NEGOTIATE_SECURITY) || (Outbound == NEGOTIATE_SECURITY))
  5187. )
  5188. {
  5189. dwReturn = ERROR_INVALID_PARAMETER;
  5190. BAIL_OUT;
  5191. }
  5192. if (IsBroadcastAddress(&tmpAddr))
  5193. {
  5194. bIsOutboundBroadcast = TRUE;
  5195. }
  5196. }
  5197. //
  5198. // Check if the given MMFilter spec exists
  5199. if (bTunnel)
  5200. {
  5201. AddSplAddr(SrcTunnel, IP_ME);
  5202. if(FindAndGetMMFilterRule(SrcTunnel, DstTunnel, TRUE, InterfaceType, bSrcMask, bDstMask, &pMMFltr, dwReturn))
  5203. {
  5204. dwReturn = SetDynamicMMFilterRule( pszMMPolicyName, *(pMMFltr), pRuleData->AuthInfos);
  5205. }
  5206. else
  5207. {
  5208. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_RULE_NO_MMFILTER);
  5209. dwReturn = ERROR_SUCCESS;
  5210. BAIL_OUT;
  5211. }
  5212. }
  5213. else
  5214. {
  5215. // no MM filter if outbound is broadcast and not a tunnel rule
  5216. if (!bIsOutboundBroadcast)
  5217. {
  5218. if(FindAndGetMMFilterRule(SrcAddr, DesAddr, bMirror, InterfaceType, bSrcMask, bDstMask, &pMMFltr, dwReturn))
  5219. {
  5220. dwReturn = SetDynamicMMFilterRule( pszMMPolicyName, *(pMMFltr), pRuleData->AuthInfos);
  5221. }
  5222. else
  5223. {
  5224. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_RULE_NO_MMFILTER);
  5225. dwReturn = ERROR_SUCCESS;
  5226. BAIL_OUT;
  5227. }
  5228. }
  5229. }
  5230. //
  5231. // Check if the given Transport spec exists
  5232. //
  5233. if(!bTunnel)
  5234. {
  5235. if(FindAndGetTransportRule(SrcAddr, DesAddr, bMirror, InterfaceType, dwProtocol, dwSrcPort, dwDstPort,
  5236. bSrcMask, bDstMask, &pTransportFltr, dwReturn))
  5237. {
  5238. dwReturn = SetTransportRule(*(pTransportFltr), pszFilterActionName, Inbound, Outbound);
  5239. }
  5240. else
  5241. {
  5242. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_RULE_NO_TRANSPORT);
  5243. dwReturn = ERROR_SUCCESS;
  5244. BAIL_OUT;
  5245. }
  5246. }
  5247. //
  5248. // Check if the given Tunnel spec exists
  5249. //
  5250. else
  5251. {
  5252. AddSplAddr(SrcTunnel, IP_ANY);
  5253. if(FindAndGetTunnelRule(SrcAddr, DesAddr, bMirror, InterfaceType, dwProtocol, dwSrcPort, dwDstPort,
  5254. bSrcMask, bDstMask, SrcTunnel, DstTunnel, &pTunnelFltr, dwReturn))
  5255. {
  5256. dwReturn = SetTunnelRule(*(pTunnelFltr), pszFilterActionName, Inbound, Outbound);
  5257. }
  5258. else
  5259. {
  5260. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_RULE_NO_TUNNEL);
  5261. dwReturn = ERROR_SUCCESS;
  5262. }
  5263. }
  5264. error:
  5265. CleanupAuthData(&pKerbAuth, &pPskAuth, ppRootcaMMAuth);
  5266. CleanUpLocalRuleDataStructure(pRuleData);
  5267. pRuleData = NULL;
  5268. if(pszMMPolicyName)
  5269. {
  5270. delete [] pszMMPolicyName;
  5271. }
  5272. if(pszFilterActionName)
  5273. {
  5274. delete [] pszFilterActionName;
  5275. }
  5276. if(pMMFltr)
  5277. {
  5278. if(pMMFltr->pszFilterName)
  5279. {
  5280. delete [] pMMFltr->pszFilterName;
  5281. }
  5282. delete pMMFltr;
  5283. }
  5284. if(pTransportFltr)
  5285. {
  5286. if(pTransportFltr->pszFilterName)
  5287. {
  5288. delete [] pTransportFltr->pszFilterName;
  5289. }
  5290. delete pTransportFltr;
  5291. }
  5292. if(pTunnelFltr)
  5293. {
  5294. if(pTunnelFltr->pszFilterName)
  5295. {
  5296. delete [] pTunnelFltr->pszFilterName;
  5297. }
  5298. delete pTunnelFltr;
  5299. }
  5300. if(dwArgCount > 3)
  5301. {
  5302. CleanUp();
  5303. }
  5304. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  5305. {
  5306. //api errors
  5307. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  5308. dwReturn = ERROR_SUCCESS;
  5309. }
  5310. //already one error displayed.
  5311. if(dwReturn == ERROR_NO_DISPLAY)
  5312. {
  5313. dwReturn = ERROR_SUCCESS;
  5314. }
  5315. return dwReturn;
  5316. }
  5317. ///////////////////////////////////////////////////////////////////////////////////////////
  5318. //
  5319. // Function : DeleteIfLastRuleOfMMFilter
  5320. //
  5321. // Date of Creation: 05-19-02
  5322. //
  5323. // Parameters : IN ADDR SrcAddr,
  5324. // IN ADDR DstAddr,
  5325. // IN BOOL bMirror,
  5326. // IN IF_TYPE ConType,
  5327. // IN BOOL bSrcMask,
  5328. // IN BOOL bDstMask,
  5329. // IN OUT DWORD& dwStatus
  5330. //
  5331. //Return : BOOL
  5332. //
  5333. //Description : Deterimines if there exists any transport or tunnel filters
  5334. // may require a MM filter. If not, then it deletes the
  5335. // respective MM filter.
  5336. //
  5337. //Revision History :
  5338. //
  5339. // Date Author Comments
  5340. //
  5341. //////////////////////////////////////////////////////////////////////////////////////////
  5342. DWORD
  5343. DeleteIfLastRuleOfMMFilter(
  5344. IN ADDR SrcAddr,
  5345. IN ADDR DesAddr,
  5346. IN BOOL bMirror,
  5347. IN IF_TYPE InterfaceType,
  5348. IN BOOL bSrcMask,
  5349. IN BOOL bDstMask,
  5350. IN OUT DWORD& dwStatus
  5351. )
  5352. {
  5353. BOOL bLastRuleOfMMFilter = FALSE;
  5354. DWORD dwReturn = ERROR_SUCCESS;
  5355. PMM_FILTER pMMFltr = NULL;
  5356. bLastRuleOfMMFilter = IsLastRuleOfMMFilter(
  5357. SrcAddr,
  5358. DesAddr,
  5359. bMirror,
  5360. InterfaceType,
  5361. bSrcMask,
  5362. bDstMask,
  5363. dwReturn
  5364. );
  5365. if (!dwReturn && bLastRuleOfMMFilter) {
  5366. //
  5367. // Check if the given MMFilter spec exists
  5368. //
  5369. if(FindAndGetMMFilterRule(SrcAddr, DesAddr, bMirror, InterfaceType, bSrcMask, bDstMask, &pMMFltr, dwReturn))
  5370. {
  5371. dwReturn = DeleteMMFilterRule(*(pMMFltr));
  5372. }
  5373. else
  5374. {
  5375. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_RULE_NO_MMFILTER);
  5376. dwReturn = ERROR_SUCCESS; //This is to support multiple QMFilters will have
  5377. BAIL_OUT; //single MMFilter
  5378. }
  5379. }
  5380. error:
  5381. dwStatus = dwReturn;
  5382. if(pMMFltr)
  5383. {
  5384. if(pMMFltr->pszFilterName)
  5385. delete [] pMMFltr->pszFilterName;
  5386. delete pMMFltr;
  5387. }
  5388. return dwReturn;
  5389. }
  5390. ///////////////////////////////////////////////////////////////////////////////////////////
  5391. //
  5392. // Function : HandleDynamicDeleteRule
  5393. //
  5394. // Date of Creation: 9-23-2001
  5395. //
  5396. // Parameters :
  5397. // IN LPCWSTR pwszMachine,
  5398. // IN OUT LPWSTR *ppwcArguments,
  5399. // IN DWORD dwCurrentIndex,
  5400. // IN DWORD dwArgCount,
  5401. // IN DWORD dwFlags,
  5402. // IN LPCVOID pvData,
  5403. // OUT BOOL *pbDone
  5404. // Return : DWORD
  5405. //
  5406. // Description :
  5407. //
  5408. // Revision History:
  5409. //
  5410. // Date Author Comments
  5411. //
  5412. //////////////////////////////////////////////////////////////////////////////////////////
  5413. DWORD WINAPI
  5414. HandleDynamicDeleteRule(
  5415. IN LPCWSTR pwszMachine,
  5416. IN OUT LPWSTR *ppwcArguments,
  5417. IN DWORD dwCurrentIndex,
  5418. IN DWORD dwArgCount,
  5419. IN DWORD dwFlags,
  5420. IN LPCVOID pvData,
  5421. OUT BOOL *pbDone
  5422. )
  5423. {
  5424. PTRANSPORT_FILTER pTransportFltr = NULL;
  5425. PTUNNEL_FILTER pTunnelFltr = NULL;
  5426. ADDR DesAddr, SrcAddr, SrcTunnel, DstTunnel;
  5427. IF_TYPE InterfaceType = INTERFACE_TYPE_ALL;
  5428. DWORD dwReturn = ERROR_SHOW_USAGE;
  5429. DWORD dwCount = 0;
  5430. DWORD dwProtocol = 0;
  5431. DWORD dwSrcPort = 0;
  5432. DWORD dwDstPort = 0;
  5433. DWORD dwSrcSplServer = NOT_SPLSERVER;
  5434. DWORD dwDstSplServer = NOT_SPLSERVER;
  5435. BOOL bTunnel = FALSE;
  5436. BOOL bSrcMask = FALSE;
  5437. BOOL bDstMask = FALSE;
  5438. BOOL bMirror = TRUE;
  5439. const TAG_TYPE vcmdDynamicDeleteRule[] =
  5440. {
  5441. { CMD_TOKEN_STR_SRCADDR, NS_REQ_PRESENT, FALSE },
  5442. { CMD_TOKEN_STR_DSTADDR, NS_REQ_PRESENT, FALSE },
  5443. { CMD_TOKEN_STR_PROTO, NS_REQ_PRESENT, FALSE },
  5444. { CMD_TOKEN_STR_SRCPORT, NS_REQ_PRESENT, FALSE },
  5445. { CMD_TOKEN_STR_DSTPORT, NS_REQ_PRESENT, FALSE },
  5446. { CMD_TOKEN_STR_MIRROR, NS_REQ_PRESENT, FALSE },
  5447. { CMD_TOKEN_STR_CONNTYPE, NS_REQ_PRESENT, FALSE },
  5448. { CMD_TOKEN_STR_SRCMASK, NS_REQ_ZERO, FALSE },
  5449. { CMD_TOKEN_STR_DSTMASK, NS_REQ_ZERO, FALSE },
  5450. { CMD_TOKEN_STR_TUNNELDST, NS_REQ_ZERO, FALSE }
  5451. };
  5452. const TOKEN_VALUE vtokDynamicDeleteRule[] =
  5453. {
  5454. { CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
  5455. { CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
  5456. { CMD_TOKEN_STR_PROTO, CMD_TOKEN_PROTO },
  5457. { CMD_TOKEN_STR_SRCPORT, CMD_TOKEN_SRCPORT },
  5458. { CMD_TOKEN_STR_DSTPORT, CMD_TOKEN_DSTPORT },
  5459. { CMD_TOKEN_STR_MIRROR, CMD_TOKEN_MIRROR },
  5460. { CMD_TOKEN_STR_CONNTYPE, CMD_TOKEN_CONNTYPE },
  5461. { CMD_TOKEN_STR_SRCMASK, CMD_TOKEN_SRCMASK },
  5462. { CMD_TOKEN_STR_DSTMASK, CMD_TOKEN_DSTMASK },
  5463. { CMD_TOKEN_STR_TUNNELDST, CMD_TOKEN_TUNNELDST }
  5464. };
  5465. PARSER_PKT parser;
  5466. ZeroMemory(&parser, sizeof(parser));
  5467. SrcAddr.uIpAddr = 0x0;
  5468. SrcAddr.AddrType = IP_ADDR_UNIQUE;
  5469. SrcAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5470. DesAddr.uIpAddr = 0x0;
  5471. DesAddr.AddrType = IP_ADDR_UNIQUE;
  5472. DesAddr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5473. SrcTunnel.uIpAddr = 0x0;
  5474. SrcTunnel.AddrType = IP_ADDR_UNIQUE;
  5475. SrcTunnel.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5476. DstTunnel.uIpAddr = 0x0;
  5477. DstTunnel.AddrType = IP_ADDR_UNIQUE;
  5478. DstTunnel.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5479. //
  5480. // Bail out as user has not given sufficient arguments.
  5481. //
  5482. if(dwArgCount <= 3)
  5483. {
  5484. PrintMessageFromModule(g_hModule, ERR_INVALID_NUM_ARGS, 3);
  5485. BAIL_OUT;
  5486. }
  5487. parser.ValidTok = vtokDynamicDeleteRule;
  5488. parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokDynamicDeleteRule);
  5489. parser.ValidCmd = vcmdDynamicDeleteRule;
  5490. parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdDynamicDeleteRule);
  5491. //
  5492. // Get the user input after parsing the data
  5493. //
  5494. dwReturn = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
  5495. if(dwReturn != ERROR_SUCCESS)
  5496. {
  5497. if(dwReturn == RETURN_NO_ERROR)
  5498. {
  5499. dwReturn = ERROR_NO_DISPLAY;
  5500. BAIL_OUT;
  5501. }
  5502. else
  5503. {
  5504. dwReturn = ERROR_SHOW_USAGE;
  5505. BAIL_OUT;
  5506. }
  5507. }
  5508. //
  5509. // Check for user given tokens from the parser and copy into local variables
  5510. //
  5511. for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
  5512. {
  5513. switch(vtokDynamicDeleteRule[parser.Cmd[dwCount].dwCmdToken].dwValue)
  5514. {
  5515. case CMD_TOKEN_MIRROR :
  5516. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5517. {
  5518. bMirror = *(BOOL *)parser.Cmd[dwCount].pArg;
  5519. }
  5520. break;
  5521. case CMD_TOKEN_CONNTYPE :
  5522. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5523. {
  5524. switch(*(DWORD *)parser.Cmd[dwCount].pArg)
  5525. {
  5526. case INTERFACE_TYPE_ALL:
  5527. InterfaceType = INTERFACE_TYPE_ALL;
  5528. break;
  5529. case INTERFACE_TYPE_LAN:
  5530. InterfaceType = INTERFACE_TYPE_LAN;
  5531. break;
  5532. case INTERFACE_TYPE_DIALUP:
  5533. InterfaceType = INTERFACE_TYPE_DIALUP;
  5534. break;
  5535. }
  5536. }
  5537. break;
  5538. case CMD_TOKEN_DSTADDR :
  5539. if (parser.Cmd[dwCount].dwStatus)
  5540. {
  5541. //
  5542. // special servers id is available in dwStatus
  5543. //
  5544. switch(parser.Cmd[dwCount].dwStatus)
  5545. {
  5546. case SERVER_WINS:
  5547. case SERVER_DHCP:
  5548. case SERVER_DNS:
  5549. case SERVER_GATEWAY:
  5550. case IP_ME:
  5551. case IP_ANY:
  5552. dwDstSplServer = parser.Cmd[dwCount].dwStatus;
  5553. break;
  5554. case NOT_SPLSERVER:
  5555. //
  5556. // if it is not special server get the user given IP address
  5557. //
  5558. DesAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  5559. break;
  5560. default:
  5561. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  5562. dwReturn = ERROR_NO_DISPLAY;
  5563. BAIL_OUT;
  5564. break;
  5565. }
  5566. }
  5567. break;
  5568. case CMD_TOKEN_SRCADDR :
  5569. if (parser.Cmd[dwCount].dwStatus)
  5570. {
  5571. //
  5572. // Special servers id is available in dwStatus
  5573. //
  5574. switch(parser.Cmd[dwCount].dwStatus)
  5575. {
  5576. case SERVER_WINS:
  5577. case SERVER_DHCP:
  5578. case SERVER_DNS:
  5579. case SERVER_GATEWAY:
  5580. case IP_ME:
  5581. case IP_ANY:
  5582. dwSrcSplServer = parser.Cmd[dwCount].dwStatus;
  5583. break;
  5584. case NOT_SPLSERVER:
  5585. //
  5586. // if it is not special server get the user given IP address
  5587. //
  5588. SrcAddr.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  5589. break;
  5590. default:
  5591. PrintMessageFromModule(g_hModule, ERROR_PARSER_ADDR);
  5592. dwReturn = ERROR_NO_DISPLAY;
  5593. BAIL_OUT;
  5594. break;
  5595. }
  5596. }
  5597. break;
  5598. case CMD_TOKEN_DSTMASK :
  5599. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5600. {
  5601. DesAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  5602. bDstMask = TRUE;
  5603. }
  5604. break;
  5605. case CMD_TOKEN_SRCMASK :
  5606. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5607. {
  5608. SrcAddr.uSubNetMask = *(IPAddr *)parser.Cmd[dwCount].pArg;
  5609. bSrcMask = TRUE;
  5610. }
  5611. break;
  5612. case CMD_TOKEN_SRCPORT :
  5613. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5614. {
  5615. dwSrcPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  5616. }
  5617. break;
  5618. case CMD_TOKEN_DSTPORT :
  5619. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5620. {
  5621. dwDstPort = *(DWORD *)parser.Cmd[dwCount].pArg;
  5622. }
  5623. break;
  5624. case CMD_TOKEN_PROTO :
  5625. if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
  5626. {
  5627. dwProtocol = *(DWORD *)parser.Cmd[dwCount].pArg;
  5628. }
  5629. break;
  5630. case CMD_TOKEN_TUNNELDST :
  5631. if (parser.Cmd[dwCount].dwStatus)
  5632. {
  5633. //
  5634. // Special servers id is available in dwStatus
  5635. //
  5636. switch(parser.Cmd[dwCount].dwStatus)
  5637. {
  5638. case NOT_SPLSERVER:
  5639. //
  5640. // if it is not special server get the user given IP address
  5641. //
  5642. DstTunnel.uIpAddr = *(IPAddr *)parser.Cmd[dwCount].pArg;
  5643. bTunnel = TRUE;
  5644. ADDR addr;
  5645. addr.uIpAddr = htonl(DstTunnel.uIpAddr);
  5646. addr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5647. if (!IsValidTunnelEndpointAddress(&addr))
  5648. {
  5649. dwReturn = ERROR_INVALID_PARAMETER;
  5650. BAIL_OUT;
  5651. }
  5652. break;
  5653. case SERVER_WINS:
  5654. case SERVER_DHCP:
  5655. case SERVER_DNS:
  5656. case SERVER_GATEWAY:
  5657. case IP_ME:
  5658. case IP_ANY:
  5659. default:
  5660. PrintMessageFromModule(g_hModule, ADD_STATIC_RULE_INVALID_TUNNEL);
  5661. dwReturn = ERROR_NO_DISPLAY;
  5662. BAIL_OUT;
  5663. break;
  5664. }
  5665. }
  5666. break;
  5667. default :
  5668. break;
  5669. }
  5670. }
  5671. if((dwSrcSplServer != NOT_SPLSERVER) && (dwDstSplServer != NOT_SPLSERVER)
  5672. && (dwSrcSplServer != IP_ME) && (dwSrcSplServer != IP_ANY)
  5673. && (dwDstSplServer != IP_ME) && (dwDstSplServer != IP_ANY))
  5674. {
  5675. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_PARSER_ADDRTYPE);
  5676. dwReturn = ERROR_NO_DISPLAY;
  5677. BAIL_OUT;
  5678. }
  5679. //
  5680. // Source address setting up
  5681. //
  5682. if(dwSrcSplServer == NOT_SPLSERVER)
  5683. {
  5684. SrcAddr.AddrType = (SrcAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  5685. }
  5686. else
  5687. {
  5688. AddSplAddr(SrcAddr, dwSrcSplServer);
  5689. }
  5690. //
  5691. // Destination address setting up
  5692. //
  5693. if(dwDstSplServer == NOT_SPLSERVER)
  5694. {
  5695. DesAddr.AddrType = (DesAddr.uSubNetMask == IP_ADDRESS_MASK_NONE) ? IP_ADDR_UNIQUE : IP_ADDR_SUBNET;
  5696. }
  5697. else
  5698. {
  5699. AddSplAddr(DesAddr, dwDstSplServer);
  5700. }
  5701. if(!bTunnel)
  5702. {
  5703. //
  5704. // Check if the given Transport filter spec exists
  5705. //
  5706. if(FindAndGetTransportRule(SrcAddr, DesAddr, bMirror, InterfaceType, dwProtocol, dwSrcPort, dwDstPort,
  5707. bSrcMask, bDstMask, &pTransportFltr, dwReturn))
  5708. {
  5709. dwReturn = DeleteTransportRule(*(pTransportFltr));
  5710. BAIL_ON_WIN32_ERROR(dwReturn);
  5711. dwReturn = DeleteIfLastRuleOfMMFilter(
  5712. SrcAddr,
  5713. DesAddr,
  5714. bMirror,
  5715. InterfaceType,
  5716. bSrcMask,
  5717. bDstMask,
  5718. dwReturn
  5719. );
  5720. }
  5721. else
  5722. {
  5723. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_RULE_NO_TRANSPORT);
  5724. dwReturn = ERROR_SUCCESS;
  5725. BAIL_OUT;
  5726. }
  5727. }
  5728. //
  5729. // Check if the given Tunnel filter spec exists
  5730. //
  5731. else
  5732. {
  5733. AddSplAddr(SrcTunnel, IP_ANY);
  5734. if(FindAndGetTunnelRule(SrcAddr, DesAddr, bMirror, InterfaceType, dwProtocol, dwSrcPort, dwDstPort,
  5735. bSrcMask, bDstMask, SrcTunnel, DstTunnel, &pTunnelFltr, dwReturn))
  5736. {
  5737. dwReturn = DeleteTunnelRule(*(pTunnelFltr));
  5738. BAIL_ON_WIN32_ERROR(dwReturn);
  5739. AddSplAddr(SrcTunnel, IP_ME);
  5740. dwReturn = DeleteIfLastRuleOfMMFilter(
  5741. SrcTunnel,
  5742. DstTunnel,
  5743. TRUE,
  5744. InterfaceType,
  5745. FALSE, // bSrcMask
  5746. FALSE, // bDstMask
  5747. dwReturn
  5748. );
  5749. }
  5750. else
  5751. {
  5752. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_RULE_NO_TUNNEL);
  5753. dwReturn = ERROR_SUCCESS;
  5754. BAIL_OUT;
  5755. }
  5756. }
  5757. error:
  5758. if(dwArgCount > 3)
  5759. {
  5760. CleanUp();
  5761. }
  5762. if(pTransportFltr)
  5763. {
  5764. if(pTransportFltr->pszFilterName)
  5765. delete [] pTransportFltr->pszFilterName;
  5766. delete pTransportFltr;
  5767. }
  5768. if(pTunnelFltr)
  5769. {
  5770. if(pTunnelFltr->pszFilterName)
  5771. delete [] pTunnelFltr->pszFilterName;
  5772. delete pTunnelFltr;
  5773. }
  5774. if((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_SHOW_USAGE)&&(dwReturn != ERROR_NO_DISPLAY))
  5775. {
  5776. //api errors
  5777. PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
  5778. dwReturn = ERROR_SUCCESS;
  5779. }
  5780. //already one error displayed.
  5781. if(dwReturn == ERROR_NO_DISPLAY)
  5782. {
  5783. dwReturn = ERROR_SUCCESS;
  5784. }
  5785. return dwReturn;
  5786. }
  5787. ///////////////////////////////////////////////////////////////////////////////////////////
  5788. //
  5789. // Function : AddSplAddr
  5790. //
  5791. // Date of Creation: 11-23-2001
  5792. //
  5793. // Parameters :
  5794. // IN OUT ADDR& Addr,
  5795. // IN DWORD dwSplServer
  5796. // Return : VOID
  5797. //
  5798. // Description : Adds a special server addr.
  5799. //
  5800. // Revision History:
  5801. //
  5802. // Date Author Comments
  5803. //
  5804. //////////////////////////////////////////////////////////////////////////////////////////
  5805. VOID
  5806. AddSplAddr(
  5807. IN OUT ADDR& Addr,
  5808. IN DWORD dwSplServer
  5809. )
  5810. {
  5811. //
  5812. // Fill up addr type, mask and uIpaddr for special servers
  5813. //
  5814. switch(dwSplServer)
  5815. {
  5816. case SERVER_WINS:
  5817. Addr.AddrType = IP_ADDR_WINS_SERVER;
  5818. Addr.uIpAddr = IP_ADDRESS_ME;
  5819. Addr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5820. break;
  5821. case SERVER_DHCP:
  5822. Addr.AddrType = IP_ADDR_DHCP_SERVER;
  5823. Addr.uIpAddr = IP_ADDRESS_ME;
  5824. Addr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5825. break;
  5826. case SERVER_DNS:
  5827. Addr.AddrType = IP_ADDR_DNS_SERVER;
  5828. Addr.uIpAddr = IP_ADDRESS_ME;
  5829. Addr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5830. break;
  5831. case SERVER_GATEWAY:
  5832. Addr.AddrType = IP_ADDR_DEFAULT_GATEWAY;
  5833. Addr.uIpAddr = IP_ADDRESS_ME;
  5834. Addr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5835. break;
  5836. case IP_ME:
  5837. Addr.AddrType = IP_ADDR_UNIQUE;
  5838. Addr.uIpAddr = IP_ADDRESS_ME;
  5839. Addr.uSubNetMask = IP_ADDRESS_MASK_NONE;
  5840. break;
  5841. case IP_ANY:
  5842. Addr.AddrType = IP_ADDR_SUBNET;
  5843. Addr.uIpAddr = SUBNET_ADDRESS_ANY;
  5844. Addr.uSubNetMask = SUBNET_MASK_ANY;
  5845. break;
  5846. default:
  5847. break;
  5848. }
  5849. }