filestub.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:31k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* 
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #define CMD_STUB 1 /* this is just a stub for security/cmd/*  */
  34. #define MOZ_LITE 1 /* don't need that other stuff, either */
  35. #if 0
  36. #include "stdafx.h"
  37. #include "dialog.h"
  38. #include "mainfrm.h"
  39. #include "custom.h"
  40. #include "shcut.h"
  41. #include "edt.h"
  42. #include "prmon.h"
  43. #include "fegui.h"
  44. #include "prefapi.h"
  45. #include <io.h>
  46. #include "secrng.h"
  47. #include "mailass.h"
  48. #include "ipframe.h"
  49. #include "mnprefs.h"
  50. #else
  51. #include <xp_core.h>
  52. #include <xp_file.h>
  53. #include <xp_mcom.h>
  54. #define ASSERT assert
  55. #endif
  56. #ifdef XP_MAC
  57. #include "prpriv.h" /* For PR_NewNamedMonitor */
  58. #else
  59. #include "private/prpriv.h"
  60. #endif
  61. #ifdef XP_WIN
  62. #ifndef _AFXDLL
  63. /* MSVC Debugging new...goes to regular new in release mode */
  64. #define new DEBUG_NEW  
  65. #endif
  66. #ifdef __BORLANDC__
  67.     #define _lseek lseek
  68. #endif
  69.        
  70. #define WIDTHBYTES(i) ((i + 31) / 32 * 4)
  71. #define MAXREAD 32767
  72.        
  73. MODULE_PRIVATE char * XP_CacheFileName();
  74. #define MAXSTRINGLEN 8192 
  75. #ifndef CMD_STUB
  76. /* Return a string the same as the In string 
  77. ** but with all of the n's replaced with rn's  
  78. */
  79. MODULE_PRIVATE char * 
  80. FE_Windowsify(const char * In)
  81. {
  82.     char *Out;
  83.     char *o, *i; 
  84.     int32 len;
  85.     if(!In)
  86.         return NULL;
  87.     /* if every character is a n then new string is twice as long */
  88.     len = (int32) XP_STRLEN(In) * 2 + 1;
  89.     Out = (char *) XP_ALLOC(len);
  90.     if(!Out)
  91.         return NULL;
  92.   /* Move the characters over one by one.  If the current character is */
  93.   /*  a n replace add a r before moving the n over */
  94.     for(i = (char *) In, o = Out; i && *i; *o++ = *i++)
  95.        if(*i == 'n')
  96.             *o++ = 'r';
  97.     /* Make sure our new string is NULL terminated */
  98.     *o = '';
  99.     return(Out);
  100. }
  101. /*  Return some adjusted out full path on the mac. */
  102. /*  For windows, we just return what was passed in. */
  103. /*  We must provide it in a seperate buffer, otherwise they might change */
  104. /*      the original and change also what they believe to be saved. */
  105. char *
  106. WH_FilePlatformName(const char *pName)    
  107. {
  108.     if(pName)   {
  109.         return XP_STRDUP(pName);
  110.     }
  111.     
  112.     return NULL;
  113. }
  114. char *
  115. FE_GetProgramDirectory(char *buffer, int length)
  116. {
  117.     ::GetModuleFileName(theApp.m_hInstance, buffer, length);
  118.     /* Find the trailing slash. */
  119.     char *pSlash = ::strrchr(buffer, '\');
  120.     if(pSlash) {
  121. *(pSlash+1) = '';
  122.     } else {
  123. buffer[0] = '';
  124.     }
  125.     return (buffer);
  126. }
  127. char*
  128. XP_TempDirName(void)
  129. {
  130.     char *tmp = theApp.m_pTempDir;
  131.     if (!tmp)
  132.         return XP_STRDUP(".");
  133.     return XP_STRDUP(tmp);
  134. }
  135. /* Windows _tempnam() lets the TMP environment variable override things sent 
  136. ** in so it look like we're going to have to make a temp name by hand.
  137. ** The user should *NOT* free the returned string.  
  138. ** It is stored in static space 
  139. ** and so is not valid across multiple calls to this function.
  140. ** The names generated look like 
  141. **   c:netscapecachem0.moz 
  142. **   c:netscapecachem1.moz 
  143. ** up to... 
  144. **   c:netscapecachem9999999.moz 
  145. ** after that if fails 
  146. ** */
  147. PUBLIC char *
  148. xp_TempFileName(int type, const char * request_prefix, const char * extension,
  149. char* file_buf)
  150. {
  151.     const char * directory = NULL; 
  152.     char * ext = NULL;           /* file extension if any */
  153.     char * prefix = NULL;        /* file prefix if any */
  154.   
  155.   
  156.     XP_StatStruct statinfo;
  157.     int status;     
  158.     /* */
  159.     /* based on the type of request determine what directory we should be */
  160.     /*   looking into */
  161.     /*   */
  162.     switch(type) {
  163.     case xpCache:
  164.         directory = theApp.m_pCacheDir;
  165.         ext = ".MOZ";
  166.         prefix = CACHE_PREFIX;
  167.         break;
  168. #ifndef MOZ_LITE        
  169.     case xpSNewsRC:
  170.     case xpNewsRC:
  171.     case xpNewsgroups:
  172.     case xpSNewsgroups:
  173.     case xpTemporaryNewsRC:
  174.         directory = g_MsgPrefs.m_csNewsDir;
  175.         ext = (char *)extension;
  176.         prefix = (char *)request_prefix;
  177.         break;
  178.     case xpMailFolderSummary:
  179.     case xpMailFolder:
  180. directory = g_MsgPrefs.m_csMailDir;
  181.         ext = (char *)extension;
  182.         prefix = (char *)request_prefix;
  183. break;
  184.     case xpAddrBook:
  185. /*changed to support multi-profile */
  186. /*directory = theApp.m_pInstallDir->GetCharValue(); */
  187. directory = (const char *)theApp.m_UserDirectory;
  188. if ((request_prefix == 0) || (XP_STRLEN (request_prefix) == 0))
  189. prefix = "abook";
  190. ext = ".nab";
  191. break;
  192. #endif /* MOZ_LITE       */
  193.     case xpCacheFAT:
  194. directory = theApp.m_pCacheDir;
  195. prefix = "fat";
  196. ext = "db";
  197. break;
  198.     case xpJPEGFile:
  199.         directory = theApp.m_pTempDir;
  200. ext = ".jpg";
  201.         prefix = (char *)request_prefix;
  202. break;
  203.     case xpPKCS12File:
  204. directory = theApp.m_pTempDir;
  205. ext = ".p12";
  206. prefix = (char *)request_prefix;
  207. break;
  208.     case xpTemporary:
  209.     default:
  210.         directory = theApp.m_pTempDir;
  211.         ext = (char *)extension;
  212.         prefix = (char *)request_prefix;
  213.         break;
  214.     }
  215.     if(!directory)
  216.         return(NULL);
  217.     if(!prefix)
  218.         prefix = "X";
  219.     if(!ext)
  220.         ext = ".TMP";
  221.   /*  We need to base our temporary file names on time, and not on sequential */
  222.   /*    addition because of the cache not being updated when the user */
  223.   /*    crashes and files that have been deleted are over written with */
  224.   /*    other files; bad data. */
  225.   /*  The 52 valid DOS file name characters are */
  226.   /*    0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_^$~!#%&-{}@`'() */
  227.   /*  We will only be using the first 32 of the choices. */
  228.   /* */
  229.   /*  Time name format will be M+++++++.MOZ */
  230.   /*    Where M is the single letter prefix (can be longer....) */
  231.   /*    Where +++++++ is the 7 character time representation (a full 8.3 */
  232.   /*      file name will be made). */
  233.   /*    Where .MOZ is the file extension to be used. */
  234.   /* */
  235.   /*  In the event that the time requested is the same time as the last call */
  236.   /*    to this function, then the current time is incremented by one, */
  237.   /*    as is the last time called to facilitate unique file names. */
  238.   /*  In the event that the invented file name already exists (can't */
  239.   /*    really happen statistically unless the clock is messed up or we */
  240.   /*    manually incremented the time), then the times are incremented */
  241.   /*    until an open name can be found. */
  242.   /* */
  243.   /*  time_t (the time) has 32 bits, or 4,294,967,296 combinations. */
  244.   /*  We will map the 32 bits into the 7 possible characters as follows: */
  245.   /*    Starting with the lsb, sets of 5 bits (32 values) will be mapped */
  246.   /*      over to the appropriate file name character, and then */
  247.   /*      incremented to an approprate file name character. */
  248.   /*    The left over 2 bits will be mapped into the seventh file name */
  249.   /*      character. */
  250.   /* */
  251.     
  252.     int i_letter, i_timechars, i_numtries = 0;
  253.     char ca_time[8];
  254.     time_t this_call = (time_t)0;
  255.     
  256.     /*  We have to base the length of our time string on the length */
  257.     /*    of the incoming prefix.... */
  258.     /* */
  259.     i_timechars = 8 - strlen(prefix);
  260.     
  261.     /*  Infinite loop until the conditions are satisfied. */
  262.     /*  There is no danger, unless every possible file name is used. */
  263.     /* */
  264.     while(1)    {
  265.         /*    We used to use the time to generate this. */
  266.         /*    Now, we use some crypto to avoid bug #47027 */
  267.         RNG_GenerateGlobalRandomBytes((void *)&this_call, sizeof(this_call));
  268.         /*  Convert the time into a 7 character string. */
  269.         /*  Strip only the signifigant 5 bits. */
  270.         /*  We'll want to reverse the string to make it look coherent */
  271.         /*    in a directory of file names. */
  272.         /* */
  273.         for(i_letter = 0; i_letter < i_timechars; i_letter++) {
  274.             ca_time[i_letter] = (char)((this_call >> (i_letter * 5)) & 0x1F);
  275.             
  276.           /*  Convert any numbers to their equivalent ascii code */
  277.           /* */
  278.             if(ca_time[i_letter] <= 9)    {
  279.                 ca_time[i_letter] += '0';
  280.             }
  281.           /*  Convert the character to it's equivalent ascii code */
  282.           /* */
  283.             else    {
  284.                 ca_time[i_letter] += 'A' - 10;
  285.             }
  286.         }
  287.         
  288.         /*  End the created time string. */
  289.         /* */
  290.         ca_time[i_letter] = '';
  291.         
  292.         /*  Reverse the time string. */
  293.         /* */
  294.         _strrev(ca_time);
  295.         
  296.         /*  Create the fully qualified path and file name. */
  297.         /* */
  298.         sprintf(file_buf, "%s\%s%s%s", directory, prefix, ca_time, ext);
  299.         /*  Determine if the file exists, and mark that we've tried yet */
  300.         /*    another file name (mark to be used later). */
  301.         /*   */
  302.         /*  Use the system call instead of XP_Stat since we already */
  303.         /*  know the name and we don't want recursion */
  304.         /* */
  305.         status = _stat(file_buf, &statinfo);
  306.         i_numtries++;
  307.         /*  If it does not exists, we are successful, return the name. */
  308.         /* */
  309.         if(status == -1)    {
  310.            /* don't generate a directory as part of the cache temp names.    
  311.     * When the cache file name is passed into the other XP_File 
  312.     * functions we will append the cache directory to the name
  313.             * to get the complete path.
  314.             * This will allow the cache to be moved around
  315.             * and for netscape to be used to generate external cache FAT's.    
  316.             */
  317.             if(type == xpCache )
  318. sprintf(file_buf, "%s%s%s", prefix, ca_time, ext);
  319.             TRACE("Temp file name is %sn", file_buf);
  320.             return(file_buf);
  321.         }
  322.         
  323.         /*  If there is no room for additional characters in the time, */
  324.         /*    we'll have to return NULL here, or we go infinite. */
  325.         /*    This is a one case scenario where the requested prefix is */
  326.         /*    actually 8 letters long!   */
  327.         /*  Infinite loops could occur with a 7, 6, 5, etc character prefixes */
  328.         /*    if available files are all eaten up (rare to impossible), in */
  329.         /*    which case, we should check at some arbitrary frequency of */
  330.         /*    tries before we give up instead of attempting to Vulcanize */
  331.         /*    this code.  Live long and prosper. */
  332.         /* */
  333.         if(i_timechars == 0)    {
  334.             break;
  335.         } else if(i_numtries == 0x00FF) {
  336.             break;
  337.         }
  338.     }
  339.     
  340.     /*  Requested name is thought to be impossible to generate. */
  341.     /* */
  342.     TRACE("No more temp file names....n");
  343.     return(NULL);
  344. }
  345. PUBLIC char *
  346. WH_TempFileName(int type, const char * request_prefix, const char * extension)
  347. {
  348.     static char file_buf[_MAX_PATH]; /* protected by _pr_TempName_lock */
  349.     char* result;
  350.     if (_pr_TempName_lock == NULL)
  351. _pr_TempName_lock = PR_NewNamedMonitor("TempName-lock");
  352.     PR_EnterMonitor(_pr_TempName_lock);
  353.     result = XP_STRDUP(xp_TempFileName(type, request_prefix, extension, file_buf));
  354.     PR_ExitMonitor(_pr_TempName_lock);
  355.     return result;
  356. }
  357. #endif /* CMD_STUB */
  358. /* */
  359. /* Return a string that is equal to the NetName string but with the */
  360. /*  cross-platform characters changed back into DOS characters */
  361. /* The caller is responsible for XP_FREE()ing the string */
  362. /* */
  363. MODULE_PRIVATE char * 
  364. XP_NetToDosFileName(const char * NetName)
  365. {
  366.     char *p, *newName;
  367.     BOOL bChopSlash = FALSE;
  368.     if(!NetName)
  369.         return NULL;
  370.         
  371.     /*  If the name is only '/' or begins '//' keep the */
  372.     /*    whole name else strip the leading '/' */
  373.     if(NetName[0] == '/')
  374.         bChopSlash = TRUE;
  375.     /* save just / as a path */
  376.     if(NetName[0] == '/' && NetName[1] == '')
  377. bChopSlash = FALSE;
  378.     /* spanky Win9X path name */
  379.     if(NetName[0] == '/' && NetName[1] == '/')
  380. bChopSlash = FALSE;
  381.     if(bChopSlash)
  382.         newName = XP_STRDUP(&(NetName[1]));
  383.     else
  384.         newName = XP_STRDUP(NetName);
  385.     if(!newName)
  386.         return NULL;
  387.     for(p = newName; *p; p++) {
  388.         switch(*p) {
  389.             case '|':
  390.                 *p = ':';
  391.                 break;
  392.             case '/':
  393.                 *p = '\';
  394.                 break;
  395.             default:
  396.                 break;
  397.         }
  398.     }
  399.     return(newName);
  400. }
  401. /* */
  402. /* Returns the absolute name of a file  */
  403. /*  */
  404. /* The result of this function can be used with the standard */
  405. /* open/fopen ansi file functions */
  406. /* */
  407. PUBLIC char * 
  408. xp_FileName(const char * name, XP_FileType type, char* *myName)
  409. {
  410.     char * newName    = NULL;
  411.     char * netLibName = NULL;
  412.     char * tempName   = NULL;
  413.     char * prefStr    = NULL;
  414.     BOOL   bNeedToRegister = FALSE;   /* == do we need to register a new  */
  415.                                       /*   newshost->file name mapping */
  416.     struct _stat sInfo;
  417.     int iDot;
  418.     int iColon;
  419. #ifndef CMD_STUB
  420.     CString csHostName;
  421.     CString csHost;
  422.     CString fileName;
  423. #endif
  424.     switch(type) {
  425. #ifndef CMD_STUB
  426.     case xpCacheFAT:
  427. newName = (char *) XP_ALLOC(_MAX_PATH);
  428. sprintf(newName, "%s\fat.db", (const char *)theApp.m_pCacheDir);
  429. break;
  430.     case xpExtCacheIndex:
  431. newName = (char *) XP_ALLOC(_MAX_PATH);
  432. sprintf(newName, "%s\extcache.fat", (const char *)theApp.m_pCacheDir);
  433. break;
  434.     case xpSARCacheIndex:
  435.         newName = (char *) XP_ALLOC(_MAX_PATH);
  436.         sprintf(newName, "%s\archive.fat", theApp.m_pSARCacheDir);
  437.         break;
  438.     case xpHTTPCookie:
  439. newName = (char *) XP_ALLOC(_MAX_PATH);
  440. /*sprintf(newName, "%s\cookies.txt", theApp.m_pInstallDir->GetCharValue()); */
  441. /* changed to support multi-profile */
  442. sprintf(newName, "%s\cookies.txt", (const char *)theApp.m_UserDirectory);
  443. break;
  444. #ifndef MOZ_LITE      
  445.     case xpSNewsRC:
  446.     case xpNewsRC:
  447.         /* see if we are asking about the default news host */
  448.         /* else look up in netlib */
  449.         if ( !name || !strlen(name) )
  450.             name = g_MsgPrefs.m_csNewsHost;
  451.         netLibName = NET_MapNewsrcHostToFilename((char *)name, 
  452.                                                  (type == xpSNewsRC),
  453.                                                  FALSE);
  454.         
  455.         /* if we found something in our map just skip the rest of this */
  456.         if(netLibName && *netLibName) {
  457.             newName = XP_STRDUP(netLibName);
  458.             break;
  459.         }
  460.         /* whatever name we eventually end up with we will need to register it */
  461.         /*   before we leave the function */
  462.         bNeedToRegister = TRUE;
  463.         /* If we are on the default host see if there is a newsrc file in the */
  464.         /*   news directory.  If so, that is what we want */
  465.         if(!stricmp(name, g_MsgPrefs.m_csNewsHost)) {
  466.             csHostName = g_MsgPrefs.m_csNewsDir;
  467.             csHostName += "\newsrc";
  468.             if(_stat((const char *) csHostName, &sInfo) == 0) {
  469.                 newName = XP_STRDUP((const char *) csHostName);
  470.                 break;
  471.             }
  472.         }
  473.                         
  474.         /* See if we are going to be able to build a file name based  */
  475.         /*   on the hostname */
  476.         csHostName = g_MsgPrefs.m_csNewsDir;
  477.         csHostName += '\';
  478.         /* build up '<hostname>.rc' so we can tell how long its going to be */
  479.         /*   we will use that as the default name to try */
  480. if(type == xpSNewsRC)
  481. csHost += 's';
  482.         csHost += name;
  483.         /* if we have a news host news.foo.com we just want to use the "news" */
  484.         /*   part */
  485.         iDot = csHost.Find('.');
  486.         if(iDot != -1)
  487.             csHost = csHost.Left(iDot);
  488. #ifdef XP_WIN16
  489.         if(csHost.GetLength() > 8)
  490.             csHost = csHost.Left(8);
  491. #endif
  492. iColon = csHost.Find(':');
  493. if (iColon != -1) {
  494. /* Windows file system seems to do horrid things if you have */
  495. /* a filename with a colon in it. */
  496. csHost = csHost.Left(iColon);
  497. }
  498.         csHost += ".rc";
  499.         /* csHost is now of the form <hostname>.rc and is in 8.3 format */
  500.         /*   if we are on a Win16 box */
  501.         csHostName += csHost;
  502.         /* looks like a file with that name already exists -- panic */
  503.         if(_stat((const char *) csHostName, &sInfo) != -1) {
  504.             
  505.             char host[5];
  506.             /* else generate a new file in news directory */
  507.             strncpy(host, name, 4);
  508.             host[4] = '';
  509.             newName = WH_TempFileName(type, host, ".rc");
  510.             if(!newName)
  511.                 return(NULL);
  512.         } else {
  513.             newName = XP_STRDUP((const char *) csHostName);
  514.         }
  515.   break;
  516.     case xpNewsrcFileMap:
  517.         /* return name of FAT file in news directory */
  518. newName = (char *) XP_ALLOC(_MAX_PATH);
  519. sprintf(newName, "%s\fat", (const char *)g_MsgPrefs.m_csNewsDir);
  520. break;
  521.     case xpNewsgroups:
  522.     case xpSNewsgroups:
  523.         /* look up in netlib */
  524.         if ( !name || !strlen(name) )
  525.             name = g_MsgPrefs.m_csNewsHost;
  526.         netLibName = NET_MapNewsrcHostToFilename((char *)name, 
  527.                                                  (type == xpSNewsgroups),
  528.                                                  TRUE);
  529.         if(!netLibName) {
  530.             csHostName = g_MsgPrefs.m_csNewsDir;
  531.             csHostName += '\';
  532.     if(type == xpSNewsgroups)
  533.     csHost += 's';
  534.             csHost += name;
  535.             /* see if we can just use "<hostname>.rcg" */
  536.             /* it might be news.foo.com so just take "news" */
  537.             int iDot = csHost.Find('.');
  538.             if(iDot != -1)
  539.                 csHost = csHost.Left(iDot);
  540. #ifdef XP_WIN16
  541.             if(csHost.GetLength() > 8)
  542.                 csHost = csHost.Left(8);
  543. #endif
  544.     iColon = csHost.Find(':');
  545.     if (iColon != -1) {
  546.     /* Windows file system seems to do horrid things if you have */
  547.     /* a filename with a colon in it. */
  548.     csHost = csHost.Left(iColon);
  549.     }
  550.             csHost += ".rcg";
  551.             /* csHost is now of the form <hostname>.rcg */
  552.             csHostName += csHost;
  553.             /* looks like a file with that name already exists -- panic */
  554.             if(_stat((const char *) csHostName, &sInfo) != -1) {
  555.                 
  556.                 char host[5];
  557.                 /* else generate a new file in news directory */
  558.                 strncpy(host, name, 4);
  559.                 host[4] = '';
  560.                 newName = WH_TempFileName(type, host, ".rcg");
  561.                 if(!newName)
  562.                     return(NULL);
  563.             } else {
  564.                 newName = XP_STRDUP((const char *) csHostName);
  565.             }
  566.             if ( !name || !strlen(name))
  567.                 NET_RegisterNewsrcFile(newName,(char *)(const char *)g_MsgPrefs.m_csNewsHost,
  568.                     (type == xpSNewsgroups), TRUE );
  569.             else
  570.                 NET_RegisterNewsrcFile(newName,(char*)name,(type == xpSNewsgroups), TRUE );
  571.         } else {
  572.             newName = XP_STRDUP(netLibName);
  573.         }
  574.         break;
  575.     case xpMimeTypes:
  576. name = NULL;
  577. break;
  578. #endif /* MOZ_LITE       */
  579.     case xpGlobalHistory:
  580. newName = (char *) XP_ALLOC(_MAX_PATH);
  581. /* changed to support multi-profile */
  582. /*sprintf(newName, "%s\netscape.hst", theApp.m_pInstallDir->GetCharValue()); */
  583. sprintf(newName, "%s\netscape.hst", (const char *)theApp.m_UserDirectory);
  584. break;
  585.     case xpGlobalHistoryList:
  586.         newName = (char *) XP_ALLOC(_MAX_PATH);
  587.         sprintf( newName, "%s\ns_hstry.htm" );
  588.         break;
  589.     case xpKeyChain:
  590. name = NULL;
  591. break;
  592.       /* larubbio */
  593.     case xpSARCache:
  594.         if(!name) {
  595.             return NULL;
  596.         }
  597. newName = (char *) XP_ALLOC(_MAX_PATH);
  598. sprintf(newName, "%s\%s", theApp.m_pSARCacheDir, name);
  599. break;
  600.     case xpCache:
  601.         if(!name) {
  602.             tempName = WH_TempFileName(xpCache, NULL, NULL);
  603.     if (!tempName) return NULL;
  604.     name = tempName;
  605. }
  606.         newName = (char *) XP_ALLOC(_MAX_PATH);
  607.         if ((strchr(name,'|')  || strchr(name,':')))  { /* Local File URL if find a | */
  608.             if(name[0] == '/')
  609.              strcpy(newName,name+1); /* skip past extra slash */
  610.     else
  611. strcpy(newName,name); /* absolute path is valid */
  612.         } else {
  613.     sprintf(newName, "%s\%s", (const char *)theApp.m_pCacheDir, name);
  614. }
  615.         break;
  616.     case xpBookmarks:
  617.     case xpHotlist: 
  618. if (!name || !strlen(name)) 
  619.     name = theApp.m_pBookmarkFile;
  620. break;
  621. #endif /* CMD_STUB */
  622.     case xpSocksConfig:
  623. prefStr = NULL;
  624. #ifndef CMD_STUB
  625. PREF_CopyCharPref("browser.socksfile_location", &prefStr);
  626. #else
  627. ASSERT(0);
  628. #endif
  629. name = prefStr;
  630. break;
  631. #ifndef CMD_STUB
  632.     case xpCertDB:
  633.         newName = (char *) XP_ALLOC(_MAX_PATH);
  634.         if ( name ) {
  635.     sprintf(newName, "%s\cert%s.db", (const char *)theApp.m_UserDirectory, name);
  636.         } else {
  637.     sprintf(newName, "%s\cert.db", (const char *)theApp.m_UserDirectory);
  638.         }
  639. break;
  640.     case xpCertDBNameIDX:
  641.         newName = (char *) XP_ALLOC(_MAX_PATH);
  642. sprintf(newName, "%s\certni.db", (const char *)theApp.m_UserDirectory);
  643. break;
  644.     case xpKeyDB:
  645.         newName = (char *) XP_ALLOC(_MAX_PATH);
  646. if ( name ) {
  647.   sprintf(newName, "%s\key%s.db", (const char *)theApp.m_UserDirectory, name);
  648. } else {
  649.   sprintf(newName, "%s\key.db", (const char *)theApp.m_UserDirectory);
  650. }
  651. break;
  652.     case xpSecModuleDB:
  653.         newName = (char *) XP_ALLOC(_MAX_PATH);
  654. sprintf(newName, "%s\secmod.db", (const char *)theApp.m_UserDirectory);
  655. break;
  656.     case xpSignedAppletDB:
  657.         newName = (char *) XP_ALLOC(_MAX_PATH);
  658. if ( name ) {
  659.   sprintf(newName, "%s\signed%s.db", (const char *)theApp.m_UserDirectory, name);
  660. } else {
  661.   sprintf(newName, "%s\signed.db", (const char *)theApp.m_UserDirectory);
  662. }
  663. break;
  664. #ifndef MOZ_LITE      
  665.     case xpAddrBook:
  666. #ifdef XP_WIN16
  667. if(!name || !strlen(name) )
  668.     newName = WH_TempName(type, NULL);
  669. #else
  670. newName = (char *) XP_ALLOC(_MAX_PATH);
  671. strcpy(newName, name);
  672. /* strip off the extension */
  673. {
  674. char * pEnd = max(strrchr(newName, '\'), strrchr(newName, '/'));
  675. if(!pEnd)
  676.     pEnd = newName;
  677. pEnd = strchr(pEnd, '.');
  678. if(pEnd)
  679.     *pEnd = '';
  680. }
  681. strcat(newName, ".nab");
  682. #endif
  683.         break;
  684.     case xpAddrBookNew:
  685. newName = (char *) XP_ALLOC(_MAX_PATH);
  686. sprintf(newName, "%s\%s", (const char *)theApp.m_UserDirectory, name);
  687. break;
  688.     case xpVCardFile:
  689. newName = (char *) XP_ALLOC(_MAX_PATH);
  690. strcpy(newName, name);
  691. /* strip off the extension */
  692. {
  693. char * pEnd = max(strrchr(newName, '\'), strrchr(newName, '/'));
  694. if(!pEnd)
  695.     pEnd = newName;
  696. pEnd = strchr(pEnd, '.');
  697. if(pEnd)
  698.     *pEnd = '';
  699. }
  700. strcat(newName, ".vcf");
  701.         break;
  702.     case xpLDIFFile:
  703. newName = (char *) XP_ALLOC(_MAX_PATH);
  704. strcpy(newName, name);
  705. /* strip off the extension */
  706. {
  707. char * pEnd = max(strrchr(newName, '\'), strrchr(newName, '/'));
  708. if(!pEnd)
  709.     pEnd = newName;
  710. pEnd = strchr(pEnd, '.');
  711. if(pEnd)
  712.     *pEnd = '';
  713. }
  714. #ifdef XP_WIN16
  715. strcat(newName, ".ldi");
  716. #else
  717. strcat(newName, ".ldif");
  718. #endif
  719.         break;
  720.     case xpTemporaryNewsRC:
  721.         {
  722.             CString csHostName = g_MsgPrefs.m_csNewsDir;
  723.             csHostName += "\news.tmp";
  724.             newName = XP_STRDUP((const char *) csHostName);
  725.         }
  726.         break;
  727. #endif /* MOZ_LITE         */
  728.     case xpPKCS12File:
  729. newName = (char *) XP_ALLOC(_MAX_PATH);
  730. strcpy(newName, name);
  731. /* strip off the extension */
  732. {
  733. char * pEnd = max(strrchr(newName, '\'), strrchr(newName, '/'));
  734. if(!pEnd)
  735.     pEnd = newName;
  736. pEnd = strchr(pEnd, '.');
  737. if(pEnd)
  738.     *pEnd = '';
  739. }
  740. strcat(newName, ".p12");
  741. break;
  742.     case xpTemporary:
  743.         if(!name || !strlen(name) )
  744.             newName = WH_TempName(type, NULL);
  745.         break;
  746. #ifndef MOZ_LITE        
  747.     case xpMailFolder:
  748. if(!name)
  749.     name = g_MsgPrefs.m_csMailDir;
  750.         break;
  751.     case xpMailFolderSummary:
  752. newName = (char *) XP_ALLOC(_MAX_PATH);
  753. strcpy(newName, name);
  754. /* strip off the extension */
  755. {
  756. char * pEnd = max(strrchr(newName, '\'), strrchr(newName, '/'));
  757. if(!pEnd)
  758.     pEnd = newName;
  759. #ifdef XP_WIN16 /* backend won't allow '.' in win16 folder names, but just to be safe. */
  760. pEnd = strchr(pEnd, '.');
  761. if(pEnd)
  762.     *pEnd = '';
  763. #endif
  764. }
  765. strcat(newName, ".snm");
  766. break;
  767.     case xpMailSort:
  768.         newName = (char *) XP_ALLOC(_MAX_PATH);
  769.         sprintf(newName, "%s\rules.dat", (const char *)g_MsgPrefs.m_csMailDir);
  770. break;
  771.     case xpMailFilterLog:
  772. newName = (char *) XP_ALLOC(_MAX_PATH);
  773. sprintf(newName, "%s\mailfilt.log", (const char *)g_MsgPrefs.m_csMailDir);
  774. break;
  775.     case xpNewsFilterLog:
  776. newName = (char *) XP_ALLOC(_MAX_PATH);
  777. sprintf(newName, "%s\newsfilt.log", (const char *)g_MsgPrefs.m_csNewsDir);
  778. break;
  779.     case xpMailPopState:
  780.         newName = (char *) XP_ALLOC(_MAX_PATH);
  781.         sprintf(newName, "%s\popstate.dat", (const char *)g_MsgPrefs.m_csMailDir);
  782. break;
  783.     case xpMailSubdirectory:
  784. newName = (char *) XP_ALLOC(_MAX_PATH);
  785. strcpy(newName, name);
  786. /* strip off the trailing slash if any */
  787. {
  788. char * pEnd = max(strrchr(newName, '\'), strrchr(newName, '/'));
  789. if(!pEnd)
  790.     pEnd = newName;
  791. }
  792. strcat(newName, ".sbd");
  793. break;
  794. #endif /* MOZ_LITE       */
  795.     /* name of global cross-platform registry */
  796.     case xpRegistry:
  797.         /* eventually need to support arbitrary names; this is the default */
  798.         newName = (char *) XP_ALLOC(_MAX_PATH);
  799.         if ( newName != NULL ) {
  800.             GetWindowsDirectory(newName, _MAX_PATH);
  801.             int namelen = strlen(newName);
  802.             if ( newName[namelen-1] == '\' )
  803.                 namelen--;
  804.             strcpy(newName+namelen, "\nsreg.dat");
  805.         }
  806.         break;
  807. /* name of news group database  */
  808. #ifndef MOZ_LITE   
  809.     case xpXoverCache:
  810. newName = (char *) XP_ALLOC(_MAX_PATH);
  811. sprintf(newName, "%s\%s", (const char *)g_MsgPrefs.m_csNewsDir, name);
  812. break;
  813. #endif /* MOZ_LITE */
  814.     case xpProxyConfig:
  815.         newName = (char *) XP_ALLOC(_MAX_PATH);
  816.         /*sprintf(newName, "%s\proxy.cfg", theApp.m_pInstallDir->GetCharValue()); */
  817. sprintf(newName, "%s\proxy.cfg", (const char *)theApp.m_UserDirectory);
  818. break;
  819.     /* add any cases where no modification is necessary here   */
  820.     /* The name is fine all by itself, no need to modify it  */
  821.     case xpFileToPost:
  822.     case xpExtCache:
  823.     case xpURL:
  824.         /* name is OK as it is */
  825. break;
  826. #ifndef MOZ_LITE      
  827.     case xpNewsHostDatabase:
  828. newName = (char *) XP_ALLOC(_MAX_PATH);
  829. sprintf(newName, "%s\news.db", (const char *)g_MsgPrefs.m_csNewsDir);
  830. break;
  831.     case xpImapRootDirectory:
  832. newName = PR_smprintf ("%s\ImapMail", (const char *)theApp.m_UserDirectory);
  833. break;
  834.     case xpImapServerDirectory:
  835. {
  836. int len = 0;
  837. char *tempImapServerDir = XP_STRDUP(name);
  838. char *imapServerDir = tempImapServerDir;
  839. #ifdef XP_WIN16
  840. if ((len = XP_STRLEN(imapServerDir)) > 8) {
  841.     imapServerDir = imapServerDir + len - 8;
  842. }
  843. #endif
  844. newName = PR_smprintf ("%s\ImapMail\%s", (const char *)theApp.m_UserDirectory, imapServerDir);
  845. if (tempImapServerDir) XP_FREE(tempImapServerDir);
  846. }
  847. break;
  848.     case xpJSMailFilters:
  849. newName = PR_smprintf("%s\filters.js", (const char *)g_MsgPrefs.m_csMailDir);
  850. break;
  851. #endif /* MOZ_LITE */
  852.     case xpFolderCache:
  853. newName = PR_smprintf ("%s\summary.dat", (const char *)theApp.m_UserDirectory);
  854. break;
  855.     case xpCryptoPolicy:
  856. newName = (char *) XP_ALLOC(_MAX_PATH);
  857. FE_GetProgramDirectory(newName, _MAX_PATH);
  858. strcat(newName, "moz40p3");
  859. break;
  860. #endif /* CMD_STUB */
  861.     default:
  862. ASSERT(0);  /* all types should be covered */
  863.         break;
  864.     }
  865. #ifndef MOZ_LITE    
  866.     /* make sure we have the correct newsrc file registered for next time */
  867. if((type == xpSNewsRC || type == xpNewsRC) && bNeedToRegister)
  868.         NET_RegisterNewsrcFile(newName, (char *)name, (type == xpSNewsRC), FALSE );
  869. #endif
  870.     /* determine what file we are supposed to load and make sure it looks */
  871.     /*   like a DOS pathname and not some unix-like name */
  872.     if(newName) {
  873. *myName = XP_NetToDosFileName((const char*)newName);
  874. XP_FREE(newName); 
  875.     } else {
  876. *myName = XP_NetToDosFileName((const char*)name);
  877.     }
  878.     if (tempName) XP_FREE(tempName);
  879.     if (prefStr) XP_FREE(prefStr);        
  880.     /* whee, we're done */
  881.     return(*myName);
  882. }
  883. /* */
  884. /* Open a file with the given name */
  885. /* If a special file type is provided we might need to get the name */
  886. /*  out of the preferences list */
  887. /* */
  888. PUBLIC XP_File 
  889. XP_FileOpen(const char * name, XP_FileType type, const XP_FilePerm perm)
  890. {
  891.     XP_File fp;
  892.     char *filename = WH_FileName(name, type);
  893.     if(!filename)
  894. return(NULL);
  895. #ifdef DEBUG_nobody
  896.     TRACE("Opening a file type (%d) permissions: %s (%s)n", type, perm, filename);
  897. #endif
  898. #ifdef XP_WIN32
  899.     if (type == xpURL) {
  900. HANDLE hFile;
  901. DWORD dwType;
  902. /* Check if we're trying to open a device. We don't allow this */
  903. hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
  904. OPEN_EXISTING, 0, NULL);
  905. if (hFile != INVALID_HANDLE_VALUE) {
  906.     dwType = GetFileType(hFile);
  907.     CloseHandle(hFile);
  908.     if (dwType != FILE_TYPE_DISK) {
  909. XP_FREE(filename);
  910. return NULL;
  911.     }
  912. }
  913.     }
  914. #endif
  915. #ifdef XP_WIN16
  916.     /* Windows uses ANSI codepage, DOS uses OEM codepage,  */
  917.     /* fopen takes OEM codepage */
  918.     /* That's why we need to do conversion here. */
  919.     CString oembuff = filename;
  920.     oembuff.AnsiToOem();
  921.     fp = fopen(oembuff, (char *) perm);
  922.     if (fp && type == xpURL) {
  923. union _REGS inregs, outregs;
  924. /* Check if we opened a device. Execute an Interrupt 21h to invoke */
  925. /* MS-DOS system call 44h */
  926. inregs.x.ax = 0x4400;  /* MS-DOS function to get device information */
  927. inregs.x.bx = _fileno(fp);
  928. _int86(0x21, &inregs, &outregs);
  929. if (outregs.x.dx & 0x80) {
  930.     /* It's a device. Don't allow any reading/writing */
  931.     fclose(fp);
  932.     XP_FREE(filename);
  933.     return NULL;
  934. }
  935.     }
  936. #else
  937.     fp = fopen(filename, (char *) perm);
  938. #endif
  939.     XP_FREE(filename);
  940.     return(fp);
  941. }
  942. /******************************************************************************/
  943. /* Thread-safe entry points: */
  944. extern PRMonitor* _pr_TempName_lock;
  945. #ifndef CMD_STUB
  946. char *
  947. WH_TempName(XP_FileType type, const char * prefix)
  948. {
  949.     static char buf[_MAX_PATH]; /* protected by _pr_TempName_lock */
  950.     char* result;
  951.     if (_pr_TempName_lock == NULL)
  952. _pr_TempName_lock = PR_NewNamedMonitor("TempName-lock");
  953.     PR_EnterMonitor(_pr_TempName_lock);
  954.     result = XP_STRDUP(xp_TempFileName(type, prefix, NULL, buf));
  955.     PR_ExitMonitor(_pr_TempName_lock);
  956.     return result;
  957. }
  958. #endif /* CMD_STUB */
  959. PUBLIC char *
  960. WH_FileName (const char *name, XP_FileType type)
  961. {
  962.     char* myName;
  963.     char* result;
  964.     /*
  965.     ** I'm not sure this lock is really needed by windows, but just
  966.     ** to be safe:
  967.     */
  968.     /* XP_ASSERT(_pr_TempName_lock); */
  969.     /* PR_EnterMonitor(_pr_TempName_lock); */
  970.     result = xp_FileName(name, type, &myName);
  971.     /* PR_ExitMonitor(_pr_TempName_lock); */
  972.     return myName;
  973. }
  974. #endif /* XP_WIN */