Skip to content

Commit 1cb660b

Browse files
committedAug 17, 2024
Fix plain exceptions not overriding block filters using header= option
Related issue: uBlockOrigin/uBlock-issues#3347
1 parent 8de454c commit 1cb660b

File tree

1 file changed

+64
-73
lines changed

1 file changed

+64
-73
lines changed
 

Diff for: ‎src/js/static-net-filtering.js

+64-73
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,15 @@
1919
Home: https://github.com/gorhill/uBlock
2020
*/
2121

22-
/* globals vAPI */
23-
24-
'use strict';
22+
import * as sfp from './static-filtering-parser.js';
2523

26-
/******************************************************************************/
24+
import { domainFromHostname, hostnameFromNetworkURL } from './uri-utils.js';
25+
import { dropTask, queueTask } from './tasks.js';
2726

28-
import { queueTask, dropTask } from './tasks.js';
2927
import BidiTrieContainer from './biditrie.js';
30-
import HNTrieContainer from './hntrie.js';
3128
import { CompiledListReader } from './static-filtering-io.js';
32-
import * as sfp from './static-filtering-parser.js';
33-
34-
import {
35-
domainFromHostname,
36-
hostnameFromNetworkURL,
37-
} from './uri-utils.js';
38-
39-
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#browser_compatibility
40-
//
41-
// This import would be best done dynamically, but since dynamic imports are
42-
// not supported by older browsers, for now a static import is necessary.
4329
import { FilteringContext } from './filtering-context.js';
30+
import HNTrieContainer from './hntrie.js';
4431

4532
/******************************************************************************/
4633

