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.

1136 lines
35 KiB

  1. /********************************************************************************
  2. / This is the base file to the Microsoft JScript Proxy Configuration
  3. / This file implements the code to provide the script site and the JSProxy psuedo
  4. / object for the script engine to call against.
  5. /
  6. / Created 11/27/96 larrysu
  7. /
  8. /
  9. /
  10. /
  11. /
  12. /
  13. /
  14. /
  15. /
  16. */
  17. #include <wininetp.h>
  18. #include "jsproxy.h"
  19. /*******************************************************************************
  20. * JSProxy functions.
  21. ********************************************************************************/
  22. CJSProxy::CJSProxy()
  23. {
  24. m_refCount = 1;
  25. m_fDestroyable = FALSE;
  26. m_fInitialized = FALSE;
  27. m_pCallout = NULL;
  28. }
  29. CJSProxy::~CJSProxy()
  30. {
  31. if(m_fInitialized)
  32. DeInit();
  33. }
  34. STDMETHODIMP CJSProxy::Init(AUTO_PROXY_HELPER_APIS* pAPHA)
  35. {
  36. if(!DelayLoad(&g_moduleOleAut32))
  37. return FALSE;
  38. m_strings[0] = L"isPlainHostName";
  39. m_strings[1] = L"dnsDomainIs";
  40. m_strings[2] = L"localHostOrDomainIs";
  41. m_strings[3] = L"isResolvable";
  42. m_strings[4] = L"isInNet";
  43. m_strings[5] = L"dnsResolve";
  44. m_strings[6] = L"myIpAddress";
  45. m_strings[7] = L"dnsDomainLevels";
  46. m_strings[8] = L"shExpMatch";
  47. m_strings[9] = L"weekdayRange";
  48. m_strings[10] = L"dateRange";
  49. m_strings[11] = L"timeRange";
  50. m_strings[12] = L"alert";
  51. m_pCallout = pAPHA;
  52. m_fInitialized = TRUE;
  53. return S_OK;
  54. }
  55. STDMETHODIMP CJSProxy::DeInit()
  56. {
  57. m_pCallout = NULL;
  58. m_fInitialized = FALSE;
  59. return S_OK;
  60. }
  61. //IDispatch functions for JSProxy. I want these to be light and fast.
  62. STDMETHODIMP CJSProxy::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames,UINT cNames, LCID lcid, DISPID FAR* rgdispid)
  63. {
  64. // Use addition of first 4 chars to make quick cheesy hash of which function wants to be called.
  65. // These are values are #defined in JSProxy.h
  66. HRESULT hr = S_OK;
  67. long strval = 0;
  68. unsigned long nameindex = 0;
  69. OLECHAR* currentName = NULL;
  70. UNREFERENCED_PARAMETER(riid);
  71. UNREFERENCED_PARAMETER(lcid);
  72. if (!*rgszNames)
  73. return E_POINTER;
  74. if (cNames < 1)
  75. return E_INVALIDARG;
  76. while (nameindex < cNames)
  77. {
  78. currentName = rgszNames[nameindex];
  79. if (currentName == NULL)
  80. break;
  81. //
  82. // All script host functions are at least 5 characters in length,
  83. // so shorter strings should fail match.
  84. //
  85. if (lstrlenW(currentName) < 5)
  86. strval = 0;
  87. else
  88. strval = currentName[0]+currentName[1]+currentName[2]+currentName[3]+currentName[4];
  89. switch (strval)
  90. {
  91. case VAL_myIpAddress :
  92. if (StrCmpW(m_strings[6],currentName) == 0)
  93. rgdispid[nameindex] = DISPID_myIpAddress;
  94. else
  95. {
  96. rgdispid[nameindex] = DISPID_UNKNOWN;
  97. hr = DISP_E_UNKNOWNNAME;
  98. }
  99. break;
  100. case VAL_isInNet :
  101. if (StrCmpW(m_strings[4],currentName) == 0)
  102. rgdispid[nameindex] = DISPID_isInNet;
  103. else
  104. {
  105. rgdispid[nameindex] = DISPID_UNKNOWN;
  106. hr = DISP_E_UNKNOWNNAME;
  107. }
  108. break;
  109. case VAL_dateRange :
  110. if (StrCmpW(m_strings[10],currentName) == 0)
  111. rgdispid[nameindex] = DISPID_dateRange;
  112. else
  113. {
  114. rgdispid[nameindex] = DISPID_UNKNOWN;
  115. hr = DISP_E_UNKNOWNNAME;
  116. }
  117. break;
  118. case VAL_dnsDomainIs : // This is also VAL_dnsDomainLevels check for both strings.
  119. if (StrCmpW(m_strings[7],currentName) == 0)
  120. rgdispid[nameindex] = DISPID_dnsDomainLevels;
  121. else
  122. {
  123. if (StrCmpW(m_strings[1],currentName) == 0)
  124. rgdispid[nameindex] = DISPID_dnsDomainIs;
  125. else
  126. {
  127. rgdispid[nameindex] = DISPID_UNKNOWN;
  128. hr = DISP_E_UNKNOWNNAME;
  129. }
  130. }
  131. break;
  132. case VAL_isPlainHostName :
  133. if (StrCmpW(m_strings[0],currentName) == 0)
  134. rgdispid[nameindex] = DISPID_isPlainHostName;
  135. else
  136. {
  137. rgdispid[nameindex] = DISPID_UNKNOWN;
  138. hr = DISP_E_UNKNOWNNAME;
  139. }
  140. break;
  141. case VAL_dnsResolve :
  142. if (StrCmpW(m_strings[5],currentName) == 0)
  143. rgdispid[nameindex] = DISPID_dnsResolve;
  144. else
  145. {
  146. rgdispid[nameindex] = DISPID_UNKNOWN;
  147. hr = DISP_E_UNKNOWNNAME;
  148. }
  149. break;
  150. case VAL_timeRange :
  151. if (StrCmpW(m_strings[11],currentName) == 0)
  152. rgdispid[nameindex] = DISPID_timeRange;
  153. else
  154. {
  155. rgdispid[nameindex] = DISPID_UNKNOWN;
  156. hr = DISP_E_UNKNOWNNAME;
  157. }
  158. break;
  159. case VAL_isResolvable :
  160. if (StrCmpW(m_strings[3],currentName) == 0)
  161. rgdispid[nameindex] = DISPID_isResolvable;
  162. else
  163. {
  164. rgdispid[nameindex] = DISPID_UNKNOWN;
  165. hr = DISP_E_UNKNOWNNAME;
  166. }
  167. break;
  168. case VAL_shExpMatch :
  169. if (StrCmpW(m_strings[8],currentName) == 0)
  170. rgdispid[nameindex] = DISPID_shExpMatch;
  171. else
  172. {
  173. rgdispid[nameindex] = DISPID_UNKNOWN;
  174. hr = DISP_E_UNKNOWNNAME;
  175. }
  176. break;
  177. case VAL_localHostOrDomainIs :
  178. if (StrCmpW(m_strings[2],currentName) == 0)
  179. rgdispid[nameindex] = DISPID_localHostOrDomainIs;
  180. else
  181. {
  182. rgdispid[nameindex] = DISPID_UNKNOWN;
  183. hr = DISP_E_UNKNOWNNAME;
  184. }
  185. break;
  186. case VAL_weekdayRange :
  187. if (StrCmpW(m_strings[9],currentName) == 0)
  188. rgdispid[nameindex] = DISPID_weekdayRange;
  189. else
  190. {
  191. rgdispid[nameindex] = DISPID_UNKNOWN;
  192. hr = DISP_E_UNKNOWNNAME;
  193. }
  194. break;
  195. case VAL_alert :
  196. if (StrCmpW(m_strings[12],currentName) == 0)
  197. rgdispid[nameindex] = DISPID_alert;
  198. else
  199. {
  200. rgdispid[nameindex] = DISPID_UNKNOWN;
  201. hr = DISP_E_UNKNOWNNAME;
  202. }
  203. break;
  204. case 0:
  205. default :
  206. rgdispid[nameindex] = DISPID_UNKNOWN;
  207. hr = DISP_E_UNKNOWNNAME;
  208. break;
  209. }
  210. nameindex++;
  211. }
  212. return hr;
  213. }
  214. STDMETHODIMP CJSProxy::Invoke(
  215. DISPID dispidMember,
  216. REFIID riid,
  217. LCID lcid,
  218. WORD wFlags,
  219. DISPPARAMS* pdispparams,
  220. VARIANT* pvarResult,
  221. EXCEPINFO* pexcepinfo,
  222. UINT* puArgErr)
  223. {
  224. HRESULT hr = S_OK;
  225. UNREFERENCED_PARAMETER(riid);
  226. UNREFERENCED_PARAMETER(lcid);
  227. UNREFERENCED_PARAMETER(pexcepinfo);
  228. UNREFERENCED_PARAMETER(puArgErr);
  229. if (dispidMember > 0x000d)
  230. return DISP_E_MEMBERNOTFOUND;
  231. if (!(wFlags & (DISPATCH_PROPERTYGET|DISPATCH_METHOD)))
  232. {
  233. return DISP_E_MEMBERNOTFOUND;
  234. }
  235. if(!m_fInitialized)
  236. return DISP_E_BADCALLEE;
  237. // The big switch based on DISPID!
  238. switch (dispidMember)
  239. {
  240. /*****************************************************************************
  241. Calling isPlainHostName
  242. *****************************************************************************/
  243. case DISPID_isPlainHostName :
  244. {
  245. // look in the DISPARAMS to make sure the signature is correct for this function.
  246. if (pdispparams->cArgs != 1)
  247. hr = DISP_E_BADPARAMCOUNT;
  248. if (pdispparams->cNamedArgs > 0)
  249. hr = DISP_E_NONAMEDARGS;
  250. if (FAILED(hr))
  251. break;
  252. VARIANT arg1;
  253. // check the type of the variant in the disparams and if it is a bstr use it
  254. if (pdispparams->rgvarg[0].vt == VT_BSTR)
  255. arg1 = pdispparams->rgvarg[0];
  256. // otherwise change it into one! if this fails the return an error.
  257. else
  258. {
  259. hr = DL(VariantChangeType)(&arg1,&(pdispparams->rgvarg[0]),NULL,VT_BSTR);
  260. if (FAILED(hr))
  261. {
  262. hr = DISP_E_TYPEMISMATCH;
  263. break;
  264. }
  265. }
  266. // call isPlainHostName.
  267. hr = isPlainHostName(arg1.bstrVal,pvarResult);
  268. break;
  269. }
  270. /*****************************************************************************
  271. Calling dnsDomainIs
  272. *****************************************************************************/
  273. case DISPID_dnsDomainIs :
  274. {
  275. if (pdispparams->cArgs != 2)
  276. {
  277. hr = DISP_E_BADPARAMCOUNT;
  278. break;
  279. }
  280. if (pdispparams->cNamedArgs > 0)
  281. {
  282. hr = DISP_E_NONAMEDARGS;
  283. break;
  284. }
  285. VARIANT arg1;
  286. VARIANT arg2;
  287. // check the type of the variant in the disparams and if it is a bstr use it
  288. if (pdispparams->rgvarg[0].vt == VT_BSTR)
  289. arg2 = pdispparams->rgvarg[0];
  290. // otherwise change it into one! if this fails the return an error.
  291. else
  292. {
  293. hr = DL(VariantChangeType)(&arg2,&(pdispparams->rgvarg[0]),NULL,VT_BSTR);
  294. if (FAILED(hr))
  295. {
  296. hr = DISP_E_TYPEMISMATCH;
  297. break;
  298. }
  299. }
  300. if (pdispparams->rgvarg[1].vt == VT_BSTR)
  301. arg1 = pdispparams->rgvarg[1];
  302. // otherwise change it into one! if this fails the return an error.
  303. else
  304. {
  305. hr = DL(VariantChangeType)(&arg1,&(pdispparams->rgvarg[1]),NULL,VT_BSTR);
  306. if (FAILED(hr))
  307. {
  308. hr = DISP_E_TYPEMISMATCH;
  309. break;
  310. }
  311. }
  312. // call dnsDomainIs
  313. hr = dnsDomainIs(arg1.bstrVal,arg2.bstrVal,pvarResult);
  314. break;
  315. }
  316. /*****************************************************************************
  317. Calling localHostOrDomainIs
  318. *****************************************************************************/
  319. case DISPID_localHostOrDomainIs :
  320. {
  321. if (pdispparams->cArgs != 2)
  322. {
  323. hr = DISP_E_BADPARAMCOUNT;
  324. break;
  325. }
  326. if (pdispparams->cNamedArgs > 0)
  327. {
  328. hr = DISP_E_NONAMEDARGS;
  329. break;
  330. }
  331. VARIANT arg1;
  332. VARIANT arg2;
  333. // check the type of the variant in the disparams and if it is a bstr use it
  334. if (pdispparams->rgvarg[0].vt == VT_BSTR)
  335. arg2 = pdispparams->rgvarg[0];
  336. // otherwise change it into one! if this fails the return an error.
  337. else
  338. {
  339. hr = DL(VariantChangeType)(&arg2,&(pdispparams->rgvarg[0]),NULL,VT_BSTR);
  340. if (FAILED(hr))
  341. {
  342. hr = DISP_E_TYPEMISMATCH;
  343. break;
  344. }
  345. }
  346. if (pdispparams->rgvarg[1].vt == VT_BSTR)
  347. arg1 = pdispparams->rgvarg[1];
  348. // otherwise change it into one! if this fails the return an error.
  349. else
  350. {
  351. hr = DL(VariantChangeType)(&arg1,&(pdispparams->rgvarg[1]),NULL,VT_BSTR);
  352. if (FAILED(hr))
  353. {
  354. hr = DISP_E_TYPEMISMATCH;
  355. break;
  356. }
  357. }
  358. // call localHostOrDomainIs
  359. hr = localHostOrDomainIs(arg1.bstrVal,arg2.bstrVal,pvarResult);
  360. break;
  361. }
  362. /*****************************************************************************
  363. Calling isResolvable
  364. *****************************************************************************/
  365. case DISPID_isResolvable :
  366. {
  367. if (pdispparams->cArgs != 1)
  368. {
  369. hr = DISP_E_BADPARAMCOUNT;
  370. break;
  371. }
  372. if (pdispparams->cNamedArgs > 0)
  373. {
  374. hr = DISP_E_NONAMEDARGS;
  375. break;
  376. }
  377. VARIANT arg1;
  378. // check the type of the variant in the disparams and if it is a bstr use it
  379. if (pdispparams->rgvarg[0].vt == VT_BSTR)
  380. arg1 = pdispparams->rgvarg[0];
  381. // otherwise change it into one! if this fails the return an error.
  382. else
  383. {
  384. hr = DL(VariantChangeType)(&arg1,&(pdispparams->rgvarg[0]),NULL,VT_BSTR);
  385. if (FAILED(hr))
  386. {
  387. hr = DISP_E_TYPEMISMATCH;
  388. break;
  389. }
  390. }
  391. // call isResolvable
  392. hr = isResolvable(arg1.bstrVal,pvarResult);
  393. break;
  394. }
  395. /*****************************************************************************
  396. Calling isInNet
  397. *****************************************************************************/
  398. case DISPID_isInNet :
  399. {
  400. int x;
  401. if (pdispparams->cArgs != 3)
  402. {
  403. hr = DISP_E_BADPARAMCOUNT;
  404. break;
  405. }
  406. if (pdispparams->cNamedArgs > 0)
  407. {
  408. hr = DISP_E_NONAMEDARGS;
  409. break;
  410. }
  411. VARIANT args[3];
  412. for (x=0;x<3;x++)
  413. {
  414. // check the type of the variant in the disparams and if it is a bstr use it
  415. if (pdispparams->rgvarg[x].vt == VT_BSTR)
  416. args[x] = pdispparams->rgvarg[x];
  417. // otherwise change it into one! if this fails the return an error.
  418. else
  419. {
  420. hr = DL(VariantChangeType)(&args[x],&(pdispparams->rgvarg[x]),NULL,VT_BSTR);
  421. if (FAILED(hr))
  422. {
  423. hr = DISP_E_TYPEMISMATCH;
  424. break;
  425. }
  426. }
  427. }
  428. if (FAILED(hr))
  429. break;
  430. // call isInNet. Args need to be reversed
  431. hr = isInNet(args[2].bstrVal,args[1].bstrVal,args[0].bstrVal,pvarResult);
  432. break;
  433. }
  434. /*****************************************************************************
  435. Calling dnsResolve
  436. *****************************************************************************/
  437. case DISPID_dnsResolve :
  438. {
  439. if (pdispparams->cArgs != 1)
  440. {
  441. hr = DISP_E_BADPARAMCOUNT;
  442. break;
  443. }
  444. if (pdispparams->cNamedArgs > 0)
  445. {
  446. hr = DISP_E_NONAMEDARGS;
  447. break;
  448. }
  449. VARIANT arg1;
  450. // check the type of the variant in the disparams and if it is a bstr use it
  451. if (pdispparams->rgvarg[0].vt == VT_BSTR)
  452. arg1 = pdispparams->rgvarg[0];
  453. // otherwise change it into one! if this fails the return an error.
  454. else
  455. {
  456. hr = DL(VariantChangeType)(&arg1,&(pdispparams->rgvarg[0]),NULL,VT_BSTR);
  457. if (FAILED(hr))
  458. {
  459. hr = DISP_E_TYPEMISMATCH;
  460. break;
  461. }
  462. }
  463. // call dnsResolve
  464. hr = dnsResolve(arg1.bstrVal,pvarResult);
  465. break;
  466. }
  467. /*****************************************************************************
  468. Calling myIpAddress
  469. *****************************************************************************/
  470. case DISPID_myIpAddress :
  471. // Should have no args and 1 named arg and the name should be DISPATCH_PROPERTYGET!
  472. /* if (pdispparams->cNamedArgs != 1)
  473. {
  474. hr = DISP_E_BADPARAMCOUNT;
  475. break;
  476. }
  477. */
  478. // call myIpAddress
  479. hr = myIpAddress(pvarResult);
  480. break;
  481. /*****************************************************************************
  482. Calling dnsDomainLevels
  483. *****************************************************************************/
  484. case DISPID_dnsDomainLevels :
  485. {
  486. if (pdispparams->cArgs != 1)
  487. {
  488. hr = DISP_E_BADPARAMCOUNT;
  489. break;
  490. }
  491. if (pdispparams->cNamedArgs > 0)
  492. {
  493. hr = DISP_E_NONAMEDARGS;
  494. break;
  495. }
  496. VARIANT arg1;
  497. // check the type of the variant in the disparams and if it is a bstr use it
  498. if (pdispparams->rgvarg[0].vt == VT_BSTR)
  499. arg1 = pdispparams->rgvarg[0];
  500. // otherwise change it into one! if this fails the return an error.
  501. else
  502. {
  503. hr = DL(VariantChangeType)(&arg1,&(pdispparams->rgvarg[0]),NULL,VT_BSTR);
  504. if (FAILED(hr))
  505. {
  506. hr = DISP_E_TYPEMISMATCH;
  507. break;
  508. }
  509. }
  510. // call dnsDomainLevels
  511. hr = dnsDomainLevels(arg1.bstrVal,pvarResult);
  512. break;
  513. }
  514. /*****************************************************************************
  515. Calling shExpMatch
  516. *****************************************************************************/
  517. case DISPID_shExpMatch :
  518. {
  519. if (pdispparams->cArgs != 2)
  520. {
  521. hr = DISP_E_BADPARAMCOUNT;
  522. break;
  523. }
  524. if (pdispparams->cNamedArgs > 0)
  525. {
  526. hr = DISP_E_NONAMEDARGS;
  527. break;
  528. }
  529. VARIANT arg1;
  530. VARIANT arg2;
  531. // check the type of the variant in the disparams and if it is a bstr use it
  532. if (pdispparams->rgvarg[0].vt == VT_BSTR)
  533. arg2 = pdispparams->rgvarg[0];
  534. // otherwise change it into one! if this fails the return an error.
  535. else
  536. {
  537. hr = DL(VariantChangeType)(&arg2,&(pdispparams->rgvarg[0]),NULL,VT_BSTR);
  538. if (FAILED(hr))
  539. {
  540. hr = DISP_E_TYPEMISMATCH;
  541. break;
  542. }
  543. }
  544. if (pdispparams->rgvarg[1].vt == VT_BSTR)
  545. arg1 = pdispparams->rgvarg[1];
  546. // otherwise change it into one! if this fails the return an error.
  547. else
  548. {
  549. hr = DL(VariantChangeType)(&arg1,&(pdispparams->rgvarg[1]),NULL,VT_BSTR);
  550. if (FAILED(hr))
  551. {
  552. hr = DISP_E_TYPEMISMATCH;
  553. break;
  554. }
  555. }
  556. // call isPlainHostName.
  557. hr = shExpMatch(arg1.bstrVal,arg2.bstrVal,pvarResult);
  558. break;
  559. }
  560. /*****************************************************************************
  561. Calling weekdayRange
  562. *****************************************************************************/
  563. case DISPID_weekdayRange :
  564. {
  565. unsigned int x;
  566. if ((pdispparams->cArgs > 3) || (pdispparams->cArgs < 1))
  567. {
  568. hr = DISP_E_BADPARAMCOUNT;
  569. break;
  570. }
  571. if (pdispparams->cNamedArgs > 0)
  572. {
  573. hr = DISP_E_NONAMEDARGS;
  574. break;
  575. }
  576. VARIANT* args[3] = {NULL,NULL,NULL};
  577. for (x=0;x<pdispparams->cArgs;x++)
  578. {
  579. args[x] = new(VARIANT);
  580. if( !(args[x]) )
  581. {
  582. hr = E_OUTOFMEMORY;
  583. break;
  584. }
  585. // check the type of the variant in the disparams and if it is a bstr use it
  586. if (pdispparams->rgvarg[x].vt == VT_BSTR)
  587. *args[x] = pdispparams->rgvarg[x];
  588. // otherwise change it into one! if this fails the return an error.
  589. else
  590. {
  591. hr = DL(VariantChangeType)(args[x],&(pdispparams->rgvarg[x]),NULL,VT_BSTR);
  592. if (FAILED(hr))
  593. {
  594. hr = DISP_E_TYPEMISMATCH;
  595. break;
  596. }
  597. }
  598. }
  599. if (FAILED(hr))
  600. break;
  601. // call isInNet. Args need to be reversed
  602. switch (pdispparams->cArgs)
  603. {
  604. case 1:
  605. hr = weekdayRange(args[0]->bstrVal,NULL,NULL,pvarResult);
  606. break;
  607. case 2:
  608. if ((args[0]->bstrVal[0] == 'G') || (args[0]->bstrVal[0] == 'g'))
  609. hr = weekdayRange(args[1]->bstrVal,NULL,args[0]->bstrVal,pvarResult);
  610. else
  611. hr = weekdayRange(args[1]->bstrVal,args[0]->bstrVal,NULL,pvarResult);
  612. break;
  613. case 3:
  614. hr = weekdayRange(args[2]->bstrVal,args[1]->bstrVal,args[0]->bstrVal,pvarResult);
  615. break;
  616. }
  617. break;
  618. }
  619. /*****************************************************************************
  620. Calling dateRange
  621. *****************************************************************************/
  622. case DISPID_dateRange :
  623. break;
  624. /*****************************************************************************
  625. Calling timeRange
  626. *****************************************************************************/
  627. case DISPID_timeRange :
  628. break;
  629. /*****************************************************************************
  630. Calling alert
  631. *****************************************************************************/
  632. case DISPID_alert :
  633. {
  634. // look in the DISPARAMS to make sure the signiture is correct for this function.
  635. if (pdispparams->cArgs != 1)
  636. hr = DISP_E_BADPARAMCOUNT;
  637. if (pdispparams->cNamedArgs > 0)
  638. hr = DISP_E_NONAMEDARGS;
  639. if (FAILED(hr))
  640. break;
  641. VARIANT arg1;
  642. // check the type of the variant in the disparams and if it is a bstr use it
  643. if (pdispparams->rgvarg[0].vt == VT_BSTR)
  644. arg1 = pdispparams->rgvarg[0];
  645. // otherwise change it into one! if this fails the return an error.
  646. else
  647. {
  648. hr = DL(VariantChangeType)(&arg1,&(pdispparams->rgvarg[0]),NULL,VT_BSTR);
  649. if (FAILED(hr))
  650. {
  651. hr = DISP_E_TYPEMISMATCH;
  652. break;
  653. }
  654. }
  655. // call alert.
  656. hr = alert(arg1.bstrVal,pvarResult);
  657. break;
  658. }
  659. /*****************************************************************************
  660. Default returning error code
  661. *****************************************************************************/
  662. default:
  663. hr = DISP_E_MEMBERNOTFOUND;
  664. }
  665. return hr;
  666. }
  667. // JScript Auto-Proxy config functions.
  668. STDMETHODIMP CJSProxy::isPlainHostName(BSTR host, VARIANT* retval)
  669. {
  670. WCHAR *currentch;
  671. BOOL bfound = FALSE;
  672. if (!host || !retval)
  673. return E_POINTER;
  674. retval->vt = VT_BOOL;
  675. // check to detemine whether this is a plain host name!
  676. currentch = host;
  677. while ((*currentch != '\0') && !bfound)
  678. {
  679. if (*currentch == '.')
  680. bfound = TRUE;
  681. else
  682. currentch++;
  683. }
  684. if (bfound)
  685. retval->boolVal = VARIANT_FALSE;
  686. else
  687. retval->boolVal = VARIANT_TRUE;
  688. return S_OK;
  689. }
  690. STDMETHODIMP CJSProxy::dnsDomainIs(BSTR host,BSTR domain, VARIANT* retval)
  691. {
  692. WCHAR *result = NULL;
  693. if (!host || !domain || !retval)
  694. return E_POINTER;
  695. result = StrStrW(host,domain);
  696. retval->vt = VT_BOOL;
  697. if (result)
  698. retval->boolVal = VARIANT_TRUE;
  699. else
  700. retval->boolVal = VARIANT_FALSE;
  701. return S_OK;
  702. }
  703. STDMETHODIMP CJSProxy::localHostOrDomainIs(BSTR host,BSTR hostdom, VARIANT* retval)
  704. {
  705. HRESULT hr = S_OK;
  706. if (!host || !hostdom || !retval)
  707. return E_POINTER;
  708. // check to see if it is a local host
  709. hr = isPlainHostName(host,retval);
  710. if (SUCCEEDED(hr))
  711. {
  712. if (retval->boolVal != VARIANT_TRUE)
  713. {
  714. //
  715. // this is a strange function, if its not a local hostname
  716. // we do a strait compare against the passed in domain
  717. // string. If its not a direct match, then its FALSE,
  718. // even if the root of the domain/hostname are the same.
  719. // Blame Netscape for this, we are just following their
  720. // behavior and docs.
  721. //
  722. if ( StrCmpIW(host, hostdom) == 0 )
  723. {
  724. retval->boolVal = VARIANT_TRUE;
  725. }
  726. else
  727. {
  728. retval->boolVal = VARIANT_FALSE;
  729. }
  730. }
  731. }
  732. return hr;
  733. }
  734. // Functions that need to call back on wininet.
  735. STDMETHODIMP CJSProxy::isResolvable(BSTR host, VARIANT* retval)
  736. {
  737. if (!host || !retval)
  738. return E_POINTER;
  739. // call into wininet provided functions!
  740. retval->vt = VT_BOOL;
  741. if (m_pCallout)
  742. {
  743. MAKE_ANSIPTR_FROMWIDE(szhost,host);
  744. if (m_pCallout->IsResolvable(szhost))
  745. retval->boolVal = VARIANT_TRUE;
  746. else
  747. retval->boolVal = VARIANT_FALSE;
  748. }
  749. else
  750. retval->boolVal = VARIANT_FALSE;
  751. return S_OK;
  752. }
  753. STDMETHODIMP CJSProxy::isInNet(BSTR host, BSTR pattern, BSTR mask, VARIANT* retval)
  754. {
  755. VARIANT myretval;
  756. HRESULT hr = S_OK;
  757. // Because isInNet() is only called from Invoke(), a non-debug
  758. //check on m_fInitialized has already been done.
  759. INET_ASSERT(m_fInitialized);
  760. // call into wininet provided functions!
  761. if (!host || !pattern || !mask || !retval)
  762. return E_POINTER;
  763. // call into wininet provided functions!
  764. retval->vt = VT_BOOL;
  765. DL(VariantInit)(&myretval);
  766. if (m_pCallout)
  767. {
  768. hr = dnsResolve(host,&myretval);
  769. if (SUCCEEDED(hr))
  770. {
  771. if (myretval.vt != VT_BSTR)
  772. {
  773. DL(VariantClear)(&myretval);
  774. retval->boolVal = VARIANT_FALSE;
  775. return hr;
  776. }
  777. }
  778. else
  779. {
  780. DL(VariantClear)(&myretval);
  781. retval->boolVal = VARIANT_FALSE;
  782. return hr;
  783. }
  784. // Fallthrough to code to check IP/pattern and mask!
  785. MAKE_ANSIPTR_FROMWIDE(szhost,myretval.bstrVal);
  786. MAKE_ANSIPTR_FROMWIDE(szpattern,pattern);
  787. MAKE_ANSIPTR_FROMWIDE(szmask,mask);
  788. // Check to see if IP address from dnsResolve matches the pattern/mask!
  789. if ( m_pCallout->IsInNet(szhost, szpattern, szmask ) )
  790. retval->boolVal = VARIANT_TRUE;
  791. else
  792. retval->boolVal = VARIANT_FALSE;
  793. }
  794. else
  795. retval->boolVal = VARIANT_FALSE;
  796. DL(VariantClear)(&myretval);
  797. return S_OK;
  798. }
  799. STDMETHODIMP CJSProxy::dnsResolve(BSTR host, VARIANT* retval)
  800. {
  801. char ipaddress[16];
  802. DWORD dwretval;
  803. DWORD dwipsize = 16;
  804. if (!host || !retval)
  805. return E_POINTER;
  806. // call into wininet provided functions!
  807. if (m_pCallout)
  808. {
  809. MAKE_ANSIPTR_FROMWIDE(szhost,host);
  810. dwretval = m_pCallout->ResolveHostName(szhost,ipaddress,&dwipsize);
  811. if (dwretval == ERROR_SUCCESS)
  812. {
  813. retval->vt = VT_BSTR;
  814. retval->bstrVal = MakeWideStrFromAnsi((LPSTR)ipaddress,STR_BSTR);
  815. }
  816. else
  817. {
  818. retval->vt = VT_BOOL;
  819. retval->boolVal = VARIANT_FALSE;
  820. }
  821. }
  822. else
  823. {
  824. retval->vt = VT_BOOL;
  825. retval->boolVal = VARIANT_FALSE;
  826. }
  827. return S_OK;
  828. }
  829. STDMETHODIMP CJSProxy::myIpAddress(VARIANT* retval)
  830. {
  831. char ipaddress[16];
  832. DWORD dwretval;
  833. DWORD dwipsize = 16;
  834. if (!retval)
  835. return E_POINTER;
  836. // call into wininet provided functions!
  837. if (m_pCallout)
  838. {
  839. dwretval = m_pCallout->GetIPAddress(ipaddress,&dwipsize);
  840. if (dwretval == ERROR_SUCCESS)
  841. {
  842. retval->vt = VT_BSTR;
  843. retval->bstrVal = MakeWideStrFromAnsi((LPSTR)ipaddress,STR_BSTR);
  844. }
  845. else
  846. {
  847. retval->vt = VT_BOOL;
  848. retval->boolVal = VARIANT_FALSE;
  849. }
  850. }
  851. else
  852. {
  853. retval->vt = VT_BOOL;
  854. retval->boolVal = VARIANT_FALSE;
  855. }
  856. return S_OK;
  857. }
  858. // Back to functions implemented here.
  859. STDMETHODIMP CJSProxy::dnsDomainLevels(BSTR host, VARIANT* retval)
  860. {
  861. WCHAR *currentch;
  862. DWORD dwlevels = 0;
  863. if (!host || !retval)
  864. return E_POINTER;
  865. retval->vt = VT_I4;
  866. // check to detemine whether this is a plain host name!
  867. currentch = host;
  868. while (*currentch != L'\0')
  869. {
  870. if (*currentch == L'.')
  871. dwlevels++;
  872. currentch++;
  873. }
  874. retval->lVal = dwlevels;
  875. return S_OK;
  876. }
  877. STDMETHODIMP CJSProxy::shExpMatch(BSTR str, BSTR shexp, VARIANT* retval)
  878. {
  879. if (!str || !shexp || !retval)
  880. return E_POINTER;
  881. retval->vt = VT_BOOL;
  882. // convert BSTR to ansi - these macros allocate memory that is freed when they
  883. // go out of scope! No need to free!
  884. MAKE_ANSIPTR_FROMWIDE(szstr, str);
  885. MAKE_ANSIPTR_FROMWIDE(szshexp, shexp);
  886. // Call into the regular expression matching code.
  887. if (match(szstr,szshexp))
  888. retval->boolVal = VARIANT_TRUE;
  889. else
  890. retval->boolVal = VARIANT_FALSE;
  891. return S_OK;
  892. }
  893. // These are to do last!!!.
  894. STDMETHODIMP CJSProxy::weekdayRange(BSTR wd1, BSTR wd2, BSTR gmt, VARIANT* retval)
  895. {
  896. SYSTEMTIME systime;
  897. char szday[4];
  898. int today = -1;
  899. int day1 = -1; // days are as follows SUN = 0; MON = 1; ...;SAT = 6.
  900. int day2 = -1;
  901. BOOL bIsInRange = FALSE;
  902. if (!wd1)
  903. return E_POINTER;
  904. if (gmt)
  905. GetSystemTime(&systime);
  906. GetDateFormat(//LOCALE_SYSTEM_DEFAULT,
  907. MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT),
  908. NULL,
  909. gmt? &systime:NULL,
  910. "ddd",
  911. szday,
  912. 4);
  913. if (szday)
  914. {
  915. int lcv;
  916. //convert all chars to upper if lowercase (don't use runtimes)
  917. for (lcv=0;lcv<3;lcv++)
  918. {
  919. if ((short)szday[lcv] > 90)
  920. szday[lcv]-=32;
  921. }
  922. today = ConvertAnsiDayToInt(szday);
  923. }
  924. if (today == -1)
  925. return E_FAIL;
  926. // compare day ranges!
  927. if (wd2)
  928. {
  929. // These are by definition in ALL CAPS
  930. MAKE_ANSIPTR_FROMWIDE(szwd1, wd1);
  931. MAKE_ANSIPTR_FROMWIDE(szwd2, wd2);
  932. if (szwd1 && szwd2)
  933. {
  934. day1 = ConvertAnsiDayToInt(szwd1);
  935. day2 = ConvertAnsiDayToInt(szwd2);
  936. }
  937. if ((day1 == -1) || (day2 == -1))
  938. return E_INVALIDARG;
  939. if (day1 < day2)
  940. {
  941. if ((today >= day1) && (today <= day2))
  942. bIsInRange = TRUE;
  943. else
  944. bIsInRange = FALSE;
  945. }
  946. else if ( day1 == day2 )
  947. {
  948. if (today == day1)
  949. {
  950. bIsInRange = TRUE;
  951. }
  952. else
  953. {
  954. bIsInRange = FALSE;
  955. }
  956. }
  957. else
  958. {
  959. if ((today >= day1) || (today <= day2))
  960. bIsInRange = TRUE;
  961. else
  962. bIsInRange = FALSE;
  963. }
  964. }
  965. else // only one day to check!
  966. {
  967. MAKE_ANSIPTR_FROMWIDE(szwd1, wd1);
  968. if (lstrcmp(szday,szwd1) == 0)
  969. bIsInRange = TRUE;
  970. else
  971. bIsInRange = FALSE;
  972. }
  973. if (bIsInRange)
  974. {
  975. retval->vt = VT_BOOL;
  976. retval->boolVal = VARIANT_TRUE;
  977. }
  978. else
  979. {
  980. retval->vt = VT_BOOL;
  981. retval->boolVal = VARIANT_FALSE;
  982. }
  983. return S_OK;
  984. }
  985. STDMETHODIMP CJSProxy::dateRange(long day, BSTR month, BSTR gmt, VARIANT* retval)
  986. {
  987. UNREFERENCED_PARAMETER(day);
  988. UNREFERENCED_PARAMETER(month);
  989. UNREFERENCED_PARAMETER(gmt);
  990. UNREFERENCED_PARAMETER(retval);
  991. return S_OK;
  992. }
  993. STDMETHODIMP CJSProxy::timeRange(long hour, long min, long sec, BSTR gmt, VARIANT* retval)
  994. {
  995. UNREFERENCED_PARAMETER(hour);
  996. UNREFERENCED_PARAMETER(min);
  997. UNREFERENCED_PARAMETER(sec);
  998. UNREFERENCED_PARAMETER(gmt);
  999. UNREFERENCED_PARAMETER(retval);
  1000. return S_OK;
  1001. }
  1002. STDMETHODIMP CJSProxy::alert(BSTR message, VARIANT* retval)
  1003. {
  1004. if (!message)
  1005. return E_POINTER;
  1006. // Return true if available...not needed?
  1007. if (retval)
  1008. {
  1009. retval->vt = VT_BOOL;
  1010. retval->vt = VARIANT_FALSE;
  1011. }
  1012. return S_OK;
  1013. }