2021-05-21 06:15:47 -07:00
|
|
|
package filtering
|
2019-07-23 02:21:37 -07:00
|
|
|
|
|
|
|
import (
|
2019-07-23 02:16:36 -07:00
|
|
|
"encoding/json"
|
|
|
|
"net/http"
|
|
|
|
|
2019-07-23 02:21:37 -07:00
|
|
|
"github.com/AdguardTeam/golibs/log"
|
2019-11-27 05:11:46 -07:00
|
|
|
"github.com/AdguardTeam/urlfilter/rules"
|
2019-07-23 02:21:37 -07:00
|
|
|
)
|
|
|
|
|
2019-11-27 05:11:46 -07:00
|
|
|
var serviceRules map[string][]*rules.NetworkRule // service name -> filtering rules
|
2019-07-23 02:21:37 -07:00
|
|
|
|
|
|
|
type svc struct {
|
|
|
|
name string
|
|
|
|
rules []string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Keep in sync with:
|
|
|
|
// client/src/helpers/constants.js
|
|
|
|
// client/src/components/ui/Icons.js
|
|
|
|
var serviceRulesArray = []svc{
|
2020-08-12 03:03:17 -07:00
|
|
|
{"whatsapp", []string{"||whatsapp.net^", "||whatsapp.com^"}},
|
2020-03-26 13:26:05 -07:00
|
|
|
{"facebook", []string{
|
2020-08-12 03:03:17 -07:00
|
|
|
"||facebook.com^",
|
|
|
|
"||facebook.net^",
|
|
|
|
"||fbcdn.net^",
|
|
|
|
"||accountkit.com^",
|
|
|
|
"||fb.me^",
|
|
|
|
"||fb.com^",
|
|
|
|
"||fbsbx.com^",
|
|
|
|
"||messenger.com^",
|
|
|
|
"||facebookcorewwwi.onion^",
|
|
|
|
"||fbcdn.com^",
|
2020-03-26 13:26:05 -07:00
|
|
|
}},
|
2020-08-12 03:03:17 -07:00
|
|
|
{"twitter", []string{"||twitter.com^", "||twttr.com^", "||t.co^", "||twimg.com^"}},
|
2020-03-26 13:26:05 -07:00
|
|
|
{"youtube", []string{
|
2020-08-12 03:03:17 -07:00
|
|
|
"||youtube.com^",
|
2020-03-26 13:26:05 -07:00
|
|
|
"||ytimg.com^",
|
2020-08-12 03:03:17 -07:00
|
|
|
"||youtu.be^",
|
|
|
|
"||googlevideo.com^",
|
|
|
|
"||youtubei.googleapis.com^",
|
|
|
|
"||youtube-nocookie.com^",
|
2020-05-30 08:51:44 -07:00
|
|
|
"||youtube",
|
2020-03-26 13:26:05 -07:00
|
|
|
}},
|
2020-08-12 03:03:17 -07:00
|
|
|
{"twitch", []string{"||twitch.tv^", "||ttvnw.net^", "||jtvnw.net^", "||twitchcdn.net^"}},
|
2020-10-13 08:42:43 -07:00
|
|
|
{"netflix", []string{"||nflxext.com^", "||netflix.com^", "||nflximg.net^", "||nflxvideo.net^", "||nflxso.net^"}},
|
2020-08-12 03:03:17 -07:00
|
|
|
{"instagram", []string{"||instagram.com^", "||cdninstagram.com^"}},
|
2020-04-20 15:52:45 -07:00
|
|
|
{"snapchat", []string{
|
2020-08-12 03:03:17 -07:00
|
|
|
"||snapchat.com^",
|
|
|
|
"||sc-cdn.net^",
|
|
|
|
"||snap-dev.net^",
|
2020-04-20 15:52:45 -07:00
|
|
|
"||snapkit.co",
|
2020-08-12 03:03:17 -07:00
|
|
|
"||snapads.com^",
|
|
|
|
"||impala-media-production.s3.amazonaws.com^",
|
2020-04-20 15:52:45 -07:00
|
|
|
}},
|
2020-08-12 03:03:17 -07:00
|
|
|
{"discord", []string{"||discord.gg^", "||discordapp.net^", "||discordapp.com^", "||discord.com^", "||discord.media^"}},
|
2019-07-23 02:21:37 -07:00
|
|
|
{"ok", []string{"||ok.ru^"}},
|
2020-08-12 03:03:17 -07:00
|
|
|
{"skype", []string{"||skype.com^", "||skypeassets.com^"}},
|
|
|
|
{"vk", []string{"||vk.com^", "||userapi.com^", "||vk-cdn.net^", "||vkuservideo.net^"}},
|
2019-11-05 06:00:15 -07:00
|
|
|
{"origin", []string{"||origin.com^", "||signin.ea.com^", "||accounts.ea.com^"}},
|
2020-04-20 15:52:45 -07:00
|
|
|
{"steam", []string{
|
|
|
|
"||steam.com^",
|
2020-08-12 03:03:17 -07:00
|
|
|
"||steampowered.com^",
|
|
|
|
"||steamcommunity.com^",
|
|
|
|
"||steamstatic.com^",
|
2020-04-20 15:52:45 -07:00
|
|
|
"||steamstore-a.akamaihd.net^",
|
|
|
|
"||steamcdn-a.akamaihd.net^",
|
|
|
|
}},
|
2020-08-12 03:03:17 -07:00
|
|
|
{"epic_games", []string{"||epicgames.com^", "||easyanticheat.net^", "||easy.ac^", "||eac-cdn.com^"}},
|
|
|
|
{"reddit", []string{"||reddit.com^", "||redditstatic.com^", "||redditmedia.com^", "||redd.it^"}},
|
2019-07-23 02:21:37 -07:00
|
|
|
{"mail_ru", []string{"||mail.ru^"}},
|
2019-11-06 19:39:30 -07:00
|
|
|
{"cloudflare", []string{
|
2020-08-12 03:03:17 -07:00
|
|
|
"||cloudflare.com^",
|
|
|
|
"||cloudflare-dns.com^",
|
|
|
|
"||cloudflare.net^",
|
|
|
|
"||cloudflareinsights.com^",
|
|
|
|
"||cloudflarestream.com^",
|
|
|
|
"||cloudflareresolve.com^",
|
|
|
|
"||cloudflareclient.com^",
|
|
|
|
"||cloudflarebolt.com^",
|
|
|
|
"||cloudflarestatus.com^",
|
|
|
|
"||cloudflare.cn^",
|
2019-11-06 19:39:30 -07:00
|
|
|
"||one.one^",
|
|
|
|
"||warp.plus^",
|
2020-03-26 13:26:05 -07:00
|
|
|
"||1.1.1.1^",
|
2020-08-12 03:03:17 -07:00
|
|
|
"||dns4torpnlfs2ifuz2s2yf3fc7rdmsbhm6rw75euj35pac6ap25zgqad.onion^",
|
2019-11-06 19:39:30 -07:00
|
|
|
}},
|
2019-11-05 02:36:06 -07:00
|
|
|
{"amazon", []string{
|
2020-08-12 03:03:17 -07:00
|
|
|
"||amazon.com^",
|
|
|
|
"||media-amazon.com^",
|
|
|
|
"||primevideo.com^",
|
|
|
|
"||amazontrust.com^",
|
|
|
|
"||images-amazon.com^",
|
|
|
|
"||ssl-images-amazon.com^",
|
|
|
|
"||amazonpay.com^",
|
|
|
|
"||amazonpay.in^",
|
|
|
|
"||amazon-adsystem.com^",
|
|
|
|
"||a2z.com^",
|
|
|
|
"||amazon.ae^",
|
|
|
|
"||amazon.ca^",
|
|
|
|
"||amazon.cn^",
|
|
|
|
"||amazon.de^",
|
|
|
|
"||amazon.es^",
|
|
|
|
"||amazon.fr^",
|
|
|
|
"||amazon.in^",
|
|
|
|
"||amazon.it^",
|
|
|
|
"||amazon.nl^",
|
|
|
|
"||amazon.com.au^",
|
|
|
|
"||amazon.com.br^",
|
|
|
|
"||amazon.co.jp^",
|
|
|
|
"||amazon.com.mx^",
|
|
|
|
"||amazon.co.uk^",
|
|
|
|
"||createspace.com^",
|
2020-05-30 08:51:44 -07:00
|
|
|
"||aws",
|
2019-11-05 02:36:06 -07:00
|
|
|
}},
|
2019-11-06 02:00:05 -07:00
|
|
|
{"ebay", []string{
|
2020-08-12 03:03:17 -07:00
|
|
|
"||ebay.com^",
|
|
|
|
"||ebayimg.com^",
|
|
|
|
"||ebaystatic.com^",
|
|
|
|
"||ebaycdn.net^",
|
|
|
|
"||ebayinc.com^",
|
|
|
|
"||ebay.at^",
|
|
|
|
"||ebay.be^",
|
|
|
|
"||ebay.ca^",
|
|
|
|
"||ebay.ch^",
|
|
|
|
"||ebay.cn^",
|
|
|
|
"||ebay.de^",
|
|
|
|
"||ebay.es^",
|
|
|
|
"||ebay.fr^",
|
|
|
|
"||ebay.ie^",
|
|
|
|
"||ebay.in^",
|
|
|
|
"||ebay.it^",
|
|
|
|
"||ebay.ph^",
|
|
|
|
"||ebay.pl^",
|
|
|
|
"||ebay.nl^",
|
|
|
|
"||ebay.com.au^",
|
|
|
|
"||ebay.com.cn^",
|
|
|
|
"||ebay.com.hk^",
|
|
|
|
"||ebay.com.my^",
|
|
|
|
"||ebay.com.sg^",
|
|
|
|
"||ebay.co.uk^",
|
2019-11-06 02:00:05 -07:00
|
|
|
}},
|
2019-09-17 14:26:58 -07:00
|
|
|
{"tiktok", []string{
|
2020-08-12 03:03:17 -07:00
|
|
|
"||tiktok.com^",
|
|
|
|
"||tiktokcdn.com^",
|
2020-04-20 15:52:45 -07:00
|
|
|
"||musical.ly^",
|
2020-08-12 03:03:17 -07:00
|
|
|
"||snssdk.com^",
|
|
|
|
"||amemv.com^",
|
2019-09-17 14:26:58 -07:00
|
|
|
"||toutiao.com^",
|
|
|
|
"||ixigua.com^",
|
|
|
|
"||pstatp.com^",
|
2020-08-12 03:03:17 -07:00
|
|
|
"||ixiguavideo.com^",
|
|
|
|
"||toutiaocloud.com^",
|
|
|
|
"||toutiaocloud.net^",
|
|
|
|
"||bdurl.com^",
|
|
|
|
"||bytecdn.cn^",
|
|
|
|
"||byteimg.com^",
|
|
|
|
"||ixigua.com^",
|
|
|
|
"||muscdn.com^",
|
2019-11-21 14:51:52 -07:00
|
|
|
"||bytedance.map.fastly.net^",
|
2020-08-12 03:03:17 -07:00
|
|
|
"||douyin.com^",
|
|
|
|
"||tiktokv.com^",
|
2019-09-17 14:26:58 -07:00
|
|
|
}},
|
2021-02-04 08:16:01 -07:00
|
|
|
{"vimeo", []string{
|
|
|
|
"||vimeo.com^",
|
|
|
|
"||vimeocdn.com^",
|
|
|
|
"*vod-adaptive.akamaized.net^",
|
|
|
|
}},
|
|
|
|
{"pinterest", []string{
|
|
|
|
"||pinterest.*^",
|
|
|
|
"||pinimg.com^",
|
|
|
|
}},
|
|
|
|
{"imgur", []string{
|
|
|
|
"||imgur.com^",
|
|
|
|
}},
|
|
|
|
{"dailymotion", []string{
|
|
|
|
"||dailymotion.com^",
|
|
|
|
"||dm-event.net^",
|
|
|
|
"||dmcdn.net^",
|
|
|
|
}},
|
|
|
|
{"qq", []string{
|
|
|
|
// block qq.com and subdomains excluding WeChat domains
|
|
|
|
"^(?!weixin|wx)([^.]+\\.)?qq\\.com$",
|
|
|
|
"||qqzaixian.com^",
|
|
|
|
}},
|
|
|
|
{"wechat", []string{
|
|
|
|
"||wechat.com^",
|
|
|
|
"||weixin.qq.com^",
|
|
|
|
"||wx.qq.com^",
|
|
|
|
}},
|
|
|
|
{"viber", []string{
|
|
|
|
"||viber.com^",
|
|
|
|
}},
|
|
|
|
{"weibo", []string{
|
|
|
|
"||weibo.com^",
|
|
|
|
}},
|
|
|
|
{"9gag", []string{
|
|
|
|
"||9cache.com^",
|
|
|
|
"||gag.com^",
|
|
|
|
}},
|
|
|
|
{"telegram", []string{
|
|
|
|
"||t.me^",
|
|
|
|
"||telegram.me^",
|
|
|
|
"||telegram.org^",
|
|
|
|
}},
|
|
|
|
{"disneyplus", []string{
|
|
|
|
"||disney-plus.net^",
|
|
|
|
"||disneyplus.com^",
|
|
|
|
}},
|
|
|
|
{"hulu", []string{
|
|
|
|
"||hulu.com^",
|
|
|
|
}},
|
|
|
|
{"spotify", []string{
|
|
|
|
"/_spotify-connect._tcp.local/",
|
|
|
|
"||spotify.com^",
|
|
|
|
"||scdn.co^",
|
|
|
|
"||spotify.com.edgesuite.net^",
|
|
|
|
"||spotify.map.fastly.net^",
|
|
|
|
"||spotify.map.fastlylb.net^",
|
|
|
|
"||spotifycdn.net^",
|
|
|
|
"||audio-ak-spotify-com.akamaized.net^",
|
|
|
|
"||audio4-ak-spotify-com.akamaized.net^",
|
|
|
|
"||heads-ak-spotify-com.akamaized.net^",
|
|
|
|
"||heads4-ak-spotify-com.akamaized.net^",
|
|
|
|
}},
|
|
|
|
{"tinder", []string{
|
|
|
|
"||gotinder.com^",
|
|
|
|
"||tinder.com^",
|
|
|
|
"||tindersparks.com^",
|
|
|
|
}},
|
2019-07-23 02:21:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// convert array to map
|
2020-02-18 10:17:35 -07:00
|
|
|
func initBlockedServices() {
|
2019-11-27 05:11:46 -07:00
|
|
|
serviceRules = make(map[string][]*rules.NetworkRule)
|
2019-07-23 02:21:37 -07:00
|
|
|
for _, s := range serviceRulesArray {
|
2019-11-27 05:11:46 -07:00
|
|
|
netRules := []*rules.NetworkRule{}
|
2019-07-23 02:21:37 -07:00
|
|
|
for _, text := range s.rules {
|
2019-11-27 05:11:46 -07:00
|
|
|
rule, err := rules.NewNetworkRule(text, 0)
|
2019-07-23 02:21:37 -07:00
|
|
|
if err != nil {
|
2019-11-27 05:11:46 -07:00
|
|
|
log.Error("rules.NewNetworkRule: %s rule: %s", err, text)
|
2019-07-23 02:21:37 -07:00
|
|
|
continue
|
|
|
|
}
|
2019-11-27 05:11:46 -07:00
|
|
|
netRules = append(netRules, rule)
|
2019-07-23 02:21:37 -07:00
|
|
|
}
|
2019-11-27 05:11:46 -07:00
|
|
|
serviceRules[s.name] = netRules
|
2019-07-23 02:21:37 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-18 10:17:35 -07:00
|
|
|
// BlockedSvcKnown - return TRUE if a blocked service name is known
|
|
|
|
func BlockedSvcKnown(s string) bool {
|
2020-03-02 08:51:48 -07:00
|
|
|
_, ok := serviceRules[s]
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
2019-07-23 02:21:37 -07:00
|
|
|
// ApplyBlockedServices - set blocked services settings for this DNS request
|
2021-05-21 06:15:47 -07:00
|
|
|
func (d *DNSFilter) ApplyBlockedServices(setts *Settings, list []string, global bool) {
|
2020-02-18 10:17:35 -07:00
|
|
|
setts.ServicesRules = []ServiceEntry{}
|
|
|
|
if global {
|
|
|
|
d.confLock.RLock()
|
|
|
|
defer d.confLock.RUnlock()
|
|
|
|
list = d.Config.BlockedServices
|
|
|
|
}
|
2019-07-23 02:21:37 -07:00
|
|
|
for _, name := range list {
|
|
|
|
rules, ok := serviceRules[name]
|
|
|
|
|
|
|
|
if !ok {
|
|
|
|
log.Error("unknown service name: %s", name)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2020-02-18 10:17:35 -07:00
|
|
|
s := ServiceEntry{}
|
2019-07-23 02:21:37 -07:00
|
|
|
s.Name = name
|
|
|
|
s.Rules = rules
|
|
|
|
setts.ServicesRules = append(setts.ServicesRules, s)
|
|
|
|
}
|
|
|
|
}
|
2019-07-23 02:16:36 -07:00
|
|
|
|
2020-12-17 03:32:46 -07:00
|
|
|
func (d *DNSFilter) handleBlockedServicesList(w http.ResponseWriter, r *http.Request) {
|
2020-02-18 10:17:35 -07:00
|
|
|
d.confLock.RLock()
|
|
|
|
list := d.Config.BlockedServices
|
|
|
|
d.confLock.RUnlock()
|
2019-07-23 02:16:36 -07:00
|
|
|
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
|
|
err := json.NewEncoder(w).Encode(list)
|
|
|
|
if err != nil {
|
2020-02-18 10:17:35 -07:00
|
|
|
httpError(r, w, http.StatusInternalServerError, "json.Encode: %s", err)
|
2019-07-23 02:16:36 -07:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-17 03:32:46 -07:00
|
|
|
func (d *DNSFilter) handleBlockedServicesSet(w http.ResponseWriter, r *http.Request) {
|
2019-07-23 02:16:36 -07:00
|
|
|
list := []string{}
|
|
|
|
err := json.NewDecoder(r.Body).Decode(&list)
|
|
|
|
if err != nil {
|
2020-02-18 10:17:35 -07:00
|
|
|
httpError(r, w, http.StatusBadRequest, "json.Decode: %s", err)
|
2019-07-23 02:16:36 -07:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2020-02-18 10:17:35 -07:00
|
|
|
d.confLock.Lock()
|
|
|
|
d.Config.BlockedServices = list
|
|
|
|
d.confLock.Unlock()
|
2019-07-23 02:16:36 -07:00
|
|
|
|
|
|
|
log.Debug("Updated blocked services list: %d", len(list))
|
|
|
|
|
2020-02-18 10:17:35 -07:00
|
|
|
d.ConfigModified()
|
2019-07-23 02:16:36 -07:00
|
|
|
}
|
|
|
|
|
2020-02-18 10:17:35 -07:00
|
|
|
// registerBlockedServicesHandlers - register HTTP handlers
|
2020-12-17 03:32:46 -07:00
|
|
|
func (d *DNSFilter) registerBlockedServicesHandlers() {
|
2021-02-04 04:15:34 -07:00
|
|
|
d.Config.HTTPRegister(http.MethodGet, "/control/blocked_services/list", d.handleBlockedServicesList)
|
|
|
|
d.Config.HTTPRegister(http.MethodPost, "/control/blocked_services/set", d.handleBlockedServicesSet)
|
2019-07-23 02:16:36 -07:00
|
|
|
}
|