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

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. #include "ctrlconn.h"
  34. #include "serv.h"
  35. #ifdef WIN32
  36. #include <windows.h>
  37. #include <winreg.h>
  38. #endif
  39. #ifdef WIN32
  40. /* local prototypes */
  41. char* SSM_PREF_WinRegQueryCharValueEx(HKEY key, const char* subKey);
  42. char* SSM_PROF_WinGetNetworkProfileDir(void);
  43. char* SSM_PROF_WinGetProfileDirFromName(const char* profName);
  44. char* SSM_PROF_WinGetDefaultProfileDB(void);
  45. #endif
  46. char* SSM_PROF_GetProfileDirectory(SSMControlConnection* conn)
  47. {
  48.     char* path = NULL;
  49.     PRFileInfo info;
  50. #ifdef WIN32
  51.     char* profDB = NULL;
  52. #endif
  53.     if (conn == NULL) {
  54. goto loser;
  55.     }
  56. #if defined(XP_UNIX)
  57.     path = PR_smprintf("%s/.netscape", PR_GetEnv("HOME"));
  58.     if (path == NULL) {
  59. goto loser;
  60.     }
  61. #elif defined(WIN32)
  62.     /* Folks tell me that the correct way to get it is through the Netscape
  63.      * registry, not the Windows registry, but I can't confirm that story.
  64.      * I will keep investigating.
  65.      * Furthermore, if we complete migration and once Cartman owns its own
  66.      * registry space, we will not have to worry about locating the profile
  67.      * directory this way.
  68.      */
  69. #if 0    /* XXX for now we only get the default directory */
  70.     /* check network installations */
  71.     path = SSM_PROF_WinGetNetworkProfileDir();
  72.     if (path != NULL) {
  73. goto check;
  74.     }
  75.     /* next, try to get it directly from the user registry */
  76.     path = SSM_PROF_WinGetProfileDirFromName(conn->m_profileName);
  77.     if (path != NULL) {
  78. goto check;
  79.     }
  80. #endif
  81.     /* couldn't find the profile; look for the default */
  82.     profDB = SSM_PROF_WinGetDefaultProfileDB();
  83.     if (profDB == NULL) {
  84. goto loser;
  85.     }
  86.     /* get the profile directory */
  87.     path = PR_smprintf("%s\%s", profDB, conn->m_profileName);
  88.     if ((PR_GetFileInfo(path, &info) != PR_SUCCESS) ||
  89. (info.type != PR_FILE_DIRECTORY)) {
  90. /* couldn't find it there either; try to guess it */
  91. SSM_DEBUG("Cannot find a profile in %s.  Trying again...n", path);
  92. PR_Free(path);
  93. path = PR_smprintf("C:\Program Files\Netscape\Users\%s",
  94.    conn->m_profileName);
  95. if (path == NULL) {
  96.     goto loser;
  97. }
  98.     }
  99.     else {
  100. goto done;
  101.     }
  102. #endif
  103.     /* check whether the directory exists */
  104.     if ((PR_GetFileInfo(path, &info) != PR_SUCCESS) || 
  105. (info.type != PR_FILE_DIRECTORY)) {
  106. SSM_DEBUG("Can't find a profile in %s.n", path);
  107. goto loser;
  108.     }
  109.     /* success */
  110.     SSM_DEBUG("The directory is %s.n", path);
  111.     goto done;
  112. loser:
  113.     if (path != NULL) {
  114. PR_Free(path);
  115. path = NULL;
  116.     }
  117. done:
  118. #ifdef WIN32
  119.     if (profDB != NULL) {
  120. PR_Free(profDB);
  121.     }
  122. #endif
  123.     return path;
  124. }
  125. #ifdef WIN32
  126. /* Function: char* SSM_PROF_WinGetNetworkProfileDir(void)
  127.  * Purpose: returns the profile directory from Windows registry in case of
  128.  *          network installation
  129.  * Arguments and return values:
  130.  * - returns: profile directory; NULL otherwise
  131.  *
  132.  * Note: this is still Nova-specific.  Seamonkey does not support network
  133.  *       installations?
  134.  * Key: "HKEY_CURRENT_USERSOFTWARENetscapeNetscape NavigatorUserInfo
  135.  *       DirRoot"
  136.  */
  137. char* SSM_PROF_WinGetNetworkProfileDir(void)
  138. {
  139.     char* subKey = "SOFTWARE\Netscape\Netscape Navigator\UserInfo";
  140.     LONG rv;
  141.     char* ret = NULL;
  142.     HKEY keyRet = NULL;
  143.     rv = RegOpenKeyEx(HKEY_CURRENT_USER, subKey, (DWORD)0, KEY_QUERY_VALUE,
  144.       &keyRet);
  145.     if (rv != ERROR_SUCCESS) {
  146. return ret;
  147.     }
  148.     ret = SSM_PREF_WinRegQueryCharValueEx(keyRet, "DirRoot");
  149.     if (ret == NULL) {
  150. goto loser;
  151.     }
  152.     /* success */
  153.     goto done;
  154. loser:
  155.     if (ret != NULL) {
  156. PR_Free(ret);
  157. ret = NULL;
  158.     }
  159. done:
  160.     if (keyRet != NULL) {
  161. RegCloseKey(keyRet);
  162.     }
  163.     return ret;
  164. }
  165. /* Function: char* SSM_PROF_WinGetProfileDirFromName()
  166.  * Purpose: returns the profile directory that belongs to the profile from
  167.  *          the registry
  168.  * Arguments and return values:
  169.  * - profName: profile name
  170.  * - returns: profile directory; NULL if failure
  171.  *
  172.  * Note: this is still Nova-specific.  A lot has to be ifdef'd when Seamonkey
  173.  *       comes online.
  174.  * key: "HKEY_LOCAL_MACHINESOFTWARENetscapeNetscape NavigatorUsers(name)
  175.  *       DirRoot"
  176.  */
  177. char* SSM_PROF_WinGetProfileDirFromName(const char* profName)
  178. {
  179.     char* subKey = NULL;
  180.     LONG rv;
  181.     char* ret = NULL;
  182.     HKEY keyRet = NULL;
  183.     PR_ASSERT(profName != NULL);
  184.     subKey = PR_smprintf("SOFTWARE\Netscape\Netscape Navigator\Users\%s",
  185.  profName);
  186.     if (subKey == NULL) {
  187. return ret;
  188.     }
  189.     /* open the user's registry key */
  190.     rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, (DWORD)0, KEY_QUERY_VALUE,
  191.       &keyRet);
  192.     if (rv != ERROR_SUCCESS) {
  193. goto loser;
  194.     }
  195.     /* get the string */
  196.     ret = SSM_PREF_WinRegQueryCharValueEx(keyRet, "DirRoot");
  197.     if (ret == NULL) {
  198. goto loser;
  199.     }
  200.     
  201.     /* success */
  202.     goto done;
  203. loser:
  204.     if (ret != NULL) {
  205. PR_Free(ret);
  206. ret = NULL;
  207.     }
  208. done:
  209.     if (keyRet != NULL) {
  210. RegCloseKey(keyRet);
  211.     }
  212.     return ret;
  213. }
  214. void ssm_prof_cut_idstring(char** idString)
  215. {
  216.     char* marker = NULL;
  217.     char* subString = NULL;
  218.     PRUint32 fullLength;
  219.     int subSize;
  220.     PR_ASSERT(*idString != NULL);
  221.     fullLength = strlen(*idString);
  222.     /* traverse backward to find the last backslash */
  223.     marker = strrchr(*idString, '\');
  224.     if (marker == NULL) {
  225. /* no backslash?  strange but return */
  226. return;
  227.     }
  228.     /* found the backslash */
  229.     subSize = marker - *idString;
  230.     subString = (char*)PR_Calloc(fullLength-subSize+1, sizeof(char));
  231.     if (subString == NULL) {
  232. goto loser;
  233.     }
  234.     memcpy(subString, marker, fullLength-subSize);
  235.     if (_stricmp(subString, "Communicator") == 0 ||
  236. _stricmp(subString, "Commun~1") == 0) {
  237. /* "Communicator" is at the end of the installation directory path.
  238.  * Take it out.
  239.  */
  240. char* newID = NULL;
  241. newID = (char*)PR_Calloc(subSize+1, sizeof(char));
  242. if (newID != NULL) {
  243.     memcpy(newID, *idString, subSize);
  244.     PR_Free(*idString);
  245.     *idString = PL_strdup(newID);
  246.     PR_Free(newID);
  247. }
  248.     }
  249. loser:
  250.     return;
  251. }
  252. /* Function: char* SSM_PROF_WinGetDefaultProfileDB()
  253.  * Purpose: tries to deduce the default profile db of the current version of 
  254.  *          Communicator
  255.  * Arguments and return values:
  256.  * - returns: newly allocated profile db string; NULL if failure
  257.  *
  258.  * Note: This is Nova-specific.  Now, this function is being used to supply
  259.  *       the "default" profile directory for 3rd party applications.
  260.  * Key: "HKEY_LOCAL_MACHINESOFTWARENetscapeNetscape Navigator(current
  261.  *       version)MainInstall Directory"
  262.  */
  263. char* SSM_PROF_WinGetDefaultProfileDB(void)
  264. {
  265.     char* subKey = "SOFTWARE\Netscape\Netscape Navigator";
  266.     LONG rv;
  267.     char* ret = NULL;
  268.     HKEY keyRet = NULL;
  269.     char* cvString = NULL;
  270.     char* idKey = NULL;
  271.     char* idString = NULL;
  272.     /* open the program registry */
  273.     rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, (DWORD)0, KEY_QUERY_VALUE,
  274.       &keyRet);
  275.     if (rv != ERROR_SUCCESS) {
  276. return ret;
  277.     }
  278.     /* get the current version info first */
  279.     cvString = SSM_PREF_WinRegQueryCharValueEx(keyRet, "currentVersion");
  280.     if (cvString == NULL) {
  281. goto loser;
  282.     }
  283.     /* now, get the actual default install directory for the current version */
  284.     idKey = PR_smprintf("%s\%s\Main", subKey, cvString);
  285.     if (idKey == NULL) {
  286. goto loser;
  287.     }
  288.     /* open a new key for the install directory */
  289.     RegCloseKey(keyRet);
  290.     rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, idKey, (DWORD)0, KEY_QUERY_VALUE,
  291.       &keyRet);
  292.     if (rv != ERROR_SUCCESS) {
  293. return ret;
  294.     }
  295.     idString = SSM_PREF_WinRegQueryCharValueEx(keyRet, "Install Directory");
  296.     if (idString == NULL) {
  297. goto loser;
  298.     }
  299.     /* wait, we would like to remove "Communicator" at the end of the
  300.      * installation path to get the profiles directory correctly
  301.      */
  302.     ssm_prof_cut_idstring(&idString);
  303.     if (idString == NULL) {
  304. goto loser;
  305.     }
  306.     /* append the user name */
  307.     ret = PR_smprintf("%s\Users", idString);
  308.     if (ret == NULL) {
  309. goto loser;
  310.     }
  311.     goto done;
  312. loser:
  313.     if (ret != NULL) {
  314. PR_Free(ret);
  315. ret = NULL;
  316.     }
  317. done:
  318.     if (cvString != NULL) {
  319. PR_Free(cvString);
  320.     }
  321.     if (idKey != NULL) {
  322. PR_Free(idKey);
  323.     }
  324.     if (idString != NULL) {
  325. PR_Free(idString);
  326.     }
  327.     if (keyRet != NULL) {
  328. RegCloseKey(keyRet);
  329.     }
  330.     return ret;
  331. }
  332. /* allocates memory for and retrieves string data from the Windows registry
  333.  * (wrapper for RegQueryValueEx())
  334.  * this should be incorporated in the prefs headers later
  335.  * Warning: key should have been already opened with RegOpenKeyEx()!
  336.  */
  337. char* SSM_PREF_WinRegQueryCharValueEx(HKEY key, const char* subKey)
  338. {
  339.     LONG rv;
  340.     DWORD type;
  341.     DWORD size = 0;
  342.     char* data = NULL;
  343.     PR_ASSERT(key != NULL && subKey != NULL);
  344.     /* size the string */
  345.     rv = RegQueryValueEx(key, (LPTSTR)subKey, NULL, &type, NULL, &size);
  346.     if (rv != ERROR_SUCCESS || size == 0) {
  347. goto loser;
  348.     }
  349.     data = (char*)PR_Malloc(size);
  350.     if (data == NULL) {
  351. goto loser;
  352.     }
  353.     rv = RegQueryValueEx(key, (LPTSTR)subKey, NULL, &type, (LPBYTE)data, 
  354.  &size);
  355.     if (rv != ERROR_SUCCESS || size == 0) {
  356. goto loser;
  357.     }
  358.     goto done;
  359. loser:
  360.     if (data != NULL) {
  361. PR_Free(data);
  362. data = NULL;
  363.     }
  364. done:
  365.     return data;
  366. }
  367. #endif