[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [Git][tpo/applications/tor-browser][tor-browser-102.7.0esr-12.5-1] 7 commits: Revert "Bug 13252: Do not store data in the app bundle"



Title: GitLab

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
    Revert "Bug 13252: Do not store data in the app bundle"
    
    This reverts commit bcbfa12f147da775edd5adda3bf51436bdd94f10.
    
  • 8029d2b1
    by Pier Angelo Vendrame at 2023-02-08T12:22:34+01:00
    fixup! Bug 14631: Improve profile access error messages.
    
    Part of Bug 20497.
    
    Move this check to Bug 14631, which seems a better place for it!
    
  • 1dafa91c
    by Pier Angelo Vendrame at 2023-02-08T12:22:34+01:00
    Revert "Bug 9173: Change the default Firefox profile directory to be relative."
    
    This reverts commit 0ef716110c63ffa26a2c9b29cd954f2c971b5178.
    
  • 4595d824
    by Pier Angelo Vendrame at 2023-02-08T12:22:35+01:00
    Bug 9173: Change the default Firefox profile directory to be relative.
    
    This commit makes Firefox look for the default profile directory in a
    directory relative to the binary path.
    The directory can be specified through the --with-relative-data-dir.
    This is relative to the same directory as the firefox main binary for
    Linux and Windows.
    
    On macOS, we remove Contents/MacOS from it.
    Or, in other words, the directory is relative to the application
    bundle.
    
    This behavior can be overriden at runtime, by placing a file called
    system-install adjacent to the firefox main binary (also on macOS).
    
  • cb3d5136
    by Pier Angelo Vendrame at 2023-02-08T12:22:36+01:00
    fixup! TB3: Tor Browser's official .mozconfigs.
    
    Part of Bug 20497.
    
    Start using the correct macOS relative data directory, instead of
    creating it with code, when possible.
    
  • 7e272b9d
    by Pier Angelo Vendrame at 2023-02-08T12:22:36+01:00
    Bug 13252: Customize profile management on macOS
    
    On macOS we allow both portable mode and system installation.
    However, in the latter case, we customize Firefox's directories to
    match the hierarchy we use for the portable mode.
    
    Also, display an informative error message if the TorBrowser-Data
    directory cannot be created due to an "access denied" or a
    "read only volume" error.
    
  • f210d8ca
    by Pier Angelo Vendrame at 2023-02-08T12:22:37+01:00
    fixup! Bug 4234: Use the Firefox Update Process for Tor Browser.
    
    Part of Bug 20497.
    
    Do not use GetAppRootdir. We only need up to .app, so we can query the
    path to the firefox executable with the methods Firefox already has.
    

8 changed files:

Changes:

  • mozconfig-macos-x86_64
    ... ... @@ -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

  • toolkit/xre/nsAppRunner.cpp
    ... ... @@ -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);
    

  • toolkit/xre/nsXREDirProvider.cpp
    ... ... @@ -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
    +}

  • toolkit/xre/nsXREDirProvider.h
    ... ... @@ -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

  • xpcom/io/TorFileUtils.cpp deleted
    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
    -}

  • xpcom/io/TorFileUtils.h deleted
    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__

  • xpcom/io/moz.build
    ... ... @@ -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",
    

  • xpcom/io/nsAppFileLocationProvider.cpp
    ... ... @@ -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) {
    

  • _______________________________________________
    tor-commits mailing list
    tor-commits@xxxxxxxxxxxxxxxxxxxx
    https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits