Improved Tor Error Handling. And Tor IPv6 Fix with associated sp-essentails fix and version bump
This commit is contained in:
parent
69834d85d5
commit
74e22e7b60
5 changed files with 127 additions and 32 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,7 @@
|
||||||
|
|
||||||
|
class TorServiceInitializationError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
class ApplicationError(Exception):
|
class ApplicationError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue