2018-08-30 17:25:33 +03:00
|
|
|
package dnsfilter
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
"sync/atomic"
|
|
|
|
)
|
|
|
|
|
|
|
|
func isValidRule(rule string) bool {
|
|
|
|
if len(rule) < 4 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if rule[0] == '!' {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if rule[0] == '#' {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if strings.HasPrefix(rule, "[Adblock") {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-10-29 15:46:58 +03:00
|
|
|
// Filter out all sorts of cosmetic rules:
|
|
|
|
// https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-rules
|
2018-08-30 17:25:33 +03:00
|
|
|
masks := []string{
|
|
|
|
"##",
|
|
|
|
"#@#",
|
2018-10-29 15:46:58 +03:00
|
|
|
"#?#",
|
|
|
|
"#@?#",
|
2018-08-30 17:25:33 +03:00
|
|
|
"#$#",
|
|
|
|
"#@$#",
|
2018-10-29 15:46:58 +03:00
|
|
|
"#?$#",
|
|
|
|
"#@?$#",
|
2018-08-30 17:25:33 +03:00
|
|
|
"$$",
|
|
|
|
"$@$",
|
|
|
|
"#%#",
|
|
|
|
"#@%#",
|
|
|
|
}
|
|
|
|
for _, mask := range masks {
|
|
|
|
if strings.Contains(rule, mask) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateMax(valuePtr *int64, maxPtr *int64) {
|
|
|
|
for {
|
|
|
|
current := atomic.LoadInt64(valuePtr)
|
|
|
|
max := atomic.LoadInt64(maxPtr)
|
|
|
|
if current <= max {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
swapped := atomic.CompareAndSwapInt64(maxPtr, max, current)
|
2018-09-14 16:50:56 +03:00
|
|
|
if swapped {
|
2018-08-30 17:25:33 +03:00
|
|
|
break
|
|
|
|
}
|
|
|
|
// swapping failed because value has changed after reading, try again
|
|
|
|
}
|
|
|
|
}
|