]> git.mxchange.org Git - fba.git/commitdiff
Continued:
authorRoland Häder <roland@mxchange.org>
Fri, 9 Jun 2023 10:04:53 +0000 (12:04 +0200)
committerRoland Häder <roland@mxchange.org>
Fri, 9 Jun 2023 10:04:53 +0000 (12:04 +0200)
- ops, have forgotten to move this function to own module

fba/federation/__init__.py
fba/federation/friendica.py [new file with mode: 0644]

index 31e599293a7734999a1e376a412d7d647d75286d..af23ef3eae8245a8fc720c3aea0282f9ea7bd67e 100644 (file)
@@ -1,4 +1,5 @@
 __all__ = [
+    'friendica',
     'lemmy',
     'mastodon',
     'misskey',
diff --git a/fba/federation/friendica.py b/fba/federation/friendica.py
new file mode 100644 (file)
index 0000000..a596a6c
--- /dev/null
@@ -0,0 +1,71 @@
+# Fedi API Block - An aggregator for fetching blocking data from fediverse nodes
+# Copyright (C) 2023 Free Software Foundation
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+import bs4
+
+from fba import config
+from fba import fba
+from fba import instances
+from fba import network
+
+def fetch_blocks(domain: str) -> dict:
+    # DEBUG: print(f"DEBUG: domain='{domain}' - CALLED!")
+    if not isinstance(domain, str):
+        raise ValueError(f"Parameter domain[]={type(domain)} is not 'str'")
+    elif domain == "":
+        raise ValueError("Parameter 'domain' is empty")
+
+    # DEBUG: print("DEBUG: Fetching friendica blocks from domain:", domain)
+    blocked = list()
+
+    try:
+        doc = bs4.BeautifulSoup(
+            network.fetch_response(domain, "/friendica", network.web_headers, (config.get("connection_timeout"), config.get("read_timeout"))).text,
+            "html.parser",
+        )
+    except BaseException as exception:
+        print("WARNING: Failed to fetch /friendica from domain:", domain, exception)
+        instances.update_last_error(domain, exception)
+        return {}
+
+    blocklist = doc.find(id="about_blocklist")
+
+    # Prevents exceptions:
+    if blocklist is None:
+        # DEBUG: print("DEBUG: Instance has no block list:", domain)
+        return {}
+
+    table = blocklist.find("table")
+
+    # DEBUG: print(f"DEBUG: table[]='{type(table)}'")
+    if table.find("tbody"):
+        rows = table.find("tbody").find_all("tr")
+    else:
+        rows = table.find_all("tr")
+
+    # DEBUG: print(f"DEBUG: Found rows()={len(rows)}")
+    for line in rows:
+        # DEBUG: print(f"DEBUG: line='{line}'")
+        blocked.append({
+            "domain": fba.tidyup_domain(line.find_all("td")[0].text),
+            "reason": fba.tidyup_reason(line.find_all("td")[1].text)
+        })
+        # DEBUG: print("DEBUG: Next!")
+
+    # DEBUG: print("DEBUG: Returning blocklist() for domain:", domain, len(blocklist))
+    return {
+        "reject": blocked
+    }