nsresult GetSpecialSystemDirectory(SystemDirectories aSystemSystemDirectory, nsIFile** aFile) { #if defined(XP_WIN) WCHAR path[MAX_PATH]; #else char path[MAXPATHLEN]; #endif switch (aSystemSystemDirectory) { case OS_CurrentWorkingDirectory: #if defined(XP_WIN) if (!_wgetcwd(path, MAX_PATH)) return NS_ERROR_FAILURE; return NS_NewLocalFile(nsDependentString(path), true, aFile); #elif defined(XP_OS2) if (DosQueryPathInfo( ".", FIL_QUERYFULLNAME, path, MAXPATHLEN)) return NS_ERROR_FAILURE; #else if(!getcwd(path, MAXPATHLEN)) return NS_ERROR_FAILURE; #endif #if !defined(XP_WIN) return NS_NewNativeLocalFile(nsDependentCString(path), true, aFile); #endif case OS_DriveDirectory: #if defined (XP_WIN) { PRInt32 len = ::GetWindowsDirectoryW(path, MAX_PATH); if (len == 0) break; if (path[1] == PRUnichar(':') && path[2] == PRUnichar('\\')) path[3] = 0; return NS_NewLocalFile(nsDependentString(path), true, aFile); } #elif defined(XP_OS2) { ULONG ulBootDrive = 0; char buffer[] = " :\\OS2\\"; DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive, sizeof ulBootDrive); buffer[0] = 'A' - 1 + ulBootDrive; // duh, 1-based index... return NS_NewNativeLocalFile(nsDependentCString(buffer), true, aFile); } #else return NS_NewNativeLocalFile(nsDependentCString("/"), true, aFile); #endif case OS_TemporaryDirectory: #if defined (XP_WIN) { DWORD len = ::GetTempPathW(MAX_PATH, path); if (len == 0) break; return NS_NewLocalFile(nsDependentString(path, len), true, aFile); } #elif defined(XP_OS2) { char *tPath = PR_GetEnv("TMP"); if (!tPath || !*tPath) { tPath = PR_GetEnv("TEMP"); if (!tPath || !*tPath) { // if an OS/2 system has neither TMP nor TEMP defined // then it is severely broken, so this will never happen. return NS_ERROR_UNEXPECTED; } } nsCString tString = nsDependentCString(tPath); if (tString.Find("/", false, 0, -1)) { tString.ReplaceChar('/','\\'); } return NS_NewNativeLocalFile(tString, true, aFile); } #elif defined(MOZ_WIDGET_COCOA) { return GetOSXFolderType(kUserDomain, kTemporaryFolderType, aFile); } #elif defined(XP_UNIX) { static const char *tPath = nullptr; if (!tPath) { tPath = PR_GetEnv("TMPDIR"); if (!tPath || !*tPath) { tPath = PR_GetEnv("TMP"); if (!tPath || !*tPath) { tPath = PR_GetEnv("TEMP"); if (!tPath || !*tPath) { tPath = "/tmp/"; } } } } return NS_NewNativeLocalFile(nsDependentCString(tPath), true, aFile); } #else break; #endif #if defined (XP_WIN) case Win_SystemDirectory: { PRInt32 len = ::GetSystemDirectoryW(path, MAX_PATH); // Need enough space to add the trailing backslash if (!len || len > MAX_PATH - 2) break; path[len] = L'\\'; path[++len] = L'\0'; return NS_NewLocalFile(nsDependentString(path, len), true, aFile); } case Win_WindowsDirectory: { PRInt32 len = ::GetWindowsDirectoryW(path, MAX_PATH); // Need enough space to add the trailing backslash if (!len || len > MAX_PATH - 2) break; path[len] = L'\\'; path[++len] = L'\0'; return NS_NewLocalFile(nsDependentString(path, len), true, aFile); } case Win_ProgramFiles: { return GetWindowsFolder(CSIDL_PROGRAM_FILES, aFile); } case Win_HomeDirectory: { nsresult rv = GetWindowsFolder(CSIDL_PROFILE, aFile); if (NS_SUCCEEDED(rv)) return rv; PRInt32 len; if ((len = ::GetEnvironmentVariableW(L"HOME", path, MAX_PATH)) > 0) { // Need enough space to add the trailing backslash if (len > MAX_PATH - 2) break; path[len] = L'\\'; path[++len] = L'\0'; rv = NS_NewLocalFile(nsDependentString(path, len), true, aFile); if (NS_SUCCEEDED(rv)) return rv; } len = ::GetEnvironmentVariableW(L"HOMEDRIVE", path, MAX_PATH); if (0 < len && len < MAX_PATH) { WCHAR temp[MAX_PATH]; DWORD len2 = ::GetEnvironmentVariableW(L"HOMEPATH", temp, MAX_PATH); if (0 < len2 && len + len2 < MAX_PATH) wcsncat(path, temp, len2); len = wcslen(path); // Need enough space to add the trailing backslash if (len > MAX_PATH - 2) break; path[len] = L'\\'; path[++len] = L'\0'; return NS_NewLocalFile(nsDependentString(path, len), true, aFile); } } case Win_Desktop: { return GetWindowsFolder(CSIDL_DESKTOP, aFile); } case Win_Programs: { return GetWindowsFolder(CSIDL_PROGRAMS, aFile); } case Win_Downloads: { // Defined in KnownFolders.h. GUID folderid_downloads = {0x374de290, 0x123f, 0x4565, {0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b}}; nsresult rv = GetKnownFolder(&folderid_downloads, aFile); // On WinXP, there is no downloads folder, default // to 'Desktop'. if(NS_ERROR_FAILURE == rv) { rv = GetWindowsFolder(CSIDL_DESKTOP, aFile); } return rv; } case Win_Controls: { return GetWindowsFolder(CSIDL_CONTROLS, aFile); } case Win_Printers: { return GetWindowsFolder(CSIDL_PRINTERS, aFile); } case Win_Personal: { return GetWindowsFolder(CSIDL_PERSONAL, aFile); } case Win_Favorites: { return GetWindowsFolder(CSIDL_FAVORITES, aFile); } case Win_Startup: { return GetWindowsFolder(CSIDL_STARTUP, aFile); } case Win_Recent: { return GetWindowsFolder(CSIDL_RECENT, aFile); } case Win_Sendto: { return GetWindowsFolder(CSIDL_SENDTO, aFile); } case Win_Bitbucket: { return GetWindowsFolder(CSIDL_BITBUCKET, aFile); } case Win_Startmenu: { return GetWindowsFolder(CSIDL_STARTMENU, aFile); } case Win_Desktopdirectory: { return GetWindowsFolder(CSIDL_DESKTOPDIRECTORY, aFile); } case Win_Drives: { return GetWindowsFolder(CSIDL_DRIVES, aFile); } case Win_Network: { return GetWindowsFolder(CSIDL_NETWORK, aFile); } case Win_Nethood: { return GetWindowsFolder(CSIDL_NETHOOD, aFile); } case Win_Fonts: { return GetWindowsFolder(CSIDL_FONTS, aFile); } case Win_Templates: { return GetWindowsFolder(CSIDL_TEMPLATES, aFile); } case Win_Common_Startmenu: { return GetWindowsFolder(CSIDL_COMMON_STARTMENU, aFile); } case Win_Common_Programs: { return GetWindowsFolder(CSIDL_COMMON_PROGRAMS, aFile); } case Win_Common_Startup: { return GetWindowsFolder(CSIDL_COMMON_STARTUP, aFile); } case Win_Common_Desktopdirectory: { return GetWindowsFolder(CSIDL_COMMON_DESKTOPDIRECTORY, aFile); } case Win_Common_AppData: { return GetWindowsFolder(CSIDL_COMMON_APPDATA, aFile); } case Win_Printhood: { return GetWindowsFolder(CSIDL_PRINTHOOD, aFile); } case Win_Cookies: { return GetWindowsFolder(CSIDL_COOKIES, aFile); } case Win_Appdata: { nsresult rv = GetWindowsFolder(CSIDL_APPDATA, aFile); if (NS_FAILED(rv)) rv = GetRegWindowsAppDataFolder(false, aFile); return rv; } case Win_LocalAppdata: { nsresult rv = GetWindowsFolder(CSIDL_LOCAL_APPDATA, aFile); if (NS_FAILED(rv)) rv = GetRegWindowsAppDataFolder(true, aFile); return rv; } #endif // XP_WIN #if defined(XP_UNIX) case Unix_LocalDirectory: return NS_NewNativeLocalFile(nsDependentCString("/usr/local/netscape/"), true, aFile); case Unix_LibDirectory: return NS_NewNativeLocalFile(nsDependentCString("/usr/local/lib/netscape/"), true, aFile); case Unix_HomeDirectory: return GetUnixHomeDir(aFile); case Unix_XDG_Desktop: case Unix_XDG_Documents: case Unix_XDG_Download: case Unix_XDG_Music: case Unix_XDG_Pictures: case Unix_XDG_PublicShare: case Unix_XDG_Templates: case Unix_XDG_Videos: return GetUnixXDGUserDirectory(aSystemSystemDirectory, aFile); #endif #ifdef XP_OS2 case OS2_SystemDirectory: { ULONG ulBootDrive = 0; char buffer[] = " :\\OS2\\System\\"; DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive, sizeof ulBootDrive); buffer[0] = 'A' - 1 + ulBootDrive; // duh, 1-based index... return NS_NewNativeLocalFile(nsDependentCString(buffer), true, aFile); } case OS2_OS2Directory: { ULONG ulBootDrive = 0; char buffer[] = " :\\OS2\\"; DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive, sizeof ulBootDrive); buffer[0] = 'A' - 1 + ulBootDrive; // duh, 1-based index... return NS_NewNativeLocalFile(nsDependentCString(buffer), true, aFile); } case OS2_HomeDirectory: { nsresult rv; char *tPath = PR_GetEnv("MOZILLA_HOME"); char buffer[CCHMAXPATH]; /* If MOZILLA_HOME is not set, use GetCurrentProcessDirectory */ /* To ensure we get a long filename system */ if (!tPath || !*tPath) { PPIB ppib; PTIB ptib; DosGetInfoBlocks( &ptib, &ppib); DosQueryModuleName( ppib->pib_hmte, CCHMAXPATH, buffer); *strrchr( buffer, '\\') = '\0'; // XXX DBCS misery tPath = buffer; } rv = NS_NewNativeLocalFile(nsDependentCString(tPath), true, aFile); PrfWriteProfileString(HINI_USERPROFILE, "Mozilla", "Home", tPath); return rv; } case OS2_DesktopDirectory: { char szPath[CCHMAXPATH + 1]; BOOL fSuccess; fSuccess = WinQueryActiveDesktopPathname (szPath, sizeof(szPath)); if (!fSuccess) { // this could happen if we are running without the WPS, return // the Home directory instead return GetSpecialSystemDirectory(OS2_HomeDirectory, aFile); } int len = strlen (szPath); if (len > CCHMAXPATH -1) break; szPath[len] = '\\'; szPath[len + 1] = '\0'; return NS_NewNativeLocalFile(nsDependentCString(szPath), true, aFile); } #endif default: break; } return NS_ERROR_NOT_AVAILABLE; }
NS_IMETHODIMP nsDirectoryService::GetFile(const char *prop, bool *persistent, nsIFile **_retval) { nsCOMPtr<nsILocalFile> localFile; nsresult rv = NS_ERROR_FAILURE; *_retval = nsnull; *persistent = PR_TRUE; nsCOMPtr<nsIAtom> inAtom = do_GetAtom(prop); // check to see if it is one of our defaults if (inAtom == nsDirectoryService::sCurrentProcess || inAtom == nsDirectoryService::sOS_CurrentProcessDirectory ) { rv = GetCurrentProcessDirectory(getter_AddRefs(localFile)); } // Unless otherwise set, the core pieces of the GRE exist // in the current process directory. else if (inAtom == nsDirectoryService::sGRE_Directory) { rv = GetCurrentProcessDirectory(getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_DriveDirectory) { rv = GetSpecialSystemDirectory(OS_DriveDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_TemporaryDirectory) { rv = GetSpecialSystemDirectory(OS_TemporaryDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_CurrentProcessDirectory) { rv = GetSpecialSystemDirectory(OS_CurrentProcessDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_CurrentWorkingDirectory) { rv = GetSpecialSystemDirectory(OS_CurrentWorkingDirectory, getter_AddRefs(localFile)); } #if defined(MOZ_WIDGET_COCOA) else if (inAtom == nsDirectoryService::sDirectory) { rv = GetOSXFolderType(kClassicDomain, kSystemFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sTrashDirectory) { rv = GetOSXFolderType(kClassicDomain, kTrashFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sStartupDirectory) { rv = GetOSXFolderType(kClassicDomain, kStartupFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sShutdownDirectory) { rv = GetOSXFolderType(kClassicDomain, kShutdownFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sAppleMenuDirectory) { rv = GetOSXFolderType(kClassicDomain, kAppleMenuFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sControlPanelDirectory) { rv = GetOSXFolderType(kClassicDomain, kControlPanelFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sExtensionDirectory) { rv = GetOSXFolderType(kClassicDomain, kExtensionFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sFontsDirectory) { rv = GetOSXFolderType(kClassicDomain, kFontsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sPreferencesDirectory) { rv = GetOSXFolderType(kClassicDomain, kPreferencesFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sDocumentsDirectory) { rv = GetOSXFolderType(kClassicDomain, kDocumentsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sInternetSearchDirectory) { rv = GetOSXFolderType(kClassicDomain, kInternetSearchSitesFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sUserLibDirectory) { rv = GetOSXFolderType(kUserDomain, kDomainLibraryFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_HomeDirectory) { rv = GetOSXFolderType(kUserDomain, kDomainTopLevelFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sDefaultDownloadDirectory) { // 10.5 and later, we can use kDownloadsFolderType which is defined in // Folders.h as "down". However, in order to support 10.4 still, we // cannot use the named constant. We'll use it's value, and if it // fails, fall back to the desktop. #ifndef kDownloadsFolderType #define kDownloadsFolderType 'down' #endif rv = GetOSXFolderType(kUserDomain, kDownloadsFolderType, getter_AddRefs(localFile)); if (NS_FAILED(rv)) { rv = GetOSXFolderType(kUserDomain, kDesktopFolderType, getter_AddRefs(localFile)); } } else if (inAtom == nsDirectoryService::sUserDesktopDirectory || inAtom == nsDirectoryService::sOS_DesktopDirectory) { rv = GetOSXFolderType(kUserDomain, kDesktopFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sLocalDesktopDirectory) { rv = GetOSXFolderType(kLocalDomain, kDesktopFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sUserApplicationsDirectory) { rv = GetOSXFolderType(kUserDomain, kApplicationsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sLocalApplicationsDirectory) { rv = GetOSXFolderType(kLocalDomain, kApplicationsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sUserDocumentsDirectory) { rv = GetOSXFolderType(kUserDomain, kDocumentsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sLocalDocumentsDirectory) { rv = GetOSXFolderType(kLocalDomain, kDocumentsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sUserInternetPlugInDirectory) { rv = GetOSXFolderType(kUserDomain, kInternetPlugInFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sLocalInternetPlugInDirectory) { rv = GetOSXFolderType(kLocalDomain, kInternetPlugInFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sUserFrameworksDirectory) { rv = GetOSXFolderType(kUserDomain, kFrameworksFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sLocalFrameworksDirectory) { rv = GetOSXFolderType(kLocalDomain, kFrameworksFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sUserPreferencesDirectory) { rv = GetOSXFolderType(kUserDomain, kPreferencesFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sLocalPreferencesDirectory) { rv = GetOSXFolderType(kLocalDomain, kPreferencesFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sPictureDocumentsDirectory) { rv = GetOSXFolderType(kUserDomain, kPictureDocumentsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sMovieDocumentsDirectory) { rv = GetOSXFolderType(kUserDomain, kMovieDocumentsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sMusicDocumentsDirectory) { rv = GetOSXFolderType(kUserDomain, kMusicDocumentsFolderType, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sInternetSitesDirectory) { rv = GetOSXFolderType(kUserDomain, kInternetSitesFolderType, getter_AddRefs(localFile)); } #elif defined (XP_WIN) else if (inAtom == nsDirectoryService::sSystemDirectory) { rv = GetSpecialSystemDirectory(Win_SystemDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sWindowsDirectory) { rv = GetSpecialSystemDirectory(Win_WindowsDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sWindowsProgramFiles) { rv = GetSpecialSystemDirectory(Win_ProgramFiles, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_HomeDirectory) { rv = GetSpecialSystemDirectory(Win_HomeDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sDesktop) { rv = GetSpecialSystemDirectory(Win_Desktop, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sPrograms) { rv = GetSpecialSystemDirectory(Win_Programs, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sControls) { rv = GetSpecialSystemDirectory(Win_Controls, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sPrinters) { rv = GetSpecialSystemDirectory(Win_Printers, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sPersonal) { rv = GetSpecialSystemDirectory(Win_Personal, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sFavorites) { rv = GetSpecialSystemDirectory(Win_Favorites, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sStartup) { rv = GetSpecialSystemDirectory(Win_Startup, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sRecent) { rv = GetSpecialSystemDirectory(Win_Recent, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sSendto) { rv = GetSpecialSystemDirectory(Win_Sendto, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sBitbucket) { rv = GetSpecialSystemDirectory(Win_Bitbucket, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sStartmenu) { rv = GetSpecialSystemDirectory(Win_Startmenu, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sDesktopdirectory || inAtom == nsDirectoryService::sOS_DesktopDirectory) { rv = GetSpecialSystemDirectory(Win_Desktopdirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sDrives) { rv = GetSpecialSystemDirectory(Win_Drives, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sNetwork) { rv = GetSpecialSystemDirectory(Win_Network, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sNethood) { rv = GetSpecialSystemDirectory(Win_Nethood, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sFonts) { rv = GetSpecialSystemDirectory(Win_Fonts, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sTemplates) { rv = GetSpecialSystemDirectory(Win_Templates, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sCommon_Startmenu) { rv = GetSpecialSystemDirectory(Win_Common_Startmenu, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sCommon_Programs) { rv = GetSpecialSystemDirectory(Win_Common_Programs, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sCommon_Startup) { rv = GetSpecialSystemDirectory(Win_Common_Startup, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sCommon_Desktopdirectory) { rv = GetSpecialSystemDirectory(Win_Common_Desktopdirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sAppdata) { rv = GetSpecialSystemDirectory(Win_Appdata, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sLocalAppdata) { rv = GetSpecialSystemDirectory(Win_LocalAppdata, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sPrinthood) { rv = GetSpecialSystemDirectory(Win_Printhood, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sWinCookiesDirectory) { rv = GetSpecialSystemDirectory(Win_Cookies, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sDefaultDownloadDirectory) { rv = GetSpecialSystemDirectory(Win_Downloads, getter_AddRefs(localFile)); } #elif defined (XP_UNIX) else if (inAtom == nsDirectoryService::sLocalDirectory) { rv = GetSpecialSystemDirectory(Unix_LocalDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sLibDirectory) { rv = GetSpecialSystemDirectory(Unix_LibDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_HomeDirectory) { rv = GetSpecialSystemDirectory(Unix_HomeDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sXDGDesktop || inAtom == nsDirectoryService::sOS_DesktopDirectory) { rv = GetSpecialSystemDirectory(Unix_XDG_Desktop, getter_AddRefs(localFile)); *persistent = PR_FALSE; } else if (inAtom == nsDirectoryService::sXDGDocuments) { rv = GetSpecialSystemDirectory(Unix_XDG_Documents, getter_AddRefs(localFile)); *persistent = PR_FALSE; } else if (inAtom == nsDirectoryService::sXDGDownload || inAtom == nsDirectoryService::sDefaultDownloadDirectory) { rv = GetSpecialSystemDirectory(Unix_XDG_Download, getter_AddRefs(localFile)); *persistent = PR_FALSE; } else if (inAtom == nsDirectoryService::sXDGMusic) { rv = GetSpecialSystemDirectory(Unix_XDG_Music, getter_AddRefs(localFile)); *persistent = PR_FALSE; } else if (inAtom == nsDirectoryService::sXDGPictures) { rv = GetSpecialSystemDirectory(Unix_XDG_Pictures, getter_AddRefs(localFile)); *persistent = PR_FALSE; } else if (inAtom == nsDirectoryService::sXDGPublicShare) { rv = GetSpecialSystemDirectory(Unix_XDG_PublicShare, getter_AddRefs(localFile)); *persistent = PR_FALSE; } else if (inAtom == nsDirectoryService::sXDGTemplates) { rv = GetSpecialSystemDirectory(Unix_XDG_Templates, getter_AddRefs(localFile)); *persistent = PR_FALSE; } else if (inAtom == nsDirectoryService::sXDGVideos) { rv = GetSpecialSystemDirectory(Unix_XDG_Videos, getter_AddRefs(localFile)); *persistent = PR_FALSE; } #elif defined (XP_OS2) else if (inAtom == nsDirectoryService::sSystemDirectory) { rv = GetSpecialSystemDirectory(OS2_SystemDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS2Directory) { rv = GetSpecialSystemDirectory(OS2_OS2Directory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_HomeDirectory) { rv = GetSpecialSystemDirectory(OS2_HomeDirectory, getter_AddRefs(localFile)); } else if (inAtom == nsDirectoryService::sOS_DesktopDirectory) { rv = GetSpecialSystemDirectory(OS2_DesktopDirectory, getter_AddRefs(localFile)); } #endif if (NS_FAILED(rv)) return rv; if (!localFile) return NS_ERROR_FAILURE; return CallQueryInterface(localFile, _retval); }
SandboxBrokerPolicyFactory::SandboxBrokerPolicyFactory() { // Policy entries that are the same in every process go here, and // are cached over the lifetime of the factory. #if defined(MOZ_CONTENT_SANDBOX) && defined(MOZ_WIDGET_GONK) SandboxBroker::Policy* policy = new SandboxBroker::Policy; // Devices that need write access: policy->AddPath(rdwr, "/dev/genlock"); // bug 980924 policy->AddPath(rdwr, "/dev/ashmem"); // bug 980947 policy->AddTree(wronly, "/dev/log"); // bug 1199857 // Graphics devices are a significant source of attack surface, but // there's not much we can do about it without proxying (which is // very difficult and a perforamnce hit). policy->AddPrefix(rdwr, "/dev", "kgsl"); // bug 995072 policy->AddPath(rdwr, "/dev/qemu_pipe"); // but 1198410: goldfish gralloc. // Bug 1198475: mochitest logs. (This is actually passed in via URL // query param to the mochitest page, and is configurable, so this // isn't enough in general, but hopefully it's good enough for B2G.) // Conditional on tests being run, using the same check seen in // DirectoryProvider.js to set ProfD. if (access("/data/local/tests/profile", R_OK) == 0) { policy->AddPath(wrlog, "/data/local/tests/log/mochitest.log"); } // Read-only items below this line. policy->AddPath(rdonly, "/dev/urandom"); // bug 964500, bug 995069 policy->AddPath(rdonly, "/dev/ion"); // bug 980937 policy->AddPath(rdonly, "/proc/cpuinfo"); // bug 995067 policy->AddPath(rdonly, "/proc/meminfo"); // bug 1025333 policy->AddPath(rdonly, "/sys/devices/system/cpu/present"); // bug 1025329 policy->AddPath(rdonly, "/sys/devices/system/soc/soc0/id"); // bug 1025339 policy->AddPath(rdonly, "/etc/media_profiles.xml"); // bug 1198419 policy->AddPath(rdonly, "/etc/media_codecs.xml"); // bug 1198460 policy->AddTree(rdonly, "/system/fonts"); // bug 1026063 // Bug 1199051 (crossplatformly, this is NS_GRE_DIR). policy->AddTree(rdonly, "/system/b2g"); // Bug 1026356: dynamic library loading from assorted frameworks we // don't control (media codecs, maybe others). // // Bug 1198515: Also, the profiler calls breakpad code to get info // on all loaded ELF objects, which opens those files. policy->AddTree(rdonly, "/system/lib"); policy->AddTree(rdonly, "/vendor/lib"); policy->AddPath(rdonly, "/system/bin/linker"); // (profiler only) // Bug 1199866: EGL/WebGL. policy->AddPath(rdonly, "/system/lib/egl"); policy->AddPath(rdonly, "/vendor/lib/egl"); // Bug 1198401: timezones. Yes, we need both of these; see bug. policy->AddTree(rdonly, "/system/usr/share/zoneinfo"); policy->AddTree(rdonly, "/system//usr/share/zoneinfo"); policy->AddPath(rdonly, "/data/local/tmp/profiler.options", SandboxBroker::Policy::AddAlways); // bug 1029337 mCommonContentPolicy.reset(policy); #elif defined(MOZ_CONTENT_SANDBOX) SandboxBroker::Policy* policy = new SandboxBroker::Policy; policy->AddDir(rdonly, "/"); policy->AddDir(rdwrcr, "/dev/shm"); // Add write permissions on the temporary directory. This can come // from various environment variables (TMPDIR,TMP,TEMP,...) so // make sure to use the full logic. nsCOMPtr<nsIFile> tmpDir; nsresult rv = GetSpecialSystemDirectory(OS_TemporaryDirectory, getter_AddRefs(tmpDir)); if (NS_SUCCEEDED(rv)) { nsAutoCString tmpPath; rv = tmpDir->GetNativePath(tmpPath); if (NS_SUCCEEDED(rv)) { policy->AddDir(rdwrcr, tmpPath.get()); } } // If the above fails at any point, fall back to a very good guess. if (NS_FAILED(rv)) { policy->AddDir(rdwrcr, "/tmp"); } // Bug 1308851: NVIDIA proprietary driver when using WebGL policy->AddPrefix(rdwr, "/dev", "nvidia"); // Bug 1312678: radeonsi/Intel with DRI when using WebGL policy->AddDir(rdwr, "/dev/dri"); mCommonContentPolicy.reset(policy); #endif }