From 4fb84b47d02128d17b14beb1b2f88fd854535e67 Mon Sep 17 00:00:00 2001 From: SimplifiedPrivacy Date: Fri, 17 Jul 2026 09:29:49 -0400 Subject: [PATCH] LocationController was missing some definitions. Also migrations was changed to do imports inside the function using session management tools. And finally Tor networking requests fixed DNS problem labels, increasd timeouts, and streamined ip address reuse. --- core/Constants.py | 2 +- core/controllers/LocationController.py | 2 +- core/models/manage/migrations.py | 26 ++++++++++++++----- .../api_requests/step1_get_or_post.py | 4 +-- .../networking/api_requests/step2_execute.py | 4 +-- .../api_requests/step4_error_classifier.py | 2 +- .../api_requests/step5_solve_api_problems.py | 2 +- .../api_requests/subtools/direct_dns_tools.py | 21 ++++++++------- 8 files changed, 39 insertions(+), 24 deletions(-) diff --git a/core/Constants.py b/core/Constants.py index 20dc285..fceabe2 100644 --- a/core/Constants.py +++ b/core/Constants.py @@ -6,7 +6,7 @@ import os @dataclass(frozen=True) class Constants: - DB_VERSION_THIS_APP_WANTS = 1 + DB_VERSION_THIS_APP_WANTS = 2 # Fallback for development (running outside AppImage) fallback_non_appimage = os.path.dirname(os.path.abspath(__file__)) diff --git a/core/controllers/LocationController.py b/core/controllers/LocationController.py index e18d0db..28ffbeb 100644 --- a/core/controllers/LocationController.py +++ b/core/controllers/LocationController.py @@ -7,7 +7,7 @@ from typing import Optional from sqlalchemy import select from sqlalchemy.orm import joinedload from core.models.DatabaseOperation import DatabaseOperation, DBErrorType -from core.models.orm_calls.location_calls import get_profile_location_data +from core.models.orm_calls.location_calls import execute_location_sql class LocationController: diff --git a/core/models/manage/migrations.py b/core/models/manage/migrations.py index 1859a34..f61a195 100644 --- a/core/models/manage/migrations.py +++ b/core/models/manage/migrations.py @@ -3,13 +3,11 @@ from core.errors.logger import logger from core.models.DatabaseOperation import DatabaseOperation, DBErrorType from core.Constants import Constants - -from core.models.orm_models.Location import Location -from core.models.orm_models.Operator import Operator -from core.models.orm_models.CachedSync import CachedSync -from core.models.orm_models.EncryptedProxy import EncryptedProxy - -MODELS = [Location, Operator, CachedSync, EncryptedProxy] +from core.models.manage.session_management import create_ALL_tables +# from core.models.orm_models.Location import Location +# from core.models.orm_models.Operator import Operator +# from core.models.orm_models.CachedSync import CachedSync +# from core.models.orm_models.EncryptedProxy import EncryptedProxy # generic from pathlib import Path @@ -63,6 +61,20 @@ def get_model_columns(model_class): def migrate_sql() -> DatabaseOperation: from core.models.manage.session_management import engine from core.models.orm_models.Base import BaseModel, Base + made_tables = create_ALL_tables() + if made_tables: + logger.info(f"[MIGRATION] Tables loaded") + MODELS = [Location, Operator, CachedSync, EncryptedProxy] + else: + logger.error(f"[MIGRATION] Huge issue with loading the tables via Session management. Trying again within migrations") + try: + from core.models.orm_models.Location import Location + from core.models.orm_models.Operator import Operator + from core.models.orm_models.CachedSync import CachedSync + from core.models.orm_models.EncryptedProxy import EncryptedProxy + except: + logger.error(f"[MIGRATION] Second try to load the tables failed.") + changes_made = [] # Step 1: Extract column definitions directly from each model diff --git a/core/services/networking/api_requests/step1_get_or_post.py b/core/services/networking/api_requests/step1_get_or_post.py index 6c382ed..185a395 100644 --- a/core/services/networking/api_requests/step1_get_or_post.py +++ b/core/services/networking/api_requests/step1_get_or_post.py @@ -40,7 +40,7 @@ def get_data_from_api( None, # get request has no payload connection_observer, client_observer, - timeout=10, + timeout=30, clearweb_resolved_ip=clearweb_resolved_ip ) else: @@ -51,7 +51,7 @@ def get_data_from_api( None, # get request has no payload connection_observer, client_observer, - timeout=5 + timeout=15 ) if not result_object.valid and client_observer: diff --git a/core/services/networking/api_requests/step2_execute.py b/core/services/networking/api_requests/step2_execute.py index bb7fcfd..6ca5e1a 100644 --- a/core/services/networking/api_requests/step2_execute.py +++ b/core/services/networking/api_requests/step2_execute.py @@ -35,7 +35,7 @@ def _execute_tor_request( payload: Optional[dict], connection_observer: Optional[ConnectionObserver] = None, client_observer: Optional[ClientObserver] = None, - timeout: int = 20, + timeout: int = 30, clearweb_resolved_ip: str = None # if DNS via Tor is blocked ) -> ApiResponse: """ @@ -108,7 +108,7 @@ def _execute_regular_request( payload: Optional[dict], connection_observer: Optional[ConnectionObserver] = None, client_observer: Optional[client_observer] = None, - timeout: int = 10, + timeout: int = 20, ) -> ApiResponse: """ Regular (non-Tor) request. NO observer coupling. diff --git a/core/services/networking/api_requests/step4_error_classifier.py b/core/services/networking/api_requests/step4_error_classifier.py index a5f2797..ca82816 100644 --- a/core/services/networking/api_requests/step4_error_classifier.py +++ b/core/services/networking/api_requests/step4_error_classifier.py @@ -56,7 +56,7 @@ def classify_request_error( else: return ApiResponse( valid=False, - error_type=ErrorType.UNKNOWN, + error_type=ErrorType.DNS_RESOLUTION, tor=True, ip_address=ip_via_tor, message=f"For Unknown reasons, we can't connect, but we can resolve {domain_only} to {ip_via_tor} via Tor" diff --git a/core/services/networking/api_requests/step5_solve_api_problems.py b/core/services/networking/api_requests/step5_solve_api_problems.py index a10b063..c7138e4 100644 --- a/core/services/networking/api_requests/step5_solve_api_problems.py +++ b/core/services/networking/api_requests/step5_solve_api_problems.py @@ -40,7 +40,7 @@ def solve_api_problems( elif reason_for_error == ErrorType.DNS_RESOLUTION: logger.debug(f"[API SOLVER] We're solving a DNS resolution error {api_reply_object.message}") if api_reply_object.tor: - dns_fix = get_DNS_then_use_it(get_or_post, url, payload, connection_observer, client_observer) + dns_fix = get_DNS_then_use_it(get_or_post, url, payload, api_reply_object.ip_address, connection_observer, client_observer) return dns_fix else: logger.error(f"[API SOLVER] We have NOT yet setup clearweb DNS solutions") diff --git a/core/services/networking/api_requests/subtools/direct_dns_tools.py b/core/services/networking/api_requests/subtools/direct_dns_tools.py index 719fb78..0c79723 100644 --- a/core/services/networking/api_requests/subtools/direct_dns_tools.py +++ b/core/services/networking/api_requests/subtools/direct_dns_tools.py @@ -26,6 +26,7 @@ def get_DNS_then_use_it( get_or_post: str, full_url: str, payload: str = None, + ip_address: str = None, connection_observer: Optional[ConnectionObserver] = None, client_observer: Optional[ClientObserver] = None, ) -> ApiResponse: @@ -59,17 +60,19 @@ def get_DNS_then_use_it( # ================= Do Quad9 Query =============== domain = extract_domain(full_url) logger.debug(f"[DNS TOOLS] We'll be doing a DNS lookup to the domain {domain}..") - ip_address = quad9_proxy_dns_lookup(domain, tor_proxy) if not ip_address: - return ApiResponse( - valid=False, - error_type=ErrorType.QUAD9_DNS_RESOLUTION, - tor=True, - message=f"Cannot resolve {domain} via Tor or Quad9" - ) - - logger.debug(f"[DNS TOOLS] We got an IP address from Quad9 for {domain} of: {ip_address}") + ip_address = quad9_proxy_dns_lookup(domain, tor_proxy) + + if not ip_address: + return ApiResponse( + valid=False, + error_type=ErrorType.QUAD9_DNS_RESOLUTION, + tor=True, + message=f"Cannot resolve {domain} via Tor or Quad9" + ) + + logger.debug(f"[DNS TOOLS] We got an IP address from Quad9 for {domain} of: {ip_address}") # ================= Use Custom DNS =============== client = create_httpx_client_with_custom_dns({domain: ip_address}, tor_proxy)