From 32b115a4b4d08768cab366663eb853baa0b9a97e Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Wed, 8 Nov 2023 18:26:01 +0200 Subject: [PATCH] support permissions modifier for compiler validation --- packages/tsurlfilter/CHANGELOG.md | 9 ++++ .../src/rules/network-rule-options.ts | 1 + .../tsurlfilter/src/rules/network-rule.ts | 50 ++++++++++++------- .../test/rules/rule-converter.test.ts | 6 +++ .../test/rules/rule-validator.test.ts | 8 +++ 5 files changed, 55 insertions(+), 19 deletions(-) diff --git a/packages/tsurlfilter/CHANGELOG.md b/packages/tsurlfilter/CHANGELOG.md index 2470a1a73..4143ca3b1 100644 --- a/packages/tsurlfilter/CHANGELOG.md +++ b/packages/tsurlfilter/CHANGELOG.md @@ -9,11 +9,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 +## [2.2.4] - 2023-11-08 + +### Added + +- Support of `$permissions` modifier for compiler validation + [#66](https://github.com/AdguardTeam/tsurlfilter/issues/66) + + ## [2.2.3] - 2023-11-03 ### Added - Support of `$referrerpolicy` modifier for compiler validation + [#191](https://github.com/AdguardTeam/FiltersCompiler/issues/191) ## [2.2.2] - 2023-10-17 diff --git a/packages/tsurlfilter/src/rules/network-rule-options.ts b/packages/tsurlfilter/src/rules/network-rule-options.ts index 200e2873a..d30e7e09c 100644 --- a/packages/tsurlfilter/src/rules/network-rule-options.ts +++ b/packages/tsurlfilter/src/rules/network-rule-options.ts @@ -50,6 +50,7 @@ export const NETWORK_RULE_OPTIONS = { CTAG: 'ctag', METHOD: 'method', TO: 'to', + PERMISSIONS: 'permissions', ALL: 'all', }; diff --git a/packages/tsurlfilter/src/rules/network-rule.ts b/packages/tsurlfilter/src/rules/network-rule.ts index 5d49913a8..bcfb4db13 100644 --- a/packages/tsurlfilter/src/rules/network-rule.ts +++ b/packages/tsurlfilter/src/rules/network-rule.ts @@ -73,41 +73,44 @@ export enum NetworkRuleOption { // Other modifiers /** $popup modifier */ - Popup = 1 << 14, + Popup = 1 << 12, /** $csp modifier */ - Csp = 1 << 15, + Csp = 1 << 13, /** $replace modifier */ - Replace = 1 << 16, + Replace = 1 << 14, /** $cookie modifier */ - Cookie = 1 << 17, + Cookie = 1 << 15, /** $redirect modifier */ - Redirect = 1 << 18, + Redirect = 1 << 16, /** $badfilter modifier */ - Badfilter = 1 << 19, + Badfilter = 1 << 17, /** $removeparam modifier */ - RemoveParam = 1 << 20, + RemoveParam = 1 << 18, /** $removeheader modifier */ - RemoveHeader = 1 << 21, + RemoveHeader = 1 << 19, /** $jsonprune modifier */ - JsonPrune = 1 << 22, + JsonPrune = 1 << 20, /** $hls modifier */ - Hls = 1 << 23, + Hls = 1 << 21, // Compatibility dependent /** $network modifier */ - Network = 1 << 24, + Network = 1 << 22, /** dns modifiers */ - Client = 1 << 25, - DnsRewrite = 1 << 26, - DnsType = 1 << 27, - Ctag = 1 << 28, + Client = 1 << 23, + DnsRewrite = 1 << 24, + DnsType = 1 << 25, + Ctag = 1 << 26, - // $method modifier - Method = 1 << 30, + /* $method modifier */ + Method = 1 << 27, - // $to modifier - To = 1 << 31, + /* $to modifier */ + To = 1 << 28, + + /* $permissions modifier */ + Permissions = 1 << 29, // Groups (for validation) @@ -1460,6 +1463,15 @@ export class NetworkRule implements rule.IRule { this.setOptionEnabled(NetworkRuleOption.RemoveHeader, true); this.advancedModifier = new RemoveHeaderModifier(optionValue, this.isAllowlist()); break; + // $permissions + case OPTIONS.PERMISSIONS: + // simple validation of permissions rules for compiler. + // should be fully supported in tsurlfilter v2.3 and the browser extension v4.4. AG-17467 + if (isCompatibleWith(CompatibilityTypes.Extension)) { + throw new SyntaxError('Extension does not support $permissions modifier yet'); + } + this.setOptionEnabled(NetworkRuleOption.Permissions, true); + break; // $jsonprune // simple validation of jsonprune rules for compiler // https://github.com/AdguardTeam/FiltersCompiler/issues/168 diff --git a/packages/tsurlfilter/test/rules/rule-converter.test.ts b/packages/tsurlfilter/test/rules/rule-converter.test.ts index 86c6598af..b61374a1f 100644 --- a/packages/tsurlfilter/test/rules/rule-converter.test.ts +++ b/packages/tsurlfilter/test/rules/rule-converter.test.ts @@ -370,6 +370,12 @@ describe('Options', () => { checkConversionResult(rule, rule); }); + it('converts permissions option properly', () => { + const rule = '||example.org^$permissions=geolocation=()'; + // converted rule should be the same as original + checkConversionResult(rule, rule); + }); + it('converts hls option properly', () => { const rule = String.raw`||example.org^$hls=/#UPLYNK-SEGMENT:.*\,ad/t`; // converted rule should be the same as original diff --git a/packages/tsurlfilter/test/rules/rule-validator.test.ts b/packages/tsurlfilter/test/rules/rule-validator.test.ts index 9ff7027c9..3dc7fccf4 100644 --- a/packages/tsurlfilter/test/rules/rule-validator.test.ts +++ b/packages/tsurlfilter/test/rules/rule-validator.test.ts @@ -85,6 +85,14 @@ describe('RuleValidator', () => { expect(RuleValidator.validate(ruleText).valid).toBeTruthy(); }); + it('validates permissions modifier', () => { + // TODO: remove following comment and setConfiguration() after the implementation + // $permissions is not implemented for extension yet + setConfiguration({ compatibility: CompatibilityTypes.CoreLibs }); + const ruleText = '||example.org^$permissions=geolocation=()'; + expect(RuleValidator.validate(ruleText).valid).toBeTruthy(); + }); + it('validates referrerpolicy modifier', () => { // $referrerpolicy is not supported by the extension setConfiguration({ compatibility: CompatibilityTypes.CoreLibs });