Documentation
¶
Overview ¶
Package rules contains implementation of all kinds of blocking rules
Index ¶
- Constants
- Variables
- func FillRequestForHostname(r *Request, hostname string)
- type CosmeticOption
- type CosmeticRule
- type CosmeticRuleType
- type DNSMX
- type DNSRewrite
- type DNSSRV
- type DNSSVCB
- type HostRule
- type MatchingResult
- type NetworkRule
- func (f *NetworkRule) GetFilterListID() int
- func (f *NetworkRule) GetPermittedDomains() []string
- func (f *NetworkRule) IsGeneric() bool
- func (f *NetworkRule) IsHigherPriority(r *NetworkRule) bool
- func (f *NetworkRule) IsHostLevelNetworkRule() bool
- func (f *NetworkRule) IsOptionDisabled(option NetworkRuleOption) bool
- func (f *NetworkRule) IsOptionEnabled(option NetworkRuleOption) bool
- func (f *NetworkRule) IsRegexRule() (ok bool)
- func (f *NetworkRule) Match(r *Request) (ok bool)
- func (f *NetworkRule) String() string
- func (f *NetworkRule) Text() string
- type NetworkRuleOption
- type RCode
- type RRType
- type RRValue
- type Request
- type RequestType
- type Rule
- type RuleSyntaxError
Constants ¶
const ( // MaskStartURL definition: // Matching the beginning of an address. With this character you don't // have to specify a particular protocol and subdomain in address mask. // It means, || stands for http://*., https://*., ws://*., wss://*. at once. MaskStartURL = "||" // MaskPipe definition: // A pointer to the beginning or the end of address. The value depends on the // character placement in the mask. For example, a rule swf| corresponds // to http://example.com/annoyingflash.swf , but not to http://example.com/swf/index.html. // |http://example.org corresponds to http://example.org, but not to http://domain.com?url=http://example.org. MaskPipe = "|" // MaskSeparator definition: // Separator character mark. Separator character is any character, // but a letter, a digit, or one of the following: _ - . % MaskSeparator = "^" // MaskAnyCharacter is a wildcard character. It is used to represent "any set of characters". // This can also be an empty string or a string of any length. MaskAnyCharacter = "*" // RegexAnyCharacter corresponds to MaskAnyCharacter. RegexAnyCharacter = ".*" // RegexSeparator corresponds to MaskSeparator. RegexSeparator = "([^ a-zA-Z0-9.%_-]|$)" // RegexStartURL corresponds to MaskStartURL. RegexStartURL = "^(http|https|ws|wss)://([a-z0-9-_.]+\\.)?" // RegexEndString corresponds to MaskPipe if it is in the end of a pattern. RegexEndString = "$" // RegexStartString corresponds to MaskPipe if it is in the beginning of a pattern. RegexStartString = "^" )
Variables ¶
var ErrTooWideRule errors.Error = "the rule is too wide, add domain, denyallow, client, " +
"or ctag restrictions or make it more specific"
ErrTooWideRule is returned if the rule matches all urls but has no domain, denyallow, client or ctag restrictions.
var ErrUnsupportedRule errors.Error = "this type of rules is unsupported"
ErrUnsupportedRule signals that this might be a valid rule type, but it is not yet supported by this library
Functions ¶
func FillRequestForHostname ¶ added in v0.17.1
FillRequestForHostname fills an instance of request r for matching the hostname. It uses "http://" as a protocol for request URL and TypeDocument as request type.
Types ¶
type CosmeticOption ¶
type CosmeticOption uint32
CosmeticOption is the enumeration of various content script options. Depending on the set of enabled flags the content script will contain different set of settings.
const ( // CosmeticOptionGenericCSS - if generic elemhide and CSS rules are enabled. // Can be disabled by a $generichide rule. CosmeticOptionGenericCSS CosmeticOption = 1 << iota // CosmeticOptionCSS - if elemhide and CSS rules are enabled. // Can be disabled by an $elemhide rule. CosmeticOptionCSS // CosmeticOptionJS - if JS rules and scriptlets are enabled. // Can be disabled by a $jsinject rule. CosmeticOptionJS // TODO: Add support for these flags // They are useful when content script is injected into an iframe // In this case we can check what flags were applied to the top-level frame CosmeticOptionSourceGenericCSS CosmeticOptionSourceCSS CosmeticOptionSourceJS // CosmeticOptionAll - everything is enabled CosmeticOptionAll = CosmeticOptionGenericCSS | CosmeticOptionCSS | CosmeticOptionJS // CosmeticOptionNone - everything is disabled CosmeticOptionNone = CosmeticOption(0) )
CosmeticOption enumeration
type CosmeticRule ¶
type CosmeticRule struct {
// RuleText is the original rule text.
RuleText string
// Content meaning depends on the rule type:
// - Element hiding: content is just a selector;
// - CSS: content is a selector + style definition;
// - JS: text of the script to be injected.
Content string
// FilterListID is a list identifier.
FilterListID int
// Type of the rule.
Type CosmeticRuleType
// Whitelist means that this rule is meant to disable rules with the same
// content on the specified domains. For instance,
// https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#elemhide-exceptions.
Whitelist bool
// ExtendedCSS means that this rule is supposed to be applied by the
// javascript library, see https://github.com/AdguardTeam/ExtendedCss.
ExtendedCSS bool
// contains filtered or unexported fields
}
CosmeticRule represents a cosmetic rule (element hiding, CSS, scriptlet)
func NewCosmeticRule ¶
func NewCosmeticRule(ruleText string, filterListID int) (*CosmeticRule, error)
NewCosmeticRule parses the rule text and creates a
func (*CosmeticRule) GetFilterListID ¶
func (f *CosmeticRule) GetFilterListID() int
GetFilterListID returns ID of the filter list this rule belongs to
func (*CosmeticRule) GetPermittedDomains ¶
func (f *CosmeticRule) GetPermittedDomains() []string
GetPermittedDomains returns a list of permitted domains
func (*CosmeticRule) IsGeneric ¶
func (f *CosmeticRule) IsGeneric() bool
IsGeneric returns true if rule can be considered generic (is not limited to a specific domain)
func (*CosmeticRule) Match ¶
func (f *CosmeticRule) Match(hostname string) bool
Match returns true if this rule can be used on the specified hostname
func (*CosmeticRule) String ¶
func (f *CosmeticRule) String() string
String returns original rule text
func (*CosmeticRule) Text ¶
func (f *CosmeticRule) Text() string
Text returns the original rule text Implements the `Rule` interface
type CosmeticRuleType ¶
type CosmeticRuleType uint
CosmeticRuleType is the enumeration of different cosmetic rules
const ( CosmeticElementHiding CosmeticRuleType = iota // ## rules (https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-elemhide-rules) CosmeticCSS // #$# rules (https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules) CosmeticJS // #%# rules (https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules) // TODO: Move HTML filtering rules to a different file/structure CosmeticHTML // $$ rules (https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules) )
CosmeticRuleType enumeration
type DNSMX ¶ added in v0.14.1
DNSMX is the type of RRValue values returned for MX records in DNS rewrites.
type DNSRewrite ¶ added in v0.14.0
type DNSRewrite struct {
// Value is the value for the record. See [RRValue] documentation for more
// details.
Value RRValue
// NewCNAME is the new CNAME. If set, clients must ignore other fields,
// resolve the CNAME, and set the new records accordingly.
NewCNAME string
// RCode is the new DNS RCODE.
RCode RCode
// RRType is the new DNS resource record (RR) type. It is only non-zero
// if RCode is dns.RCodeSuccess.
RRType RRType
}
DNSRewrite is a DNS rewrite ($dnsrewrite) rule.
type DNSSRV ¶ added in v0.14.4
DNSSRV is the type of RRValue values returned for SRV records in DNS rewrites.
type DNSSVCB ¶ added in v0.14.1
DNSSVCB is the type of RRValue values returned for HTTPS and SVCB records in dns rewrites.
See https://tools.ietf.org/html/draft-ietf-dnsop-svcb-https-02.
type HostRule ¶
type HostRule struct {
// IP is the address of the rule.
IP netip.Addr
// RuleText is the original text of the rule.
RuleText string
// Hostnames is the slice of hostnames associated with IP.
Hostnames []string
// FilterListID is the identifier of the filter, containing the rule.
FilterListID int
}
HostRule is a structure for simple host-level rules (i.e. /etc/hosts syntax). http://man7.org/linux/man-pages/man5/hosts.5.html It also supports "just domain" syntax. In this case, the IP will be set to 0.0.0.0.
func NewHostRule ¶
NewHostRule parses the rule and creates a new HostRule instance The format is: IP_address canonical_hostname [aliases...]
func (*HostRule) GetFilterListID ¶
GetFilterListID returns ID of the filter list this rule belongs to
type MatchingResult ¶
type MatchingResult struct {
// BasicRule - a rule matching the request.
// It could lead to one of the following:
// * block the request
// * unblock the request (a regular whitelist rule or a document-level whitelist rule)
// * modify the way cosmetic rules work for this request
// * modify the response (see $redirect rules)
BasicRule *NetworkRule
// DocumentRule - a rule matching the request's referrer and having on of the following modifiers:
// * $document -- this one basically disables everything
// * $urlblock -- disables network-level rules (not cosmetic)
// * $genericblock -- disables generic network-level rules
//
// Other document-level modifiers like $jsinject or $content will be ignored here
// as they don't do anything
DocumentRule *NetworkRule
// StealthRule - this is a whitelist rule that negates stealth mode features
// Note that the stealth rule can be received from both rules and sourceRules
// https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#stealth-modifier
StealthRule *NetworkRule
// CspRules - a set of rules modifying the response's content-security-policy
// See $csp modifier
CspRules []*NetworkRule
// CookieRules - a set of rules modifying the request's and response's cookies
// See $cookie modifier
CookieRules []*NetworkRule
// ReplaceRules -- a set of rules modifying the response's content
// See $replace modifier
ReplaceRules []*NetworkRule
}
MatchingResult contains all the rules matching a web request, and provides methods that define how a web request should be processed
func NewMatchingResult ¶
func NewMatchingResult(rules, sourceRules []*NetworkRule) (result *MatchingResult)
NewMatchingResult creates an instance of the MatchingResult struct and fills it with the rules. rules - a set of rules matching the request URL sourceRules - a set of rules matching the referrer nolint:gocyclo
func (*MatchingResult) GetBasicResult ¶
func (m *MatchingResult) GetBasicResult() *NetworkRule
GetBasicResult returns a rule that should be applied to the web request.
Possible outcomes are: * returns nil -- bypass the request. * returns a whitelist rule -- bypass the request. * returns a blocking rule -- block the request.
func (*MatchingResult) GetCosmeticOption ¶
func (m *MatchingResult) GetCosmeticOption() CosmeticOption
GetCosmeticOption returns a bit-flag with the list of cosmetic options
type NetworkRule ¶
type NetworkRule struct {
// DNSRewrite is the DNS rewrite rule, if any.
DNSRewrite *DNSRewrite
// RuleText is the original rule text.
RuleText string
// Shortcut is the longest substring of the rule pattern with no special
// characters.
Shortcut string
// Mutex protects the fields.
sync.Mutex
// FilterListID is a filter list identifier.
FilterListID int
// Whitelist is true if this is an exception rule.
Whitelist bool
// contains filtered or unexported fields
}
NetworkRule is a basic filtering rule https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules
func GetDNSBasicRule ¶ added in v0.17.1
func GetDNSBasicRule(rules []*NetworkRule) (basicRule *NetworkRule)
GetDNSBasicRule returns a rule that should be applied to the DNS request.
func NewNetworkRule ¶
func NewNetworkRule(ruleText string, filterListID int) (r *NetworkRule, err error)
NewNetworkRule parses the rule text and returns a filter rule
func (*NetworkRule) GetFilterListID ¶
func (f *NetworkRule) GetFilterListID() int
GetFilterListID returns ID of the filter list this rule belongs to
func (*NetworkRule) GetPermittedDomains ¶
func (f *NetworkRule) GetPermittedDomains() []string
GetPermittedDomains - returns an array of domains this rule is allowed on
func (*NetworkRule) IsGeneric ¶
func (f *NetworkRule) IsGeneric() bool
IsGeneric returns true if the rule is considered "generic" "generic" means that the rule is not restricted to a limited set of domains Please note that it might be forbidden on some domains, though.
func (*NetworkRule) IsHigherPriority ¶
func (f *NetworkRule) IsHigherPriority(r *NetworkRule) bool
IsHigherPriority checks if the rule has higher priority that the specified rule whitelist + $important > $important > whitelist > basic rules nolint: gocyclo
func (*NetworkRule) IsHostLevelNetworkRule ¶
func (f *NetworkRule) IsHostLevelNetworkRule() bool
IsHostLevelNetworkRule checks if this rule can be used for hosts-level blocking
func (*NetworkRule) IsOptionDisabled ¶
func (f *NetworkRule) IsOptionDisabled(option NetworkRuleOption) bool
IsOptionDisabled returns true if the specified option is disabled
func (*NetworkRule) IsOptionEnabled ¶
func (f *NetworkRule) IsOptionEnabled(option NetworkRuleOption) bool
IsOptionEnabled returns true if the specified option is enabled
func (*NetworkRule) IsRegexRule ¶
func (f *NetworkRule) IsRegexRule() (ok bool)
IsRegexRule returns true if the rule is a regular expression rule
func (*NetworkRule) Match ¶
func (f *NetworkRule) Match(r *Request) (ok bool)
Match checks if this filtering rule matches the specified request.
func (*NetworkRule) String ¶
func (f *NetworkRule) String() string
String returns original rule text
func (*NetworkRule) Text ¶
func (f *NetworkRule) Text() string
Text returns the original rule text Implements the `Rule` interface
type NetworkRuleOption ¶
type NetworkRuleOption uint64
NetworkRuleOption is the enumeration of various rule options In order to save memory, we store some options as a flag
const ( OptionThirdParty NetworkRuleOption = 1 << iota // $third-party modifier OptionMatchCase // $match-case modifier OptionImportant // $important modifier OptionBadfilter // $badfilter modifier OptionElemhide // $elemhide modifier OptionGenerichide // $generichide modifier OptionGenericblock // $genericblock modifier OptionJsinject // $jsinject modifier OptionUrlblock // $urlblock modifier OptionContent // $content modifier OptionExtension // $extension modifier // Whitelist -- specific to Stealth mode OptionStealth // $stealth // Content-modifying (TODO: get rid of, deprecated in favor of $redirect) OptionEmpty // $empty OptionMp4 // $mp4 // Blocking OptionPopup // $popup // Advanced (TODO: Implement) OptionCsp // $csp OptionReplace // $replace OptionCookie // $cookie OptionRedirect // $redirect // Blacklist-only options OptionBlacklistOnly = OptionPopup | OptionEmpty | OptionMp4 // Whitelist-only options OptionWhitelistOnly = OptionElemhide | OptionGenericblock | OptionGenerichide | OptionJsinject | OptionUrlblock | OptionContent | OptionExtension | OptionStealth // Options supported by host-level network rules OptionHostLevelRulesOnly = OptionImportant | OptionBadfilter )
NetworkRuleOption enumeration
func (NetworkRuleOption) Count ¶
func (o NetworkRuleOption) Count() int
Count returns the count of enabled options.
type RCode ¶ added in v0.14.0
type RCode = int
RCode is a semantic alias for int when used as a DNS response code RCODE.
type RRType ¶ added in v0.14.0
type RRType = uint16
RRType is a semantic alias for uint16 when used as a DNS resource record (RR) type.
type RRValue ¶ added in v0.14.0
type RRValue = any
RRValue is the value of a resource record. Depending on the RRType, it will have different types:
- netip.Addr for dns.TypeA and dns.TypeAAAA;
- non-nil *DNSMX for dns.TypeMX;
- string for dns.TypePTR (it's also a valid FQDN);
- string for dns.TypeTXT;
- non-nil *DNSSVCB for dns.TypeHTTPS and dns.TypeSVCB;
- non-nil *DNSSRV for dns.TypeSRV;
- nil otherwise, but new types may be added in the future.
type Request ¶
type Request struct {
// ClientIP is the IP address to match against $client modifiers. The
// default zero value won't be considered.
ClientIP netip.Addr
// ClientName is the name to match against $client modifiers. The default
// empty value won't be considered.
ClientName string
// URL is the full request URL.
URL string
// URLLowerCase is the full request URL in lower case.
URLLowerCase string
// Hostname is the hostname to filter.
Hostname string
// Domain is the effective top-level domain of the request with an
// additional label.
Domain string
// SourceURL is the full URL of the source.
SourceURL string
// SourceHostname is the hostname of the source.
SourceHostname string
// SourceDomain is the effective top-level domain of the source with an
// additional label.
SourceDomain string
// SortedClientTags is the list of tags to match against $ctag modifiers.
SortedClientTags []string
// RequestType is the type of the filtering request.
RequestType RequestType
// DNSType is the type of the resource record (RR) of a DNS request, for
// example "A" or "AAAA". See [RRValue] for all acceptable constants and
// their corresponding values.
DNSType uint16
// ThirdParty is true if the filtering request should consider $third-party
// modifier.
ThirdParty bool
// IsHostnameRequest means that the request is for a given Hostname, and not
// for a URL, and we don't really know what protocol it is. This can be
// true for DNS requests, for HTTP CONNECT, or for SNI matching.
IsHostnameRequest bool
}
Request represents a web filtering request with all it's necessary properties.
func NewRequest ¶
func NewRequest(url, sourceURL string, requestType RequestType) *Request
NewRequest creates a new instance of "Request" and populates it's fields
func NewRequestForHostname ¶
NewRequestForHostname creates a new instance of Request for matching the hostname. It uses "http://" as a protocol and TypeDocument as a request type.
type RequestType ¶
type RequestType uint32
RequestType is the request types enumeration
const ( // TypeDocument (main frame) TypeDocument RequestType = 1 << iota // TypeSubdocument (iframe) $subdocument TypeSubdocument // TypeScript (javascript, etc) $script TypeScript // TypeStylesheet (css) $stylesheet TypeStylesheet // TypeObject (flash, etc) $object TypeObject // TypeImage (any image) $image TypeImage // TypeXmlhttprequest (ajax/fetch) $xmlhttprequest TypeXmlhttprequest // TypeMedia (video/music) $media TypeMedia // TypeFont (any custom font) $font TypeFont // TypeWebsocket (a websocket connection) $websocket TypeWebsocket // TypePing (navigator.sendBeacon() or ping attribute on links) $ping TypePing // TypeOther - any other request type TypeOther )
func (RequestType) Count ¶
func (t RequestType) Count() int
Count returns the count of the enabled flags.
type Rule ¶
type Rule interface {
// Text returns the original rule text
Text() string
// GetFilterListID returns ID of the filter list this rule belongs to
GetFilterListID() int
}
Rule is a base interface for all filtering rules
type RuleSyntaxError ¶
type RuleSyntaxError struct {
// contains filtered or unexported fields
}
RuleSyntaxError represents an error while parsing a filtering rule
func (*RuleSyntaxError) Error ¶
func (e *RuleSyntaxError) Error() string