Improve exception handling-related logic

This commit is contained in:
codeking 2025-02-25 14:11:40 +01:00
parent a30752650c
commit 5468fe4998
5 changed files with 38 additions and 24 deletions

View file

@ -1,3 +1,11 @@
class CommandNotFoundError(OSError):
def __init__(self, subject):
self.subject = subject
super().__init__(f"Command '{subject}' could not be found.")
class UnknownClientVersionError(Exception): class UnknownClientVersionError(Exception):
pass pass

View file

@ -1,4 +1,5 @@
from core.Constants import Constants from core.Constants import Constants
from core.Errors import CommandNotFoundError
from core.controllers.SessionStateController import SessionStateController from core.controllers.SessionStateController import SessionStateController
from core.models.session.Application import Application from core.models.session.Application import Application
from core.models.session.ApplicationVersion import ApplicationVersion from core.models.session.ApplicationVersion import ApplicationVersion
@ -111,7 +112,10 @@ class ApplicationController:
@staticmethod @staticmethod
def __run_process(initialization_file_path, profile, display, session_state): def __run_process(initialization_file_path, profile, display, session_state):
virtual_display_process = subprocess.Popen(('/usr/bin/Xephyr', '-ac', '-br', '-title', f'Hydra Veil - {profile.name or "Unnamed Profile"}', '-screen', profile.resolution, '-no-host-grab', display), stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) if shutil.which('Xephyr') is None:
raise CommandNotFoundError('Xephyr')
virtual_display_process = subprocess.Popen(('Xephyr', '-ac', '-br', '-title', f'Hydra Veil - {profile.name or "Unnamed Profile"}', '-screen', profile.resolution, '-no-host-grab', display), stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
start_time = time.time() start_time = time.time()
timeout = float(10) timeout = float(10)

View file

@ -1,5 +1,5 @@
from core.Constants import Constants from core.Constants import Constants
from core.Errors import InvalidSubscriptionError, MissingSubscriptionError, ConnectionUnprotectedError, ConnectionTerminationError from core.Errors import InvalidSubscriptionError, MissingSubscriptionError, ConnectionUnprotectedError, ConnectionTerminationError, CommandNotFoundError
from core.controllers.ConfigurationController import ConfigurationController from core.controllers.ConfigurationController import ConfigurationController
from core.controllers.ProfileController import ProfileController from core.controllers.ProfileController import ProfileController
from core.controllers.SessionStateController import SessionStateController from core.controllers.SessionStateController import SessionStateController
@ -14,6 +14,7 @@ from typing import Union, Optional
import os import os
import re import re
import requests import requests
import shutil
import socket import socket
import subprocess import subprocess
import tempfile import tempfile
@ -157,11 +158,11 @@ class ConnectionController:
@staticmethod @staticmethod
def establish_system_connection(profile: SystemProfile, connection_observer: Optional[ConnectionObserver] = None): def establish_system_connection(profile: SystemProfile, connection_observer: Optional[ConnectionObserver] = None):
if subprocess.getstatusoutput('pkexec --help')[0] == 127: if shutil.which('pkexec') is None:
raise OSError('The polkit toolkit does not appear to be installed.') raise CommandNotFoundError('pkexec')
if subprocess.getstatusoutput('wg-quick --help')[0] == 127: if shutil.which('wg-quick') is None:
raise OSError('WireGuard tools does not appear to be installed.') raise CommandNotFoundError('wg-quick')
process = subprocess.Popen(('pkexec', 'wg-quick', 'up', profile.get_wireguard_configuration_path()), stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) process = subprocess.Popen(('pkexec', 'wg-quick', 'up', profile.get_wireguard_configuration_path()), stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
completed_successfully = not bool(os.waitpid(process.pid, 0)[1] >> 8) completed_successfully = not bool(os.waitpid(process.pid, 0)[1] >> 8)
@ -205,8 +206,8 @@ class ConnectionController:
@staticmethod @staticmethod
def establish_tor_session_connection(session_directory: str, port_number: int): def establish_tor_session_connection(session_directory: str, port_number: int):
if subprocess.getstatusoutput('tor --help')[0] == 127: if shutil.which('tor') is None:
raise OSError('Tor does not appear to be installed.') raise CommandNotFoundError('tor')
tor_session_directory = f'{session_directory}/tor' tor_session_directory = f'{session_directory}/tor'
Path(tor_session_directory).mkdir(exist_ok=True, mode=0o700) Path(tor_session_directory).mkdir(exist_ok=True, mode=0o700)
@ -236,11 +237,11 @@ class ConnectionController:
@staticmethod @staticmethod
def establish_proxy_session_connection(profile: SessionProfile, session_directory: str, port_number: int, proxy_port_number: int): def establish_proxy_session_connection(profile: SessionProfile, session_directory: str, port_number: int, proxy_port_number: int):
if subprocess.getstatusoutput('proxychains4 --help')[0] == 127: if shutil.which('proxychains4') is None:
raise OSError('ProxyChains does not appear to be installed.') raise CommandNotFoundError('proxychains4')
if subprocess.getstatusoutput('microsocks --help')[0] == 127: if shutil.which('microsocks') is None:
raise OSError('MicroSocks does not appear to be installed.') raise CommandNotFoundError('microsocks')
if profile.has_proxy_configuration(): if profile.has_proxy_configuration():
proxy_configuration = profile.get_proxy_configuration() proxy_configuration = profile.get_proxy_configuration()
@ -275,11 +276,11 @@ class ConnectionController:
@staticmethod @staticmethod
def terminate_system_connection(profile: SystemProfile): def terminate_system_connection(profile: SystemProfile):
if subprocess.getstatusoutput('pkexec --help')[0] == 127: if shutil.which('pkexec') is None:
raise OSError('The polkit toolkit does not appear to be installed.') raise CommandNotFoundError('pkexec')
if subprocess.getstatusoutput('wg-quick --help')[0] == 127: if shutil.which('wg-quick') is None:
raise OSError('WireGuard tools does not appear to be installed.') raise CommandNotFoundError('wg-quick')
process = subprocess.Popen(('pkexec', 'wg-quick', 'down', profile.get_wireguard_configuration_path()), stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) process = subprocess.Popen(('pkexec', 'wg-quick', 'down', profile.get_wireguard_configuration_path()), stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
completed_successfully = not bool(os.waitpid(process.pid, 0)[1] >> 8) completed_successfully = not bool(os.waitpid(process.pid, 0)[1] >> 8)
@ -365,8 +366,8 @@ class ConnectionController:
@staticmethod @staticmethod
def system_uses_wireguard_interface(): def system_uses_wireguard_interface():
if subprocess.getstatusoutput('ip --help')[0] == 127: if shutil.which('ip') is None:
raise OSError('The iproute2 utility package does not appear to be installed.') raise CommandNotFoundError('ip')
process = subprocess.Popen(('ip', 'route', 'get', '192.0.2.1'), stdout=subprocess.PIPE) process = subprocess.Popen(('ip', 'route', 'get', '192.0.2.1'), stdout=subprocess.PIPE)
process_output = str(process.stdout.read()) process_output = str(process.stdout.read())

View file

@ -216,7 +216,7 @@ class ProfileController:
from core.controllers.ConnectionController import ConnectionController from core.controllers.ConnectionController import ConnectionController
if profile.subscription is None: if profile.subscription is None:
raise InvalidSubscriptionError() raise MissingSubscriptionError()
if profile.location is None: if profile.location is None:
raise MissingLocationError() raise MissingLocationError()

View file

@ -1,10 +1,11 @@
from core.Constants import Constants from core.Constants import Constants
from core.Errors import ProfileDeletionError, ProfileModificationError from core.Errors import ProfileDeletionError, ProfileModificationError, CommandNotFoundError
from core.models.BaseProfile import BaseProfile from core.models.BaseProfile import BaseProfile
from core.models.system.SystemConnection import SystemConnection from core.models.system.SystemConnection import SystemConnection
from dataclasses import dataclass from dataclasses import dataclass
from typing import Optional from typing import Optional
import os import os
import shutil
import subprocess import subprocess
@ -17,8 +18,8 @@ class SystemProfile(BaseProfile):
def attach_wireguard_configuration(self, wireguard_configuration): def attach_wireguard_configuration(self, wireguard_configuration):
if subprocess.getstatusoutput('pkexec --help')[0] == 127: if shutil.which('pkexec') is None:
raise OSError('The polkit toolkit does not appear to be installed.') raise CommandNotFoundError('pkexec')
wireguard_configuration_file_backup_path = f'{self.get_config_path()}/wg.conf.bak' wireguard_configuration_file_backup_path = f'{self.get_config_path()}/wg.conf.bak'
@ -51,8 +52,8 @@ class SystemProfile(BaseProfile):
if self.has_wireguard_configuration(): if self.has_wireguard_configuration():
if subprocess.getstatusoutput('pkexec --help')[0] == 127: if shutil.which('pkexec') is None:
raise OSError('The polkit toolkit does not appear to be installed.') raise CommandNotFoundError('pkexec')
process = subprocess.Popen(('pkexec', 'rm', '-d', self.get_wireguard_configuration_path(), self.get_system_config_path())) process = subprocess.Popen(('pkexec', 'rm', '-d', self.get_wireguard_configuration_path(), self.get_system_config_path()))
completed_successfully = not bool(os.waitpid(process.pid, 0)[1] >> 8) completed_successfully = not bool(os.waitpid(process.pid, 0)[1] >> 8)