Skip to content
Snippets Groups Projects
Verified Commit e5161726 authored by cypherpunks1's avatar cypherpunks1 Committed by Pier Angelo Vendrame
Browse files

Bug 42730: Patch RemoteSettings to use only local dumps as a data source

parent 120a3e1e
Branches
Tags
No related merge requests found
......@@ -3267,6 +3267,11 @@ BrowserGlue.prototype = {
lazy.RemoteSecuritySettings.init();
},
function RemoteSettingsPollChanges() {
// Support clients that use the "sync" event or "remote-settings:changes-poll-end".
lazy.RemoteSettings.pollChanges({ trigger: "timer" });
},
function BrowserUsageTelemetryReportProfileCount() {
lazy.BrowserUsageTelemetry.reportProfileCount();
},
......
......@@ -21,6 +21,7 @@ ChromeUtils.defineESModuleGetters(this, {
InitializationTracker: "resource://gre/modules/GeckoViewTelemetry.sys.mjs",
RemoteSecuritySettings:
"resource://gre/modules/psm/RemoteSecuritySettings.sys.mjs",
RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
SafeBrowsing: "resource://gre/modules/SafeBrowsing.sys.mjs",
});
......@@ -922,6 +923,10 @@ function startup() {
Blocklist.loadBlocklistAsync();
});
InitLater(() => {
RemoteSettings.pollChanges({ trigger: "timer" });
});
// This should always go last, since the idle tasks (except for the ones with
// timeouts) should execute in order. Note that this observer notification is
// not guaranteed to fire, since the window could close before we get here.
......
......@@ -223,6 +223,10 @@ export class Downloader {
fallbackToDump = false;
}
avoidDownload = true;
fallbackToCache = true;
fallbackToDump = true;
const dumpInfo = new LazyRecordAndBuffer(() =>
this._readAttachmentDump(attachmentId)
);
......@@ -444,6 +448,8 @@ export class Downloader {
attachment: { location, hash, size },
} = record;
return (await this.#fetchAttachment(record)).buffer;
// eslint-disable-next-line no-unreachable
const remoteFileUrl = (await this._baseAttachmentsURL()) + location;
const { retries = 3, checkHash = true } = options;
......
......@@ -424,11 +424,19 @@ export class RemoteSettingsClient extends EventEmitter {
order = "", // not sorted by default.
dumpFallback = true,
emptyListFallback = true,
forceSync = false,
loadDumpIfNewer = true,
syncIfEmpty = true,
} = options;
let { verifySignature = false } = options;
const hasLocalDump = await lazy.Utils.hasLocalDump(
this.bucketName,
this.collectionName
);
if (!hasLocalDump) {
return [];
}
const forceSync = false;
const syncIfEmpty = true;
let verifySignature = false;
const hasParallelCall = !!this._importingPromise;
let data;
......@@ -598,6 +606,10 @@ export class RemoteSettingsClient extends EventEmitter {
* @param {Object} options See #maybeSync() options.
*/
async sync(options) {
if (AppConstants.BASE_BROWSER_VERSION) {
return;
}
if (lazy.Utils.shouldSkipRemoteActivityDueToTests) {
return;
}
......@@ -664,7 +676,7 @@ export class RemoteSettingsClient extends EventEmitter {
let thrownError = null;
try {
// If network is offline, we can't synchronize.
if (lazy.Utils.isOffline) {
if (!AppConstants.BASE_BROWSER_VERSION && lazy.Utils.isOffline) {
throw new RemoteSettingsClient.NetworkOfflineError();
}
......@@ -1046,14 +1058,8 @@ export class RemoteSettingsClient extends EventEmitter {
options = {}
) {
const { retry = false } = options;
const since = retry || !localTimestamp ? undefined : `"${localTimestamp}"`;
// Fetch collection metadata and list of changes from server.
lazy.console.debug(
`${this.identifier} Fetch changes from server (expected=${expectedTimestamp}, since=${since})`
);
const { metadata, remoteTimestamp, remoteRecords } =
await this._fetchChangeset(expectedTimestamp, since);
let metadata, remoteTimestamp;
// We build a sync result, based on remote changes.
const syncResult = {
......@@ -1062,24 +1068,20 @@ export class RemoteSettingsClient extends EventEmitter {
updated: [],
deleted: [],
};
// If data wasn't changed, return empty sync result.
// This can happen when we update the signature but not the data.
lazy.console.debug(
`${this.identifier} local timestamp: ${localTimestamp}, remote: ${remoteTimestamp}`
);
if (localTimestamp && remoteTimestamp < localTimestamp) {
try {
await this._importJSONDump();
} catch (e) {
return syncResult;
}
await this.db.importChanges(metadata, remoteTimestamp, remoteRecords, {
clear: retry,
});
// Read the new local data, after updating.
const newLocal = await this.db.list();
const newRecords = newLocal.map(r => this._cleanLocalFields(r));
// And verify the signature on what is now stored.
if (this.verifySignature) {
if (metadata === undefined) {
// When working only with dumps, we do not have signatures.
} else if (this.verifySignature) {
try {
await this._validateCollectionSignature(
newRecords,
......
......@@ -63,8 +63,10 @@ def main(output):
dumps_locations = []
if buildconfig.substs["MOZ_BUILD_APP"] == "browser":
dumps_locations += ["services/settings/dumps/"]
dumps_locations += ["services/settings/static-dumps/"]
elif buildconfig.substs["MOZ_BUILD_APP"] == "mobile/android":
dumps_locations += ["services/settings/dumps/"]
dumps_locations += ["services/settings/static-dumps/"]
elif buildconfig.substs["MOZ_BUILD_APP"] == "mobile/ios":
dumps_locations += ["services/settings/dumps/"]
elif buildconfig.substs["MOZ_BUILD_APP"] == "comm/mail":
......
......@@ -91,6 +91,7 @@ export async function jexlFilterFunc(entry, environment) {
function remoteSettingsFunction() {
const _clients = new Map();
let _invalidatePolling = false;
let _initialized = false;
// If not explicitly specified, use the default signer.
const defaultOptions = {
......@@ -194,6 +195,39 @@ function remoteSettingsFunction() {
trigger = "manual",
full = false,
} = {}) => {
if (AppConstants.BASE_BROWSER_VERSION) {
// Called multiple times on GeckoView due to bug 1730026
if (_initialized) {
return;
}
_initialized = true;
let importedFromDump = false;
for (const client of _clients.values()) {
const hasLocalDump = await lazy.Utils.hasLocalDump(
client.bucketName,
client.collectionName
);
if (hasLocalDump) {
const lastModified = await client.getLastModified();
const lastModifiedDump = await lazy.Utils.getLocalDumpLastModified(
client.bucketName,
client.collectionName
);
if (lastModified < lastModifiedDump) {
await client.maybeSync(lastModifiedDump, {
loadDump: true,
trigger,
});
importedFromDump = true;
}
}
}
if (importedFromDump) {
Services.obs.notifyObservers(null, "remote-settings:changes-poll-end");
}
return;
}
if (lazy.Utils.shouldSkipRemoteActivityDueToTests) {
return;
}
......
......@@ -423,11 +423,11 @@ export var AppConstants = Object.freeze({
#ifdef MOZ_THUNDERBIRD
"https://thunderbird-settings.thunderbird.net/v1",
#else
"https://firefox.settings.services.mozilla.com/v1",
"",
#endif
REMOTE_SETTINGS_VERIFY_SIGNATURE:
#ifdef MOZ_THUNDERBIRD
#if defined(MOZ_THUNDERBIRD) || defined(BASE_BROWSER_VERSION)
false,
#else
true,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment