]> git.mxchange.org Git - fba.git/blobdiff - fba/networks/misskey.py
Continued:
[fba.git] / fba / networks / misskey.py
index 045b5061c807fa4547802e26edcef8243e4b31b5..4c4b99d135c58aefc63a90b2df008574295890e3 100644 (file)
@@ -17,6 +17,7 @@
 import json
 import logging
 
+from fba.helpers import blacklist
 from fba.helpers import config
 from fba.helpers import dicts as dict_helper
 from fba.helpers import domain as domain_helper
@@ -29,28 +30,34 @@ from fba.models import instances
 
 logging.basicConfig(level=logging.INFO)
 logger = logging.getLogger(__name__)
+#logger.setLevel(logging.DEBUG)
 
 def fetch_peers(domain: str) -> list:
     logger.debug("domain='%s' - CALLED!", domain)
     domain_helper.raise_on(domain)
 
+    if blacklist.is_blacklisted(domain):
+        raise RuntimeError(f"domain='{domain}' is blacklisted but function was invoked")
+    elif not instances.is_registered(domain):
+        raise RuntimeError(f"domain='{domain}' is not registered but function was invoked")
+
     logger.debug("domain='%s' is misskey, sending API POST request ...", domain)
-    peers  = list()
+    peers  = []
     offset = 0
     step   = config.get("misskey_limit")
 
     # No CSRF by default, you don't have to add network.api_headers by yourself here
-    headers = tuple()
+    headers = {}
 
     try:
         logger.debug("Checking CSRF for domain='%s'", domain)
-        headers = csrf.determine(domain, dict())
+        headers = csrf.determine(domain, {})
     except network.exceptions as exception:
         logger.warning("Exception '%s' during checking CSRF (fetch_peers,%s)", type(exception), __name__)
         instances.set_last_error(domain, exception)
 
         logger.debug("Returning empty list ... - EXIT!")
-        return list()
+        return []
 
     # iterating through all "suspended" (follow-only in its terminology)
     # instances page-by-page, since that troonware doesn't support
