[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.
This commit is contained in:
Raymond Hill 2025-04-16 15:04:47 -04:00
parent 3b34f9439a
commit b8adf5b027
No known key found for this signature in database
GPG key ID: 25E1490B761470C2
4 changed files with 49 additions and 4 deletions

View file

@ -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);

View file

@ -33,6 +33,7 @@ export const rulesetConfig = {
showBlockedCount: true,
strictBlockMode: true,
developerMode: false,
hasBroadHostPermissions: true,
};
export const process = {

View file

@ -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();

View file

@ -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",