Pier Angelo Vendrame pushed to branch tor-browser-102.7.0esr-12.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
fbc46b57
by Pier Angelo Vendrame at 2023-02-08T12:22:33+01:00
-
8029d2b1
by Pier Angelo Vendrame at 2023-02-08T12:22:34+01:00
-
1dafa91c
by Pier Angelo Vendrame at 2023-02-08T12:22:34+01:00
-
4595d824
by Pier Angelo Vendrame at 2023-02-08T12:22:35+01:00
-
cb3d5136
by Pier Angelo Vendrame at 2023-02-08T12:22:36+01:00
-
7e272b9d
by Pier Angelo Vendrame at 2023-02-08T12:22:36+01:00
-
f210d8ca
by Pier Angelo Vendrame at 2023-02-08T12:22:37+01:00
8 changed files:
- mozconfig-macos-x86_64
- toolkit/xre/nsAppRunner.cpp
- toolkit/xre/nsXREDirProvider.cpp
- toolkit/xre/nsXREDirProvider.h
- − xpcom/io/TorFileUtils.cpp
- − xpcom/io/TorFileUtils.h
- xpcom/io/moz.build
- xpcom/io/nsAppFileLocationProvider.cpp
Changes:
... | ... | @@ -5,4 +5,5 @@ ac_add_options --enable-strip |
5 | 5 | # See bug #41131
|
6 | 6 | ac_add_options --disable-update-agent
|
7 | 7 | |
8 | +ac_add_options --with-relative-data-dir=../TorBrowser-Data/Browser
|
|
8 | 9 | ac_add_options --enable-tor-browser-data-outside-app-dir |
... | ... | @@ -3099,13 +3099,16 @@ static ReturnAbortOnError ShowProfileManager( |
3099 | 3099 | return LaunchChild(false, true);
|
3100 | 3100 | }
|
3101 | 3101 | |
3102 | -#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
|
|
3103 | -static ProfileStatus CheckTorBrowserDataWriteAccess(nsIFile* aAppDir) {
|
|
3102 | +#ifdef XP_MACOSX
|
|
3103 | +static ProfileStatus CheckTorBrowserDataWriteAccess() {
|
|
3104 | 3104 | // Check whether we can write to the directory that will contain
|
3105 | 3105 | // TorBrowser-Data.
|
3106 | + RefPtr<nsXREDirProvider> singleton = nsXREDirProvider::GetSingleton();
|
|
3107 | + if (!singleton) {
|
|
3108 | + return PROFILE_STATUS_OTHER_ERROR;
|
|
3109 | + }
|
|
3106 | 3110 | nsCOMPtr<nsIFile> tbDataDir;
|
3107 | - nsresult rv =
|
|
3108 | - nsXREDirProvider::GetTorBrowserUserDataDir(getter_AddRefs(tbDataDir));
|
|
3111 | + nsresult rv = singleton->GetTorBrowserUserDataDir(getter_AddRefs(tbDataDir));
|
|
3109 | 3112 | NS_ENSURE_SUCCESS(rv, PROFILE_STATUS_OTHER_ERROR);
|
3110 | 3113 | nsCOMPtr<nsIFile> tbDataDirParent;
|
3111 | 3114 | rv = tbDataDir->GetParent(getter_AddRefs(tbDataDirParent));
|
... | ... | @@ -5081,25 +5084,14 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) { |
5081 | 5084 | }
|
5082 | 5085 | #endif
|
5083 | 5086 | |
5084 | -#if (defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID)) || \
|
|
5085 | - defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
|
|
5086 | - nsCOMPtr<nsIFile> exeFile, exeDir;
|
|
5087 | - bool persistent;
|
|
5088 | - rv = mDirProvider.GetFile(XRE_EXECUTABLE_FILE, &persistent,
|
|
5089 | - getter_AddRefs(exeFile));
|
|
5090 | - NS_ENSURE_SUCCESS(rv, 1);
|
|
5091 | - rv = exeFile->GetParent(getter_AddRefs(exeDir));
|
|
5092 | - NS_ENSURE_SUCCESS(rv, 1);
|
|
5093 | -#endif
|
|
5094 | - |
|
5095 | 5087 | rv = NS_NewToolkitProfileService(getter_AddRefs(mProfileSvc));
|
5096 | -#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
|
|
5088 | +#ifdef XP_MACOSX
|
|
5097 | 5089 | if (NS_FAILED(rv)) {
|
5098 | 5090 | // NS_NewToolkitProfileService() returns a generic NS_ERROR_FAILURE error
|
5099 | 5091 | // if creation of the TorBrowser-Data directory fails due to access denied
|
5100 | 5092 | // or because of a read-only disk volume. Do an extra check here to detect
|
5101 | 5093 | // these errors so we can display an informative error message.
|
5102 | - ProfileStatus status = CheckTorBrowserDataWriteAccess(exeDir);
|
|
5094 | + ProfileStatus status = CheckTorBrowserDataWriteAccess();
|
|
5103 | 5095 | if ((PROFILE_STATUS_ACCESS_DENIED == status) ||
|
5104 | 5096 | (PROFILE_STATUS_READ_ONLY == status)) {
|
5105 | 5097 | ProfileErrorDialog(nullptr, nullptr, status, nullptr, mNativeApp,
|
... | ... | @@ -5216,14 +5208,12 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) { |
5216 | 5208 | if (CheckArg("test-process-updates")) {
|
5217 | 5209 | SaveToEnv("MOZ_TEST_PROCESS_UPDATES=1");
|
5218 | 5210 | }
|
5219 | -# ifndef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
|
|
5220 | 5211 | nsCOMPtr<nsIFile> exeFile, exeDir;
|
5221 | 5212 | rv = mDirProvider.GetFile(XRE_EXECUTABLE_FILE, &persistent,
|
5222 | 5213 | getter_AddRefs(exeFile));
|
5223 | 5214 | NS_ENSURE_SUCCESS(rv, 1);
|
5224 | 5215 | rv = exeFile->GetParent(getter_AddRefs(exeDir));
|
5225 | 5216 | NS_ENSURE_SUCCESS(rv, 1);
|
5226 | -# endif
|
|
5227 | 5217 | |
5228 | 5218 | # ifdef TOR_BROWSER_UPDATE
|
5229 | 5219 | nsAutoCString compatVersion(TOR_BROWSER_VERSION_QUOTED);
|
... | ... | @@ -56,8 +56,6 @@ |
56 | 56 | # include "nsIPK11Token.h"
|
57 | 57 | #endif
|
58 | 58 | |
59 | -#include "TorFileUtils.h"
|
|
60 | - |
|
61 | 59 | #include <stdlib.h>
|
62 | 60 | |
63 | 61 | #ifdef XP_WIN
|
... | ... | @@ -113,6 +111,10 @@ nsIFile* gDataDirHome = nullptr; |
113 | 111 | nsCOMPtr<nsIFile> gDataDirProfileLocal = nullptr;
|
114 | 112 | nsCOMPtr<nsIFile> gDataDirProfile = nullptr;
|
115 | 113 | |
114 | +#if defined(RELATIVE_DATA_DIR)
|
|
115 | +mozilla::Maybe<nsCOMPtr<nsIFile>> gDataDirPortable;
|
|
116 | +#endif
|
|
117 | + |
|
116 | 118 | // These are required to allow nsXREDirProvider to be usable in xpcshell tests.
|
117 | 119 | // where gAppData is null.
|
118 | 120 | #if defined(XP_MACOSX) || defined(XP_UNIX)
|
... | ... | @@ -1205,14 +1207,19 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult, |
1205 | 1207 | }
|
1206 | 1208 | #endif
|
1207 | 1209 | nsCOMPtr<nsIFile> updRoot;
|
1210 | + nsCOMPtr<nsIFile> appFile;
|
|
1211 | + bool per = false;
|
|
1212 | + nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &per, getter_AddRefs(appFile));
|
|
1213 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1214 | + |
|
1208 | 1215 | #if defined(TOR_BROWSER_UPDATE)
|
1209 | 1216 | // For Tor Browser, we store update history, etc. within the UpdateInfo
|
1210 | 1217 | // directory under the user data directory.
|
1211 | - nsresult rv = GetTorBrowserUserDataDir(getter_AddRefs(updRoot));
|
|
1218 | + rv = GetTorBrowserUserDataDir(getter_AddRefs(updRoot));
|
|
1212 | 1219 | NS_ENSURE_SUCCESS(rv, rv);
|
1213 | 1220 | rv = updRoot->AppendNative("UpdateInfo"_ns);
|
1214 | 1221 | NS_ENSURE_SUCCESS(rv, rv);
|
1215 | -# if defined(XP_MACOSX) && defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
|
|
1222 | +# if defined(XP_MACOSX)
|
|
1216 | 1223 | // Since the TorBrowser-Data directory may be shared among different
|
1217 | 1224 | // installations of the application, embed the app path in the update dir
|
1218 | 1225 | // so that the update history is partitioned. This is much less likely to
|
... | ... | @@ -1220,29 +1227,20 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult, |
1220 | 1227 | // those platforms include a "container" folder that provides partitioning
|
1221 | 1228 | // by default, and we do not support use of a shared, OS-recommended area
|
1222 | 1229 | // for user data on those platforms.
|
1223 | - nsAutoString appDirPath;
|
|
1224 | - nsCOMPtr<nsIFile> appRootDir;
|
|
1225 | - rv = GetAppRootDir(getter_AddRefs(appRootDir));
|
|
1230 | + nsAutoString appPath;
|
|
1231 | + rv = appFile->GetPath(appPath);
|
|
1226 | 1232 | NS_ENSURE_SUCCESS(rv, rv);
|
1227 | - rv = appRootDir->GetPath(appDirPath);
|
|
1228 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1229 | - |
|
1230 | - int32_t dotIndex = appDirPath.RFind(".app");
|
|
1233 | + int32_t dotIndex = appPath.RFind(".app");
|
|
1231 | 1234 | if (dotIndex == kNotFound) {
|
1232 | - dotIndex = appDirPath.Length();
|
|
1235 | + dotIndex = appPath.Length();
|
|
1233 | 1236 | }
|
1234 | - appDirPath = Substring(appDirPath, 1, dotIndex - 1);
|
|
1235 | - rv = updRoot->AppendRelativePath(appDirPath);
|
|
1237 | + appPath = Substring(appPath, 1, dotIndex - 1);
|
|
1238 | + rv = updRoot->AppendRelativePath(appPath);
|
|
1236 | 1239 | NS_ENSURE_SUCCESS(rv, rv);
|
1237 | 1240 | # endif
|
1238 | 1241 | #else // ! TOR_BROWSER_UPDATE
|
1239 | - nsCOMPtr<nsIFile> appFile;
|
|
1240 | - bool per = false;
|
|
1241 | - nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &per, getter_AddRefs(appFile));
|
|
1242 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1243 | 1242 | rv = appFile->GetParent(getter_AddRefs(updRoot));
|
1244 | 1243 | NS_ENSURE_SUCCESS(rv, rv);
|
1245 | - |
|
1246 | 1244 | # ifdef XP_MACOSX
|
1247 | 1245 | nsCOMPtr<nsIFile> appRootDirFile;
|
1248 | 1246 | nsCOMPtr<nsIFile> localDir;
|
... | ... | @@ -1360,6 +1358,91 @@ nsresult nsXREDirProvider::SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile, |
1360 | 1358 | return NS_OK;
|
1361 | 1359 | }
|
1362 | 1360 | |
1361 | +#if defined(RELATIVE_DATA_DIR)
|
|
1362 | +nsresult nsXREDirProvider::GetPortableDataDir(nsIFile** aFile,
|
|
1363 | + bool& aIsPortable) {
|
|
1364 | + if (gDataDirPortable) {
|
|
1365 | + if (*gDataDirPortable) {
|
|
1366 | + nsresult rv = (*gDataDirPortable)->Clone(aFile);
|
|
1367 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1368 | + aIsPortable = true;
|
|
1369 | + } else {
|
|
1370 | + aIsPortable = false;
|
|
1371 | + }
|
|
1372 | + return NS_OK;
|
|
1373 | + }
|
|
1374 | + |
|
1375 | + nsCOMPtr<nsIFile> exeFile, exeDir;
|
|
1376 | + bool persistent = false;
|
|
1377 | + nsresult rv =
|
|
1378 | + GetFile(XRE_EXECUTABLE_FILE, &persistent, getter_AddRefs(exeFile));
|
|
1379 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1380 | + rv = exeFile->Normalize();
|
|
1381 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1382 | + rv = exeFile->GetParent(getter_AddRefs(exeDir));
|
|
1383 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1384 | + |
|
1385 | +# if defined(XP_MACOSX)
|
|
1386 | + nsAutoString exeDirPath;
|
|
1387 | + rv = exeDir->GetPath(exeDirPath);
|
|
1388 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1389 | + // When the browser is installed in /Applications, we never run in portable
|
|
1390 | + // mode.
|
|
1391 | + if (exeDirPath.Find("/Applications/", true /* ignore case */) == 0) {
|
|
1392 | + aIsPortable = false;
|
|
1393 | + return NS_OK;
|
|
1394 | + }
|
|
1395 | +# endif
|
|
1396 | + |
|
1397 | + nsCOMPtr<nsIFile> systemInstallFile;
|
|
1398 | + rv = exeDir->Clone(getter_AddRefs(systemInstallFile));
|
|
1399 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1400 | + rv = systemInstallFile->AppendNative("system-install"_ns);
|
|
1401 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1402 | + |
|
1403 | + bool exists = false;
|
|
1404 | + rv = systemInstallFile->Exists(&exists);
|
|
1405 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1406 | + if (exists) {
|
|
1407 | + aIsPortable = false;
|
|
1408 | + gDataDirPortable.emplace(nullptr);
|
|
1409 | + return NS_OK;
|
|
1410 | + }
|
|
1411 | + |
|
1412 | + nsCOMPtr<nsIFile> localDir = exeDir;
|
|
1413 | +# if defined(XP_MACOSX)
|
|
1414 | + rv = exeDir->GetParent(getter_AddRefs(localDir));
|
|
1415 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1416 | + exeDir = localDir;
|
|
1417 | + rv = exeDir->GetParent(getter_AddRefs(localDir));
|
|
1418 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1419 | +# endif
|
|
1420 | + rv = localDir->SetRelativePath(localDir.get(),
|
|
1421 | + nsLiteralCString(RELATIVE_DATA_DIR));
|
|
1422 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1423 | + |
|
1424 | +# if defined(XP_MACOSX)
|
|
1425 | + // On macOS we try to create the directory immediately to switch to
|
|
1426 | + // system-install mode if needed (e.g., when running from the DMG).
|
|
1427 | + rv = localDir->Exists(&exists);
|
|
1428 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1429 | + if (!exists) {
|
|
1430 | + rv = localDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
|
|
1431 | + if (NS_FAILED(rv)) {
|
|
1432 | + aIsPortable = false;
|
|
1433 | + return NS_OK;
|
|
1434 | + }
|
|
1435 | + }
|
|
1436 | +# endif
|
|
1437 | + |
|
1438 | + gDataDirPortable.emplace(localDir);
|
|
1439 | + rv = (*gDataDirPortable)->Clone(aFile);
|
|
1440 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1441 | + aIsPortable = true;
|
|
1442 | + return rv;
|
|
1443 | +}
|
|
1444 | +#endif
|
|
1445 | + |
|
1363 | 1446 | nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
|
1364 | 1447 | bool aLocal) {
|
1365 | 1448 | // Copied from nsAppFileLocationProvider (more or less)
|
... | ... | @@ -1374,38 +1457,40 @@ nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile, |
1374 | 1457 | return gDataDirHome->Clone(aFile);
|
1375 | 1458 | }
|
1376 | 1459 | |
1377 | -#if defined(RELATIVE_DATA_DIR) || defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
|
|
1378 | -# ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
|
|
1379 | - rv = GetTorBrowserUserDataDir(getter_AddRefs(localDir));
|
|
1380 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1381 | - rv = localDir->AppendNative("Browser"_ns);
|
|
1382 | -# else
|
|
1460 | +#if defined(RELATIVE_DATA_DIR)
|
|
1383 | 1461 | RefPtr<nsXREDirProvider> singleton = GetSingleton();
|
1384 | 1462 | if (!singleton) {
|
1385 | 1463 | return NS_ERROR_OUT_OF_MEMORY;
|
1386 | 1464 | }
|
1387 | - rv = singleton->GetAppRootDir(getter_AddRefs(localDir));
|
|
1465 | + bool isPortable = false;
|
|
1466 | + rv = singleton->GetPortableDataDir(getter_AddRefs(localDir), isPortable);
|
|
1388 | 1467 | NS_ENSURE_SUCCESS(rv, rv);
|
1389 | - nsAutoCString profileDir(RELATIVE_DATA_DIR);
|
|
1390 | - rv = localDir->SetRelativePath(localDir.get(), profileDir);
|
|
1391 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1392 | -# endif
|
|
1393 | - if (aLocal) {
|
|
1394 | - rv = localDir->AppendNative("Caches"_ns);
|
|
1395 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1468 | + if (isPortable) {
|
|
1469 | + if (aLocal) {
|
|
1470 | + rv = localDir->AppendNative("Caches"_ns);
|
|
1471 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1472 | + }
|
|
1473 | + NS_IF_ADDREF(*aFile = localDir);
|
|
1474 | + return rv;
|
|
1396 | 1475 | }
|
1397 | -#elif defined(XP_MACOSX)
|
|
1476 | +#endif
|
|
1477 | + |
|
1478 | +#if defined(XP_MACOSX)
|
|
1398 | 1479 | FSRef fsRef;
|
1480 | +# if defined(TOR_BROWSER_VERSION)
|
|
1481 | + OSType folderType = kApplicationSupportFolderType;
|
|
1482 | +# else
|
|
1399 | 1483 | OSType folderType;
|
1400 | 1484 | if (aLocal) {
|
1401 | 1485 | folderType = kCachedDataFolderType;
|
1402 | 1486 | } else {
|
1403 | -# ifdef MOZ_THUNDERBIRD
|
|
1487 | +# ifdef MOZ_THUNDERBIRD
|
|
1404 | 1488 | folderType = kDomainLibraryFolderType;
|
1405 | -# else
|
|
1489 | +# else
|
|
1406 | 1490 | folderType = kApplicationSupportFolderType;
|
1407 | -# endif
|
|
1491 | +# endif
|
|
1408 | 1492 | }
|
1493 | +# endif
|
|
1409 | 1494 | OSErr err = ::FSFindFolder(kUserDomain, folderType, kCreateFolder, &fsRef);
|
1410 | 1495 | NS_ENSURE_FALSE(err, NS_ERROR_FAILURE);
|
1411 | 1496 | |
... | ... | @@ -1418,6 +1503,17 @@ nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile, |
1418 | 1503 | rv = dirFileMac->InitWithFSRef(&fsRef);
|
1419 | 1504 | NS_ENSURE_SUCCESS(rv, rv);
|
1420 | 1505 | |
1506 | +# if defined(TOR_BROWSER_VERSION)
|
|
1507 | + rv = dirFileMac->AppendNative("TorBrowser-Data"_ns);
|
|
1508 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1509 | + rv = dirFileMac->AppendNative("Browser"_ns);
|
|
1510 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1511 | + if (aLocal) {
|
|
1512 | + rv = dirFileMac->AppendNative("Caches"_ns);
|
|
1513 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1514 | + }
|
|
1515 | +# endif
|
|
1516 | + |
|
1421 | 1517 | localDir = dirFileMac;
|
1422 | 1518 | #elif defined(XP_IOS)
|
1423 | 1519 | nsAutoCString userDir;
|
... | ... | @@ -1537,37 +1633,6 @@ nsresult nsXREDirProvider::GetUserDataDirectory(nsIFile** aFile, bool aLocal) { |
1537 | 1633 | return NS_OK;
|
1538 | 1634 | }
|
1539 | 1635 | |
1540 | -nsresult nsXREDirProvider::GetTorBrowserUserDataDir(nsIFile** aFile) {
|
|
1541 | - NS_ENSURE_ARG_POINTER(aFile);
|
|
1542 | - nsCOMPtr<nsIFile> appRootDir;
|
|
1543 | - RefPtr<nsXREDirProvider> singleton = GetSingleton();
|
|
1544 | - if (!singleton) {
|
|
1545 | - return NS_ERROR_OUT_OF_MEMORY;
|
|
1546 | - }
|
|
1547 | - nsresult rv = singleton->GetAppRootDir(getter_AddRefs(appRootDir));
|
|
1548 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1549 | - return TorBrowser_GetUserDataDir(appRootDir, aFile);
|
|
1550 | -}
|
|
1551 | - |
|
1552 | -nsresult nsXREDirProvider::GetAppRootDir(nsIFile** aFile) {
|
|
1553 | - bool persistent = false;
|
|
1554 | - nsCOMPtr<nsIFile> file, appRootDir;
|
|
1555 | - nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &persistent, getter_AddRefs(file));
|
|
1556 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1557 | - rv = file->Normalize();
|
|
1558 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1559 | - int levelsToRemove = 1;
|
|
1560 | -#if defined(XP_MACOSX)
|
|
1561 | - levelsToRemove += 2;
|
|
1562 | -#endif
|
|
1563 | - while (levelsToRemove-- > 0) {
|
|
1564 | - rv = file->GetParent(getter_AddRefs(appRootDir));
|
|
1565 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1566 | - file = appRootDir;
|
|
1567 | - }
|
|
1568 | - return appRootDir->Clone(aFile);
|
|
1569 | -}
|
|
1570 | - |
|
1571 | 1636 | nsresult nsXREDirProvider::EnsureDirectoryExists(nsIFile* aDirectory) {
|
1572 | 1637 | nsresult rv = aDirectory->Create(nsIFile::DIRECTORY_TYPE, 0700);
|
1573 | 1638 | |
... | ... | @@ -1618,6 +1683,13 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) { |
1618 | 1683 | return NS_OK;
|
1619 | 1684 | }
|
1620 | 1685 | |
1686 | +#if defined(RELATIVE_DATA_DIR)
|
|
1687 | + if (gDataDirPortable && *gDataDirPortable) {
|
|
1688 | + // Do nothing in portable mode
|
|
1689 | + return NS_OK;
|
|
1690 | + }
|
|
1691 | +#endif
|
|
1692 | + |
|
1621 | 1693 | nsAutoCString profile;
|
1622 | 1694 | nsAutoCString appName;
|
1623 | 1695 | nsAutoCString vendor;
|
... | ... | @@ -1631,29 +1703,29 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) { |
1631 | 1703 | nsresult rv = NS_OK;
|
1632 | 1704 | |
1633 | 1705 | #if defined(XP_MACOSX)
|
1706 | +# ifndef TOR_BROWSER_VERSION
|
|
1707 | + // For Tor Browser we already prepare the data directory as we need it, even
|
|
1708 | + // when we are running a system install.
|
|
1634 | 1709 | if (!profile.IsEmpty()) {
|
1635 | 1710 | rv = AppendProfileString(aFile, profile.get());
|
1636 | -# ifndef RELATIVE_DATA_DIR
|
|
1637 | 1711 | } else {
|
1638 | 1712 | // Note that MacOS ignores the vendor when creating the profile hierarchy -
|
1639 | 1713 | // all application preferences directories live alongside one another in
|
1640 | 1714 | // ~/Library/Application Support/
|
1641 | 1715 | rv = aFile->AppendNative(appName);
|
1642 | -# endif
|
|
1643 | 1716 | }
|
1644 | 1717 | NS_ENSURE_SUCCESS(rv, rv);
|
1718 | +# endif
|
|
1645 | 1719 | |
1646 | 1720 | #elif defined(XP_WIN)
|
1647 | 1721 | if (!profile.IsEmpty()) {
|
1648 | 1722 | rv = AppendProfileString(aFile, profile.get());
|
1649 | -# ifndef RELATIVE_DATA_DIR
|
|
1650 | 1723 | } else {
|
1651 | 1724 | if (!vendor.IsEmpty()) {
|
1652 | 1725 | rv = aFile->AppendNative(vendor);
|
1653 | 1726 | NS_ENSURE_SUCCESS(rv, rv);
|
1654 | 1727 | }
|
1655 | 1728 | rv = aFile->AppendNative(appName);
|
1656 | -# endif
|
|
1657 | 1729 | }
|
1658 | 1730 | NS_ENSURE_SUCCESS(rv, rv);
|
1659 | 1731 | |
... | ... | @@ -1668,26 +1740,21 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) { |
1668 | 1740 | nsAutoCString folder;
|
1669 | 1741 | // Make it hidden (by starting with "."), except when local (the
|
1670 | 1742 | // profile is already under ~/.cache or XDG_CACHE_HOME).
|
1671 | -# ifndef RELATIVE_DATA_DIR
|
|
1672 | 1743 | if (!aLocal) folder.Assign('.');
|
1673 | -# endif
|
|
1674 | 1744 | |
1675 | 1745 | if (!profile.IsEmpty()) {
|
1676 | 1746 | // Skip any leading path characters
|
1677 | 1747 | const char* profileStart = profile.get();
|
1678 | 1748 | while (*profileStart == '/' || *profileStart == '\\') profileStart++;
|
1679 | 1749 | |
1680 | -# ifndef RELATIVE_DATA_DIR
|
|
1681 | 1750 | // On the off chance that someone wanted their folder to be hidden don't
|
1682 | 1751 | // let it become ".."
|
1683 | 1752 | if (*profileStart == '.' && !aLocal) profileStart++;
|
1684 | -# endif
|
|
1685 | 1753 | |
1686 | 1754 | folder.Append(profileStart);
|
1687 | 1755 | ToLowerCase(folder);
|
1688 | 1756 | |
1689 | 1757 | rv = AppendProfileString(aFile, folder.BeginReading());
|
1690 | -# ifndef RELATIVE_DATA_DIR
|
|
1691 | 1758 | } else {
|
1692 | 1759 | if (!vendor.IsEmpty()) {
|
1693 | 1760 | folder.Append(vendor);
|
... | ... | @@ -1706,7 +1773,6 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) { |
1706 | 1773 | |
1707 | 1774 | rv = aFile->AppendNative(folder);
|
1708 | 1775 | }
|
1709 | -# endif
|
|
1710 | 1776 | }
|
1711 | 1777 | NS_ENSURE_SUCCESS(rv, rv);
|
1712 | 1778 | |
... | ... | @@ -1734,3 +1800,21 @@ nsresult nsXREDirProvider::AppendProfileString(nsIFile* aFile, |
1734 | 1800 | |
1735 | 1801 | return NS_OK;
|
1736 | 1802 | }
|
1803 | + |
|
1804 | +nsresult nsXREDirProvider::GetTorBrowserUserDataDir(nsIFile** aFile) {
|
|
1805 | +#ifdef ANDROID
|
|
1806 | + // We expect this function not to be called on Android.
|
|
1807 | + // But, for sake of completeness, we handle also this case.
|
|
1808 | + const char* homeDir = getenv("HOME");
|
|
1809 | + if (!homeDir || !*homeDir) {
|
|
1810 | + return NS_ERROR_FAILURE;
|
|
1811 | + }
|
|
1812 | + return NS_NewNativeLocalFile(nsDependentCString(homeDir), true, aFile);
|
|
1813 | +#endif
|
|
1814 | + |
|
1815 | + NS_ENSURE_ARG_POINTER(aFile);
|
|
1816 | + nsCOMPtr<nsIFile> dataDir;
|
|
1817 | + nsresult rv = GetUserDataDirectoryHome(getter_AddRefs(dataDir), false);
|
|
1818 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1819 | + return dataDir->GetParent(aFile);
|
|
1820 | +} |
... | ... | @@ -110,18 +110,11 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2, |
110 | 110 | nsresult GetProfileDir(nsIFile** aResult);
|
111 | 111 | |
112 | 112 | /**
|
113 | - * Get the TorBrowser user data directory by calling the
|
|
114 | - * TorBrowser_GetUserDataDir() utility function.
|
|
113 | + * Get the Tor Browser user data directory.
|
|
114 | + * We take for granted that for Tor Browser we can take the parent directory
|
|
115 | + * of the one returned by GetUserDataDirectoryHome (with aLocal = false).
|
|
115 | 116 | */
|
116 | - static nsresult GetTorBrowserUserDataDir(nsIFile** aFile);
|
|
117 | - |
|
118 | - /**
|
|
119 | - * Get the path to the base application directory.
|
|
120 | - *
|
|
121 | - * In almost all platforms it is the directory that contains the Firefox
|
|
122 | - * executable; on macOS we remove also Contents/MacOS from it.
|
|
123 | - */
|
|
124 | - nsresult GetAppRootDir(nsIFile** aFile);
|
|
117 | + nsresult GetTorBrowserUserDataDir(nsIFile** aFile);
|
|
125 | 118 | |
126 | 119 | protected:
|
127 | 120 | nsresult GetFilesInternal(const char* aProperty,
|
... | ... | @@ -169,6 +162,14 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2, |
169 | 162 | private:
|
170 | 163 | static nsresult SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile,
|
171 | 164 | bool aLocal);
|
165 | + |
|
166 | +#if defined(RELATIVE_DATA_DIR)
|
|
167 | + /**
|
|
168 | + * Get the path to the portable data dir, if the application is running in
|
|
169 | + * portable mode.
|
|
170 | + */
|
|
171 | + nsresult GetPortableDataDir(nsIFile** aFile, bool& aIsPortable);
|
|
172 | +#endif
|
|
172 | 173 | };
|
173 | 174 | |
174 | 175 | #endif |
1 | -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
2 | -/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
3 | -/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
4 | - * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5 | - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
6 | - |
|
7 | -#include "TorFileUtils.h"
|
|
8 | -#include "nsString.h"
|
|
9 | -#ifdef MOZ_WIDGET_COCOA
|
|
10 | -# include <Carbon/Carbon.h>
|
|
11 | -# include "nsILocalFileMac.h"
|
|
12 | -#endif
|
|
13 | - |
|
14 | -nsresult TorBrowser_GetUserDataDir(nsIFile* aAppDir, nsIFile** aFile) {
|
|
15 | - NS_ENSURE_ARG_POINTER(aFile);
|
|
16 | - nsCOMPtr<nsIFile> tbDataDir;
|
|
17 | - |
|
18 | -#ifdef ANDROID
|
|
19 | - const char* homeDir = getenv("HOME");
|
|
20 | - if (!homeDir || !*homeDir) return NS_ERROR_FAILURE;
|
|
21 | - nsresult rv = NS_NewNativeLocalFile(nsDependentCString(homeDir), true,
|
|
22 | - getter_AddRefs(tbDataDir));
|
|
23 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
24 | -#elif defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
|
|
25 | - nsAutoCString tbDataLeafName("TorBrowser-Data"_ns);
|
|
26 | -# ifndef XP_MACOSX
|
|
27 | - // On all platforms except Mac OS, we always operate in a "portable" mode
|
|
28 | - // where the TorBrowser-Data directory is located next to the application.
|
|
29 | - nsresult rv = aAppDir->GetParent(getter_AddRefs(tbDataDir));
|
|
30 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
31 | - rv = tbDataDir->AppendNative(tbDataLeafName);
|
|
32 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
33 | -# else
|
|
34 | - // For Mac OS, determine whether we should store user data in the OS's
|
|
35 | - // standard location (i.e., under ~/Library/Application Support). We use
|
|
36 | - // the OS location if (1) the application is installed in a directory whose
|
|
37 | - // path contains "/Applications" or (2) the TorBrowser-Data directory does
|
|
38 | - // not exist and cannot be created (which probably means we lack write
|
|
39 | - // permission to the directory that contains the application).
|
|
40 | - nsAutoString appRootPath;
|
|
41 | - nsresult rv = aAppDir->GetPath(appRootPath);
|
|
42 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
43 | - bool useOSLocation =
|
|
44 | - (appRootPath.Find("/Applications", true /* ignore case */) >= 0);
|
|
45 | - if (!useOSLocation) {
|
|
46 | - // We hope to use the portable (aka side-by-side) approach, but before we
|
|
47 | - // commit to that, let's ensure that we can create the TorBrowser-Data
|
|
48 | - // directory. If it already exists, we will try to use it; if not and we
|
|
49 | - // fail to create it, we will switch to ~/Library/Application Support.
|
|
50 | - rv = aAppDir->GetParent(getter_AddRefs(tbDataDir));
|
|
51 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
52 | - rv = tbDataDir->AppendNative(tbDataLeafName);
|
|
53 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
54 | - bool exists = false;
|
|
55 | - rv = tbDataDir->Exists(&exists);
|
|
56 | - if (NS_SUCCEEDED(rv) && !exists)
|
|
57 | - rv = tbDataDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
|
|
58 | - useOSLocation = NS_FAILED(rv);
|
|
59 | - }
|
|
60 | - |
|
61 | - if (useOSLocation) {
|
|
62 | - // We are using ~/Library/Application Support/TorBrowser-Data. We do not
|
|
63 | - // need to create that directory here because the code in nsXREDirProvider
|
|
64 | - // will do so (and the user should always have write permission for
|
|
65 | - // ~/Library/Application Support; if they do not we have no more options).
|
|
66 | - FSRef fsRef;
|
|
67 | - OSErr err = ::FSFindFolder(kUserDomain, kApplicationSupportFolderType,
|
|
68 | - kCreateFolder, &fsRef);
|
|
69 | - NS_ENSURE_FALSE(err, NS_ERROR_FAILURE);
|
|
70 | - // To convert the FSRef returned by FSFindFolder() into an nsIFile that
|
|
71 | - // points to ~/Library/Application Support, we first create an empty
|
|
72 | - // nsIFile object (no path) and then use InitWithFSRef() to set the
|
|
73 | - // path.
|
|
74 | - rv = NS_NewNativeLocalFile(""_ns, true, getter_AddRefs(tbDataDir));
|
|
75 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
76 | - nsCOMPtr<nsILocalFileMac> dirFileMac = do_QueryInterface(tbDataDir);
|
|
77 | - if (!dirFileMac) return NS_ERROR_UNEXPECTED;
|
|
78 | - rv = dirFileMac->InitWithFSRef(&fsRef);
|
|
79 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
80 | - rv = tbDataDir->AppendNative(tbDataLeafName);
|
|
81 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
82 | - }
|
|
83 | -# endif
|
|
84 | - |
|
85 | -#else
|
|
86 | - // User data is embedded within the application directory (i.e.,
|
|
87 | - // TOR_BROWSER_DATA_OUTSIDE_APP_DIR is not defined).
|
|
88 | - nsresult rv = aAppDir->Clone(getter_AddRefs(tbDataDir));
|
|
89 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
90 | - rv = tbDataDir->AppendNative("TorBrowser"_ns);
|
|
91 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
92 | -#endif
|
|
93 | - |
|
94 | - tbDataDir.forget(aFile);
|
|
95 | - return NS_OK;
|
|
96 | -} |
1 | -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
2 | -/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
3 | -/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
4 | - * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5 | - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
6 | - |
|
7 | -#ifndef TorFileUtils_h__
|
|
8 | -#define TorFileUtils_h__
|
|
9 | - |
|
10 | -#include "nsIFile.h"
|
|
11 | - |
|
12 | -/**
|
|
13 | - * TorBrowser_GetUserDataDir
|
|
14 | - *
|
|
15 | - * Retrieve the Tor Browser user data directory.
|
|
16 | - * When built with --enable-tor-browser-data-outside-app-dir, the directory
|
|
17 | - * is next to the application directory, except on Mac OS where it may be
|
|
18 | - * there or it may be at ~/Library/Application Support/TorBrowser-Data (the
|
|
19 | - * latter location is used if the .app bundle is in a directory whose path
|
|
20 | - * contains /Applications or if we lack write access to the directory that
|
|
21 | - * contains the .app).
|
|
22 | - * When built without --enable-tor-browser-data-outside-app-dir, this
|
|
23 | - * directory is TorBrowser.app/TorBrowser.
|
|
24 | - *
|
|
25 | - * @param aAppDir The path to Tor Browser directory
|
|
26 | - * @param aFile Out parameter that is set to the Tor Browser user data
|
|
27 | - * directory.
|
|
28 | - * @return NS_OK on success. Error otherwise.
|
|
29 | - */
|
|
30 | -extern nsresult TorBrowser_GetUserDataDir(nsIFile* aAppDir, nsIFile** aFile);
|
|
31 | - |
|
32 | -#endif // !TorFileUtils_h__ |
... | ... | @@ -86,7 +86,6 @@ EXPORTS += [ |
86 | 86 | "nsUnicharInputStream.h",
|
87 | 87 | "nsWildCard.h",
|
88 | 88 | "SpecialSystemDirectory.h",
|
89 | - "TorFileUtils.h",
|
|
90 | 89 | ]
|
91 | 90 | |
92 | 91 | EXPORTS.mozilla += [
|
... | ... | @@ -137,10 +136,6 @@ UNIFIED_SOURCES += [ |
137 | 136 | "SpecialSystemDirectory.cpp",
|
138 | 137 | ]
|
139 | 138 | |
140 | -SOURCES += [
|
|
141 | - "TorFileUtils.cpp",
|
|
142 | -]
|
|
143 | - |
|
144 | 139 | if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa":
|
145 | 140 | SOURCES += [
|
146 | 141 | "CocoaFileUtils.mm",
|
... | ... | @@ -27,8 +27,6 @@ |
27 | 27 | # include <sys/param.h>
|
28 | 28 | #endif
|
29 | 29 | |
30 | -#include "TorFileUtils.h"
|
|
31 | - |
|
32 | 30 | // WARNING: These hard coded names need to go away. They need to
|
33 | 31 | // come from localizable resources
|
34 | 32 | |
... | ... | @@ -231,66 +229,137 @@ nsresult nsAppFileLocationProvider::CloneMozBinDirectory(nsIFile** aLocalFile) { |
231 | 229 | return NS_OK;
|
232 | 230 | }
|
233 | 231 | |
234 | -//----------------------------------------------------------------------------------------
|
|
235 | -// GetProductDirectory - Gets the directory which contains the application data
|
|
236 | -// folder
|
|
237 | -//
|
|
238 | -// UNIX : ~/.mozilla/
|
|
239 | -// WIN : <Application Data folder on user's machine>\Mozilla
|
|
240 | -// Mac : :Documents:Mozilla:
|
|
241 | -//----------------------------------------------------------------------------------------
|
|
242 | -nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
|
|
243 | - bool aLocal) {
|
|
244 | - if (NS_WARN_IF(!aLocalFile)) {
|
|
245 | - return NS_ERROR_INVALID_ARG;
|
|
246 | - }
|
|
232 | +#ifdef RELATIVE_DATA_DIR
|
|
233 | +static nsresult SetupPortableMode(nsIFile** aDirectory, bool aLocal,
|
|
234 | + bool& aIsPortable) {
|
|
235 | + // This is almost the same as nsXREDirProvider::GetPortableDataDir.
|
|
236 | + // However, it seems that this is never called, at least during simple usage
|
|
237 | + // of the browser.
|
|
247 | 238 | |
248 | 239 | nsresult rv = NS_ERROR_UNEXPECTED;
|
249 | - bool exists;
|
|
250 | - nsCOMPtr<nsIFile> localDir;
|
|
251 | - |
|
252 | -#if defined(RELATIVE_DATA_DIR) || defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
|
|
253 | 240 | nsCOMPtr<nsIProperties> directoryService(
|
254 | 241 | do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv));
|
255 | 242 | NS_ENSURE_SUCCESS(rv, rv);
|
256 | - |
|
257 | - bool persistent = false;
|
|
258 | - nsCOMPtr<nsIFile> file, appRootDir;
|
|
243 | + nsCOMPtr<nsIFile> exeFile, exeDir;
|
|
259 | 244 | rv = directoryService->Get(XRE_EXECUTABLE_FILE, NS_GET_IID(nsIFile),
|
260 | - getter_AddRefs(file));
|
|
245 | + getter_AddRefs(exeFile));
|
|
246 | + rv = exeFile->Normalize();
|
|
261 | 247 | NS_ENSURE_SUCCESS(rv, rv);
|
262 | - rv = file->Normalize();
|
|
248 | + rv = exeFile->GetParent(getter_AddRefs(exeDir));
|
|
263 | 249 | NS_ENSURE_SUCCESS(rv, rv);
|
264 | - int levelsToRemove = 1;
|
|
250 | + |
|
265 | 251 | # if defined(XP_MACOSX)
|
266 | - levelsToRemove += 2;
|
|
252 | + nsAutoString exeDirPath;
|
|
253 | + rv = exeDir->GetPath(exeDirPath);
|
|
254 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
255 | + // When the browser is installed in /Applications, we never run in portable
|
|
256 | + // mode.
|
|
257 | + if (exeDirPath.Find("/Applications/", true /* ignore case */) == 0) {
|
|
258 | + aIsPortable = false;
|
|
259 | + return NS_OK;
|
|
260 | + }
|
|
267 | 261 | # endif
|
268 | - while (levelsToRemove-- > 0) {
|
|
269 | - rv = file->GetParent(getter_AddRefs(appRootDir));
|
|
270 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
271 | - file = appRootDir;
|
|
262 | + |
|
263 | + nsCOMPtr<nsIFile> systemInstallFile;
|
|
264 | + rv = exeDir->Clone(getter_AddRefs(systemInstallFile));
|
|
265 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
266 | + rv = systemInstallFile->AppendNative("system-install"_ns);
|
|
267 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
268 | + |
|
269 | + bool exists = false;
|
|
270 | + rv = systemInstallFile->Exists(&exists);
|
|
271 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
272 | + if (exists) {
|
|
273 | + aIsPortable = false;
|
|
274 | + return NS_OK;
|
|
272 | 275 | }
|
273 | 276 | |
274 | -# ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
|
|
275 | - rv = TorBrowser_GetUserDataDir(appRootDir, getter_AddRefs(localDir));
|
|
277 | + nsCOMPtr<nsIFile> localDir = exeDir;
|
|
278 | +# if defined(XP_MACOSX)
|
|
279 | + rv = exeDir->GetParent(getter_AddRefs(localDir));
|
|
276 | 280 | NS_ENSURE_SUCCESS(rv, rv);
|
277 | - rv = localDir->AppendNative("Browser"_ns);
|
|
278 | -# else
|
|
279 | - localDir = appRootDir;
|
|
280 | - nsAutoCString profileDir(RELATIVE_DATA_DIR);
|
|
281 | - rv = localDir->SetRelativePath(localDir.get(), profileDir);
|
|
282 | -# endif
|
|
281 | + exeDir = localDir;
|
|
282 | + rv = exeDir->GetParent(getter_AddRefs(localDir));
|
|
283 | 283 | NS_ENSURE_SUCCESS(rv, rv);
|
284 | +# endif
|
|
284 | 285 | |
286 | + rv = localDir->SetRelativePath(localDir.get(),
|
|
287 | + nsLiteralCString(RELATIVE_DATA_DIR));
|
|
288 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
285 | 289 | if (aLocal) {
|
286 | 290 | rv = localDir->AppendNative("Caches"_ns);
|
287 | 291 | NS_ENSURE_SUCCESS(rv, rv);
|
288 | 292 | }
|
289 | 293 | |
290 | -#elif defined(MOZ_WIDGET_COCOA)
|
|
294 | + rv = localDir->Exists(&exists);
|
|
295 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
296 | + if (!exists) {
|
|
297 | + rv = localDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
|
|
298 | +# if defined(XP_MACOSX)
|
|
299 | + if (NS_FAILED(rv)) {
|
|
300 | + // On macOS, we forgive this failure to allow running from the DMG.
|
|
301 | + aIsPortable = false;
|
|
302 | + return NS_OK;
|
|
303 | + }
|
|
304 | +# else
|
|
305 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
306 | +# endif
|
|
307 | + }
|
|
308 | + |
|
309 | + localDir.forget(aDirectory);
|
|
310 | + aIsPortable = true;
|
|
311 | + return rv;
|
|
312 | +}
|
|
313 | +#endif
|
|
314 | + |
|
315 | +//----------------------------------------------------------------------------------------
|
|
316 | +// GetProductDirectory - Gets the directory which contains the application data
|
|
317 | +// folder
|
|
318 | +//
|
|
319 | +// If portable mode is enabled:
|
|
320 | +// - aLocal == false: $APP_ROOT/$RELATIVE_DATA_DIR
|
|
321 | +// - aLocal == true: $APP_ROOT/$RELATIVE_DATA_DIR/Caches
|
|
322 | +// where $APP_ROOT is:
|
|
323 | +// - the parent directory of the executable on Windows and Linux
|
|
324 | +// - the root of the app bundle on macOS
|
|
325 | +//
|
|
326 | +// Otherwise:
|
|
327 | +// - Windows:
|
|
328 | +// - aLocal == false: %APPDATA%/$MOZ_USER_DIR
|
|
329 | +// - aLocal == true: %LOCALAPPDATA%/$MOZ_USER_DIR
|
|
330 | +// - macOS:
|
|
331 | +// - aLocal == false: kDomainLibraryFolderType/$MOZ_USER_DIR
|
|
332 | +// - aLocal == true: kCachedDataFolderType/$MOZ_USER_DIR
|
|
333 | +// - Unix: ~/$MOZ_USER_DIR
|
|
334 | +//----------------------------------------------------------------------------------------
|
|
335 | +nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
|
|
336 | + bool aLocal) {
|
|
337 | + if (NS_WARN_IF(!aLocalFile)) {
|
|
338 | + return NS_ERROR_INVALID_ARG;
|
|
339 | + }
|
|
340 | + |
|
341 | + nsresult rv = NS_ERROR_UNEXPECTED;
|
|
342 | + bool exists;
|
|
343 | + nsCOMPtr<nsIFile> localDir;
|
|
344 | + |
|
345 | +#if defined(RELATIVE_DATA_DIR)
|
|
346 | + bool isPortable = false;
|
|
347 | + rv = SetupPortableMode(aLocalFile, aLocal, isPortable);
|
|
348 | + // If portable mode is enabled, we absolutely want it (e.g., to be sure there
|
|
349 | + // will not be disk leaks), so a failure is to be propagated.
|
|
350 | + if (NS_FAILED(rv) || isPortable) {
|
|
351 | + return rv;
|
|
352 | + }
|
|
353 | +#endif
|
|
354 | + |
|
355 | +#if defined(MOZ_WIDGET_COCOA)
|
|
291 | 356 | FSRef fsRef;
|
357 | +# if defined(TOR_BROWSER_VERSION)
|
|
358 | + OSType folderType = kApplicationSupportFolderType;
|
|
359 | +# else
|
|
292 | 360 | OSType folderType =
|
293 | 361 | aLocal ? (OSType)kCachedDataFolderType : (OSType)kDomainLibraryFolderType;
|
362 | +# endif
|
|
294 | 363 | OSErr err = ::FSFindFolder(kUserDomain, folderType, kCreateFolder, &fsRef);
|
295 | 364 | if (err) {
|
296 | 365 | return NS_ERROR_FAILURE;
|
... | ... | @@ -304,6 +373,17 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile, |
304 | 373 | if (NS_FAILED(rv)) {
|
305 | 374 | return rv;
|
306 | 375 | }
|
376 | + |
|
377 | +# if defined(TOR_BROWSER_VERSION)
|
|
378 | + rv = localDir->AppendNative("TorBrowser-Data"_ns);
|
|
379 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
380 | + rv = localDir->AppendNative("Browser"_ns);
|
|
381 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
382 | + if (aLocal) {
|
|
383 | + rv = localDir->AppendNative("Caches"_ns);
|
|
384 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
385 | + }
|
|
386 | +# endif
|
|
307 | 387 | #elif defined(XP_WIN)
|
308 | 388 | nsCOMPtr<nsIProperties> directoryService =
|
309 | 389 | do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv);
|
... | ... | @@ -326,7 +406,7 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile, |
326 | 406 | # error dont_know_how_to_get_product_dir_on_your_platform
|
327 | 407 | #endif
|
328 | 408 | |
329 | -#if !defined(RELATIVE_DATA_DIR) && !defined(TOR_BROWSER_VERSION)
|
|
409 | +#if !defined(TOR_BROWSER_VERSION)
|
|
330 | 410 | rv = localDir->AppendRelativeNativePath(DEFAULT_PRODUCT_DIR);
|
331 | 411 | if (NS_FAILED(rv)) {
|
332 | 412 | return rv;
|
... | ... | @@ -350,6 +430,11 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile, |
350 | 430 | //----------------------------------------------------------------------------------------
|
351 | 431 | // GetDefaultUserProfileRoot - Gets the directory which contains each user
|
352 | 432 | // profile dir
|
433 | +//
|
|
434 | +// - Windows and macOS: $PRODUCT_DIRECTORY/Profiles
|
|
435 | +// - Unix: $PRODUCT_DIRECTORY
|
|
436 | +// See also GetProductDirectory for instructions on how $PRODUCT_DIRECTORY is
|
|
437 | +// generated.
|
|
353 | 438 | //----------------------------------------------------------------------------------------
|
354 | 439 | nsresult nsAppFileLocationProvider::GetDefaultUserProfileRoot(
|
355 | 440 | nsIFile** aLocalFile, bool aLocal) {
|