@@ -3423,63 +3410,63 @@ class FilterCompiler {
34233410

34243411
processOptionWithValue(parser, id) {
34253412
switch ( id ) {
3426-
case sfp.NODE_TYPE_NET_OPTION_NAME_CSP:
3427-
if ( this.processCspOption(parser.getNetOptionValue(id)) === false ) { return false; }
3428-
break;
3429-
case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW:
3430-
this.denyallowOpt = this.processHostnameList(
3431-
parser.getNetFilterDenyallowOptionIterator(),
3432-
);
3433-
if ( this.denyallowOpt === '' ) { return false; }
3434-
this.optionUnitBits |= DENYALLOW_BIT;
3435-
break;
3436-
case sfp.NODE_TYPE_NET_OPTION_NAME_FROM:
3437-
this.fromDomainOpt = this.processHostnameList(
3438-
parser.getNetFilterFromOptionIterator(),
3439-
this.fromDomainOptList
3440-
);
3441-
if ( this.fromDomainOpt === '' ) { return false; }
3442-
this.optionUnitBits |= FROM_BIT;
3443-
break;
3444-
case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER: {
3445-
this.headerOpt = parser.getNetOptionValue(id) || '';
3446-
this.optionUnitBits |= HEADER_BIT;
3447-
break;
3413+
case sfp.NODE_TYPE_NET_OPTION_NAME_CSP:
3414+
if ( this.processCspOption(parser.getNetOptionValue(id)) === false ) { return false; }
3415+
break;
3416+
case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW:
3417+
this.denyallowOpt = this.processHostnameList(
3418+
parser.getNetFilterDenyallowOptionIterator(),
3419+
);
3420+
if ( this.denyallowOpt === '' ) { return false; }
3421+
this.optionUnitBits |= DENYALLOW_BIT;
3422+
break;
3423+
case sfp.NODE_TYPE_NET_OPTION_NAME_FROM:
3424+
this.fromDomainOpt = this.processHostnameList(
3425+
parser.getNetFilterFromOptionIterator(),
3426+
this.fromDomainOptList
3427+
);
3428+
if ( this.fromDomainOpt === '' ) { return false; }
3429+
this.optionUnitBits |= FROM_BIT;
3430+
break;
3431+
case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER: {
3432+
this.headerOpt = parser.getNetOptionValue(id) || '';
3433+
this.optionUnitBits |= HEADER_BIT;
3434+
break;
3435+
}
3436+
case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD:
3437+
this.processMethodOption(parser.getNetOptionValue(id));
3438+
this.optionUnitBits |= METHOD_BIT;
3439+
break;
3440+
case sfp.NODE_TYPE_NET_OPTION_NAME_PERMISSIONS:
3441+
case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE:
3442+
case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM:
3443+
case sfp.NODE_TYPE_NET_OPTION_NAME_REPLACE:
3444+
case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM:
3445+
if ( this.processModifierOption(id, parser.getNetOptionValue(id)) === false ) {
3446+
return false;
34483447
}
3449-
case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD:
3450-
this.processMethodOption(parser.getNetOptionValue(id));
3451-
this.optionUnitBits |= METHOD_BIT;
3452-
break;
3453-
case sfp.NODE_TYPE_NET_OPTION_NAME_PERMISSIONS:
3454-
case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE:
3455-
case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM:
3456-
case sfp.NODE_TYPE_NET_OPTION_NAME_REPLACE:
3457-
case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM:
3458-
if ( this.processModifierOption(id, parser.getNetOptionValue(id)) === false ) {
3459-
return false;
3460-
}
3461-
this.optionUnitBits |= MODIFY_BIT;
3462-
break;
3463-
case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT: {
3464-
const actualId = this.action === ALLOW_REALM
3465-
? sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE
3466-
: id;
3467-
if ( this.processModifierOption(actualId, parser.getNetOptionValue(id)) === false ) {
3468-
return false;
3469-
}
3470-
this.optionUnitBits |= MODIFY_BIT;
3471-
break;
3448+
this.optionUnitBits |= MODIFY_BIT;
3449+
break;
3450+
case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT: {
3451+
const actualId = this.action === ALLOW_REALM
3452+
? sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE
3453+
: id;
3454+
if ( this.processModifierOption(actualId, parser.getNetOptionValue(id)) === false ) {
3455+
return false;
34723456
}
3473-
case sfp.NODE_TYPE_NET_OPTION_NAME_TO:
3474-
this.toDomainOpt = this.processHostnameList(
3475-
parser.getNetFilterToOptionIterator(),
3476-
this.toDomainOptList
3477-
);
3478-
if ( this.toDomainOpt === '' ) { return false; }
3479-
this.optionUnitBits |= TO_BIT;
3480-
break;
3481-
default:
3482-
break;
3457+
this.optionUnitBits |= MODIFY_BIT;
3458+
break;
3459+
}
3460+
case sfp.NODE_TYPE_NET_OPTION_NAME_TO:
3461+
this.toDomainOpt = this.processHostnameList(
3462+
parser.getNetFilterToOptionIterator(),
3463+
this.toDomainOptList
3464+
);
3465+
if ( this.toDomainOpt === '' ) { return false; }
3466+
this.optionUnitBits |= TO_BIT;
3467+
break;
3468+
default:
3469+
break;
34833470
}
34843471
return true;
34853472
}
@@ -3798,7 +3785,7 @@ class FilterCompiler {
37983785
isJustOrigin() {
37993786
if ( this.optionUnitBits !== FROM_BIT ) { return false; }
38003787
if ( this.isRegex ) { return false; }
3801-
if ( /[\/~]/.test(this.fromDomainOpt) ) { return false; }
3788+
if ( /[/~]/.test(this.fromDomainOpt) ) { return false; }
38023789
if ( this.pattern === '*' ) { return true; }
38033790
if ( this.anchor !== 0b010 ) { return false; }
38043791
if ( /^(?:http[s*]?:(?:\/\/)?)$/.test(this.pattern) ) { return true; }
@@ -5156,6 +5143,10 @@ StaticNetFilteringEngine.prototype.matchHeaders = function(fctxt, headers) {
51565143
if ( r !== 0 && $isBlockImportant !== true ) {
51575144
if ( this.realmMatchString(HEADERS_REALM | ALLOW_REALM, typeBits, partyBits) ) {
51585145
r = 2;
5146+
} else if ( this.realmMatchString(ALLOW_REALM, typeBits, partyBits) ) {
5147+
r = 2;
5148+
}
5149+
if ( r === 2 ) {
51595150
if ( this.realmMatchString(HEADERS_REALM | BLOCKIMPORTANT_REALM, typeBits, partyBits) ) {
51605151
r = 1;
51615152
}

0 commit comments

Comments
 (0)