portaddr.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:14k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxcom.h"
  36. #if defined (_UNIX) || defined (_WIN16)
  37. #include <stdlib.h>
  38. #endif
  39. #include "hxcomm.h"
  40. #include "hxslist.h"
  41. #include "hxstring.h"
  42. #include "hxstrutl.h"
  43. #include "hxbuffer.h"
  44. #include "hxprefs.h"
  45. #include "netbyte.h"
  46. #include "portaddr.h"
  47. #include "hxheap.h"
  48. #ifdef _DEBUG
  49. #undef HX_THIS_FILE
  50. static const char HX_THIS_FILE[] = __FILE__;
  51. #endif
  52. HX_RESULT
  53. ReadUDPPorts(IHXBuffer* pBuffer, REF(CHXSimpleList*) pUDPPortList)
  54. {
  55.     HX_RESULT hr = HXR_OK;
  56.     int i = 0;
  57.     UINT16 iPort = 0;
  58.     BOOL bNewEntry = TRUE;
  59.     char* pUDPPorts = NULL;
  60.     char* pToken = NULL;
  61.     UDP_PORTS* pEntry = NULL;
  62.     UDP_PORTS* pUDPPort = NULL;
  63.     CHXString szToken;
  64.     if (!pBuffer || !pUDPPortList)
  65.     {
  66. hr = HXR_FAILED;
  67. goto cleanup;
  68.     }
  69.     pUDPPorts = (char*)pBuffer->GetBuffer();
  70.     pToken = strtok(pUDPPorts, ",");
  71.     while (pToken)
  72.     {
  73. bNewEntry = TRUE;
  74. szToken = pToken;
  75. pEntry = new UDP_PORTS;
  76. // trim off the spaces
  77. szToken.TrimLeft();
  78. szToken.TrimRight();
  79. i = szToken.Find('-');
  80. if (-1 == i)
  81. {
  82.     // single port
  83.     iPort = atoi(szToken);
  84.     CHXSimpleList::Iterator lIterator = pUDPPortList->Begin();
  85.     for (; lIterator != pUDPPortList->End(); ++lIterator)
  86.     {
  87.  pUDPPort = (UDP_PORTS*) (*lIterator);
  88.  if (pUDPPort->uFrom == iPort + 1)
  89.  {
  90.      pUDPPort->uFrom = iPort;
  91.      bNewEntry = FALSE;
  92.  }
  93.  else if (pUDPPort->uTo + 1 == iPort)
  94.  {
  95.      pUDPPort->uTo = iPort;
  96.      bNewEntry = FALSE;
  97.  }
  98.     }
  99.     if (bNewEntry)
  100.     {
  101. pEntry->uFrom = atoi(szToken);
  102. pEntry->uTo = atoi(szToken);
  103. pUDPPortList->AddTail((void*)pEntry);
  104.     }
  105.     else
  106.     {
  107. HX_DELETE(pEntry);
  108.     }
  109. }
  110. // the entry is a range
  111. else
  112. {
  113.     CHXString szFrom = szToken.Left(i);
  114.     CHXString szTo = szToken.Right(szToken.GetLength() - (i + 1));
  115.     szFrom.TrimRight();
  116.     szTo.TrimLeft();
  117.     pEntry->uFrom = atoi(szFrom);
  118.     pEntry->uTo = atoi(szTo);
  119.     pUDPPortList->AddTail((void*)pEntry);
  120. }
  121. pToken = strtok(NULL, ",");
  122.     }
  123. cleanup:
  124.     return hr;
  125. }
  126. HX_RESULT   
  127. ReadListEntries(IHXBuffer* pValue, REF(CHXSimpleList*) pEntryList)
  128. {
  129.     HX_RESULT hr = HXR_OK;
  130.     char* pszValue = NULL;
  131.     char* pszToken = NULL;
  132.     CHXString* pToken = NULL;
  133.     CommonEntry* pEntry = NULL;
  134.     if (!pValue)
  135.     {
  136. hr = HXR_FAILED;
  137. goto cleanup;
  138.     }
  139.     // collect the # of entries with/without wildcard
  140.     pszValue = new char[pValue->GetSize() + 1];
  141.     SafeStrCpy(pszValue, (char*)pValue->GetBuffer(), pValue->GetSize());
  142.     pszToken = strtok(pszValue, ",n");
  143.     while (pszToken)
  144.     {
  145. pToken = new CHXString(pszToken);
  146. // trim off the spaces
  147. pToken->TrimLeft();
  148. pToken->TrimRight();
  149. if (IsValidSubnetEntry(*pToken))
  150. {
  151.     pEntry = new SubnetEntry(*pToken);
  152. }
  153. else if (IsValidWildcardEntry(*pToken))
  154. {
  155.     pEntry = new WideCardEntry(*pToken);
  156. }
  157. else
  158. {
  159.     pEntry = new NonWideCardEntry(*pToken);
  160. }
  161. if (!pEntryList)
  162. {
  163.     pEntryList = new CHXSimpleList();
  164. }
  165. pEntryList->AddTail(pEntry);
  166. HX_DELETE(pToken);
  167. pszToken = strtok(NULL, ",n");
  168.     }
  169. cleanup:
  170.     HX_VECTOR_DELETE(pszValue);
  171.     
  172.     return hr;
  173. }
  174. BOOL     
  175. IsValidWildcardEntry(const char* pszValue)
  176. {
  177.     BOOL bResult = FALSE;
  178.     CHXString string = pszValue;
  179.     // there are only 3 cases
  180.     // *.XXX
  181.     // XXX.*
  182.     // XXX.*.XXX
  183.     if (!string.Left(2).Compare("*.") ||
  184. !string.Right(2).Compare(".*") ||
  185. string.Find(".*.") != -1)
  186.     {
  187. if (string.Find('*') == string.ReverseFind('*'))
  188. {
  189.     bResult = TRUE;
  190. }
  191.     }
  192.     return bResult;
  193. }
  194. BOOL
  195. IsValidSubnetEntry(const char* pszValue)
  196. {
  197.     BOOL bResult = FALSE;
  198.     CHXString inString = pszValue;
  199.     CHXString outString;
  200.     // XXX.XXX.XXX.XXX:XXX.XXX.XXX.XXX
  201.     if (2 == inString.CountFields(':'))
  202.     {
  203. outString = inString.NthField(':', 1);
  204. if (4 != outString.CountFields('.'))
  205. {
  206.     goto cleanup;
  207. }
  208. outString = inString.NthField(':', 2);
  209. if (4 != outString.CountFields('.'))
  210. {
  211.     goto cleanup;
  212. }
  213. bResult = TRUE;
  214.     }
  215. cleanup:
  216.     return bResult;
  217. }
  218. CommonEntry::CommonEntry(const char* pszValue)
  219. {
  220.     UINT8   size = 0;
  221.     if (pszValue)
  222.     {
  223. size = strlen(pszValue) + 1;
  224. m_pszValue = new char[size];
  225. memset(m_pszValue, 0, size);
  226. strcpy(m_pszValue, pszValue); /* Flawfinder: ignore */
  227.     }
  228.     m_nChunks = 0;
  229.     m_pChunks = 0;
  230. }
  231. CommonEntry::~CommonEntry()
  232. {
  233.     int i = 0;
  234.     for (i = 0; i < m_nChunks; i++)
  235.     {
  236. HX_VECTOR_DELETE(m_pChunks[i]);
  237.     }
  238.     HX_VECTOR_DELETE(m_pChunks);
  239.     HX_VECTOR_DELETE(m_pszValue);
  240. }
  241. NonWideCardEntry::NonWideCardEntry(const char* pszValue)
  242. : CommonEntry(pszValue)
  243. {
  244. }
  245. BOOL
  246. NonWideCardEntry::IsEqual(const char* pszValue)
  247. {
  248.     BOOL bResult = FALSE;
  249.     if (!m_pszValue || !pszValue)
  250.     {
  251. goto cleanup;
  252.     }
  253.     if (0 == strcasecmp(m_pszValue, pszValue))
  254.     {
  255. bResult = TRUE;
  256.     }
  257. cleanup:
  258.     return bResult;
  259. }
  260. WideCardEntry::WideCardEntry(const char* pszValue)
  261.      : CommonEntry(pszValue)
  262. {
  263.     char* pHead = NULL;
  264.     char* pTail = NULL;
  265.     UINT8 i = 0;
  266.     UINT8 nLength = 0;
  267.     CHXString string;
  268.     if (pszValue)
  269.     {
  270. // caculate the # of chunks
  271. pHead = pTail = (char*)pszValue;
  272. string = pszValue;
  273. m_pChunks = new char*[string.CountFields('.')];
  274. nLength = (UINT8)(string.GetLength());
  275. for (i = 0; i < nLength; i++)
  276. {
  277.     if (*pTail == '.')
  278.     {
  279. m_pChunks[m_nChunks] = new char[(pTail - pHead) + 1];
  280. strncpy(m_pChunks[m_nChunks], pHead, pTail - pHead); /* Flawfinder: ignore */
  281. m_pChunks[m_nChunks][pTail - pHead] = '';
  282. m_nChunks++;
  283. pHead = pTail + 1;
  284.     }
  285.     pTail++;
  286. }
  287. m_pChunks[m_nChunks] = new char[(pTail - pHead) + 1];
  288. strncpy(m_pChunks[m_nChunks], pHead, pTail - pHead); /* Flawfinder: ignore */
  289. m_pChunks[m_nChunks][pTail - pHead] = '';
  290. m_nChunks++;
  291.     }
  292. }
  293. BOOL
  294. WideCardEntry::IsEqual(const char* pszValue)
  295. {
  296.     BOOL     bResult = FALSE;
  297.     int      i = 0;
  298.     int      j = 0;
  299.     WideCardEntry*  pTargetEntry = NULL;
  300.     if (!m_pszValue || !pszValue)
  301.     {
  302. goto cleanup;
  303.     }
  304.     pTargetEntry = new WideCardEntry(pszValue);
  305.     if (pTargetEntry->m_nChunks == 1)
  306.     {
  307.         goto cleanup;
  308.     }
  309.     bResult = TRUE;
  310.     
  311.     // start from left to right till either hit '*' or done with pTargetInfo
  312.     for (i = 0, j = 0; strcasecmp(m_pChunks[i], "*") != 0 && j < pTargetEntry->m_nChunks; i++, j++)
  313.     {
  314. if (strcasecmp(m_pChunks[i], pTargetEntry->m_pChunks[j]) != 0)
  315. {
  316.     bResult = FALSE;
  317.     break;
  318. }
  319.     }
  320.     // start from right to left
  321.     for (i = m_nChunks-1, j = pTargetEntry->m_nChunks-1; 
  322.  bResult && strcasecmp(m_pChunks[i], "*") != 0 && j >= 0; i--, j--)
  323.     {
  324. if (strcasecmp(m_pChunks[i], pTargetEntry->m_pChunks[j]) != 0)
  325. {
  326.     bResult = FALSE;
  327.     break;
  328. }
  329.     }
  330. cleanup:
  331.     HX_DELETE(pTargetEntry);
  332.     return bResult;
  333. }
  334. SubnetEntry::SubnetEntry(const char* pszValue)
  335.    : CommonEntry(pszValue)
  336. {
  337.     UINT8   size = 0;
  338.     UINT32  ulIAddress = 0;
  339.     char*   pColumn = NULL;
  340.     if (pszValue)
  341.     {
  342. pColumn = (char*) strchr(pszValue, ':');
  343. *pColumn = '';
  344. pColumn++;
  345. ulIAddress = HXinet_addr(pszValue);
  346. m_ulSubnet = DwToHost(ulIAddress);
  347. ulIAddress = HXinet_addr(pColumn);
  348. m_ulSubnetMask = DwToHost(ulIAddress);
  349.     }
  350. }
  351. BOOL
  352. SubnetEntry::IsEqual(const char* pszValue)
  353. {
  354.     BOOL    bResult = FALSE;
  355.     UINT32  ulIAddress = 0;
  356.     UINT32  ulHostAddress = 0;
  357.     
  358.     if(IsNumericAddr(pszValue, strlen(pszValue)))
  359.     {
  360. ulIAddress = HXinet_addr(pszValue);
  361. ulHostAddress = DwToHost(ulIAddress);
  362. if (m_ulSubnet == (ulHostAddress & m_ulSubnetMask))
  363. {
  364.     bResult = TRUE;
  365. }
  366.     }
  367.     return bResult;
  368. }
  369.  
  370. HXSubnetManager::HXSubnetManager(IUnknown* pContext)
  371. : m_pContext(pContext)
  372. , m_pEntryList(NULL)
  373. , m_pPreferences(NULL)
  374. , m_pPrevSubnet(NULL)
  375. {
  376.     if (m_pContext)
  377.     {
  378. m_pContext->AddRef();
  379. m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences);
  380. Initialize();
  381.     }
  382. }
  383. HXSubnetManager::~HXSubnetManager()
  384. {
  385.     Close();
  386. }
  387. void    
  388. HXSubnetManager::Initialize(void)
  389. {
  390.     IHXBuffer* pBuffer = NULL;
  391.     if (m_pPreferences && m_pPreferences->ReadPref("SubnetList", pBuffer) == HXR_OK)
  392.     {
  393. if (!m_pPrevSubnet ||
  394.     strcasecmp((const char*)m_pPrevSubnet->GetBuffer(), (const char*)pBuffer->GetBuffer()))
  395. {
  396.     ResetEntryList();
  397.     ReadListEntries(pBuffer, m_pEntryList);
  398.     HX_RELEASE(m_pPrevSubnet);
  399.     m_pPrevSubnet = pBuffer;
  400.     m_pPrevSubnet->AddRef();
  401. }
  402.     }
  403.     HX_RELEASE(pBuffer);
  404. }
  405. BOOL
  406. HXSubnetManager::IsSubnet(const char* pszDomain)
  407. {
  408.     BOOL bResult = FALSE;
  409.     CommonEntry* pEntry = NULL;
  410.     CHXSimpleList::Iterator lIterator;
  411.     if (m_pEntryList)
  412.     {
  413. lIterator = m_pEntryList->Begin();
  414. for (; lIterator != m_pEntryList->End(); ++lIterator)
  415. {
  416.     pEntry = (CommonEntry*)(*lIterator);
  417.     if (pEntry->IsEqual(pszDomain))
  418.     {
  419. bResult = TRUE;
  420. break;
  421.     }
  422. }
  423.     }
  424.     return bResult;
  425. }
  426. void
  427. HXSubnetManager::Close(void)
  428. {
  429.     ResetEntryList();
  430.     HX_DELETE(m_pEntryList);
  431.     HX_RELEASE(m_pPrevSubnet);
  432.     HX_RELEASE(m_pPreferences);
  433.     HX_RELEASE(m_pContext);
  434. }
  435. void
  436. HXSubnetManager::ResetEntryList(void)
  437. {
  438.     while (m_pEntryList && m_pEntryList->GetCount() > 0)
  439.     {
  440. CommonEntry* pEntry = (CommonEntry*)m_pEntryList->RemoveHead();
  441. HX_DELETE(pEntry);
  442.     }
  443. }
  444. #if defined(HELIX_FEATURE_PROXYMGR)
  445. HXProxyManager::HXProxyManager(void)
  446. : m_lRefCount(0)
  447. , m_pContext(NULL)
  448. , m_pPreferences(NULL)
  449. , m_pEntryList(NULL)
  450. , m_pPrevNoProxyFor(NULL)
  451. {
  452. }
  453. HXProxyManager::~HXProxyManager()
  454. {
  455.     Close();
  456. }
  457. STDMETHODIMP
  458. HXProxyManager::QueryInterface(REFIID riid, void**ppvObj)
  459. {
  460. QInterfaceList qiList[] =
  461. {
  462. { GET_IIDHANDLE(IID_IUnknown), this },
  463. { GET_IIDHANDLE(IID_IHXProxyManager), (IHXProxyManager*) this },
  464. };
  465.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  466. }
  467. /////////////////////////////////////////////////////////////////////////
  468. //  Method:
  469. // IUnknown::AddRef
  470. //  Purpose:
  471. // Everyone usually implements this the same... feel free to use
  472. // this implementation.
  473. //
  474. STDMETHODIMP_(ULONG32) 
  475. HXProxyManager::AddRef()
  476. {
  477.     return InterlockedIncrement(&m_lRefCount);
  478. }
  479. /////////////////////////////////////////////////////////////////////////
  480. //  Method:
  481. // IUnknown::Release
  482. //  Purpose:
  483. // Everyone usually implements this the same... feel free to use
  484. // this implementation.
  485. //
  486. STDMETHODIMP_(ULONG32) 
  487. HXProxyManager::Release()
  488. {
  489.     if (InterlockedDecrement(&m_lRefCount) > 0)
  490.     {
  491.         return m_lRefCount;
  492.     }
  493.     delete this;
  494.     return 0;
  495. }
  496. STDMETHODIMP
  497. HXProxyManager::Initialize(IUnknown* pContext)
  498. {
  499.     HX_RESULT hr = HXR_OK;
  500.     IHXBuffer* pBuffer = NULL;
  501.     if (!m_pPreferences)
  502.     {
  503.         HX_RELEASE(m_pContext);
  504. m_pContext = pContext;
  505. if (!m_pContext)
  506. {
  507.     hr = HXR_FAILED;
  508.     goto cleanup;
  509. }
  510. m_pContext->AddRef();
  511. if (HXR_OK != m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences))
  512. {
  513.     m_pPreferences = NULL;
  514. }
  515.     }
  516.     if (m_pPreferences && m_pPreferences->ReadPref("NoProxyFor", pBuffer) == HXR_OK)
  517.     {
  518. if (!m_pPrevNoProxyFor ||
  519.     strcasecmp((const char*)m_pPrevNoProxyFor->GetBuffer(), (const char*)pBuffer->GetBuffer()))
  520. {
  521.     ResetEntryList();
  522.     ReadListEntries(pBuffer, m_pEntryList);
  523.     HX_RELEASE(m_pPrevNoProxyFor);
  524.     m_pPrevNoProxyFor = pBuffer;
  525.     m_pPrevNoProxyFor->AddRef();
  526. }
  527.     }
  528.     HX_RELEASE(pBuffer);
  529. cleanup:
  530.     return hr;
  531. }
  532. STDMETHODIMP_(BOOL)
  533. HXProxyManager::IsExemptionHost(char* pszDomain)
  534. {
  535.     BOOL bResult = FALSE;
  536.     CommonEntry* pEntry = NULL;
  537.     CHXSimpleList::Iterator lIterator;
  538.     if (m_pEntryList)
  539.     {
  540. lIterator = m_pEntryList->Begin();
  541. for (; lIterator != m_pEntryList->End(); ++lIterator)
  542. {
  543.     pEntry = (CommonEntry*)(*lIterator);
  544.     if (pEntry->IsEqual(pszDomain))
  545.     {
  546. bResult = TRUE;
  547. break;
  548.     }
  549. }
  550.     }
  551.     return bResult;
  552. }
  553. void
  554. HXProxyManager::Close()
  555. {
  556.     ResetEntryList();
  557.     HX_DELETE(m_pEntryList);
  558.     HX_RELEASE(m_pPrevNoProxyFor);
  559.     HX_RELEASE(m_pPreferences);
  560.     HX_RELEASE(m_pContext);
  561. }
  562. void
  563. HXProxyManager::ResetEntryList(void)
  564. {
  565.     while (m_pEntryList && m_pEntryList->GetCount() > 0)
  566.     {
  567. CommonEntry* pEntry = (CommonEntry*)m_pEntryList->RemoveHead();
  568. HX_DELETE(pEntry);
  569.     }
  570. }
  571. #endif /* HELIX_FEATURE_PROXYMGR */