Pier Angelo Vendrame pushed to branch tor-browser-128.2.0esr-14.0-1 at The Tor Project / Applications / Tor Browser

Commits:

8 changed files:

Changes:

  • browser/components/BrowserGlue.sys.mjs
    ... ... @@ -3497,6 +3497,11 @@ BrowserGlue.prototype = {
    3497 3497
             lazy.RemoteSecuritySettings.init();
    
    3498 3498
           },
    
    3499 3499
     
    
    3500
    +      function RemoteSettingsPollChanges() {
    
    3501
    +        // Support clients that use the "sync" event or "remote-settings:changes-poll-end".
    
    3502
    +        lazy.RemoteSettings.pollChanges({ trigger: "timer" });
    
    3503
    +      },
    
    3504
    +
    
    3500 3505
           function BrowserUsageTelemetryReportProfileCount() {
    
    3501 3506
             lazy.BrowserUsageTelemetry.reportProfileCount();
    
    3502 3507
           },
    

  • mobile/shared/chrome/geckoview/geckoview.js
    ... ... @@ -21,6 +21,7 @@ ChromeUtils.defineESModuleGetters(this, {
    21 21
       InitializationTracker: "resource://gre/modules/GeckoViewTelemetry.sys.mjs",
    
    22 22
       RemoteSecuritySettings:
    
    23 23
         "resource://gre/modules/psm/RemoteSecuritySettings.sys.mjs",
    
    24
    +  RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
    
    24 25
       SafeBrowsing: "resource://gre/modules/SafeBrowsing.sys.mjs",
    
    25 26
     });
    
    26 27
     
    
    ... ... @@ -922,6 +923,10 @@ function startup() {
    922 923
           Blocklist.loadBlocklistAsync();
    
    923 924
         });
    
    924 925
     
    
    926
    +    InitLater(() => {
    
    927
    +      RemoteSettings.pollChanges({ trigger: "timer" });
    
    928
    +    });
    
    929
    +
    
    925 930
         // This should always go last, since the idle tasks (except for the ones with
    
    926 931
         // timeouts) should execute in order. Note that this observer notification is
    
    927 932
         // not guaranteed to fire, since the window could close before we get here.
    

  • services/settings/Attachments.sys.mjs
    ... ... @@ -223,6 +223,10 @@ export class Downloader {
    223 223
           fallbackToDump = false;
    
    224 224
         }
    
    225 225
     
    
    226
    +    avoidDownload = true;
    
    227
    +    fallbackToCache = true;
    
    228
    +    fallbackToDump = true;
    
    229
    +
    
    226 230
         const dumpInfo = new LazyRecordAndBuffer(() =>
    
    227 231
           this._readAttachmentDump(attachmentId)
    
    228 232
         );
    
    ... ... @@ -444,6 +448,8 @@ export class Downloader {
    444 448
           attachment: { location, hash, size },
    
    445 449
         } = record;
    
    446 450
     
    
    451
    +    return (await this.#fetchAttachment(record)).buffer;
    
    452
    +    // eslint-disable-next-line no-unreachable
    
    447 453
         const remoteFileUrl = (await this._baseAttachmentsURL()) + location;
    
    448 454
     
    
    449 455
         const { retries = 3, checkHash = true } = options;
    

  • services/settings/RemoteSettingsClient.sys.mjs
    ... ... @@ -424,11 +424,19 @@ export class RemoteSettingsClient extends EventEmitter {
    424 424
           order = "", // not sorted by default.
    
    425 425
           dumpFallback = true,
    
    426 426
           emptyListFallback = true,
    
    427
    -      forceSync = false,
    
    428 427
           loadDumpIfNewer = true,
    
    429
    -      syncIfEmpty = true,
    
    430 428
         } = options;
    
    431
    -    let { verifySignature = false } = options;
    
    429
    +
    
    430
    +    const hasLocalDump = await lazy.Utils.hasLocalDump(
    
    431
    +      this.bucketName,
    
    432
    +      this.collectionName
    
    433
    +    );
    
    434
    +    if (!hasLocalDump) {
    
    435
    +      return [];
    
    436
    +    }
    
    437
    +    const forceSync = false;
    
    438
    +    const syncIfEmpty = true;
    
    439
    +    let verifySignature = false;
    
    432 440
     
    
    433 441
         const hasParallelCall = !!this._importingPromise;
    
    434 442
         let data;
    
    ... ... @@ -598,6 +606,10 @@ export class RemoteSettingsClient extends EventEmitter {
    598 606
        * @param {Object} options See #maybeSync() options.
    
    599 607
        */
    
    600 608
       async sync(options) {
    
    609
    +    if (AppConstants.BASE_BROWSER_VERSION) {
    
    610
    +      return;
    
    611
    +    }
    
    612
    +
    
    601 613
         if (lazy.Utils.shouldSkipRemoteActivityDueToTests) {
    
    602 614
           return;
    
    603 615
         }
    
    ... ... @@ -664,7 +676,7 @@ export class RemoteSettingsClient extends EventEmitter {
    664 676
         let thrownError = null;
    
    665 677
         try {
    
    666 678
           // If network is offline, we can't synchronize.
    
    667
    -      if (lazy.Utils.isOffline) {
    
    679
    +      if (!AppConstants.BASE_BROWSER_VERSION && lazy.Utils.isOffline) {
    
    668 680
             throw new RemoteSettingsClient.NetworkOfflineError();
    
    669 681
           }
    
    670 682
     
    
    ... ... @@ -1046,14 +1058,8 @@ export class RemoteSettingsClient extends EventEmitter {
    1046 1058
         options = {}
    
    1047 1059
       ) {
    
    1048 1060
         const { retry = false } = options;
    
    1049
    -    const since = retry || !localTimestamp ? undefined : `"${localTimestamp}"`;
    
    1050 1061
     
    
    1051
    -    // Fetch collection metadata and list of changes from server.
    
    1052
    -    lazy.console.debug(
    
    1053
    -      `${this.identifier} Fetch changes from server (expected=${expectedTimestamp}, since=${since})`
    
    1054
    -    );
    
    1055
    -    const { metadata, remoteTimestamp, remoteRecords } =
    
    1056
    -      await this._fetchChangeset(expectedTimestamp, since);
    
    1062
    +    let metadata, remoteTimestamp;
    
    1057 1063
     
    
    1058 1064
         // We build a sync result, based on remote changes.
    
    1059 1065
         const syncResult = {
    
    ... ... @@ -1062,24 +1068,20 @@ export class RemoteSettingsClient extends EventEmitter {
    1062 1068
           updated: [],
    
    1063 1069
           deleted: [],
    
    1064 1070
         };
    
    1065
    -    // If data wasn't changed, return empty sync result.
    
    1066
    -    // This can happen when we update the signature but not the data.
    
    1067
    -    lazy.console.debug(
    
    1068
    -      `${this.identifier} local timestamp: ${localTimestamp}, remote: ${remoteTimestamp}`
    
    1069
    -    );
    
    1070
    -    if (localTimestamp && remoteTimestamp < localTimestamp) {
    
    1071
    +
    
    1072
    +    try {
    
    1073
    +      await this._importJSONDump();
    
    1074
    +    } catch (e) {
    
    1071 1075
           return syncResult;
    
    1072 1076
         }
    
    1073 1077
     
    
    1074
    -    await this.db.importChanges(metadata, remoteTimestamp, remoteRecords, {
    
    1075
    -      clear: retry,
    
    1076
    -    });
    
    1077
    -
    
    1078 1078
         // Read the new local data, after updating.
    
    1079 1079
         const newLocal = await this.db.list();
    
    1080 1080
         const newRecords = newLocal.map(r => this._cleanLocalFields(r));
    
    1081 1081
         // And verify the signature on what is now stored.
    
    1082
    -    if (this.verifySignature) {
    
    1082
    +    if (metadata === undefined) {
    
    1083
    +      // When working only with dumps, we do not have signatures.
    
    1084
    +    } else if (this.verifySignature) {
    
    1083 1085
           try {
    
    1084 1086
             await this._validateCollectionSignature(
    
    1085 1087
               newRecords,
    

  • services/settings/dumps/gen_last_modified.py
    ... ... @@ -63,8 +63,10 @@ def main(output):
    63 63
         dumps_locations = []
    
    64 64
         if buildconfig.substs["MOZ_BUILD_APP"] == "browser":
    
    65 65
             dumps_locations += ["services/settings/dumps/"]
    
    66
    +        dumps_locations += ["services/settings/static-dumps/"]
    
    66 67
         elif buildconfig.substs["MOZ_BUILD_APP"] == "mobile/android":
    
    67 68
             dumps_locations += ["services/settings/dumps/"]
    
    69
    +        dumps_locations += ["services/settings/static-dumps/"]
    
    68 70
         elif buildconfig.substs["MOZ_BUILD_APP"] == "mobile/ios":
    
    69 71
             dumps_locations += ["services/settings/dumps/"]
    
    70 72
         elif buildconfig.substs["MOZ_BUILD_APP"] == "comm/mail":
    

  • services/settings/remote-settings.sys.mjs
    ... ... @@ -91,6 +91,7 @@ export async function jexlFilterFunc(entry, environment) {
    91 91
     function remoteSettingsFunction() {
    
    92 92
       const _clients = new Map();
    
    93 93
       let _invalidatePolling = false;
    
    94
    +  let _initialized = false;
    
    94 95
     
    
    95 96
       // If not explicitly specified, use the default signer.
    
    96 97
       const defaultOptions = {
    
    ... ... @@ -194,21 +195,49 @@ function remoteSettingsFunction() {
    194 195
         trigger = "manual",
    
    195 196
         full = false,
    
    196 197
       } = {}) => {
    
    198
    +    if (AppConstants.BASE_BROWSER_VERSION) {
    
    199
    +      // Called multiple times on GeckoView due to bug 1730026
    
    200
    +      if (_initialized) {
    
    201
    +        return;
    
    202
    +      }
    
    203
    +      _initialized = true;
    
    204
    +      let importedFromDump = false;
    
    205
    +      for (const client of _clients.values()) {
    
    206
    +        const hasLocalDump = await lazy.Utils.hasLocalDump(
    
    207
    +          client.bucketName,
    
    208
    +          client.collectionName
    
    209
    +        );
    
    210
    +        if (hasLocalDump) {
    
    211
    +          const lastModified = await client.getLastModified();
    
    212
    +          const lastModifiedDump = await lazy.Utils.getLocalDumpLastModified(
    
    213
    +            client.bucketName,
    
    214
    +            client.collectionName
    
    215
    +          );
    
    216
    +          if (lastModified < lastModifiedDump) {
    
    217
    +            await client.maybeSync(lastModifiedDump, {
    
    218
    +              loadDump: true,
    
    219
    +              trigger,
    
    220
    +            });
    
    221
    +            importedFromDump = true;
    
    222
    +          }
    
    223
    +        }
    
    224
    +      }
    
    225
    +      if (importedFromDump) {
    
    226
    +        Services.obs.notifyObservers(null, "remote-settings:changes-poll-end");
    
    227
    +      }
    
    228
    +      return;
    
    229
    +    }
    
    230
    +
    
    197 231
         if (lazy.Utils.shouldSkipRemoteActivityDueToTests) {
    
    198 232
           return;
    
    199 233
         }
    
    200 234
         // When running in full mode, we ignore last polling status.
    
    201
    -    if (full || AppConstants.BASE_BROWSER_VERSION) {
    
    235
    +    if (full) {
    
    202 236
           lazy.gPrefs.clearUserPref(PREF_SETTINGS_SERVER_BACKOFF);
    
    203 237
           lazy.gPrefs.clearUserPref(PREF_SETTINGS_LAST_UPDATE);
    
    204 238
           lazy.gPrefs.clearUserPref(PREF_SETTINGS_LAST_ETAG);
    
    205 239
         }
    
    206 240
     
    
    207
    -    if (AppConstants.BASE_BROWSER_VERSION) {
    
    208
    -      // tor-browser#41704: pollChanges is always online, so do not allow it.
    
    209
    -      return;
    
    210
    -    }
    
    211
    -
    
    212 241
         let pollTelemetryArgs = {
    
    213 242
           source: TELEMETRY_SOURCE_POLL,
    
    214 243
           trigger,
    

  • toolkit/modules/AppConstants.sys.mjs
    ... ... @@ -423,11 +423,11 @@ export var AppConstants = Object.freeze({
    423 423
     #ifdef MOZ_THUNDERBIRD
    
    424 424
         "https://thunderbird-settings.thunderbird.net/v1",
    
    425 425
     #else
    
    426
    -    "https://firefox.settings.services.mozilla.com/v1",
    
    426
    +    "",
    
    427 427
     #endif
    
    428 428
     
    
    429 429
       REMOTE_SETTINGS_VERIFY_SIGNATURE:
    
    430
    -#ifdef MOZ_THUNDERBIRD
    
    430
    +#if defined(MOZ_THUNDERBIRD) || defined(BASE_BROWSER_VERSION)
    
    431 431
         false,
    
    432 432
     #else
    
    433 433
         true,
    

  • toolkit/modules/IgnoreLists.sys.mjs
    ... ... @@ -5,16 +5,18 @@
    5 5
     const lazy = {};
    
    6 6
     
    
    7 7
     ChromeUtils.defineESModuleGetters(lazy, {
    
    8
    +  RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
    
    8 9
       RemoteSettingsClient:
    
    9 10
         "resource://services-settings/RemoteSettingsClient.sys.mjs",
    
    10 11
     });
    
    11 12
     
    
    12
    -class IgnoreListsManager {
    
    13
    -  _ignoreListSettings = null;
    
    13
    +const SETTINGS_IGNORELIST_KEY = "hijack-blocklists";
    
    14 14
     
    
    15
    +class IgnoreListsManager {
    
    15 16
       async init() {
    
    16
    -    // TODO: Restore the initialization, once we use only the local dumps for
    
    17
    -    // the remote settings.
    
    17
    +    if (!this._ignoreListSettings) {
    
    18
    +      this._ignoreListSettings = lazy.RemoteSettings(SETTINGS_IGNORELIST_KEY);
    
    19
    +    }
    
    18 20
       }
    
    19 21
     
    
    20 22
       async getAndSubscribe(listener) {
    
    ... ... @@ -24,7 +26,7 @@ class IgnoreListsManager {
    24 26
         const settings = await this._getIgnoreList();
    
    25 27
     
    
    26 28
         // Listen for future updates after we first get the values.
    
    27
    -    this._ignoreListSettings?.on("sync", listener);
    
    29
    +    this._ignoreListSettings.on("sync", listener);
    
    28 30
     
    
    29 31
         return settings;
    
    30 32
       }
    
    ... ... @@ -65,14 +67,6 @@ class IgnoreListsManager {
    65 67
        *   could be obtained.
    
    66 68
        */
    
    67 69
       async _getIgnoreListSettings(firstTime = true) {
    
    68
    -    if (!this._ignoreListSettings) {
    
    69
    -      const dump = await fetch(
    
    70
    -        "resource:///defaults/settings/main/hijack-blocklists.json"
    
    71
    -      );
    
    72
    -      const { data } = await dump.json();
    
    73
    -      return data;
    
    74
    -    }
    
    75
    -
    
    76 70
         let result = [];
    
    77 71
         try {
    
    78 72
           result = await this._ignoreListSettings.get({