Skip to content

Commit 0f6400c

Browse files
committed
[mv3] Add support for permissions= filter option
Related discussion: uBlockOrigin/uBlock-issues#2714
1 parent 54e4b8c commit 0f6400c

File tree

5 files changed

+40
-29
lines changed

5 files changed

+40
-29
lines changed

platform/mv3/extension/js/popup.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ async function init() {
310310
const { rules, filters, css } = details;
311311
let ruleCount = rules.plain + rules.regex;
312312
if ( popupPanelData.hasOmnipotence ) {
313-
ruleCount += rules.removeparam + rules.redirect + rules.csp;
313+
ruleCount += rules.removeparam + rules.redirect + rules.modifyHeaders;
314314
}
315315
let specificCount = 0;
316316
if ( typeof css.specific === 'number' ) {

platform/mv3/extension/js/ruleset-manager.js

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ const REMOVEPARAMS_REALM_START = REGEXES_REALM_END;
3838
const REMOVEPARAMS_REALM_END = REMOVEPARAMS_REALM_START + RULE_REALM_SIZE;
3939
const REDIRECT_REALM_START = REMOVEPARAMS_REALM_END;
4040
const REDIRECT_REALM_END = REDIRECT_REALM_START + RULE_REALM_SIZE;
41-
const CSP_REALM_START = REDIRECT_REALM_END;
42-
const CSP_REALM_END = CSP_REALM_START + RULE_REALM_SIZE;
41+
const MODIFYHEADERS_REALM_START = REDIRECT_REALM_END;
42+
const MODIFYHEADERS_REALM_END = MODIFYHEADERS_REALM_START + RULE_REALM_SIZE;
4343
const TRUSTED_DIRECTIVE_BASE_RULE_ID = 8000000;
4444

4545
/******************************************************************************/
@@ -326,7 +326,7 @@ async function updateRedirectRules() {
326326

327327
/******************************************************************************/
328328

329-
async function updateCspRules() {
329+
async function updateModifyHeadersRules() {
330330
const [
331331
hasOmnipotence,
332332
rulesetDetails,
@@ -337,36 +337,36 @@ async function updateCspRules() {
337337
getDynamicRules(),
338338
]);
339339

340-
// Fetch csp rules for all enabled rulesets
340+
// Fetch modifyHeaders rules for all enabled rulesets
341341
const toFetch = [];
342342
for ( const details of rulesetDetails ) {
343-
if ( details.rules.csp === 0 ) { continue; }
344-
toFetch.push(fetchJSON(`/rulesets/csp/${details.id}`));
343+
if ( details.rules.modifyHeaders === 0 ) { continue; }
344+
toFetch.push(fetchJSON(`/rulesets/modify-headers/${details.id}`));
345345
}
346-
const cspRulesets = await Promise.all(toFetch);
346+
const rulesets = await Promise.all(toFetch);
347347

348348
// Redirect rules can only be enforced with omnipotence
349349
const newRules = [];
350350
if ( hasOmnipotence ) {
351-
let cspRuleId = CSP_REALM_START;
352-
for ( const rules of cspRulesets ) {
351+
let ruleId = MODIFYHEADERS_REALM_START;
352+
for ( const rules of rulesets ) {
353353
if ( Array.isArray(rules) === false ) { continue; }
354354
for ( const rule of rules ) {
355-
rule.id = cspRuleId++;
355+
rule.id = ruleId++;
356356
newRules.push(rule);
357357
}
358358
}
359359
}
360360

361-
// Add csp rules to dynamic ruleset without affecting rules
362-
// outside csp rules realm.
361+
// Add modifyHeaders rules to dynamic ruleset without affecting rules
362+
// outside modifyHeaders realm.
363363
const newRuleMap = new Map(newRules.map(rule => [ rule.id, rule ]));
364364
const addRules = [];
365365
const removeRuleIds = [];
366366

367367
for ( const oldRule of dynamicRuleMap.values() ) {
368-
if ( oldRule.id < CSP_REALM_START ) { continue; }
369-
if ( oldRule.id >= CSP_REALM_END ) { continue; }
368+
if ( oldRule.id < MODIFYHEADERS_REALM_START ) { continue; }
369+
if ( oldRule.id >= MODIFYHEADERS_REALM_END ) { continue; }
370370
const newRule = newRuleMap.get(oldRule.id);
371371
if ( newRule === undefined ) {
372372
removeRuleIds.push(oldRule.id);
@@ -387,10 +387,10 @@ async function updateCspRules() {
387387
if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; }
388388

389389
if ( removeRuleIds.length !== 0 ) {
390-
ubolLog(`Remove ${removeRuleIds.length} DNR csp rules`);
390+
ubolLog(`Remove ${removeRuleIds.length} DNR modifyHeaders rules`);
391391
}
392392
if ( addRules.length !== 0 ) {
393-
ubolLog(`Add ${addRules.length} DNR csp rules`);
393+
ubolLog(`Add ${addRules.length} DNR modifyHeaders rules`);
394394
}
395395

396396
return dnr.updateDynamicRules({ addRules, removeRuleIds });
@@ -405,7 +405,7 @@ async function updateDynamicRules() {
405405
updateRegexRules(),
406406
updateRemoveparamRules(),
407407
updateRedirectRules(),
408-
updateCspRules(),
408+
updateModifyHeadersRules(),
409409
]);
410410
}
411411

platform/mv3/extension/js/settings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ function rulesetStats(rulesetId) {
4646
const { rules, filters } = rulesetDetails;
4747
let ruleCount = rules.plain + rules.regex;
4848
if ( hasOmnipotence ) {
49-
ruleCount += rules.removeparam + rules.redirect + rules.csp;
49+
ruleCount += rules.removeparam + rules.redirect + rules.modifyHeaders;
5050
}
5151
const filterCount = filters.accepted;
5252
return { ruleCount, filterCount };

platform/mv3/make-rulesets.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ const isRedirect = rule =>
228228
rule.action.type === 'redirect' &&
229229
rule.action.redirect.extensionPath !== undefined;
230230

231-
const isCsp = rule =>
231+
const isModifyHeaders = rule =>
232232
rule.action !== undefined &&
233233
rule.action.type === 'modifyHeaders';
234234

@@ -240,7 +240,7 @@ const isRemoveparam = rule =>
240240
const isGood = rule =>
241241
isUnsupported(rule) === false &&
242242
isRedirect(rule) === false &&
243-
isCsp(rule) === false &&
243+
isModifyHeaders(rule) === false &&
244244
isRemoveparam(rule) === false;
245245

246246
/******************************************************************************/
@@ -298,11 +298,11 @@ async function processNetworkFilters(assetDetails, network) {
298298
);
299299
log(`\tremoveparams= (accepted/discarded): ${removeparamsGood.length}/${removeparamsBad.length}`);
300300

301-
const csps = rules.filter(rule =>
301+
const modifyHeaders = rules.filter(rule =>
302302
isUnsupported(rule) === false &&
303-
isCsp(rule)
303+
isModifyHeaders(rule)
304304
);
305-
log(`\tcsp=: ${csps.length}`);
305+
log(`\tmodifyHeaders=: ${modifyHeaders.length}`);
306306

307307
const bad = rules.filter(rule =>
308308
isUnsupported(rule)
@@ -336,10 +336,10 @@ async function processNetworkFilters(assetDetails, network) {
336336
);
337337
}
338338

339-
if ( csps.length !== 0 ) {
339+
if ( modifyHeaders.length !== 0 ) {
340340
writeFile(
341-
`${rulesetDir}/csp/${assetDetails.id}.json`,
342-
`${JSON.stringify(csps, replacer, 1)}\n`
341+
`${rulesetDir}/modify-headers/${assetDetails.id}.json`,
342+
`${JSON.stringify(modifyHeaders, replacer, 1)}\n`
343343
);
344344
}
345345

@@ -351,7 +351,7 @@ async function processNetworkFilters(assetDetails, network) {
351351
regex: regexes.length,
352352
removeparam: removeparamsGood.length,
353353
redirect: redirects.length,
354-
csp: csps.length,
354+
modifyHeaders: modifyHeaders.length,
355355
};
356356
}
357357

@@ -966,7 +966,7 @@ async function rulesetFromURLs(assetDetails) {
966966
regex: netStats.regex,
967967
removeparam: netStats.removeparam,
968968
redirect: netStats.redirect,
969-
csp: netStats.csp,
969+
modifyHeaders: netStats.modifyHeaders,
970970
discarded: netStats.discarded,
971971
rejected: netStats.rejected,
972972
},

src/js/static-net-filtering.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4441,6 +4441,17 @@ FilterContainer.prototype.dnrFromCompiled = function(op, context, ...args) {
44414441
dnrAddRuleError(rule, 'Unsupported modifier exception');
44424442
}
44434443
break;
4444+
case 'permissions':
4445+
rule.action.type = 'modifyHeaders';
4446+
rule.action.responseHeaders = [{
4447+
header: 'permissions-policy',
4448+
operation: 'append',
4449+
value: rule.__modifierValue.split('|').join(', '),
4450+
}];
4451+
if ( rule.__modifierAction === AllowAction ) {
4452+
dnrAddRuleError(rule, 'Unsupported modifier exception');
4453+
}
4454+
break;
44444455
case 'redirect-rule': {
44454456
let priority = rule.priority || 1;
44464457
let token = rule.__modifierValue;

0 commit comments

Comments
 (0)