diff --git a/core/Constants.py b/core/Constants.py index f61e9ce..dd5629e 100644 --- a/core/Constants.py +++ b/core/Constants.py @@ -47,8 +47,8 @@ class Constants: HV_PRIVILEGE_POLICY_PATH: Final[str] = f'{SYSTEM_CONFIG_PATH}/sudoers.d/hydra-veil' HV_SESSION_STATE_HOME: Final[str] = f'{HV_STATE_HOME}/sessions' - HV_TOR_SESSION_STATE_HOME: Final[str] = f'{HV_SESSION_STATE_HOME}/tor' + HV_TOR_STATE_HOME: Final[str] = f'{HV_STATE_HOME}/tor' - HV_TOR_CONTROL_SOCKET_PATH: Final[str] = f'{HV_TOR_SESSION_STATE_HOME}/tor.sock' - HV_TOR_PROCESS_IDENTIFIER_PATH: Final[str] = f'{HV_TOR_SESSION_STATE_HOME}/tor.pid' - HV_TOR_INSTANCE_LOCK_PATH: Final[str] = f'{HV_TOR_SESSION_STATE_HOME}/lock' + HV_TOR_CONTROL_SOCKET_PATH: Final[str] = f'{HV_TOR_STATE_HOME}/tor.sock' + HV_TOR_PROCESS_IDENTIFIER_PATH: Final[str] = f'{HV_TOR_STATE_HOME}/tor.pid' + HV_TOR_INSTANCE_LOCK_PATH: Final[str] = f'{HV_TOR_STATE_HOME}/lock' diff --git a/core/controllers/ConnectionController.py b/core/controllers/ConnectionController.py index 356989b..c66a4e1 100644 --- a/core/controllers/ConnectionController.py +++ b/core/controllers/ConnectionController.py @@ -206,6 +206,7 @@ class ConnectionController: raise ConnectionError('The connection could not be established.') + ConnectionController.terminate_tor_connection() time.sleep(1.0) @staticmethod @@ -252,7 +253,7 @@ class ConnectionController: @staticmethod def establish_tor_connection(connection_observer: Optional[ConnectionObserver] = None): - Path(Constants.HV_TOR_SESSION_STATE_HOME).mkdir(exist_ok=True, mode=0o700) + Path(Constants.HV_TOR_STATE_HOME).mkdir(mode=0o700, parents=True, exist_ok=True) ConnectionController.terminate_tor_connection() @@ -264,7 +265,7 @@ class ConnectionController: future = executor.submit( stem.process.launch_tor_with_config, config={ - 'DataDirectory': Constants.HV_TOR_SESSION_STATE_HOME, + 'DataDirectory': Constants.HV_TOR_STATE_HOME, 'ControlSocket': Constants.HV_TOR_CONTROL_SOCKET_PATH, 'PIDFile': Constants.HV_TOR_PROCESS_IDENTIFIER_PATH, 'SocksPort': '0' @@ -398,6 +399,7 @@ class ConnectionController: if completed_successfully or not ConnectionController.system_uses_wireguard_interface(): subprocess.run(('nmcli', 'connection', 'delete', 'hv-ipv6-sink'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + ConnectionController.terminate_tor_connection() SystemState.dissolve() else: @@ -482,6 +484,9 @@ class ConnectionController: @staticmethod def __establish_system_connection(profile: SystemProfile, connection_observer: Optional[ConnectionObserver] = None): + if shutil.which('dbus-send') is None: + raise CommandNotFoundError('dbus-send') + if shutil.which('nmcli') is None: raise CommandNotFoundError('nmcli') @@ -489,19 +494,28 @@ class ConnectionController: try: process_output = subprocess.check_output(('nmcli', 'connection', 'import', '--temporary', 'type', 'wireguard', 'file', profile.get_wireguard_configuration_path()), text=True) - except CalledProcessError as exception: - raise CalledProcessError(exception.returncode, 'nmcli') - - connection_id = (m := re.search(r'(?<=\()([a-f0-9-]+?)(?=\))', process_output)) and m.group(1) - subprocess.run(('nmcli', 'connection', 'modify', connection_id, 'ipv4.dns-priority', '-1750', 'ipv4.ignore-auto-dns', 'yes'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + except CalledProcessError: + raise ConnectionError('The connection could not be established.') try: + + connection_id = (m := re.search(r'(?<=\()([a-f0-9-]+?)(?=\))', process_output)) and m.group(1) ipv6_method = subprocess.check_output(('nmcli', '-g', 'ipv6.method', 'connection', 'show', connection_id), text=True).strip() + except CalledProcessError: raise ConnectionError('The connection could not be established.') if ipv6_method in ('disabled', 'ignore'): - subprocess.run(('nmcli', 'connection', 'add', 'type', 'dummy', 'save', 'no', 'con-name', 'hv-ipv6-sink', 'ifname', 'hvipv6sink0', 'ipv6.method', 'manual', 'ipv6.addresses', 'fd7a:fd4b:54e3:077c::/64', 'ipv6.gateway', 'fd7a:fd4b:54e3:077c::1', 'ipv6.route-metric', '72'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + try: + subprocess.run(('dbus-send', '--system', '--print-reply', '--dest=org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager', 'org.freedesktop.DBus.Properties.Set', 'string:org.freedesktop.NetworkManager', 'string:ConnectivityCheckEnabled', 'variant:boolean:false'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) + except CalledProcessError: + raise ConnectionError('The connection could not be established.') + + try: + subprocess.run(('nmcli', 'connection', 'add', 'type', 'dummy', 'save', 'no', 'con-name', 'hv-ipv6-sink', 'ifname', 'hvipv6sink0', 'ipv6.method', 'manual', 'ipv6.addresses', 'fd7a:fd4b:54e3:077c::/64', 'ipv6.gateway', 'fd7a:fd4b:54e3:077c::1', 'ipv6.dns', '::1', 'ipv6.route-metric', '72'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) + except CalledProcessError: + raise ConnectionError('The connection could not be established.') SystemStateController.create(profile.id) diff --git a/core/models/session/SessionState.py b/core/models/session/SessionState.py index 4718a04..eda4552 100644 --- a/core/models/session/SessionState.py +++ b/core/models/session/SessionState.py @@ -67,9 +67,14 @@ class SessionState: @staticmethod def all(): + try: + directory_entries = os.listdir(Constants.HV_SESSION_STATE_HOME) + except FileNotFoundError: + return [] + session_states = [] - for directory_entry in os.listdir(Constants.HV_SESSION_STATE_HOME): + for directory_entry in directory_entries: try: id = int(directory_entry)