]> git.mxchange.org Git - fba.git/commitdiff
Continued:
authorRoland Häder <roland@mxchange.org>
Thu, 24 Aug 2023 18:35:55 +0000 (20:35 +0200)
committerRoland Häder <roland@mxchange.org>
Thu, 24 Aug 2023 18:38:44 +0000 (20:38 +0200)
- renamed fetch_nodeinfo() to fetch() as it is already part of module nodeinfo
- added 3rd optional parameter to it, fetching of /.well-known/* isn't then
  required anymore and saves another request
- also the wanted URL can be directly used

fba/helpers/blacklist.py
fba/http/federation.py
fba/http/nodeinfo.py
fba/networks/pleroma.py

index 2a65fbc5037ff24a225907bcc625305ade62c790..bbd8d03f27defb777bbcd9ff15af4b7b33b45489 100644 (file)
@@ -61,6 +61,7 @@ def is_blacklisted(domain: str) -> bool:
         if blocked in domain:
             logger.debug("domain='%s' is blacklisted.", domain)
             blacklisted = True
+            break
 
     logger.debug("blacklisted='%s' - EXIT!", blacklisted)
     return blacklisted
index e726ae5941ddf27074f047a99cc97bda7c17d03a..ba6ac67ecfb0e0a490c56e583c0df5e4d5fd28b3 100644 (file)
@@ -354,19 +354,19 @@ def fetch_generator_from_path(domain: str, path: str = "/") -> str:
     logger.debug("software='%s' - EXIT!", software)
     return software
 
-def determine_software(domain: str, path: str = None) -> str:
-    logger.debug("domain='%s',path='%s' - CALLED!", domain, path)
+def determine_software(domain: str, path: str = None, nodeinfo_url: str = None) -> str:
+    logger.debug("domain='%s',path='%s',nodeinfo_url='%s' - CALLED!", domain, path, nodeinfo_url)
     domain_helper.raise_on(domain)
 
     if not isinstance(path, str) and path is not None:
         raise ValueError(f"Parameter path[]='{type(path)}' is not of type 'str'")
+    elif not isinstance(nodeinfo_url, str) and nodeinfo_url is not None:
+        raise ValueError(f"Parameter nodeinfo_url[]='{type(nodeinfo_url)}' is not of type 'str'")
 
-    logger.debug("Determining software for domain='%s',path='%s'", domain, path)
+    logger.debug("Fetching nodeinfo from domain='%s',path='%s',nodeinfo_url='%s' ...", domain, path, nodeinfo_url)
+    data = nodeinfo.fetch(domain, path, nodeinfo_url)
     software = None
 
-    logger.debug("Fetching nodeinfo from domain='%s' ...", domain)
-    data = nodeinfo.fetch_nodeinfo(domain, path)
-
     logger.debug("data[%s]='%s'", type(data), data)
     if "exception" in data:
         # Continue raising it
index ec78862ef6fac91fa9388189d5712d1f671cae3d..724c87501d45d7784a1eafb761a5b66ad63a33d2 100644 (file)
@@ -14,6 +14,7 @@
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 import logging
+import validators
 
 from urllib.parse import urlparse
 
@@ -31,26 +32,33 @@ _DEPTH = 0
 logging.basicConfig(level=logging.INFO)
 logger = logging.getLogger(__name__)
 
-def fetch_nodeinfo(domain: str, path: str = None) -> dict:
-    logger.debug("domain='%s',path='%s' - CALLED!", domain, path)
+def fetch(domain: str, path: str = None, nodeinfo_url: str = None) -> dict:
+    logger.debug("domain='%s',path='%s',nodeinfo_url='%s' - CALLED!", domain, path, nodeinfo_url)
     domain_helper.raise_on(domain)
 
     if not isinstance(path, str) and path is not None:
         raise ValueError(f"Parameter path[]='{type(path)}' is not of type 'str'")
+    elif not isinstance(nodeinfo_url, str) and nodeinfo_url is not None:
+        raise ValueError(f"Parameter nodeinfo_url[]='{type(nodeinfo_url)}' is not of type 'str'")
 
-    logger.debug("Fetching nodeinfo from domain='%s' ...", domain)
-    data = fetch_wellknown_nodeinfo(domain)
+    logger.debug("nodeinfo_url='%s'", nodeinfo_url)
+    is_url = nodeinfo_url is not None and validators.url(nodeinfo_url)
 
-    logger.debug("data[%s](%d)='%s'", type(data), len(data), data)
-    if "exception" in data:
-        logger.warning("Exception returned: '%s', raising again ...", type(data["exception"]))
-        raise data["exception"]
-    elif "error_message" not in data and "json" in data and len(data["json"]) > 0:
-        logger.debug("Invoking instances.set_last_nodeinfo(%s) ...", domain)
-        instances.set_last_nodeinfo(domain)
+    logger.debug("is_url='%s'", is_url)
+    if not is_url:
+        logger.debug("Fetching well-known nodeinfo from domain='%s' ...", domain)
+        data = fetch_wellknown_nodeinfo(domain)
 
-        logger.debug("Found data[json]()=%d - EXIT!", len(data['json']))
-        return data
+        logger.debug("data[%s](%d)='%s'", type(data), len(data), data)
+        if "exception" in data:
+            logger.warning("Exception returned: '%s', raising again ...", type(data["exception"]))
+            raise data["exception"]
+        elif "error_message" not in data and "json" in data and len(data["json"]) > 0:
+            logger.debug("Invoking instances.set_last_nodeinfo(%s) ...", domain)
+            instances.set_last_nodeinfo(domain)
+
+            logger.debug("Found data[json]()=%d - EXIT!", len(data['json']))
+            return data
 
     # No CSRF by default, you don't have to add network.api_headers by yourself here
     headers = tuple()
@@ -80,17 +88,11 @@ def fetch_nodeinfo(domain: str, path: str = None) -> dict:
 
     for request in request_paths:
         logger.debug("request='%s'", request)
-        http_url  = f"http://{domain}{str(path)}"
-        https_url = f"https://{domain}{str(path)}"
+        http_url  = f"http://{domain}{str(path) if path is not None else '/'}"
+        https_url = f"https://{domain}{str(path) if path is not None else '/'}"
 
         logger.debug("path[%s]='%s',request='%s',http_url='%s',https_url='%s'", type(path), path, request, http_url, https_url)
-        if path is None or path in [request, http_url, https_url]:
-            logger.debug("path='%s',http_url='%s',https_url='%s'", path, http_url, https_url)
-            if path in [http_url, https_url]:
-                logger.debug("domain='%s',path='%s' has protocol in path, splitting ...", domain, path)
-                components = urlparse(path)
-                path = components.path
-
+        if (path is None and nodeinfo_url is None) or path in [request, http_url, https_url] or (is_url and nodeinfo_url.endswith(request)):
             logger.debug("Fetching request='%s' from domain='%s' ...", request, domain)
             data = network.get_json_api(
                 domain,
index 8352915e9a7e03b2ba9cdb0f54745d35e7043aa9..bd0ae04680d1bf277996d2f17c2008502c8c3edb 100644 (file)
@@ -63,11 +63,12 @@ def fetch_blocks(domain: str, nodeinfo_url: str) -> list:
     rows = None
     try:
         logger.debug("Fetching nodeinfo: domain='%s',nodeinfo_url='%s'", domain, nodeinfo_url)
-        rows = nodeinfo.fetch_nodeinfo(domain, nodeinfo_url)
+        rows = nodeinfo.fetch(domain, nodeinfo_url=nodeinfo_url)
 
         if "error_message" in rows:
             logger.warning("Error message '%s' during fetching nodeinfo for domain='%s',nodeinfo_url='%s'", rows["error_message"], domain, nodeinfo_url)
             instances.set_last_error(domain, rows)
+            instances.update_data(domain)
 
             logger.debug("Returning empty list ... - EXIT!")
             return list()