@@ -59,13 +66,13 @@ def fetch_peers(domain: str) -> list:
         logger.debug("Fetching offset=%d from domain='%s' ...", offset, domain)
         if offset == 0:
             fetched = network.post_json_api(domain, "/api/federation/instances", json.dumps({
-                "sort" : "+pubAt",
+                "sort" : "+pubSub",
                 "host" : None,
                 "limit": step
             }), headers)
         else:
             fetched = network.post_json_api(domain, "/api/federation/instances", json.dumps({
-                "sort"  : "+pubAt",
+                "sort"  : "+pubSub",
                 "host"  : None,
                 "limit" : step,
                 "offset": offset - 1
@@ -78,7 +85,7 @@ def fetch_peers(domain: str) -> list:
             instances.set_last_error(domain, fetched)
             break
         elif isinstance(fetched["json"], dict) and "error" in fetched["json"] and "message" in fetched["json"]["error"]:
-            logger.warning("post_json_api() returned error: '%s'", fetched['error']['message'])
+            logger.warning("post_json_api() returned error: '%s'", fetched["json"]["error"]["message"])
             instances.set_last_error(domain, fetched["json"]["error"]["message"])
             break
 
@@ -88,9 +95,9 @@ def fetch_peers(domain: str) -> list:
         if len(rows) == 0:
             logger.debug("Returned zero bytes, domain='%s' - BREAK!", domain)
             break
-        elif len(rows) != config.get("misskey_limit"):
-            logger.debug("Fetched %d row(s) but expected: %d", len(rows), config.get('misskey_limit'))
-            offset = offset + (config.get("misskey_limit") - len(rows))
+        elif len(rows) != step:
+            logger.debug("Fetched %d row(s) but expected: %d", len(rows), step)
+            offset = offset + (step - len(rows))
         else:
             logger.debug("Raising offset by step=%d", step)
             offset = offset + step
@@ -103,16 +110,19 @@ def fetch_peers(domain: str) -> list:
                 logger.warning("row()=%d does not contain key 'host': row='%s',domain='%s' - SKIPPED!", len(row), row, domain)
                 continue
             elif not isinstance(row["host"], str):
-                logger.warning("row[host][]='%s' is not of type 'str' - SKIPPED!", type(row['host']))
+                logger.warning("row[host][]='%s' has not expected type 'str' - SKIPPED!", type(row["host"]))
+                continue
+            elif row["host"] == "":
+                logger.warning("row[host] is an empty string,domain='%s' - SKIPPED!", domain)
                 continue
             elif row["host"] in peers:
-                logger.debug("Not adding row[host]='%s', already found - SKIPPED!", row['host'])
+                logger.debug("Not adding row[host]='%s', already found - SKIPPED!", row["host"])
                 continue
             elif not domain_helper.is_wanted(row["host"]):
                 logger.debug("row[host]='%s' is not wanted - SKIPPED!", row["host"])
                 continue
 
-            logger.debug("Adding peer: row[host]='%s'", row['host'])
+            logger.debug("Adding peer: row[host]='%s'", row["host"])
             added = added + 1
             peers.append(row["host"])
 
@@ -128,46 +138,47 @@ def fetch_blocks(domain: str) -> list:
     logger.debug("domain='%s' - CALLED!", domain)
     domain_helper.raise_on(domain)
 
-    if not instances.is_registered(domain):
-        raise Exception(f"domain='{domain}' is not registered but function is invoked.")
+    if blacklist.is_blacklisted(domain):
+        raise RuntimeError(f"domain='{domain}' is blacklisted but function was invoked")
+    elif not instances.is_registered(domain):
+        raise RuntimeError(f"domain='{domain}' is not registered but function was invoked")
 
     # No CSRF by default, you don't have to add network.api_headers by yourself here
-    headers = tuple()
+    headers = {}
 
     try:
-        logger.debug("Checking CSRF for domain='%s'", domain)
-        headers = csrf.determine(domain, dict())
+        logger.debug("Checking CSRF for domain='%s' ...", domain)
+        headers = csrf.determine(domain, {})
     except network.exceptions as exception:
         logger.warning("Exception '%s' during checking CSRF (fetch_blocks,%s)", type(exception), __name__)
         instances.set_last_error(domain, exception)
 
         logger.debug("Returning empty list ... - EXIT!")
-        return list()
+        return []
 
-    blocklist = list()
+    blocklist = []
     offset    = 0
     step      = config.get("misskey_limit")
 
     # iterating through all "suspended" (follow-only in its terminology)
     # instances page-by-page since it doesn't support sending them all at once
-    logger.debug("Fetching misskey blocks from domain='%s'", domain)
+    logger.debug("Fetching misskey blocks from domain='%s' ...", domain)
     while True:
+        logger.debug("offset=%d", offset)
         try:
             logger.debug("Fetching offset=%d from domain='%s' ...", offset, domain)
             if offset == 0:
-                logger.debug("Sending JSON API request to domain='%s',step=%d,offset=%d", domain, step, offset)
+                logger.debug("Sending JSON API request to domain='%s',step=%d ...", domain, step)
                 fetched = network.post_json_api(domain, "/api/federation/instances", json.dumps({
-                    "sort"     : "+pubAt",
+                    "sort"     : "+pubSub",
                     "host"     : None,
-                    "suspended": True,
                     "limit"    : step
                 }), headers)
             else:
-                logger.debug("Sending JSON API request to domain='%s',step=%d,offset=%d", domain, step, offset)
+                logger.debug("Sending JSON API request to domain='%s',step=%d,offset=%d ...", domain, step, offset)
                 fetched = network.post_json_api(domain, "/api/federation/instances", json.dumps({
-                    "sort"     : "+pubAt",
+                    "sort"     : "+pubSub",
                     "host"     : None,
-                    "suspended": True,
                     "limit"    : step,
                     "offset"   : offset - 1
                 }), headers)
@@ -178,7 +189,7 @@ def fetch_blocks(domain: str) -> list:
                 instances.set_last_error(domain, fetched)
                 break
             elif isinstance(fetched["json"], dict) and "error" in fetched["json"] and "message" in fetched["json"]["error"]:
-                logger.warning("post_json_api() returned error: '%s'", fetched['error']['message'])
+                logger.warning("post_json_api() returned error: '%s'", fetched["json"]["error"]["message"])
                 instances.set_last_error(domain, fetched["json"]["error"]["message"])
                 break
 
@@ -188,29 +199,33 @@ def fetch_blocks(domain: str) -> list:
             if len(rows) == 0:
                 logger.debug("Returned zero bytes, domain='%s' - BREAK!", domain)
                 break
-            elif len(rows) != config.get("misskey_limit"):
-                logger.debug("Fetched %d row(s) but expected: %d", len(rows), config.get('misskey_limit'))
-                offset = offset + (config.get("misskey_limit") - len(rows))
+            elif len(rows) != step:
+                logger.debug("Fetched %d row(s) but expected: %d", len(rows), step)
+                offset = offset + (step - len(rows))
             else:
                 logger.debug("Raising offset by step=%d", step)
                 offset = offset + step
 
             count = 0
+            logger.debug("Checking %d row(s) of instances ...", len(rows))
             for instance in rows:
                 # Is it there?
                 logger.debug("instance[]='%s'", type(instance))
                 if "host" not in instance:
                     logger.warning("instance(%d)='%s' has no key 'host' - SKIPPED!", len(instance), instance)
                     continue
-                elif instance["host"] is None or instance["host"] == "":
-                    logger.debug("instance[host]='%s' is None or empty - SKIPPED!", instance["host"])
+                elif not isinstance(instance["host"], str):
+                    logger.warning("instance[host][]='%s' has not expected type 'str' - SKIPPED!", type(instance["host"]))
+                    continue
+                elif instance["host"] == "":
+                    logger.warning("instance[host] is an empty string,domain='%s' - SKIPPED!", domain)
                     continue
 
                 logger.debug("instance[host]='%s' - BEFORE!", instance["host"])
                 blocked = tidyup.domain(instance["host"])
-
                 logger.debug("blocked[%s]='%s' - AFTER!", type(blocked), blocked)
-                if blocked is None or blocked == "":
+
+                if blocked in [None, ""]:
                     logger.warning("instance[host]='%s' is None or empty after tidyup.domain() - SKIPPED!", instance["host"])
                     continue
                 elif not domain_helper.is_wanted(blocked):
@@ -218,95 +233,38 @@ def fetch_blocks(domain: str) -> list:
                     continue
                 elif "isSuspended" in instance and instance["isSuspended"] and not dict_helper.has_key(blocklist, "blocked", blocked):
                     count = count + 1
-                    logger.debug("Appending blocker='%s',blocked='%s',block_level='suspended'", domain, blocked)
+                    logger.debug("Appending blocker='%s',blocked='%s',block_level='suspended' ... #1", domain, blocked)
                     blocklist.append({
                         "blocker"    : domain,
                         "blocked"    : blocked,
                         "reason"     : None,
                         "block_level": "suspended",
                     })
-
-            logger.debug("count=%d", count)
-            if count == 0:
-                logger.debug("API is no more returning new instances, aborting loop! domain='%s'", domain)
-                break
-
-        except network.exceptions as exception:
-            logger.warning("Caught error, exiting loop: domain='%s',exception[%s]='%s'", domain, type(exception), str(exception))
-            instances.set_last_error(domain, exception)
-            offset = 0
-            break
-
-    while True:
-        # Fetch blocked (full suspended) instances
-        try:
-            if offset == 0:
-                logger.debug("Sending JSON API request to domain='%s',step=%d,offset=%d", domain, step, offset)
-                fetched = network.post_json_api(domain, "/api/federation/instances", json.dumps({
-                    "sort"   : "+pubAt",
-                    "host"   : None,
-                    "blocked": True,
-                    "limit"  : step
-                }), headers)
-            else:
-                logger.debug("Sending JSON API request to domain='%s',step=%d,offset=%d", domain, step, offset)
-                fetched = network.post_json_api(domain, "/api/federation/instances", json.dumps({
-                    "sort"   : "+pubAt",
-                    "host"   : None,
-                    "blocked": True,
-                    "limit"  : step,
-                    "offset" : offset - 1
-                }), headers)
-
-            logger.debug("fetched[]='%s'", type(fetched))
-            if "error_message" in fetched:
-                logger.warning("post_json_api() for domain='%s' returned error message: '%s'", domain, fetched['error_message'])
-                instances.set_last_error(domain, fetched)
-                break
-            elif isinstance(fetched["json"], dict) and "error" in fetched["json"] and "message" in fetched["json"]["error"]:
-                logger.warning("post_json_api() returned error: '%s'", fetched['error']['message'])
-                instances.set_last_error(domain, fetched["json"]["error"]["message"])
-                break
-
-            rows = fetched["json"]
-
-            logger.debug("rows(%d)[]='%s'", len(rows), type(rows))
-            if len(rows) == 0:
-                logger.debug("Returned zero bytes, domain='%s' - BREAK!", domain)
-                break
-            elif len(rows) != config.get("misskey_limit"):
-                logger.debug("Fetched %d row(s) but expected: %d'", len(rows), config.get('misskey_limit'))
-                offset = offset + (config.get("misskey_limit") - len(rows))
-            else:
-                logger.debug("Raising offset by step=%d", step)
-                offset = offset + step
-
-            count = 0
-            for instance in rows:
-                # Is it there?
-                logger.debug("instance[]='%s'", type(instance))
-                blocked = tidyup.domain(instance["host"])
-
-                logger.debug("blocked='%s'", blocked)
-                if blocked is None or blocked == "":
-                    logger.warning("instance[host]='%s' is None or empty after tidyup.domain() - SKIPPED!", instance["host"])
-                    continue
-                elif not domain_helper.is_wanted(blocked):
-                    logger.debug("blocked='%s' is not wanted - SKIPPED!", blocked)
-                    continue
                 elif "isBlocked" in instance and instance["isBlocked"] and not dict_helper.has_key(blocklist, "blocked", blocked):
                     count = count + 1
-                    logger.debug("Appending blocker='%s',blocked='%s',block_level='reject'", domain, blocked)
+                    logger.debug("Appending blocker='%s',blocked='%s',block_level='suspended' ... #2", domain, blocked)
+                    blocklist.append({
+                        "blocker"    : domain,
+                        "blocked"    : blocked,
+                        "reason"     : None,
+                        "block_level": "suspended",
+                    })
+                elif "isSilenced" in instance and instance["isSilenced"] and not dict_helper.has_key(blocklist, "blocked", blocked):
+                    count = count + 1
+                    logger.debug("Appending blocker='%s',blocked='%s',block_level='silenced' ...", domain, blocked)
                     blocklist.append({
                         "blocker"    : domain,
                         "blocked"    : blocked,
                         "reason"     : None,
-                        "block_level": "reject",
+                        "block_level": "silenced",
                     })
+                else:
+                    logger.debug("domain='%s',blocked='%s' is not marked suspended - SKIPPED!", domain, blocked)
+                    continue
 
             logger.debug("count=%d", count)
             if count == 0:
-                logger.debug("API is no more returning new instances, aborting loop!")
+                logger.debug("API is no more returning new instances, aborting loop! domain='%s'", domain)
                 break
 
         except network.exceptions as exception: