From b8adf5b027bcc6397657824e7a2c70499cc344aa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 16 Apr 2025 15:04:47 -0400 Subject: [PATCH] [mv3] Add admin setting `defaultFiltering` Setting name: "defaultFiltering" Type: string Valid values: "none", "basic", "optimal", "complete" Additionally, fix default "basic" mode toggling back to "optimal" upon extension restart when uBOL has broad host permissions. The default mode will toggle automatically only when there is a change in broad host permissions status. --- platform/mv3/extension/js/admin.js | 8 +++++ platform/mv3/extension/js/config.js | 1 + platform/mv3/extension/js/mode-manager.js | 40 ++++++++++++++++++--- platform/mv3/extension/managed_storage.json | 4 +++ 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/platform/mv3/extension/js/admin.js b/platform/mv3/extension/js/admin.js index 8a6b91fb7..843285d89 100644 --- a/platform/mv3/extension/js/admin.js +++ b/platform/mv3/extension/js/admin.js @@ -31,6 +31,7 @@ import { } from './ruleset-manager.js'; import { + getDefaultFilteringMode, getTrustedSites, readFilteringModeDetails, } from './mode-manager.js'; @@ -66,6 +67,13 @@ const adminSettings = { const [ adminRulesets, enabledRulesets ] = results; broadcastMessage({ adminRulesets, enabledRulesets }); } + if ( this.keys.has('defaultFiltering') ) { + ubolLog('admin setting "defaultFiltering" changed'); + await readFilteringModeDetails(true); + await registerInjectables(); + const defaultFilteringMode = await getDefaultFilteringMode(); + broadcastMessage({ defaultFilteringMode }); + } if ( this.keys.has('noFiltering') ) { ubolLog('admin setting "noFiltering" changed'); await readFilteringModeDetails(true); diff --git a/platform/mv3/extension/js/config.js b/platform/mv3/extension/js/config.js index 0c79dd62b..64e2f3e9b 100644 --- a/platform/mv3/extension/js/config.js +++ b/platform/mv3/extension/js/config.js @@ -33,6 +33,7 @@ export const rulesetConfig = { showBlockedCount: true, strictBlockMode: true, developerMode: false, + hasBroadHostPermissions: true, }; export const process = { diff --git a/platform/mv3/extension/js/mode-manager.js b/platform/mv3/extension/js/mode-manager.js index 01f973962..805a45a99 100644 --- a/platform/mv3/extension/js/mode-manager.js +++ b/platform/mv3/extension/js/mode-manager.js @@ -33,6 +33,11 @@ import { sessionRead, sessionWrite, } from './ext.js'; +import { + rulesetConfig, + saveRulesetConfig, +} from './config.js'; + import { adminReadEx } from './admin.js'; import { filteringModesToDNR } from './ruleset-manager.js'; @@ -219,14 +224,31 @@ export async function readFilteringModeDetails(bypassCache = false) { return readFilteringModeDetails.cache; } } - let [ userModes, adminNoFiltering ] = await Promise.all([ + let [ + userModes, + adminDefaultFiltering, + adminNoFiltering, + ] = await Promise.all([ localRead('filteringModeDetails'), + adminReadEx('defaultFiltering'), adminReadEx('noFiltering'), ]); if ( userModes === undefined ) { userModes = { optimal: [ 'all-urls' ] }; } userModes = unserializeModeDetails(userModes); + if ( adminDefaultFiltering !== undefined ) { + const modefromName = { + none: MODE_NONE, + basic: MODE_BASIC, + optimal: MODE_OPTIMAL, + complete: MODE_COMPLETE, + }; + const adminDefaultFilteringMode = modefromName[adminDefaultFiltering]; + if ( adminDefaultFilteringMode !== undefined ) { + applyFilteringMode(userModes, 'all-urls', adminDefaultFilteringMode); + } + } if ( Array.isArray(adminNoFiltering) ) { if ( adminNoFiltering.includes('-*') ) { userModes.none.clear(); @@ -341,19 +363,29 @@ export async function setTrustedSites(hostnames) { /******************************************************************************/ export async function syncWithBrowserPermissions() { - const [ permissions, beforeMode ] = await Promise.all([ + const [ + permissions, + beforeMode, + ] = await Promise.all([ browser.permissions.getAll(), getDefaultFilteringMode(), ]); const allowedHostnames = new Set(hostnamesFromMatches(permissions.origins || [])); + const hasBroadHostPermissions = allowedHostnames.has('all-urls'); + const broadHostPermissionsToggled = + hasBroadHostPermissions !== rulesetConfig.hasBroadHostPermissions; let modified = false; - if ( beforeMode > MODE_BASIC && allowedHostnames.has('all-urls') === false ) { + if ( beforeMode > MODE_BASIC && hasBroadHostPermissions === false ) { await setDefaultFilteringMode(MODE_BASIC); modified = true; - } else if ( beforeMode === MODE_BASIC && allowedHostnames.has('all-urls') ) { + } else if ( beforeMode === MODE_BASIC && hasBroadHostPermissions && broadHostPermissionsToggled ) { await setDefaultFilteringMode(MODE_OPTIMAL); modified = true; } + if ( broadHostPermissionsToggled ) { + rulesetConfig.hasBroadHostPermissions = hasBroadHostPermissions; + saveRulesetConfig(); + } const afterMode = await getDefaultFilteringMode(); if ( afterMode > MODE_BASIC ) { return afterMode !== beforeMode; } const filteringModes = await getFilteringModeDetails(); diff --git a/platform/mv3/extension/managed_storage.json b/platform/mv3/extension/managed_storage.json index 9fb3be661..5cf817aeb 100644 --- a/platform/mv3/extension/managed_storage.json +++ b/platform/mv3/extension/managed_storage.json @@ -2,6 +2,10 @@ "$schema": "http://json-schema.org/draft-03/schema#", "type": "object", "properties": { + "defaultFiltering": { + "title": "The default filtering mode", + "type": "string", + }, "noFiltering": { "title": "List of domains for which no filtering should occur", "type": "array",