cookies.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:53k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: cookies.cpp,v 1.19.20.4 2004/07/09 01:48:15 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  *                 Phil Dibowitz
  48.  * 
  49.  * ***** END LICENSE BLOCK ***** */
  50. #include "hxcom.h"
  51. #include "hxtypes.h"
  52. #include "hlxclib/string.h"
  53. // #include "hlxclib/stdio.h"
  54. #include "safestring.h"
  55. #ifdef _MACINTOSH
  56. #ifdef _CARBON
  57. #ifdef _MAC_MACHO
  58. #include <sys/stat.h>
  59. #else
  60. #include <stat.h>
  61. #endif
  62. #else /* _CARBON */
  63. #include <stat.mac.h>
  64. #endif /* _CARBON */
  65. #else /* _MACINTOSH */
  66. #include "hlxclib/sys/types.h"
  67. #include "hlxclib/sys/stat.h"
  68. #endif /* _MACINTOSH */
  69. #include "hlxclib/time.h"
  70. #if defined(_AIX)
  71. #include <ctype.h>
  72. #endif
  73. #ifdef _WINDOWS
  74. #include "hlxclib/windows.h"
  75. #include <wininet.h>
  76. #include "hlxclib/io.h"
  77. #endif /* _WINDOWS */
  78. #if defined(_CARBON) || defined(_MAC_MACHO)
  79. #include "hxver.h" // for HXVER_SDK_PRODUCT
  80. #endif
  81. #ifdef _CARBON
  82. #include "cfwrappers.h"
  83. #endif
  84. #include "hxresult.h"
  85. #include "hxslist.h"
  86. #include "chxpckts.h"
  87. #include "hxstrutl.h"
  88. #include "dbcs.h"
  89. #include "dllpath.h"
  90. #include "hxprefs.h"
  91. #include "hxthread.h"
  92. #include "ihxcookies.h"
  93. #include "cookhlpr.h"
  94. #include "ihxcookies2.h"
  95. #include "hxdate.h"
  96. #include "cookies.h"
  97. #include "md5.h"
  98. #include "filespecutils.h"
  99. #ifdef _UNIX
  100. #include <sys/types.h>
  101. #include <sys/stat.h>
  102. #endif
  103. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_OSF1)
  104. #include <sys/file.h>
  105. #endif /* UNIX */
  106. #define RM_COOKIE_CAPTION "# Helix Cookie Filen# http://www.netscape.com/newsref/std/cookie_spec.htmln# This is a generated file!  Do not edit.nn"
  107. #if defined(_UNIX) && !defined(_MAC_UNIX)
  108. #  define RM_COOKIE_FILE_NAME "Cookies_6_0"
  109. #else
  110. #  define RM_COOKIE_FILE_NAME "cookies.txt"
  111. #endif
  112. /* We should really define it in a common header file */
  113. #if defined (_WINDOWS ) || defined (WIN32) || defined(_SYMBIAN)
  114. #define OS_SEPARATOR_CHAR '\'
  115. #define OS_SEPARATOR_STRING "\"
  116. #elif defined (_UNIX) || defined (_OPENWAVE)
  117. #define OS_SEPARATOR_CHAR '/'
  118. #define OS_SEPARATOR_STRING "/"
  119. #elif defined (_MACINTOSH)
  120. #define OS_SEPARATOR_CHAR ':'
  121. #define OS_SEPARATOR_STRING ":"
  122. #endif /* defined (_WINDOWS ) || defined (WIN32) */
  123. HXCookies::HXCookies(IUnknown* pContext, BOOL bMemoryOnly)
  124. : m_lRefCount(0)
  125. , m_bSaveCookies(FALSE)
  126. , m_bMemoryOnly(bMemoryOnly)
  127. , m_pNSCookiesPath(NULL)
  128. , m_pNSCookies(NULL)
  129. , m_pRMCookiesPath(NULL)
  130. , m_pRMCookies(NULL)
  131. , m_pCookiesHelper(NULL)
  132. , m_pPreferences(NULL)
  133. , m_bInitialized(FALSE)
  134. , m_lastModification(0)
  135. , m_pContext(NULL)
  136. #ifdef _WINDOWS
  137. , m_hLib(NULL)
  138. , m_pLock(NULL)
  139. , _pInternetSetCookie(NULL)
  140. , _pInternetGetCookie(NULL)
  141. #elif _UNIX
  142. , m_fileID(0)
  143. #endif /* _WINDOWS */
  144. {    
  145.     if (pContext)
  146.     {
  147. m_pContext = pContext;
  148. m_pContext->AddRef();
  149.     }
  150. }
  151. HXCookies::~HXCookies()
  152. {
  153.     Close();
  154. }
  155. STDMETHODIMP
  156. HXCookies::QueryInterface(REFIID riid, void**ppvObj)
  157. {
  158.     QInterfaceList qiList[] =
  159.     {
  160. { GET_IIDHANDLE(IID_IUnknown), this },
  161. { GET_IIDHANDLE(IID_IHXCookies), (IHXCookies*) this },
  162. { GET_IIDHANDLE(IID_IHXCookies2), (IHXCookies2*) this }
  163.     };
  164.     if (QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj) == HXR_OK)
  165.     {
  166.         return HXR_OK;
  167.     }
  168.     else if (IsEqualIID(riid, IID_IHXCookiesHelper) && m_pCookiesHelper)
  169.     {
  170. return m_pCookiesHelper->QueryInterface(riid, ppvObj);
  171.     }
  172.     *ppvObj = NULL;
  173.     return HXR_NOINTERFACE;
  174. }
  175. /////////////////////////////////////////////////////////////////////////
  176. //  Method:
  177. // IUnknown::AddRef
  178. //  Purpose:
  179. // Everyone usually implements this the same... feel free to use
  180. // this implementation.
  181. //
  182. STDMETHODIMP_(ULONG32) 
  183. HXCookies::AddRef()
  184. {
  185.     return InterlockedIncrement(&m_lRefCount);
  186. }
  187. /////////////////////////////////////////////////////////////////////////
  188. //  Method:
  189. // IUnknown::Release
  190. //  Purpose:
  191. // Everyone usually implements this the same... feel free to use
  192. // this implementation.
  193. //
  194. STDMETHODIMP_(ULONG32) 
  195. HXCookies::Release()
  196. {
  197.     if (InterlockedDecrement(&m_lRefCount) > 0)
  198.     {
  199.         return m_lRefCount;
  200.     }
  201.     delete this;
  202.     return 0;
  203. }
  204. HX_RESULT    
  205. HXCookies::Initialize(void)
  206. {
  207.     HX_RESULT hr = HXR_OK;
  208.     
  209.     if (!m_pContext || !IsCookieEnabled())
  210.     {
  211. hr = HXR_FAILED;
  212. goto cleanup;
  213.     }
  214.     m_pContext->QueryInterface(IID_IHXCookiesHelper, (void**) &m_pCookiesHelper);
  215.     if (!m_pCookiesHelper)
  216.     {
  217.         HXCookiesHelper* pHelper = new HXCookiesHelper();
  218.         if (pHelper)
  219. {
  220.             pHelper->QueryInterface(IID_IHXCookiesHelper, (void**) &m_pCookiesHelper);
  221. }
  222.     }
  223.     if (!m_bMemoryOnly)
  224.     {
  225. #ifdef _WINDOWS
  226.         if (m_hLib = LoadLibrary(OS_STRING("wininet.dll")))
  227. {
  228.             _pInternetSetCookie = (INTERNETSETCOOKIE)GetProcAddress(m_hLib, OS_STRING("InternetSetCookieA"));
  229.     _pInternetGetCookie = (INTERNETGETCOOKIE)GetProcAddress(m_hLib, OS_STRING("InternetGetCookieA"));
  230. }
  231. #endif /* _WINDOWS */
  232.         PrepareCookiesPath();
  233.         if (m_pNSCookiesPath)
  234. {
  235.     OpenCookies(m_pNSCookiesPath, FALSE, m_pNSCookies);
  236. }
  237.         if (m_pRMCookiesPath)
  238. {
  239.     OpenCookies(m_pRMCookiesPath, TRUE, m_pRMCookies);
  240.         }
  241.     }
  242.     m_bInitialized = TRUE;
  243. cleanup:
  244.     return hr;
  245. }
  246. void
  247. HXCookies::Close(void)
  248. {
  249.     if (m_bSaveCookies && !m_bMemoryOnly)
  250.     {
  251. SaveCookies();
  252.     }
  253.     ResetCookies(m_pNSCookies);
  254.     ResetCookies(m_pRMCookies);
  255.     HX_DELETE(m_pNSCookies);
  256.     HX_DELETE(m_pRMCookies);
  257.     HX_VECTOR_DELETE(m_pNSCookiesPath);
  258.     HX_VECTOR_DELETE(m_pRMCookiesPath);
  259.     HX_RELEASE(m_pPreferences);
  260.     HX_RELEASE(m_pCookiesHelper);
  261.     HX_RELEASE(m_pContext);
  262.     m_bInitialized = FALSE;
  263. #ifdef _WINDOWS
  264.     if (m_hLib)
  265.     {
  266. FreeLibrary(m_hLib);
  267. m_hLib = NULL;
  268.     }
  269.     HX_DELETE(m_pLock);
  270. #endif /* _WINDOWS */
  271. }
  272. STDMETHODIMP 
  273. HXCookies::SetCookies(const char* pHost, const char* pPath, IHXBuffer* pCookies)
  274. {
  275.     HX_RESULT     hr = HXR_OK;
  276.     int     host_length = 0;
  277.     int     path_length = 0;
  278.     int     domain_length = 0;
  279.     char*     pURL = NULL;
  280.     char*     path_from_header = NULL;
  281.     char*     domain_from_header = NULL;
  282.     char*     name_from_header = NULL;
  283.     char*     cookie_from_header = NULL;
  284.     char*     dot = NULL;
  285.     char*     slash = NULL;
  286.     BOOL     bIsDomain = FALSE;
  287.     time_t     expires=0;
  288.     IHXBuffer*     pBuffer = NULL;
  289.     IHXValues*     pValues = NULL;    
  290.     CookieStruct*   pNewCookie = NULL;
  291.     
  292.     if (!IsCookieEnabled())
  293.     {
  294. goto cleanup;
  295.     }
  296.     if (!m_bInitialized)
  297.     {
  298. hr = Initialize();
  299. if (HXR_OK != hr)
  300. {
  301.     goto cleanup;
  302. }
  303.     }
  304.     if (!m_pCookiesHelper || !pCookies || !pHost)
  305.     {
  306. hr = HXR_FAILED;
  307. goto cleanup;
  308.     }
  309.     if (HXR_OK != m_pCookiesHelper->Pack(pCookies, pValues))
  310.     {
  311. hr = HXR_FAILED;
  312. goto cleanup;
  313.     }
  314.     if (HXR_OK == pValues->GetPropertyBuffer("path", pBuffer) && pBuffer)
  315.     {
  316. ::StrAllocCopy(path_from_header, (char*)pBuffer->GetBuffer());
  317.     }
  318.     HX_RELEASE(pBuffer);
  319.     if (HXR_OK == pValues->GetPropertyBuffer("domain", pBuffer) && pBuffer)
  320.     {
  321.         // verify that this host has the authority to set for
  322.         // this domain.   We do this by making sure that the
  323.         // host is in the domain
  324.         // We also require that a domain have at least two
  325.         // periods to prevent domains of the form ".com"
  326.         // and ".edu"
  327. //
  328. // also make sure that there is more stuff after
  329. // the second dot to prevent ".com."
  330. ::StrAllocCopy(domain_from_header, (char*)pBuffer->GetBuffer());
  331.         dot = strchr(domain_from_header, '.');
  332.     
  333. if(dot)
  334. {
  335.             dot = strchr(dot+1, '.');
  336. }
  337. if(!dot || *(dot+1) == '') 
  338. {
  339.     // did not pass two dot test. FAIL
  340.     hr = HXR_FAILED;
  341.     goto cleanup;
  342. }
  343. domain_length = strlen(domain_from_header);
  344. host_length = strlen(pHost);
  345. // check to see if the host is in the domain
  346. if(domain_length > host_length || 
  347.    strcasecmp(domain_from_header, &pHost[host_length-domain_length]))
  348. {
  349.     hr = HXR_FAILED;
  350.     goto cleanup;
  351. }
  352. bIsDomain = TRUE;
  353.     }
  354.     HX_RELEASE(pBuffer);
  355.     if (HXR_OK == pValues->GetPropertyBuffer("name", pBuffer) && pBuffer)
  356.     {
  357. ::StrAllocCopy(name_from_header, (char*)pBuffer->GetBuffer());
  358.     }
  359.     HX_RELEASE(pBuffer);
  360.     if (HXR_OK == pValues->GetPropertyBuffer("value", pBuffer) && pBuffer)
  361.     {
  362. ::StrAllocCopy(cookie_from_header, (char*)pBuffer->GetBuffer());
  363.     }
  364.     HX_RELEASE(pBuffer);
  365.     if (HXR_OK == pValues->GetPropertyBuffer("expires", pBuffer) && pBuffer)
  366.     {
  367. expires = ::ParseDate((char*)pBuffer->GetBuffer());
  368.     }
  369.     HX_RELEASE(pBuffer);
  370.     if(!path_from_header && pPath)
  371.     {
  372.         // strip down everything after the last slash
  373.         // to get the path.
  374. CHXString strPath = pPath;
  375. INT32 nIndex = strPath.ReverseFind('/');
  376. if (nIndex != -1)
  377. {
  378.     strPath = strPath.Left(nIndex + 1);
  379. }
  380. ::StrAllocCopy(path_from_header, (char*) (const char*) strPath);
  381.     }
  382.     if(!domain_from_header && pHost)
  383.     {
  384. ::StrAllocCopy(domain_from_header, (char*)pHost); 
  385.     }
  386.     
  387.     m_bSaveCookies = TRUE;
  388.     // We have decided we are going to insert a cookie into the list
  389.     // Get the cookie lock so that we can munge on the list
  390.     pNewCookie = CheckForPrevCookie(path_from_header, 
  391.     domain_from_header, 
  392.     name_from_header);
  393.     if(pNewCookie) 
  394.     {
  395. HX_DELETE(pNewCookie->pCookieValue);
  396. HX_DELETE(pNewCookie->pCookieName);
  397. HX_DELETE(pNewCookie->pPath);
  398.         HX_DELETE(pNewCookie->pHost);
  399.         
  400. pNewCookie->pCookieValue = new CHXString(cookie_from_header);
  401. pNewCookie->pCookieName = new CHXString(name_from_header);
  402.         pNewCookie->pPath = new CHXString(path_from_header);
  403.         pNewCookie->pHost = new CHXString(domain_from_header);
  404.         pNewCookie->expires = expires;
  405.         pNewCookie->bIsDomain = bIsDomain;
  406. pNewCookie->bMemoryOnly = TRUE;
  407.     }
  408.     else 
  409.     {
  410. pNewCookie = new CookieStruct;
  411.         // copy
  412. pNewCookie->pCookieValue = new CHXString(cookie_from_header);
  413. pNewCookie->pCookieName = new CHXString(name_from_header);
  414.         pNewCookie->pPath = new CHXString(path_from_header);
  415.         pNewCookie->pHost = new CHXString(domain_from_header);
  416.         pNewCookie->expires = expires;
  417.         pNewCookie->bIsDomain = bIsDomain;
  418. pNewCookie->bMemoryOnly = TRUE;
  419. if (!m_pRMCookies)
  420. {
  421.     m_pRMCookies = new CHXSimpleList();
  422. }
  423. hr = AddCookie(pNewCookie, m_pRMCookies);
  424.     }
  425. #ifdef _WINDOWS
  426.     if (!m_bMemoryOnly)
  427.     {
  428.         if (!_pInternetSetCookie)
  429. {
  430.     goto cleanup;
  431. }
  432. host_length = strlen(pHost);
  433. if (pPath)
  434. {
  435.     path_length = strlen(pPath);
  436. }
  437. pURL = new char[host_length + path_length + 8];
  438. sprintf(pURL, "http://%s%s", pHost, pPath); /* Flawfinder: ignore */
  439. _pInternetSetCookie(pURL, NULL, (const char*)pCookies->GetBuffer());
  440.     }
  441. #endif /* _WINDOWS */
  442. cleanup:
  443.     HX_RELEASE(pBuffer);
  444.     HX_RELEASE(pValues);
  445.     HX_VECTOR_DELETE(pURL);
  446.     HX_VECTOR_DELETE(path_from_header);
  447.     HX_VECTOR_DELETE(domain_from_header);
  448.     HX_VECTOR_DELETE(name_from_header);
  449.     HX_VECTOR_DELETE(cookie_from_header);
  450.     
  451.     return hr;
  452. }
  453. STDMETHODIMP 
  454. HXCookies::GetCookies(const char* pHost, const char* pPath, REF(IHXBuffer*) pCookies)
  455. {
  456.     IHXBuffer* pPlayerCookies = NULL;
  457.     HX_RESULT res = GetCookiesInternal(pHost, pPath, pCookies, pPlayerCookies);
  458.     HX_RELEASE(pPlayerCookies);
  459.     return res;
  460. }
  461. STDMETHODIMP HXCookies::GetCookies(const char*     pHost,
  462.       const char*     pPath,
  463.       REF(IHXBuffer*)   pCookies,
  464.       REF(IHXBuffer*)   pPlayerCookies)
  465. {
  466.     return GetCookiesInternal(pHost, pPath, pCookies, pPlayerCookies);
  467. }
  468. #if defined(_CARBON) || defined(_MAC_MACHO)
  469. #define REPORT_COOKIES 1
  470. #endif
  471. HX_RESULT HXCookies::GetCookiesInternal(const char* pHost,
  472.  const char*     pPath,
  473.  REF(IHXBuffer*)   pCookies,
  474.  REF(IHXBuffer*)   pPlayerCookies)
  475. {
  476.     HX_RESULT     hr = HXR_OK;
  477.     char*     cp = NULL;
  478.     char*     pComma = NULL;
  479.     char*     pEqualSign = NULL;
  480.     char*     pData = NULL;
  481.     char*     pURL = NULL;
  482.     int     l = 0;
  483.     int     host_length = 0;
  484.     int     path_length = 0;
  485.     BOOL     bAdded = FALSE;
  486. UINT32     dwSize = 0;    
  487.     time_t     cur_time = time(NULL);
  488.     CookieStruct*   pTempCookie = NULL;
  489.     CookieStruct*   pNewCookie = NULL;
  490.     CHXSimpleList*  pCookiesFound1 = NULL;
  491.     CHXSimpleList*  pCookiesFound2 = NULL;
  492.     CHXSimpleList*  pCookiesList = NULL;
  493.     IHXValues*     pValues = NULL;
  494.     CHXSimpleList::Iterator  i;
  495.     CHXString       cHostCopy;
  496.     INT32           lColon;
  497.     BOOL     bIsPlayerCookieList = FALSE;
  498.     CHXString     strPlayerCookies;
  499. #ifdef REPORT_COOKIES
  500.     CHXString strCookieReport;
  501. #endif
  502.     
  503.     pCookies = NULL;
  504.     pPlayerCookies = NULL;
  505.     if (!IsCookieEnabled())
  506.     {
  507. goto cleanup;
  508.     }
  509.     if (!m_bInitialized)
  510.     {
  511. hr = Initialize();
  512. if (HXR_OK != hr)
  513. {
  514.     goto cleanup;
  515. }
  516.     }
  517.     else
  518.     {
  519. SyncRMCookies(FALSE);
  520.     }
  521.     if (!pHost || !m_pCookiesHelper)
  522.     {
  523. hr = HXR_FAILED;
  524. goto cleanup;
  525.     }
  526.     // return string to build    
  527.     if (!(pValues = new CHXHeader()))
  528.     {
  529. hr = HXR_OUTOFMEMORY;
  530. goto cleanup;
  531.     }
  532.     pValues->AddRef();
  533.     cHostCopy = pHost;
  534.     lColon    = cHostCopy.Find(':');
  535.     if (lColon >= 0)
  536.     {
  537. cHostCopy = cHostCopy.Left(lColon);
  538.     }
  539.     cHostCopy.MakeLower();
  540.     // search for all cookies(Netscape only for now)
  541.     for (l = 0; l < 2; l++)
  542.     {
  543. switch (l)
  544. {
  545. case 0:
  546.     pCookiesList = m_pRMCookies;
  547.     bIsPlayerCookieList = TRUE;
  548.     break;
  549. case 1:
  550.     pCookiesList = m_pNSCookies;
  551.     bIsPlayerCookieList = FALSE;
  552.     break;
  553. default:
  554.     break;
  555. }
  556. if (!pCookiesList)
  557. {
  558.     continue;
  559. }
  560. for (i = pCookiesList->Begin(); i != pCookiesList->End(); ++i)
  561. {
  562.     pTempCookie = (CookieStruct*) (*i);
  563.     
  564.     if (!pTempCookie->pHost)
  565.     {
  566. continue;
  567.     }
  568.     
  569.     // check the host or domain first
  570.     if(pTempCookie->bIsDomain)
  571.     {
  572. if (!DoesDomainMatch(*pTempCookie->pHost, cHostCopy))
  573. {
  574.     continue;
  575. }
  576.     }
  577.     else if(strcasecmp((const char*)*(pTempCookie->pHost), pHost))
  578.     {
  579. // hostname matchup failed.
  580. continue;
  581.     }
  582.     // shorter strings always come last so there can be no
  583.     // ambiquity             
  584.     if(pTempCookie->pPath && 
  585.        !strncmp(pPath, (const char*)*(pTempCookie->pPath), pTempCookie->pPath->GetLength()))
  586.     {
  587. // check for expired cookies
  588. if(pTempCookie->expires && (pTempCookie->expires < cur_time))
  589. {
  590.     m_bSaveCookies = TRUE;
  591.     continue;
  592. }
  593. if (!pCookiesFound1)
  594. {
  595.     pCookiesFound1 = new CHXSimpleList();
  596.     pCookiesFound1->AddTail(pTempCookie);
  597. }
  598. else if (!WasCookieAdded(pCookiesFound1, pTempCookie))
  599. {
  600.     pCookiesFound1->AddTail(pTempCookie);
  601. }
  602. if(bIsPlayerCookieList)
  603. {
  604.     if(!strPlayerCookies.IsEmpty())
  605.     {
  606.         strPlayerCookies += "|";
  607.     }
  608.     strPlayerCookies += *pTempCookie->pCookieName;
  609. #ifdef REPORT_COOKIES
  610.     strCookieReport += (strCookieReport.IsEmpty() ? "" : ", ");
  611.     strCookieReport += *pTempCookie->pCookieName;
  612.     strCookieReport += "=";
  613.     strCookieReport += *pTempCookie->pCookieValue;
  614. #endif
  615. }
  616.     }
  617. }
  618.     }
  619. #ifdef _WINDOWS
  620.     if (!_pInternetGetCookie || m_bMemoryOnly)
  621.     {
  622. goto cleanup;
  623.     }
  624.     host_length = strlen(pHost);
  625.     if (pPath)
  626.     {
  627. path_length = strlen(pPath);
  628.     }
  629.     pURL = new char[host_length + path_length + 8];
  630.     sprintf(pURL, "http://%s%s", pHost, pPath); /* Flawfinder: ignore */
  631.     if (_pInternetGetCookie(pURL, NULL, pData, &dwSize) && !pData && dwSize)
  632.     {
  633. pData = new char[dwSize+1];
  634. if (!_pInternetGetCookie(pURL, NULL, pData, &dwSize))
  635. {
  636.     goto cleanup;
  637. }
  638. cp = pData;
  639. while (pComma = (char*) ::HXFindChar(cp, ';'))
  640. {
  641.     *pComma = '';
  642.     pComma++;
  643.     if (pEqualSign = (char*) ::HXFindChar(cp, '='))
  644.     {
  645. *pEqualSign = '';
  646. pEqualSign++;
  647.          pNewCookie = new CookieStruct;
  648. bAdded = FALSE;
  649. // copy
  650. pNewCookie->pCookieValue = new CHXString(pEqualSign);
  651. pNewCookie->pCookieName = new CHXString(cp);
  652. pNewCookie->pPath = new CHXString(pPath);
  653. pNewCookie->pHost = new CHXString(pHost);
  654. pNewCookie->expires = 0;
  655. pNewCookie->bIsDomain = FALSE;
  656. pNewCookie->bMemoryOnly = FALSE;
  657. if(pNewCookie->pCookieName)
  658. {
  659.     pNewCookie->pCookieName->TrimLeft();
  660.     pNewCookie->pCookieName->TrimRight();
  661. }
  662. if (!WasCookieAdded(pCookiesFound1, pNewCookie))
  663. {
  664.     if (!pCookiesFound2)
  665.     {
  666. pCookiesFound2 = new CHXSimpleList();
  667. pCookiesFound2->AddTail(pNewCookie);
  668. bAdded = TRUE;
  669.     }
  670.     else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
  671.     {
  672. pCookiesFound2->AddTail(pNewCookie);
  673. bAdded = TRUE;
  674.     }
  675. }
  676. if (!bAdded)
  677. {
  678.     HX_DELETE(pNewCookie);
  679. }
  680.     }
  681.     cp = pComma;
  682. }
  683. if (pEqualSign = (char*) ::HXFindChar(cp, '='))
  684. {
  685.     *pEqualSign = '';
  686.     pEqualSign++;
  687.     pNewCookie = new CookieStruct;
  688.     bAdded = FALSE;
  689.     // copy
  690.     pNewCookie->pCookieValue = new CHXString(pEqualSign);
  691.     pNewCookie->pCookieName = new CHXString(cp);
  692.     pNewCookie->pPath = NULL;
  693.     pNewCookie->pHost = NULL;
  694.     pNewCookie->expires = 0;
  695.     pNewCookie->bIsDomain = FALSE;
  696.     pNewCookie->bMemoryOnly = FALSE;
  697.     if(pNewCookie->pCookieName)
  698.     {
  699.         pNewCookie->pCookieName->TrimLeft();
  700.         pNewCookie->pCookieName->TrimRight();
  701.     }
  702.     if (!WasCookieAdded(pCookiesFound1, pNewCookie))
  703.     {
  704. if (!pCookiesFound2)
  705. {
  706.     pCookiesFound2 = new CHXSimpleList();
  707.     pCookiesFound2->AddTail(pNewCookie);
  708.     bAdded = TRUE;
  709. }
  710. else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
  711. {
  712.     pCookiesFound2->AddTail(pNewCookie);
  713.     bAdded = TRUE;
  714. }
  715.     }
  716.     if (!bAdded)
  717.     {
  718. HX_DELETE(pNewCookie);
  719.     }
  720. }
  721.     }
  722. #endif /* _WINDOWS */
  723. cleanup:
  724.     if (pCookiesFound1)
  725.     {
  726. for (i = pCookiesFound1->Begin(); i != pCookiesFound1->End(); ++i)
  727. {
  728.     pTempCookie = (CookieStruct*) (*i);
  729.     if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
  730.     {
  731. ::SaveStringToHeader(pValues,
  732.      (const char*)*(pTempCookie->pCookieName),
  733.      (char*)(const char*)*(pTempCookie->pCookieValue));
  734.     }
  735. }
  736.     }
  737.     if (pCookiesFound2)
  738.     {
  739. for (i = pCookiesFound2->Begin(); i != pCookiesFound2->End(); ++i)
  740. {
  741.     pTempCookie = (CookieStruct*) (*i);
  742.     if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
  743.     {
  744. ::SaveStringToHeader(pValues,
  745.      (const char*)*(pTempCookie->pCookieName),
  746.      (char*)(const char*)*(pTempCookie->pCookieValue));
  747.     }
  748.     HX_DELETE(pTempCookie);
  749. }
  750.     }
  751.     if (m_pCookiesHelper)
  752.     {
  753. hr = m_pCookiesHelper->UnPack(pValues, pCookies);
  754.     }
  755. #ifdef REPORT_COOKIES
  756. // if the preference "CookieData" is set to "console" then write the cookie requests to the console
  757.     IHXBuffer* pBuff = NULL;
  758.     if (m_pPreferences
  759. && m_pPreferences->ReadPref("CookieData", pBuff) == HXR_OK
  760. && 0 == stricmp((const char*)pBuff->GetBuffer(), "console"))
  761.     {
  762. CHXString str;
  763. str.Format("Cookies requested, getting host: %s  path: %s  cookies: %s",
  764. pHost, pPath, 
  765. strCookieReport.IsEmpty() ? "<no cookies>" : (const char *) strCookieReport);
  766. #if defined(_CARBON) || defined(_MAC_MACHO)
  767. CFStringRef stringRef = ::CFStringCreateWithCString( kCFAllocatorDefault, (const char*) str, kCFStringEncodingUTF8 );
  768. ::CFShow(stringRef);
  769. ::CFRelease(stringRef);
  770. #endif
  771.     }
  772.     HX_RELEASE(pBuff);
  773. #endif
  774.     if(!strPlayerCookies.IsEmpty())
  775.     {
  776. pPlayerCookies = new CHXBuffer;
  777. pPlayerCookies->AddRef();
  778. pPlayerCookies->Set((const UCHAR*)(const char*)strPlayerCookies, strPlayerCookies.GetLength() + 1);
  779.     }
  780.     HX_DELETE(pCookiesFound1);
  781.     HX_DELETE(pCookiesFound2);
  782.     HX_VECTOR_DELETE(pData);
  783.     HX_VECTOR_DELETE(pURL);
  784.     HX_RELEASE(pValues);
  785.    
  786.     return hr;
  787. }
  788. HX_RESULT     
  789. HXCookies::PrepareCookiesPath(void)
  790. {
  791.     HX_RESULT hr = HXR_OK;
  792. #ifndef _VXWORKS
  793.     const char* pRMCookiesPath = NULL;
  794.     IHXBuffer* pBuffer = NULL;
  795. #if !defined(_CARBON) && !defined(_MAC_MACHO) /* figured out every time at runtime on the Mac since paths are not stable between runs */
  796.     if (m_pPreferences && (m_pPreferences->ReadPref("CookiesPath", pBuffer) == HXR_OK))
  797.     {
  798. m_pRMCookiesPath = new char[pBuffer->GetSize() + 1];
  799. strcpy(m_pRMCookiesPath, (const char*)pBuffer->GetBuffer()); /* Flawfinder: ignore */
  800.     }
  801.     HX_RELEASE(pBuffer);
  802. #endif
  803.     if( !m_pRMCookiesPath )
  804.     {
  805. if (m_pPreferences && (m_pPreferences->ReadPref("UserSDKDataPath", pBuffer) == HXR_OK))
  806. {
  807.     pRMCookiesPath = (char*) pBuffer->GetBuffer();
  808. }
  809. else
  810. {
  811. #if defined(_CARBON) || defined(_MAC_MACHO)
  812. CHXString strSDKPath = CHXFileSpecUtils::GetAppDataDir(HXVER_SDK_PRODUCT).GetPathName();
  813. #elif defined(_UNIX)
  814.     pRMCookiesPath = getenv("HOME");
  815.     HX_ASSERT( pRMCookiesPath );     
  816. #else
  817.     pRMCookiesPath = GetDLLAccessPath()->GetPath(DLLTYPE_COMMON);
  818. #endif        
  819. }
  820.         if( pRMCookiesPath )
  821.         {
  822.         
  823.             m_pRMCookiesPath = new char[strlen(pRMCookiesPath) + strlen(RM_COOKIE_FILE_NAME)+2];
  824.     ::strcpy(m_pRMCookiesPath, pRMCookiesPath); /* Flawfinder: ignore */
  825.     if (m_pRMCookiesPath[::strlen(m_pRMCookiesPath)-1] != OS_SEPARATOR_CHAR)
  826.     {
  827. strcat(m_pRMCookiesPath, OS_SEPARATOR_STRING); /* Flawfinder: ignore */
  828.     }
  829.     strcat(m_pRMCookiesPath, RM_COOKIE_FILE_NAME); /* Flawfinder: ignore */
  830.             
  831.     HX_RELEASE(pBuffer);
  832.             pBuffer = new CHXBuffer();
  833.             pBuffer->AddRef();
  834.             
  835.             pBuffer->Set((const unsigned char*)m_pRMCookiesPath, strlen(m_pRMCookiesPath) + 1);    
  836.             
  837.             if (m_pPreferences)
  838.             {
  839.                 m_pPreferences->WritePref("CookiesPath", pBuffer);
  840.             }
  841.             HX_RELEASE(pBuffer);
  842.         }
  843.    }
  844. #endif
  845. #ifdef _WINDOWS
  846.     HKEY    hMainAppKey = NULL;
  847.     HKEY    hBiffKey = NULL;
  848.     HKEY    hUsersKey = NULL;
  849.     HKEY    hServersKey = NULL;
  850.     HKEY    hCookiesKey = NULL;
  851.     INT32   lSize = _MAX_PATH - 1;
  852.     UINT32  ulSize = _MAX_PATH - 1;
  853.     UINT32  ulType = 0;
  854.     char    regKey[_MAX_PATH] = {0}; /* Flawfinder: ignore */
  855.     char*   pPath = NULL;
  856.     char*   pUser = NULL;
  857.     char*   pValue = NULL;
  858.     char*   pCursor = NULL;
  859.     // Netscape Browser 4.0+
  860.     if (RegOpenKeyEx(HKEY_CURRENT_USER, 
  861.      OS_STRING("Software\Netscape\Netscape Navigator\biff"), 
  862.      0,
  863.      KEY_READ, &hBiffKey) == ERROR_SUCCESS) 
  864.     {
  865. pUser = new char[_MAX_PATH];
  866. memset(pUser, 0, _MAX_PATH);
  867. if (RegQueryValueEx(hBiffKey, OS_STRING("CurrentUser"), 0, &ulType, (LPBYTE)pUser, &ulSize) == ERROR_SUCCESS) 
  868. {
  869.     SafeSprintf(regKey, _MAX_PATH, "Software\Netscape\Netscape Navigator\biff\users\%s", pUser);
  870.     
  871.     if (RegOpenKeyEx(HKEY_CURRENT_USER, OS_STRING(regKey), 0, KEY_READ, &hUsersKey) == ERROR_SUCCESS)
  872.     {
  873. pValue = new char[_MAX_PATH];
  874. memset(pValue, 0, _MAX_PATH);
  875. ulSize = _MAX_PATH - 1;
  876. if (RegQueryValueEx(hUsersKey, OS_STRING("defaultServer"), 0, &ulType, (LPBYTE)pValue, &ulSize) == ERROR_SUCCESS)
  877. {
  878.     SafeSprintf(regKey, _MAX_PATH, "Software\Netscape\Netscape Navigator\biff\users\%s\servers\%s",
  879.     pUser, pValue);
  880.     if (RegOpenKeyEx(HKEY_CURRENT_USER, OS_STRING(regKey), 0, KEY_READ, &hServersKey) == ERROR_SUCCESS)
  881.     {
  882. pPath = new char[_MAX_PATH];
  883. memset(pPath, 0, _MAX_PATH);
  884. ulSize = _MAX_PATH - 1;
  885. if (RegQueryValueEx(hServersKey, OS_STRING("popstatePath"), 0, &ulType, (LPBYTE)pPath, &ulSize) == ERROR_SUCCESS)
  886. {
  887.     // pPath ="..mailpopstate.dat"
  888.     // the actual location of cookies is 1 level up
  889.     if (pCursor = ::HXReverseFindChar(pPath, '\'))
  890.     {
  891. *pCursor = '';
  892.     
  893. if (pCursor = ::HXReverseFindChar(pPath, '\'))
  894. {
  895.     *pCursor = '';
  896.     m_pNSCookiesPath = new char[strlen(pPath) + 13];
  897.     sprintf(m_pNSCookiesPath, "%s\%s", pPath, RM_COOKIE_FILE_NAME); /* Flawfinder: ignore */
  898.     goto cleanup;
  899. }
  900.     }
  901. }
  902.     }
  903. }
  904.     }
  905. }
  906.     }
  907.     // Netscape Browser 3.0+
  908.     if (RegOpenKeyEx(HKEY_CURRENT_USER, OS_STRING("Software\Netscape\Netscape Navigator\Cookies"), 0,
  909. KEY_READ, &hCookiesKey) == ERROR_SUCCESS) 
  910.     {
  911. HX_VECTOR_DELETE(pPath);
  912. pPath = new char[_MAX_PATH];
  913. memset(pPath, 0, _MAX_PATH);
  914. ulSize = _MAX_PATH - 1;
  915. if (RegQueryValueEx(hCookiesKey, OS_STRING("Cookie File"), 0, &ulType, (LPBYTE)pPath, &ulSize) == ERROR_SUCCESS)
  916. {
  917.     m_pNSCookiesPath = new char[strlen(pPath) + 1];
  918.     strcpy(m_pNSCookiesPath, pPath); /* Flawfinder: ignore */
  919. }
  920.     }
  921. cleanup:
  922.     HX_RELEASE(pBuffer);
  923.     if (hMainAppKey)
  924.     {
  925. RegCloseKey(hMainAppKey);
  926.     }
  927.     if (hBiffKey)
  928.     {
  929. RegCloseKey(hBiffKey);
  930.     }
  931.     if (hUsersKey)
  932.     {
  933. RegCloseKey(hUsersKey);
  934.     }
  935.     if (hServersKey)
  936.     {
  937. RegCloseKey(hServersKey);
  938.     }
  939.     if (hCookiesKey)
  940.     {
  941. RegCloseKey(hCookiesKey);
  942.     }
  943.     HX_VECTOR_DELETE(pUser);
  944.     HX_VECTOR_DELETE(pPath);
  945.     HX_VECTOR_DELETE(pValue);    
  946. #endif /* _WINDOWS */
  947.     return hr;
  948. }
  949. void
  950. HXCookies::ResetCookies(CHXSimpleList* pCookieList)
  951. {
  952.     CookieStruct*   pCookie = NULL;
  953.     while (pCookieList && pCookieList->GetCount() > 0)
  954.     {
  955. pCookie = (CookieStruct*) pCookieList->RemoveHead();
  956. HX_DELETE(pCookie);
  957.     }
  958. }
  959. HX_RESULT
  960. HXCookies::FileReadLine(FILE* fp, char* pLine, UINT32 ulLineBuf, UINT32* pBytesRead)
  961. {
  962. #ifdef _OPENWAVE
  963.     return HXR_NOTIMPL;
  964. #else
  965.     HX_RESULT hr = HXR_OK;
  966.     UINT32 i = 0;
  967.     UINT32 ulBytesRead = 0;
  968.     char* pTmpBuf = NULL;
  969.     if (!fp)
  970.     {
  971. hr = HXR_FAILED;
  972. goto cleanup;
  973.     }
  974.     if (ulLineBuf < 1) 
  975.     {
  976.         *pBytesRead = 0;
  977.         goto cleanup;
  978.     }
  979.     ulBytesRead = fread(pLine, sizeof(char), ulLineBuf, fp);
  980.     pTmpBuf = pLine;
  981.     if (ulBytesRead)
  982.     {
  983. while (i < ulBytesRead) 
  984. {
  985. #ifdef _MACINTOSH
  986.     if (pTmpBuf[i] == 10 || pTmpBuf[i] == 13)
  987. #else
  988.     if (pTmpBuf[i] == 10)
  989. #endif
  990.     {   // LF
  991. if (pTmpBuf[i+1])
  992. {
  993.     pTmpBuf[i+1] = '';
  994. }
  995. // Back the file pointer up.
  996. fseek(fp, (long)((i + 1) - ulBytesRead), SEEK_CUR);
  997. *pBytesRead = i + 1;
  998. break;
  999.     }
  1000.     i++;
  1001. }
  1002.     }
  1003.     else
  1004.     {
  1005. hr = HXR_FAILED;
  1006.     }
  1007.     
  1008. cleanup:
  1009.     return hr;
  1010. #endif /* _OPENWAVE */
  1011. }
  1012. CookieStruct*
  1013. HXCookies::CheckForPrevCookie(char * path,
  1014.        char * hostname,
  1015.        char * name)
  1016. {
  1017.     int     nResult = 0;
  1018.     const char*     pValue = NULL;
  1019.     BOOL     bFound = FALSE;
  1020.     CookieStruct*   pCookie = NULL;
  1021.     CHXSimpleList::Iterator  i;
  1022.     if (!m_pRMCookies)
  1023.     {
  1024. goto cleanup;
  1025.     }
  1026.     for (i = m_pRMCookies->Begin(); i != m_pRMCookies->End(); ++i)
  1027.     {
  1028. pCookie = (CookieStruct*) (*i);
  1029.         if(path && hostname && 
  1030.    pCookie->pPath && 
  1031.    pCookie->pHost && 
  1032.    pCookie->pCookieName &&
  1033.    !pCookie->pCookieName->Compare(name) &&
  1034.    !pCookie->pPath->Compare(path) &&     
  1035.    !pCookie->pHost->CompareNoCase(hostname))
  1036. {
  1037.             bFound = TRUE;
  1038.     break;
  1039. }
  1040.     }
  1041. cleanup:    
  1042.     return bFound?pCookie:NULL;
  1043. }
  1044. HX_RESULT
  1045. HXCookies::OpenCookies(char* pCookieFile, BOOL bRMCookies, CHXSimpleList*& pCookiesList)
  1046. {
  1047. #ifdef _OPENWAVE
  1048.     return HXR_NOTIMPL;
  1049. #else
  1050.     HX_RESULT     hr = HXR_OK;
  1051.     char*     pHost = NULL;
  1052.     char*     pPath = NULL;
  1053.     char*     pCookieName = NULL; 
  1054.     char*     pCookieValue = NULL;
  1055.     char*     pIsDomain = NULL;
  1056.     char*     pXXX = NULL;
  1057.     char*     pExpires = NULL;
  1058.     char*     pBuffer = new char[LINE_BUFFER_SIZE]; /* Flawfinder: ignore */
  1059.     UINT32     ulBytesRead = 0;
  1060.     FILE*     fp = NULL;
  1061.     CookieStruct*   pNewCookie = NULL;
  1062.  
  1063.     pCookiesList = NULL;
  1064.     if (!pBuffer)
  1065.     {
  1066. hr = HXR_FAILED;
  1067. goto cleanup;
  1068.     }
  1069.     pBuffer[0] = '';
  1070.     if (!pCookieFile)
  1071.     {
  1072. hr = HXR_FAILED;
  1073. goto cleanup;
  1074.     }
  1075. #ifdef _WINDOWS
  1076.     if (bRMCookies)
  1077.     {
  1078. if (!m_pLock)
  1079. {
  1080. #ifdef THREADS_SUPPORTED            
  1081.     HXEvent::MakeEvent(m_pLock, "CookieFileLock", FALSE);
  1082. #else            
  1083.     HXEvent::MakeStubEvent(m_pLock, "CookieFileLock", FALSE);
  1084. #endif            
  1085. }
  1086. else
  1087. {
  1088.     m_pLock->Wait();
  1089. }
  1090.     }
  1091. #endif /* _WINDOWS */
  1092.     if (bRMCookies)
  1093.     {
  1094. if(CheckCookies() == HXR_FAIL)
  1095. {
  1096.           hr = HXR_FAILED;
  1097.     goto cleanup;
  1098. }
  1099.     }
  1100.     if (!(fp = fopen(pCookieFile, "r+b")))
  1101.     {
  1102. hr = HXR_FAILED;
  1103. goto cleanup;
  1104.     }
  1105. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
  1106.     if (bRMCookies)
  1107.     {
  1108. m_fileID = fileno(fp);    
  1109. flock(m_fileID, LOCK_EX);
  1110.     }
  1111. #endif /* _UNIX */
  1112.     /* format is:
  1113.      *
  1114.      * host t is_domain t path t xxx t expires t name t cookie
  1115.      *
  1116.      * if this format isn't respected we move onto the next line in the file.
  1117.      *
  1118.      * is_domain is TRUE or FALSE   -- defaulting to FALSE
  1119.      * xxx is TRUE or FALSE     -- should default to TRUE
  1120.      * expires is a time_t integer
  1121.      * cookie can have tabs
  1122.      */
  1123.     while(HXR_OK == FileReadLine(fp, &pBuffer[0], LINE_BUFFER_SIZE, &ulBytesRead))
  1124.     {
  1125. if (*pBuffer == '#' || *pBuffer == CR || *pBuffer == LF || *pBuffer == 0)
  1126. {
  1127.     continue;
  1128. }
  1129. pHost = pBuffer;
  1130.     
  1131. if(!(pIsDomain = strchr(pHost, 't')))
  1132. {
  1133.     continue;
  1134. }
  1135. *pIsDomain++ = '';
  1136. if(*pIsDomain == CR || *pIsDomain == LF || *pIsDomain == 0)
  1137. {
  1138.     continue;
  1139. }
  1140. if(!(pPath = strchr(pIsDomain, 't')))
  1141. {
  1142.     continue;
  1143. }
  1144. *pPath++ = '';
  1145. if(*pPath == CR || *pPath == LF || *pPath == 0)
  1146. {
  1147.     continue;
  1148. }
  1149. if(!(pXXX = strchr(pPath, 't')))
  1150. {
  1151.     continue;
  1152. }
  1153. *pXXX++ = '';
  1154. if(*pXXX == CR || *pXXX == LF || *pXXX == 0)
  1155. {
  1156.     continue;
  1157. }
  1158. if(!(pExpires = strchr(pXXX, 't')))
  1159. {
  1160.     continue;
  1161. }
  1162. *pExpires++ = '';
  1163. if(*pExpires == CR || *pExpires == LF || *pExpires == 0)
  1164. {
  1165.     continue;
  1166. }
  1167. if(!(pCookieName = strchr(pExpires, 't')))
  1168. {
  1169.     continue;
  1170. }
  1171. *pCookieName++ = '';
  1172. if(*pCookieName == CR || *pCookieName == LF || *pCookieName == 0)
  1173. {
  1174.     continue;
  1175. }
  1176. if(!(pCookieValue = strchr(pCookieName, 't')))
  1177. {
  1178.     continue;
  1179. }
  1180. *pCookieValue++ = '';
  1181. if(*pCookieValue == CR || *pCookieValue == LF || *pCookieValue == 0)
  1182. {
  1183.     continue;
  1184. }
  1185. // remove the 'n' from the end of the cookie
  1186. pCookieValue = ::StripLine(pCookieValue);
  1187. // construct a new cookie_struct
  1188. pNewCookie = new CookieStruct;
  1189. if(!pNewCookie)
  1190. {
  1191.     hr = HXR_OUTOFMEMORY;
  1192.     goto cleanup;
  1193. }
  1194. memset(pNewCookie, 0, sizeof(CookieStruct));
  1195. /* copy
  1196.  */
  1197. pNewCookie->pCookieValue = new CHXString(pCookieValue);
  1198. pNewCookie->pCookieName = new CHXString(pCookieName);
  1199. pNewCookie->pPath = new CHXString(pPath);
  1200. pNewCookie->pHost = new CHXString(pHost);
  1201. #ifdef _MACINTOSH
  1202. pNewCookie->expires = (time_t)atoi64(pExpires);
  1203. #else
  1204. pNewCookie->expires = atol(pExpires);
  1205. #endif
  1206. if(!strcasecmp(pIsDomain, "TRUE"))
  1207. {
  1208.     pNewCookie->bIsDomain = TRUE;
  1209. }
  1210. else
  1211. {
  1212.     pNewCookie->bIsDomain = FALSE;
  1213. }
  1214. pNewCookie->bMemoryOnly = FALSE;
  1215. if (!pCookiesList)
  1216. {
  1217.     pCookiesList = new CHXSimpleList();
  1218. }
  1219. hr = AddCookie(pNewCookie, pCookiesList);
  1220.     }
  1221.     UpdateModificationTime();
  1222. cleanup:
  1223. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
  1224.     if (bRMCookies)
  1225.     {
  1226. flock(m_fileID, LOCK_UN);
  1227.     }
  1228. #endif /* _UNIX */
  1229.     if (fp)
  1230.     {
  1231. fclose(fp);
  1232.     }
  1233. #ifdef _WINDOWS
  1234.     if (bRMCookies && m_pLock)
  1235.     {
  1236. m_pLock->SignalEvent();
  1237.     }
  1238. #endif /* _WINDOWS */
  1239.     delete [] pBuffer;
  1240.     
  1241.     return hr;
  1242. #endif /* _OPENWAVE */
  1243. }
  1244. HX_RESULT
  1245. HXCookies::SaveCookies(void)
  1246. {
  1247. #ifdef _OPENWAVE
  1248.     return HXR_NOTIMPL;
  1249. #else
  1250.     HX_RESULT     hr = HXR_OK;
  1251.     FILE*     fp = NULL;
  1252.     INT32     len = 0;
  1253.     char     date_string[36] = {0}; /* Flawfinder: ignore */
  1254.     time_t     cur_date = time(NULL);
  1255.     CookieStruct*   pTempCookie = NULL;
  1256.     CHXSimpleList::Iterator  i;
  1257.     if (!m_pRMCookies || !m_pRMCookiesPath)
  1258.     {
  1259. goto cleanup;
  1260.     }
  1261. #ifdef _WINDOWS
  1262.     if (!m_pLock)
  1263.     {
  1264. #ifdef THREADS_SUPPORTED        
  1265. HXEvent::MakeEvent(m_pLock, "CookieFileLock", FALSE);
  1266. #else        
  1267. HXEvent::MakeStubEvent(m_pLock, "CookieFileLock", FALSE);
  1268. #endif
  1269.     }
  1270.     else
  1271.     {
  1272. m_pLock->Wait();
  1273.     }
  1274. #endif /* _WINDOWS */
  1275.     if (!(fp = fopen(m_pRMCookiesPath, "w")))
  1276.     {
  1277. hr = HXR_FAILED;
  1278. goto cleanup;
  1279.     }
  1280. #ifdef _UNIX
  1281.     //Make the permisions on the cookies file User read/write only.
  1282.     if( chmod( m_pRMCookiesPath, S_IRUSR | S_IWUSR ) != 0 )
  1283.     {
  1284.         HX_ASSERT( "Can't change permision on cookies file." == NULL );
  1285.     }
  1286.     
  1287. #endif    
  1288. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
  1289.     m_fileID = fileno(fp);    
  1290.     flock(m_fileID, LOCK_EX);
  1291. #endif /* _UNIX */
  1292.     fwrite(RM_COOKIE_CAPTION, sizeof(char), strlen(RM_COOKIE_CAPTION), fp);
  1293.     for (i = m_pRMCookies->Begin(); i != m_pRMCookies->End(); ++i)
  1294.     {
  1295. pTempCookie = (CookieStruct*) (*i);
  1296. /* format shall be:
  1297.    *
  1298.  * host t is_domain t path t secure t expires t name t cookie
  1299.  *
  1300.  * is_domain is TRUE or FALSE
  1301.  * secure is TRUE or FALSE  
  1302.  * expires is a time_t integer
  1303.  * cookie can have tabs
  1304.  */
  1305. if(pTempCookie->expires < cur_date)
  1306. {
  1307.     continue;  /* don't write entry if cookie has expired 
  1308. * or has no expiration date
  1309. */
  1310. }
  1311. len = fwrite((const char*)*(pTempCookie->pHost), sizeof(char), pTempCookie->pHost->GetLength(), fp);
  1312. if (len < 0)
  1313. {
  1314.     hr = HXR_FAILED;
  1315.     goto cleanup;
  1316. }
  1317. fwrite("t", sizeof(char), 1, fp);
  1318. if(pTempCookie->bIsDomain)
  1319. {
  1320.     fwrite("TRUE", sizeof(char), 4, fp);
  1321. }
  1322. else
  1323. {
  1324.     fwrite("FALSE", sizeof(char), 5, fp);
  1325. }     
  1326. fwrite("t", sizeof(char), 1, fp);
  1327. fwrite((const char*)*(pTempCookie->pPath), sizeof(char), pTempCookie->pPath->GetLength(), fp);
  1328. fwrite("t", sizeof(char), 1, fp);
  1329. fwrite("FALSE", sizeof(char), 5, fp);
  1330. fwrite("t", sizeof(char), 1, fp);
  1331. sprintf(date_string, "%lu", pTempCookie->expires); /* Flawfinder: ignore */
  1332. fwrite(date_string, sizeof(char), strlen(date_string), fp);
  1333. fwrite("t", sizeof(char), 1, fp);
  1334. fwrite((const char*)*(pTempCookie->pCookieName), sizeof(char), 
  1335. pTempCookie->pCookieName->GetLength(), fp);
  1336. fwrite("t", sizeof(char), 1, fp);
  1337. fwrite((const char*)*(pTempCookie->pCookieValue), sizeof(char), 
  1338. pTempCookie->pCookieValue->GetLength(), fp);
  1339. fwrite(LINEBREAK, sizeof(char), LINEBREAK_LEN, fp);
  1340. //once saved to disk, make sure the memory only flag is false
  1341. pTempCookie->bMemoryOnly = FALSE;
  1342.     }
  1343.     UpdateModificationTime();    
  1344.     m_bSaveCookies = FALSE;
  1345. cleanup:
  1346. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
  1347.     flock(m_fileID, LOCK_UN);
  1348. #endif /* _UNIX */
  1349.     if (fp)
  1350.     {
  1351. fclose(fp);
  1352.     }
  1353. #ifdef _WINDOWS
  1354.     if (m_pLock)
  1355.     {
  1356. m_pLock->SignalEvent();
  1357.     }
  1358. #endif /* _WINDOWS */
  1359.     SecureCookies();
  1360.     return(hr);
  1361. #endif /* _OPENWAVE */
  1362. }
  1363. HX_RESULT
  1364. HXCookies::AddCookie(CookieStruct* pCookie, CHXSimpleList*& pCookiesList)
  1365. {
  1366.     HX_RESULT     hr = HXR_OK;
  1367.     BOOL     bShorterPathFound = FALSE;
  1368.     CookieStruct*   pTempCookie = NULL;
  1369.     LISTPOSITION    position;
  1370.     if (!pCookie || !pCookiesList)
  1371.     {
  1372. hr = HXR_FAILED;
  1373. goto cleanup;
  1374.     }
  1375.     /* add it to the list so that it is before any strings of
  1376.      * smaller length
  1377.      */
  1378.     position = pCookiesList->GetHeadPosition();
  1379.     while (position != NULL)
  1380.     {
  1381. pTempCookie = (CookieStruct*) pCookiesList->GetNext(position);
  1382. if (strlen(*pCookie->pPath) > strlen(*pTempCookie->pPath))
  1383. {
  1384.     // Remember that we found a shorter path
  1385.     bShorterPathFound = TRUE;
  1386.     // If the position is null, then event was the first
  1387.     // item in the list, and we need to do some fancy footwork...
  1388.     if (!position)
  1389.     {
  1390. POSITION theTail = pCookiesList->GetTailPosition();
  1391. pCookiesList->InsertBefore(theTail,(void*) pCookie);
  1392.     }
  1393.     // otherwise, roll after one...
  1394.     else
  1395.     {
  1396. pCookiesList->GetPrev(position);
  1397. if (!position)
  1398. {
  1399.     pCookiesList->AddHead((void*) pCookie);
  1400. }
  1401. else
  1402. {
  1403.     pCookiesList->InsertBefore(position,(void*) pCookie);
  1404. }
  1405.     }
  1406.     break;
  1407. }
  1408.     }
  1409.     // If we didn't find an earlier packet, then we should insert at
  1410.     // the head of the list...
  1411.     if (!bShorterPathFound)
  1412.     {
  1413. pCookiesList->AddTail((void*) pCookie);
  1414.     }
  1415. cleanup:
  1416.     return hr;
  1417. }
  1418. BOOL
  1419. HXCookies::WasCookieAdded(CHXSimpleList* pCookiesList, CookieStruct* pCookie)
  1420. {
  1421.     BOOL bResult = FALSE;
  1422.     CookieStruct*  pTempCookie = NULL;
  1423.     CHXSimpleList::Iterator  i;
  1424.     if (!pCookiesList || !pCookie)
  1425.     {
  1426. goto cleanup;
  1427.     }
  1428.     for (i = pCookiesList->Begin(); i != pCookiesList->End(); ++i)
  1429.     {
  1430. pTempCookie = (CookieStruct*) (*i);
  1431. if (pTempCookie->pCookieName && pCookie->pCookieName 
  1432. && *(pTempCookie->pCookieName) == *(pCookie->pCookieName) 
  1433. && pTempCookie->pHost && pCookie->pHost)
  1434. {
  1435.     if(DoesDomainMatch(*pTempCookie->pHost, *pCookie->pHost))
  1436.     {
  1437. bResult = TRUE;
  1438. break;
  1439.     }
  1440. }
  1441.     }
  1442. cleanup:
  1443.     return bResult;
  1444. }
  1445. BOOL HXCookies::DoesDomainMatch(const char* szDomain, const char* szDomainToParse)
  1446. {
  1447.     BOOL bMatches = FALSE;
  1448.     CHXString cHostCopy;
  1449.     CHXString cDomainCopy;
  1450.     CHXString cHostRight;
  1451.     if(!szDomain || !szDomainToParse || !strlen(szDomain) || !strlen(szDomainToParse))
  1452.     {
  1453. goto cleanup;
  1454.     }
  1455.     cHostCopy = szDomainToParse;
  1456.     cDomainCopy = szDomain;
  1457.     cDomainCopy.MakeLower();
  1458.     // Now we compare the domain (from the cookie itself) with
  1459.     // the rightmost characters of the host. For instance,
  1460.     // a domain of ".bar.com" would match with a host (passed in)
  1461.     // of "foo.bar.com", "www.bar.com", etc. but would NOT match
  1462.     // a host of "bar.com".
  1463.     cHostRight = cHostCopy.Right(cDomainCopy.GetLength());
  1464.     if (cHostRight != cDomainCopy)
  1465.     {
  1466.         // no match
  1467.         goto cleanup;
  1468.     }
  1469.     else if (cDomainCopy.GetAt(0) != '.' && cHostCopy.GetLength() > cDomainCopy.GetLength() &&
  1470.                  cHostCopy.GetAt(cHostCopy.GetLength() - cDomainCopy.GetLength() - 1) != '.')
  1471.     {
  1472.        // no match
  1473.         goto cleanup;
  1474.     }
  1475.     bMatches = TRUE;
  1476. cleanup:
  1477.     return bMatches;
  1478. }
  1479. BOOL
  1480. HXCookies::IsCookieEnabled()
  1481. {
  1482.     BOOL bResult = TRUE;
  1483.     IHXBuffer* pBuffer = NULL;
  1484.     if (!m_pPreferences)
  1485.     {
  1486. if (HXR_OK != m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences))
  1487. {
  1488.     m_pPreferences = NULL;
  1489. }
  1490.     }
  1491.     if (m_pPreferences &&
  1492. m_pPreferences->ReadPref("CookiesEnabled", pBuffer) == HXR_OK)
  1493.     {
  1494. if (strcmp((const char*)pBuffer->GetBuffer(), "0") == 0)
  1495. {
  1496.     bResult = FALSE;
  1497. }
  1498. HX_RELEASE(pBuffer);
  1499.     } 
  1500.     return bResult;
  1501. }
  1502. void     
  1503. HXCookies::UpdateModificationTime(void)
  1504. {
  1505. #ifdef _OPENWAVE
  1506.     // XXXSAB implement this!!!
  1507. #else
  1508.     struct stat status;
  1509.     if (!m_pRMCookiesPath)
  1510.     {
  1511. goto cleanup;
  1512.     }
  1513. #ifndef _VXWORKS
  1514.     if (0 == stat(m_pRMCookiesPath, &status))
  1515.     {
  1516. m_lastModification = status.st_mtime;
  1517.     }
  1518. #endif /* _VXWORKS */
  1519. cleanup:
  1520.     return;
  1521. #endif
  1522. }
  1523. BOOL     
  1524. HXCookies::IsCookieFileModified(void)
  1525. {
  1526. #ifdef _OPENWAVE
  1527.     // XXXSAB implement this!!!
  1528.     return FALSE;
  1529. #else
  1530.     BOOL bResult = FALSE;
  1531.     struct stat status;
  1532.     if (!m_pRMCookiesPath)
  1533.     {
  1534. goto cleanup;
  1535.     }
  1536. #ifndef _VXWORKS
  1537.     if (0 == stat(m_pRMCookiesPath, &status) &&
  1538. status.st_mtime != m_lastModification)
  1539.     {
  1540. bResult = TRUE;
  1541.     }
  1542. #endif /* _VXWORKS */
  1543. cleanup:
  1544.     return bResult;
  1545. #endif
  1546. }
  1547. HX_RESULT
  1548. HXCookies::MergeCookieList(CHXSimpleList* pFromList, CHXSimpleList* pToList)
  1549. {
  1550.     HX_RESULT     hr = HXR_OK;
  1551.     CookieStruct*   pCookie = NULL;
  1552.     CHXSimpleList::Iterator  i;
  1553.     if (!pFromList)
  1554.     {
  1555. goto cleanup;
  1556.     }
  1557.     for (i = pFromList->Begin(); HXR_OK == hr && i != pFromList->End(); ++i)
  1558.     {
  1559. pCookie = (CookieStruct*) (*i);
  1560. if (pCookie->bMemoryOnly && !WasCookieAdded(pToList, pCookie))
  1561. {
  1562.     CookieStruct* pNewCookie = new CookieStruct;
  1563.     pNewCookie->pPath = new CHXString(*pCookie->pPath);
  1564.     pNewCookie->pHost = new CHXString(*pCookie->pHost);
  1565.     pNewCookie->pCookieName = new CHXString(*pCookie->pCookieName);
  1566.     pNewCookie->pCookieValue = new CHXString(*pCookie->pCookieValue);
  1567.     pNewCookie->expires = pCookie->expires;
  1568.     pNewCookie->bIsDomain = pCookie->bIsDomain;
  1569.     pNewCookie->bMemoryOnly = pCookie->bMemoryOnly;
  1570.     hr = AddCookie(pNewCookie, pToList);
  1571. }
  1572.     }
  1573. cleanup:
  1574.     return hr;
  1575. }
  1576. HX_RESULT
  1577. HXCookies::SyncRMCookies(BOOL bSave)
  1578. {
  1579.     HX_RESULT     hr = HXR_OK;
  1580.     CHXSimpleList*  pNewRMCookies = NULL;
  1581.     CHXSimpleList::Iterator i;
  1582.     CookieStruct* pCookie = NULL;
  1583.     BOOL bCookieFileModified = FALSE;
  1584.     if (!m_bInitialized)
  1585.     {
  1586. hr = HXR_FAILED;
  1587. goto cleanup;
  1588.     }
  1589.     bCookieFileModified = IsCookieFileModified();
  1590.     if (bCookieFileModified)
  1591.     {
  1592. if (HXR_OK == OpenCookies(m_pRMCookiesPath, TRUE, pNewRMCookies))
  1593. {
  1594.     if (m_bSaveCookies)
  1595.     {
  1596. MergeCookieList(m_pRMCookies, pNewRMCookies);
  1597.     }
  1598.      
  1599.     ResetCookies(m_pRMCookies);
  1600.     HX_DELETE(m_pRMCookies);
  1601.     m_pRMCookies = pNewRMCookies;
  1602. }          
  1603.     }
  1604.     if (bSave && m_bSaveCookies)
  1605.     {
  1606. if(m_pRMCookies && bCookieFileModified && pNewRMCookies == NULL)
  1607. {
  1608.     //this means there are no more cookies on disk, and we need to look at what's in memory, and keep
  1609.     //only cookies that have bMemoryOnly set
  1610.     pNewRMCookies = new CHXSimpleList;
  1611.     while (m_pRMCookies && m_pRMCookies->GetCount() > 0 && pNewRMCookies)
  1612.     {
  1613.      pCookie = (CookieStruct*) m_pRMCookies->RemoveHead();
  1614. if(pCookie->bMemoryOnly)
  1615. {
  1616.     CookieStruct* pNewCookie = new CookieStruct;
  1617.     pNewCookie->pPath = new CHXString(*pCookie->pPath);
  1618.     pNewCookie->pHost = new CHXString(*pCookie->pHost);
  1619.     pNewCookie->pCookieName = new CHXString(*pCookie->pCookieName);
  1620.     pNewCookie->pCookieValue = new CHXString(*pCookie->pCookieValue);
  1621.     pNewCookie->expires = pCookie->expires;
  1622.     pNewCookie->bIsDomain = pCookie->bIsDomain;
  1623.     pNewCookie->bMemoryOnly = pCookie->bMemoryOnly;
  1624.     AddCookie(pNewCookie, pNewRMCookies);
  1625. }
  1626.      HX_DELETE(pCookie);
  1627.     }
  1628.     HX_DELETE(m_pRMCookies);
  1629.     m_pRMCookies = pNewRMCookies;
  1630. }
  1631. hr = SaveCookies();
  1632.     }
  1633. cleanup:
  1634.     return hr;
  1635. }
  1636. #ifdef _TEST
  1637. void
  1638. HXCookies::DumpCookies(void)
  1639. {
  1640.     CHXSimpleList* pCookies = NULL;
  1641.     CookieStruct*  pCookie = NULL;
  1642.     CHXSimpleList::Iterator  i;
  1643.     for (int l = 0; l < 2; l++)
  1644.     {
  1645. switch (l)
  1646. {
  1647. case 0:
  1648.     pCookies = m_pNSCookies;
  1649.     break;
  1650. case 1:
  1651.     pCookies = m_pRMCookies;
  1652.     break;
  1653. default:
  1654.     break;
  1655. }
  1656. if (pCookies)
  1657. {
  1658.     printf("Total cookies: %lun", pCookies->GetCount());
  1659.     
  1660.     for (i = pCookies->Begin(); i != pCookies->End(); ++i)
  1661.     {
  1662. pCookie = (CookieStruct*) (*i);
  1663. printf("%st%st%sn",
  1664.        (const char*)*(pCookie->pHost),
  1665.        (const char*)*(pCookie->pCookieName),
  1666.        (const char*)*(pCookie->pCookieValue));
  1667.     }
  1668. }
  1669.     }
  1670.     return;
  1671. }
  1672. #endif // _TEST
  1673. //IRPCookies
  1674. STDMETHODIMP HXCookies::GetExpiredCookies(const char* pHost,
  1675.          const char*        pPath,
  1676.          REF(IHXBuffer*)   pCookies)
  1677. {
  1678.     HX_RESULT     hr = HXR_OK;
  1679.     char*     cp = NULL;
  1680.     char*     pComma = NULL;
  1681.     char*     pEqualSign = NULL;
  1682.     char*     pData = NULL;
  1683.     char*     pURL = NULL;
  1684.     int     l = 0;
  1685.     int     host_length = 0;
  1686.     int     path_length = 0;
  1687.     int     domain_length = 0;
  1688.     BOOL     bAdded = FALSE;
  1689.     UINT32     dwSize = 0;    
  1690.     time_t     cur_time = time(NULL);
  1691.     CookieStruct*   pTempCookie = NULL;
  1692.     CookieStruct*   pNewCookie = NULL;
  1693.     CHXSimpleList*  pCookiesFound1 = NULL;
  1694.     //CHXSimpleList*  pCookiesFound2 = NULL;
  1695.     CHXSimpleList*  pCookiesList = NULL;
  1696.     IHXValues*     pValues = NULL;
  1697.     CHXSimpleList::Iterator  i;
  1698.     CHXString       cHostCopy;
  1699.     INT32           lColon;
  1700.     
  1701.     pCookies = NULL;
  1702.     if (!IsCookieEnabled())
  1703.     {
  1704. goto cleanup;
  1705.     }
  1706.     if (!m_bInitialized)
  1707.     {
  1708. hr = Initialize();
  1709. if (HXR_OK != hr)
  1710. {
  1711.     goto cleanup;
  1712. }
  1713.     }
  1714.     else
  1715.     {
  1716. SyncRMCookies(FALSE);
  1717.     }
  1718.     if (!pHost || !m_pCookiesHelper)
  1719.     {
  1720. hr = HXR_FAILED;
  1721. goto cleanup;
  1722.     }
  1723.     // return string to build    
  1724.     if (!(pValues = new CHXHeader()))
  1725.     {
  1726. hr = HXR_OUTOFMEMORY;
  1727. goto cleanup;
  1728.     }
  1729.     pValues->AddRef();
  1730.     cHostCopy = pHost;
  1731.     lColon    = cHostCopy.Find(':');
  1732.     if (lColon >= 0)
  1733.     {
  1734. cHostCopy = cHostCopy.Left(lColon);
  1735.     }
  1736.     cHostCopy.MakeLower();
  1737.     // search for all cookies(Netscape only for now)
  1738.     for (l = 0; l < 2; l++)
  1739.     {
  1740. switch (l)
  1741. {
  1742. case 0:
  1743.     pCookiesList = m_pRMCookies;
  1744.     break;
  1745. case 1:
  1746.     pCookiesList = m_pNSCookies;
  1747.     break;
  1748. default:
  1749.     break;
  1750. }
  1751. if (!pCookiesList)
  1752. {
  1753.     continue;
  1754. }
  1755. for (i = pCookiesList->Begin(); i != pCookiesList->End(); ++i)
  1756. {
  1757.     pTempCookie = (CookieStruct*) (*i);
  1758.     
  1759.     if (!pTempCookie->pHost)
  1760.     {
  1761. continue;
  1762.     }
  1763.     // check the host or domain first
  1764.     if(pTempCookie->bIsDomain)
  1765.     {
  1766. domain_length = pTempCookie->pHost->GetLength();
  1767. CHXString cDomainCopy(*(pTempCookie->pHost));
  1768. cDomainCopy.MakeLower();
  1769. // Now we compare the domain (from the cookie itself) with
  1770. // the rightmost characters of the host. For instance,
  1771. // a domain of ".bar.com" would match with a host (passed in)
  1772. // of "foo.bar.com", "www.bar.com", etc. but would NOT match
  1773. // a host of "bar.com".
  1774. CHXString cHostRight = cHostCopy.Right(cDomainCopy.GetLength());
  1775. if (cHostRight != cDomainCopy)
  1776. {
  1777.     // no match
  1778.     continue;
  1779. }
  1780.     }
  1781.     else if(strcasecmp((const char*)*(pTempCookie->pHost), pHost))
  1782.     {
  1783. // hostname matchup failed.
  1784. continue;
  1785.     }
  1786.     // shorter strings always come last so there can be no
  1787.     // ambiquity             
  1788.     if(pTempCookie->pPath && 
  1789.        !strncmp(pPath, (const char*)*(pTempCookie->pPath), pTempCookie->pPath->GetLength()))
  1790.     {
  1791. // check for expired cookies
  1792. if(pTempCookie->expires && (pTempCookie->expires < cur_time))
  1793. {
  1794.     if (!pCookiesFound1)
  1795.     {
  1796.         pCookiesFound1 = new CHXSimpleList();
  1797.     }
  1798.     pCookiesFound1->AddTail(pTempCookie);
  1799. }
  1800.     }
  1801. }
  1802.     }
  1803. #ifdef _WINDOWS
  1804.     if (!_pInternetGetCookie || m_bMemoryOnly)
  1805.     {
  1806. goto cleanup;
  1807.     }
  1808.     host_length = strlen(pHost);
  1809.     if (pPath)
  1810.     {
  1811. path_length = strlen(pPath);
  1812.     }
  1813.     pURL = new char[host_length + path_length + 8];
  1814.     sprintf(pURL, "http://%s%s", pHost, pPath); /* Flawfinder: ignore */
  1815.     if (_pInternetGetCookie(pURL, NULL, pData, &dwSize) && !pData && dwSize)
  1816.     {
  1817. pData = new char[dwSize+1];
  1818. if (!_pInternetGetCookie(pURL, NULL, pData, &dwSize))
  1819. {
  1820.     goto cleanup;
  1821. }
  1822. cp = pData;
  1823. while (pComma = (char*) ::HXFindChar(cp, ';'))
  1824. {
  1825.     *pComma = '';
  1826.     pComma++;
  1827.     if (pEqualSign = (char*) ::HXFindChar(cp, '='))
  1828.     {
  1829. *pEqualSign = '';
  1830. pEqualSign++;
  1831. pNewCookie = new CookieStruct;
  1832. bAdded = FALSE;
  1833. // copy
  1834. pNewCookie->pCookieValue = new CHXString(pEqualSign);
  1835. pNewCookie->pCookieName = new CHXString(cp);
  1836. pNewCookie->pPath = NULL;
  1837. pNewCookie->pHost = NULL;
  1838. pNewCookie->expires = 0;
  1839. pNewCookie->bIsDomain = FALSE;
  1840. pNewCookie->bMemoryOnly = FALSE;
  1841. if (!WasCookieAdded(pCookiesFound1, pNewCookie))
  1842. {
  1843.     //if (!pCookiesFound2)
  1844.     //{
  1845.     // pCookiesFound2 = new CHXSimpleList();
  1846.     // pCookiesFound2->AddTail(pNewCookie);
  1847.     // bAdded = TRUE;
  1848.     //}
  1849.     //else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
  1850.     //{
  1851.     // pCookiesFound2->AddTail(pNewCookie);
  1852.     // bAdded = TRUE;
  1853.     //}
  1854. }
  1855. if (!bAdded)
  1856. {
  1857.     HX_DELETE(pNewCookie);
  1858. }
  1859.     }
  1860.     cp = pComma;
  1861. }
  1862. if (pEqualSign = (char*) ::HXFindChar(cp, '='))
  1863. {
  1864.     *pEqualSign = '';
  1865.     pEqualSign++;
  1866.     pNewCookie = new CookieStruct;
  1867.     bAdded = FALSE;
  1868.     // copy
  1869.     pNewCookie->pCookieValue = new CHXString(pEqualSign);
  1870.     pNewCookie->pCookieName = new CHXString(cp);
  1871.     pNewCookie->pPath = NULL;
  1872.     pNewCookie->pHost = NULL;
  1873.     pNewCookie->expires = 0;
  1874.     pNewCookie->bIsDomain = FALSE;
  1875.     pNewCookie->bMemoryOnly = FALSE;
  1876.     if (!WasCookieAdded(pCookiesFound1, pNewCookie))
  1877.     {
  1878. //if (!pCookiesFound2)
  1879. //{
  1880. //    pCookiesFound2 = new CHXSimpleList();
  1881. //    pCookiesFound2->AddTail(pNewCookie);
  1882. //    bAdded = TRUE;
  1883. //}
  1884. //else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
  1885. //{
  1886. //    pCookiesFound2->AddTail(pNewCookie);
  1887. //    bAdded = TRUE;
  1888. //}
  1889.     }
  1890.     if (!bAdded)
  1891.     {
  1892. HX_DELETE(pNewCookie);
  1893.     }
  1894. }
  1895.     }
  1896. #endif /* _WINDOWS */
  1897. cleanup:
  1898.     if (pCookiesFound1)
  1899.     {
  1900. for (i = pCookiesFound1->Begin(); i != pCookiesFound1->End(); ++i)
  1901. {
  1902.     pTempCookie = (CookieStruct*) (*i);
  1903.     if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
  1904.     {
  1905. ::SaveStringToHeader(pValues,
  1906.      (const char*)*(pTempCookie->pCookieName),
  1907.      (char*)(const char*)*(pTempCookie->pCookieValue));
  1908.     }
  1909. }
  1910.     }
  1911.     //if (pCookiesFound2)
  1912.     //{
  1913.     // for (i = pCookiesFound2->Begin(); i != pCookiesFound2->End(); ++i)
  1914.     // {
  1915.     //     pTempCookie = (CookieStruct*) (*i);
  1916.     //
  1917.     //     if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
  1918.     //     {
  1919.     // ::SaveStringToHeader(pValues,
  1920.     //      (const char*)*(pTempCookie->pCookieName),
  1921.     //      (char*)(const char*)*(pTempCookie->pCookieValue));
  1922.     //     }
  1923.     //
  1924.     //     HX_DELETE(pTempCookie);
  1925.     // }
  1926.     //}
  1927.     if (m_pCookiesHelper)
  1928.     {
  1929. hr = m_pCookiesHelper->UnPack(pValues, pCookies);
  1930.     }
  1931.     HX_DELETE(pCookiesFound1);
  1932.     //HX_DELETE(pCookiesFound2);
  1933.     HX_VECTOR_DELETE(pData);
  1934.     HX_VECTOR_DELETE(pURL);
  1935.     HX_RELEASE(pValues);
  1936.    
  1937.     return hr;
  1938. }
  1939. HX_RESULT HXCookies::SecureCookies()
  1940. {
  1941.     return HXR_OK;
  1942. }
  1943. HX_RESULT HXCookies::CheckCookies()
  1944. {
  1945.     return HXR_OK;
  1946. }