From f3978f5aad464b734ddd86de2e112242f5e00d09 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Tue, 20 Jun 2023 13:52:59 +0200 Subject: [PATCH] Continued: - stopping other bad domains from entering functions - also need to catch urlib3 exception --- fba/federation.py | 28 ++++++++++++++++++++++++++++ fba/network.py | 17 ++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/fba/federation.py b/fba/federation.py index 71e02d9..45aa32d 100644 --- a/fba/federation.py +++ b/fba/federation.py @@ -50,6 +50,10 @@ def fetch_instances(domain: str, origin: str, software: str, command: str, path: raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") elif domain == "": raise ValueError("Parameter 'domain' is empty") + elif not validators.domain(domain): + raise ValueErrror(f"domain='{domain}' is not a valid domain") + elif domain.endswith(".arpa"): + raise ValueError(f"domain='{domain}' is a domain for reversed IP addresses, please don't crawl them!") elif domain.endswith(".tld"): raise ValueError(f"domain='{domain}' is a fake domain, please don't crawl them!") elif not isinstance(origin, str) and origin is not None: @@ -144,6 +148,12 @@ def fetch_peers(domain: str, software: str) -> list: raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") elif domain == "": raise ValueError("Parameter 'domain' is empty") + elif not validators.domain(domain): + raise ValueErrror(f"domain='{domain}' is not a valid domain") + elif domain.endswith(".arpa"): + raise ValueError(f"domain='{domain}' is a domain for reversed IP addresses, please don't crawl them!") + elif domain.endswith(".tld"): + raise ValueError(f"domain='{domain}' is a fake domain, please don't crawl them!") elif not isinstance(software, str) and software is not None: raise ValueError(f"software[]='{type(software)}' is not 'str'") @@ -218,6 +228,12 @@ def fetch_nodeinfo(domain: str, path: str = None) -> dict: raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") elif domain == "": raise ValueError("Parameter 'domain' is empty") + elif not validators.domain(domain): + raise ValueErrror(f"domain='{domain}' is not a valid domain") + elif domain.endswith(".arpa"): + raise ValueError(f"domain='{domain}' is a domain for reversed IP addresses, please don't crawl them!") + elif domain.endswith(".tld"): + raise ValueError(f"domain='{domain}' is a fake domain, please don't crawl them!") elif not isinstance(path, str) and path is not None: raise ValueError(f"Parameter path[]='{type(path)}' is not 'str'") @@ -288,6 +304,12 @@ def fetch_wellknown_nodeinfo(domain: str) -> dict: raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") elif domain == "": raise ValueError("Parameter 'domain' is empty") + elif not validators.domain(domain): + raise ValueErrror(f"domain='{domain}' is not a valid domain") + elif domain.endswith(".arpa"): + raise ValueError(f"domain='{domain}' is a domain for reversed IP addresses, please don't crawl them!") + elif domain.endswith(".tld"): + raise ValueError(f"domain='{domain}' is a fake domain, please don't crawl them!") # No CSRF by default, you don't have to add network.api_headers by yourself here headers = tuple() @@ -359,6 +381,12 @@ def fetch_generator_from_path(domain: str, path: str = "/") -> str: raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") elif domain == "": raise ValueError("Parameter 'domain' is empty") + elif not validators.domain(domain): + raise ValueErrror(f"domain='{domain}' is not a valid domain") + elif domain.endswith(".arpa"): + raise ValueError(f"domain='{domain}' is a domain for reversed IP addresses, please don't crawl them!") + elif domain.endswith(".tld"): + raise ValueError(f"domain='{domain}' is a fake domain, please don't crawl them!") elif not isinstance(path, str): raise ValueError(f"path[]='{type(path)}' is not 'str'") elif path == "": diff --git a/fba/network.py b/fba/network.py index b4d320d..5b3aa0e 100644 --- a/fba/network.py +++ b/fba/network.py @@ -17,6 +17,8 @@ import json import reqto import requests +import urllib3 +import validators from fba import config from fba import fba @@ -42,7 +44,8 @@ exceptions = ( requests.exceptions.InvalidURL, requests.exceptions.Timeout, requests.exceptions.TooManyRedirects, - UnicodeEncodeError + UnicodeEncodeError, + urllib3.exceptions.LocationParseError ) def post_json_api(domain: str, path: str, data: str = "", headers: dict = {}) -> dict: @@ -51,6 +54,10 @@ def post_json_api(domain: str, path: str, data: str = "", headers: dict = {}) -> raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") elif domain == "": raise ValueError("Parameter 'domain' is empty") + elif not validators.domain(domain): + raise ValueErrror(f"domain='{domain}' is not a valid domain") + elif domain.endswith(".arpa"): + raise ValueError(f"domain='{domain}' is a domain for reversed IP addresses, please don't crawl them!") elif domain.endswith(".tld"): raise ValueError(f"domain='{domain}' is a fake domain, please don't crawl them!") elif not isinstance(path, str): @@ -136,6 +143,10 @@ def get_json_api(domain: str, path: str, headers: dict, timeout: tuple) -> dict: raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") elif domain == "": raise ValueError("Parameter 'domain' is empty") + elif not validators.domain(domain): + raise ValueErrror(f"domain='{domain}' is not a valid domain") + elif domain.endswith(".arpa"): + raise ValueError(f"domain='{domain}' is a domain for reversed IP addresses, please don't crawl them!") elif domain.endswith(".tld"): raise ValueError(f"domain='{domain}' is a fake domain, please don't crawl them!") elif not isinstance(path, str): @@ -233,6 +244,10 @@ def fetch_response(domain: str, path: str, headers: dict, timeout: tuple) -> req raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'") elif domain == "": raise ValueError("Parameter 'domain' is empty") + elif not validators.domain(domain): + raise ValueErrror(f"domain='{domain}' is not a valid domain") + elif domain.endswith(".arpa"): + raise ValueError(f"domain='{domain}' is a domain for reversed IP addresses, please don't crawl them!") elif domain.endswith(".tld"): raise ValueError(f"domain='{domain}' is a fake domain, please don't crawl them!") elif not isinstance(path, str): -- 2.39.5