]> git.mxchange.org Git - fba.git/blob - fba/helpers/blacklist.py
321fe3fb270295696ab2b8d36b7b0127e419a4ae
[fba.git] / fba / helpers / blacklist.py
1 # Fedi API Block - An aggregator for fetching blocking data from fediverse nodes
2 # Copyright (C) 2023 Free Software Foundation
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published
6 # by the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
16
17 import logging
18
19 from functools import lru_cache
20
21 from fba.helpers import domain as domain_helper
22
23 logging.basicConfig(level=logging.INFO)
24 logger = logging.getLogger(__name__)
25 #logger.setLevel(logging.DEBUG)
26
27 # Don't check these, known trolls/flooders/testing/developing
28 _blacklist = {
29     "activitypub-troll.cf"           : "Floods federation with fake nodes as \"research\" project",
30     "activitypub-proxy.cf"           : "Floods federation with fake nodes as \"research\" project",
31     "misskey-forkbomb.cf"            : "Floods federation tables with fake nodes",
32     "gab.best"                       : "Floods federation tables with fake nodes",
33     "4chan.icu"                      : "Floods federation tables with fake nodes",
34     "social.shrimpcam.pw"            : "Floods federation tables with fake nodes",
35     "mastotroll.netz.org"            : "Floods federation tables with fake nodes",
36     "lhr.life"                       : "Floods federation tables with fake nodes",
37     "localhost.run"                  : "Floods federation tables with fake nodes",
38     "loca.lt"                        : "Floods federation tables with fake nodes",
39     "grid.tf"                        : "Floods federation tables with fake nodes",
40     "gitpod.io"                      : "Floods federation tables with fake nodes",
41     "everyoneattack.com"             : "Floods federation tables with fake nodes",
42     "vercel.app"                     : "Floods federation tables with fake nodes",
43     "run.app"                        : "Floods federation tables with fake nodes",
44     "sutty.nl"                       : "Floods federation tables with fake nodes",
45     "mdrqnxtagon.pw"                 : "Floods federation tables with fake nodes",
46     "denden.world"                   : "Looks like a valid Mastodon instance, but return exactly (!) 5k instances with trash domains",
47     "fnaf.stream"                    : "Trolls with over-long sub-domain name(s)",
48     "ngrok.io"                       : "Testing/developing instances shouldn't be part of public instances",
49     "ngrok.app"                      : "Testing/developing instances shouldn't be part of public instances",
50     "ngrok-free.app"                 : "Testing/developing instances shouldn't be part of public instances",
51     "misskeytest.chn.moe"            : "Testing/developing instances shouldn't be part of public instances",
52     "netlify.app"                    : "Testing/developing instances shouldn't be part of public instances",
53     "ignorelist.com"                 : "Testing/developing instances shouldn't be part of public instances",
54     "app.github.dev"                 : "Testing/developing instances shouldn't be part of public instances",
55     "tunnel.silicon.moe"             : "Testing/developing instances shouldn't be part of public instances",
56     "7988276.xyz"                    : "Testing/developing instances shouldn't be part of public instances",
57     "hexbear.net"                    : "Is a Lemmy instance with malicious JavaScript code (shell commands)",
58     "mastodon.n41.lat"               : "Somehow this instance repeatedly causes an OOM here",
59     "fb.me"                          : "Facebook websites are never Fediverse instances",
60     "osl.academy"                    : "Parked domain, no fediverse instance",
61     "icolectiva.org"                 : "Parked domain, no fediverse instance",
62     "blombus.com"                    : "Parked domain, no fediverse instance",
63     "eliotberriot.com"               : "Parked domain, no fediverse instance",
64     "fsam.one"                       : "Parked domain, no fediverse instance",
65     "doot.tv"                        : "Parked domain, no fediverse instance",
66     "snet.blog"                      : "Parked domain, no fediverse instance",
67     "horserock.xyz"                  : "Parked domain, no fediverse instance",
68     "free-pic.org"                   : "Parked domain, no fediverse instance",
69     "co-mastdn.ga"                   : "Parked domain, no fediverse instance",
70     "chocoflan.net"                  : "Parked domain, no fediverse instance",
71     "singleuser.club"                : "Parked domain, no fediverse instance",
72     "qwest.net"                      : "Dynamic IP address hosts should not be used for fediverse instances",
73     "github.io"                      : "GITHub's 'pages' service won't contain any fediverse instance",
74     "github.com"                     : "GIT repository hosting service",
75     "clients.your-server.de"         : "Please get yourself a proper domain name, no static-IP host names",
76     "reverse.open-telekom-cloud.com" : "Please get yourself a proper domain name, no static-IP host names",
77     "static.sl-reverse.messenger.com": "Please get yourself a proper domain name, no static-IP host names",
78     "documentation.on.seirdy.one"    : "Just ignore such lines!",
79 }
80
81 @lru_cache
82 def is_blacklisted(domain: str) -> bool:
83     logger.debug("domain='%s' - CALLED!", domain)
84     domain_helper.raise_on(domain)
85
86     blacklisted = False
87     logger.debug("Checking %d blacklist entries ...", len(_blacklist))
88     for blocked in _blacklist:
89         logger.debug("Checking blocked='%s' ...", blocked)
90         if blocked in domain:
91             logger.debug("domain='%s' is blacklisted.", domain)
92             blacklisted = True
93             break
94
95     logger.debug("blacklisted='%s' - EXIT!", blacklisted)
96     return blacklisted
97
98 def get_all() -> dict:
99     logger.debug("_blacklist()=%d - CALLED!", len(_blacklist))
100     return _blacklist