tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit ec1f4eddbcab61ba1c352aac135379a3168f385c
parent 58f0aa28513a9b514c819e83e826ce02402cc2a6
Author: Harsheet <hsohaney@mozilla.com>
Date:   Mon, 20 Oct 2025 16:26:16 +0000

Bug 1991951 - (part 3) Connect backup prefs to enterprise policies. r=cdupuis,fluent-reviewers,fchasen,bolsson,mkaply

Differential Revision: https://phabricator.services.mozilla.com/D267856

Diffstat:
Mbrowser/components/backup/tests/browser/browser.toml | 2++
Abrowser/components/backup/tests/browser/browser_backup_policies.js | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mbrowser/components/enterprisepolicies/Policies.sys.mjs | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Mbrowser/components/enterprisepolicies/content/aboutPolicies.js | 1+
Mbrowser/components/enterprisepolicies/schemas/policies-schema.json | 12++++++++++++
5 files changed, 171 insertions(+), 0 deletions(-)

diff --git a/browser/components/backup/tests/browser/browser.toml b/browser/components/backup/tests/browser/browser.toml @@ -9,6 +9,8 @@ support-files = [ "head.js", ] +["browser_backup_policies.js"] + ["browser_password_validation_inputs.js"] ["browser_settings.js"] diff --git a/browser/components/backup/tests/browser/browser_backup_policies.js b/browser/components/backup/tests/browser/browser_backup_policies.js @@ -0,0 +1,107 @@ +/* Any copyright is dedicated to the Public Domain. +https://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const { EnterprisePolicyTesting, PoliciesPrefTracker } = + ChromeUtils.importESModule( + "resource://testing-common/EnterprisePolicyTesting.sys.mjs" + ); + +function checkPrefs( + expectedBackupServiceState, + expectedArchiveEnabledState, + expectedRestoreEnabledState +) { + Assert.equal( + Services.prefs.getBoolPref("browser.backup.enabled"), + expectedBackupServiceState, + `Backup Service state should match the expected state` + ); + Assert.equal( + Services.prefs.getBoolPref("browser.backup.archive.enabled"), + expectedArchiveEnabledState, + `Archive state should match the expected state` + ); + Assert.equal( + Services.prefs.getBoolPref("browser.backup.restore.enabled"), + expectedRestoreEnabledState, + `Restore state should match the expected state` + ); +} + +add_setup(async () => { + // let's set the prefs to a default so that we can see if the policies + // adhere to the defaults when they aren't present + await SpecialPowers.pushPrefEnv({ + set: [ + ["browser.backup.enabled", false], + ["browser.backup.archive.enabled", false], + ["browser.backup.restore.enabled", true], + ], + }); + + registerCleanupFunction(async () => { + await SpecialPowers.popPrefEnv(); + }); +}); + +add_task(async function test_backup_disabled_enterprise_policies() { + PoliciesPrefTracker.start(); + await EnterprisePolicyTesting.setupPolicyEngineWithJson({ + policies: { + BrowserDataBackup: false, + }, + }); + + checkPrefs(false, false, false); + PoliciesPrefTracker.stop(); +}); + +add_task(async function test_backup_archive_enabled_enterprise_policies() { + PoliciesPrefTracker.start(); + await EnterprisePolicyTesting.setupPolicyEngineWithJson({ + policies: { + BrowserDataBackup: { + AllowBackup: true, + }, + }, + }); + + checkPrefs(true, true, true); + PoliciesPrefTracker.stop(); +}); + +add_task(async function test_backup_restore_enabled_enterprise_policies() { + PoliciesPrefTracker.start(); + await EnterprisePolicyTesting.setupPolicyEngineWithJson({ + policies: { + BrowserDataBackup: { + AllowRestore: true, + }, + }, + }); + + checkPrefs(true, false, true); + PoliciesPrefTracker.stop(); +}); + +add_task(async function test_backup_service_disabled_enterprise_policies() { + PoliciesPrefTracker.start(); + + await SpecialPowers.pushPrefEnv({ + set: [["browser.backup.enabled", true]], + }); + + await EnterprisePolicyTesting.setupPolicyEngineWithJson({ + policies: { + BrowserDataBackup: { + AllowBackup: false, + AllowRestore: false, + }, + }, + }); + + checkPrefs(false, false, false); + PoliciesPrefTracker.stop(); +}); diff --git a/browser/components/enterprisepolicies/Policies.sys.mjs b/browser/components/enterprisepolicies/Policies.sys.mjs @@ -395,6 +395,55 @@ export var Policies = { }, }, + BrowserDataBackup: { + onBeforeUIStartup(manager, param) { + if (typeof param === "boolean") { + setAndLockPref("browser.backup.enabled", param); + setAndLockPref("browser.backup.archive.enabled", param); + setAndLockPref("browser.backup.restore.enabled", param); + } else { + const hasBackup = "AllowBackup" in param; + const hasRestore = "AllowRestore" in param; + let serviceValue; + + if (hasBackup && hasRestore) { + // both present but could be set to false + serviceValue = param.AllowBackup || param.AllowRestore; + } else if (hasBackup && param.AllowBackup) { + // only AllowBackup is true + serviceValue = true; + } else if (hasRestore && param.AllowRestore) { + // only AllowRestore is true + serviceValue = true; + } + + if (serviceValue !== undefined) { + PoliciesUtils.setDefaultPref( + "browser.backup.enabled", + serviceValue, + true + ); + } + + if (hasBackup) { + PoliciesUtils.setDefaultPref( + "browser.backup.archive.enabled", + param.AllowBackup, + true + ); + } + + if (hasRestore) { + PoliciesUtils.setDefaultPref( + "browser.backup.restore.enabled", + param.AllowRestore, + true + ); + } + } + }, + }, + CaptivePortal: { onBeforeAddons(manager, param) { setAndLockPref("network.captive-portal-service.enabled", param); diff --git a/browser/components/enterprisepolicies/content/aboutPolicies.js b/browser/components/enterprisepolicies/content/aboutPolicies.js @@ -296,6 +296,7 @@ function generateDocumentation() { SecurityDevices: "SecurityDevices2", SkipTermsOfUse: "SkipTermsOfUse2", WindowsSSO: "Windows10SSO", + Backup: "BrowserDataBackup", }; let deprecated_policies = ["DisablePocket"]; diff --git a/browser/components/enterprisepolicies/schemas/policies-schema.json b/browser/components/enterprisepolicies/schemas/policies-schema.json @@ -167,6 +167,18 @@ } }, + "BrowserDataBackup": { + "type": ["boolean", "object"], + "properties": { + "AllowBackup": { + "type": "boolean" + }, + "AllowRestore": { + "type": "boolean" + } + } + }, + "CaptivePortal": { "type": "boolean" },