Improved Tor Error Handling. And Tor IPv6 Fix with associated sp-essentails fix and version bump

This commit is contained in:
SimplifiedPrivacy 2026-06-29 15:13:06 -04:00
parent 69834d85d5
commit 74e22e7b60
5 changed files with 127 additions and 32 deletions

View file

@ -6,7 +6,7 @@ import os
@dataclass(frozen=True) @dataclass(frozen=True)
class Constants: class Constants:
DB_VERSION_THIS_APP_WANTS = 1 DB_VERSION_THIS_APP_WANTS = 2
# ticketing group: # ticketing group:
TICKET_API_BASE_URL: Final[str] = os.environ.get( TICKET_API_BASE_URL: Final[str] = os.environ.get(

View file

@ -1,3 +1,6 @@
from core.errors.exceptions import *
from core.errors.logger import logger
from collections.abc import Callable from collections.abc import Callable
from core.Constants import Constants from core.Constants import Constants
from core.Errors import InvalidSubscriptionError, MissingSubscriptionError, ConnectionUnprotectedError, ConnectionTerminationError, CommandNotFoundError from core.Errors import InvalidSubscriptionError, MissingSubscriptionError, ConnectionUnprotectedError, ConnectionTerminationError, CommandNotFoundError
@ -232,9 +235,13 @@ class ConnectionController:
@staticmethod @staticmethod
def establish_tor_session_connection(port_number: int, connection_observer: Optional[ConnectionObserver] = None): def establish_tor_session_connection(port_number: int, connection_observer: Optional[ConnectionObserver] = None):
try:
tor_module = TorModule(Constants.HV_TOR_STATE_HOME) tor_module = TorModule(Constants.HV_TOR_STATE_HOME)
tor_module.create_session(port_number, connection_observer) tor_module.create_session(port_number, connection_observer)
except TorServiceInitializationError as e:
logger.error(f"TorServiceInitializationError. Tor Can't Start: {e}")
except Exception as e:
logger.error(f"Tor Can't Start: {e}")
@staticmethod @staticmethod
def terminate_tor_session_connection(port_number: int): def terminate_tor_session_connection(port_number: int):

View file

@ -1,3 +1,7 @@
class TorServiceInitializationError(Exception):
pass
class ApplicationError(Exception): class ApplicationError(Exception):
pass pass

View file

@ -16,54 +16,98 @@ from core.errors.logger import logger
import json, os import json, os
from typing import Any from typing import Any
from core.Constants import Constants from core.Constants import Constants
import time
def tor_get_request(custom_url: str, connection_observer: ConnectionObserver) -> dict: def tor_get_request(custom_url: str, connection_observer: ConnectionObserver) -> dict:
import requests import requests
# ============================================================================
# INITIALIZE TOR
# ============================================================================
port_number = ConnectionService.get_random_available_port_number() port_number = ConnectionService.get_random_available_port_number()
logger.debug(f"Using Tor on port number {port_number}") logger.debug(f"[USE TOR SERVICE] Using Tor on port number {port_number}")
try: try:
tor_module = TorModule(Constants.HV_TOR_STATE_HOME) tor_module = TorModule(Constants.HV_TOR_STATE_HOME)
tor_module.create_session(port_number, connection_observer) tor_module.create_session(port_number, connection_observer)
logger.debug(f"[USE TOR SERVICE] Tor Started a Session")
proxies = { except TorServiceInitializationError as e:
"http": f"socks5h://127.0.0.1:{port_number}", error_msg = f"[USE TOR SERVICE] Tor failed to start: {e}"
"https": f"socks5h://127.0.0.1:{port_number}", tor_module.destroy_session(port_number)
} logger.error(error_msg, exc_info=True)
problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer
)
return problem_results
except Exception as e:
logger.error(f"[USE TOR SERVICE] Unexpected Tor error: {e}")
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer
)
return problem_results
logger.debug(f"Doing Request through Tor via port {port_number}") proxies = {
"http": f"socks5h://127.0.0.1:{port_number}",
"https": f"socks5h://127.0.0.1:{port_number}",
}
# ============================================================================
# USE TOR AS PROXY
# ============================================================================
try:
logger.debug(f"[TOR GET REQUEST] Using Tor on port number {port_number}")
response = requests.get(custom_url, proxies=proxies, timeout=5) response = requests.get(custom_url, proxies=proxies, timeout=5)
logger.debug("Request through Tor successful.") logger.debug("[TOR GET REQUEST] Request through Tor Successful!")
# if it crashes from the above error check, then it won't destroy the proxy, # if it crashes from an error in trying to get a JSON out of it, then we'd skip destroying the Tor session,
# so we'll destroy it now first,
logger.debug("[TOR GET REQUEST] DESTROY SESSION!")
tor_module.destroy_session(port_number) tor_module.destroy_session(port_number)
# return response # Now that it's safe, get a JSON out of it, and return the response
dictonary_of_response = response.json() dictonary_of_response = response.json()
logger.debug(f"[TOR GET REQUEST] Got Data out of the reply. {dictonary_of_response}")
final_reply = {"valid": True, "data": dictonary_of_response} final_reply = {"valid": True, "data": dictonary_of_response}
return final_reply return final_reply
except requests.exceptions.ConnectionError: except requests.exceptions.ConnectionError:
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem( problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer, port_number, proxies custom_url, connection_observer
) )
return problem_results return problem_results
except requests.exceptions.Timeout: except requests.exceptions.Timeout:
logger.debug("Connection timed out") logger.debug("Connection timed out")
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem( problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer, port_number custom_url, connection_observer
) )
return problem_results return problem_results
except requests.exceptions.HTTPError: except requests.exceptions.HTTPError:
logger.debug(f"HTTP error: {response.status_code}") logger.debug(f"HTTP error: {response.status_code}")
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem( problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer, port_number custom_url, connection_observer
)
return problem_results
except requests.exceptions.ProxyError:
error_msg = "[USE TOR SERVICE] Requests Proxy Error"
tor_module.destroy_session(port_number)
logger.error(error_msg, exc_info=True)
problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer
)
return problem_results
except Exception as e:
logger.error(f"[USE TOR SERVICE] Unexpected Tor error: {e}")
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer
) )
return problem_results return problem_results
@ -80,41 +124,63 @@ def tor_post_request(
"status": "unable_to_get" "status": "unable_to_get"
} # incase this goes to the except block, it's "defined" } # incase this goes to the except block, it's "defined"
# ============================================================================
# INITIALIZE TOR
# ============================================================================
port_number = ConnectionService.get_random_available_port_number() port_number = ConnectionService.get_random_available_port_number()
logger.debug(f"Using Tor on port number {port_number}") logger.debug(f"Using Tor on port number {port_number}")
try: try:
tor_module = TorModule(Constants.HV_TOR_STATE_HOME) tor_module = TorModule(Constants.HV_TOR_STATE_HOME)
tor_module.create_session(port_number, connection_observer) tor_module.create_session(port_number, connection_observer)
except TorServiceInitializationError as e:
error_msg = f"[USE TOR SERVICE] Tor failed to start: {e}"
tor_module.destroy_session(port_number)
logger.error(error_msg, exc_info=True)
problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer
)
return problem_results
except Exception as e:
logger.error(f"[USE TOR SERVICE] Unexpected Tor error: {e}")
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer
)
return problem_results
proxies = { proxies = {
"http": f"socks5h://127.0.0.1:{port_number}", "http": f"socks5h://127.0.0.1:{port_number}",
"https": f"socks5h://127.0.0.1:{port_number}", "https": f"socks5h://127.0.0.1:{port_number}",
} }
logger.debug(f"Sending data through Tor via port {port_number}")
logger.debug(f"Sending data through Tor via port {port_number}")
# ============================================================================
# USE TOR AS PROXY
# ============================================================================
try:
response = requests.post(custom_url, json=payload, proxies=proxies) response = requests.post(custom_url, json=payload, proxies=proxies)
logger.debug("Sending data through Tor successful.") logger.debug("[USE TOR SERVICE] Sent data through Tor successfully. Now deleting the session..")
tor_module.destroy_session(port_number) tor_module.destroy_session(port_number)
return response return response
except requests.exceptions.ConnectionError: except requests.exceptions.ConnectionError:
error_msg = "There was a Connection Error with the Tor Module." error_msg = "[USE TOR SERVICE] There was a Connection Error with the Use Tor Module."
logger.error(error_msg, exc_info=True) logger.error(error_msg, exc_info=True)
logger.debug(error_msg) logger.debug(error_msg)
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem( problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer custom_url, connection_observer
) )
return problem_results return problem_results
except requests.exceptions.Timeout: except requests.exceptions.Timeout:
error_msg = "Connection timed out" error_msg = "[USE TOR SERVICE] Connection timed out"
logger.error(error_msg, exc_info=True) logger.error(error_msg, exc_info=True)
logger.debug(error_msg) logger.debug(error_msg)
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem( problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer custom_url, connection_observer
) )
@ -122,10 +188,28 @@ def tor_post_request(
except requests.exceptions.HTTPError: except requests.exceptions.HTTPError:
if isinstance(response, requests.Response): if isinstance(response, requests.Response):
error_msg = f"HTTP error: {response.status_code}" error_msg = f"[USE TOR SERVICE] HTTP error: {response.status_code}"
logger.error(error_msg, exc_info=True) logger.error(error_msg, exc_info=True)
logger.debug(error_msg) logger.debug(error_msg)
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer
)
return problem_results
except requests.exceptions.ProxyError:
error_msg = "[USE TOR SERVICE] Requests Proxy Error"
logger.error(error_msg, exc_info=True)
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer
)
return problem_results
except Exception as e:
logger.error(f"[USE TOR SERVICE] Unexpected Tor error: {e}")
tor_module.destroy_session(port_number)
problem_results = evaluate_tor_networking_problem( problem_results = evaluate_tor_networking_problem(
custom_url, connection_observer custom_url, connection_observer
) )

View file

@ -1,6 +1,6 @@
[project] [project]
name = "sp-hydra-veil-core" name = "sp-hydra-veil-core"
version = "2.3.6" version = "2.3.7"
authors = [ authors = [
{ name = "Simplified Privacy" }, { name = "Simplified Privacy" },
] ]
@ -18,7 +18,7 @@ dependencies = [
"pysocks ~= 1.7.1", "pysocks ~= 1.7.1",
"python-dateutil ~= 2.9.0.post0", "python-dateutil ~= 2.9.0.post0",
"requests ~= 2.32.5", "requests ~= 2.32.5",
"sp-essentials ~= 1.1.0", "sp-essentials ~= 1.2.0",
"annotated-types==0.7.0", "annotated-types==0.7.0",
"certifi==2026.4.22", "certifi==2026.4.22",
"charset-normalizer==3.4.7", "charset-normalizer==3.4.7",