diff --git a/src/netcontroller/torcontrol/__init__.py b/src/netcontroller/torcontrol/__init__.py index 7f0777e8..90573f38 100644 --- a/src/netcontroller/torcontrol/__init__.py +++ b/src/netcontroller/torcontrol/__init__.py @@ -7,7 +7,6 @@ import subprocess import signal import time import multiprocessing -import platform # For windows sigkill workaround from onionrtypes import BooleanSuccessState import logger @@ -129,28 +128,26 @@ class NetController: return True def killTor(self): - """ - Properly kill tor based on pid saved to file - """ - + """Properly kill tor based on pid saved to file.""" try: - pid = open(self.dataDir + 'torPid.txt', 'r') - pidN = pid.read() - pid.close() + with open(self.dataDir + 'torPid.txt', 'r') as torPid: + pidN = torPid.read() except FileNotFoundError: return - try: - int(pidN) - except ValueError: - return - try: try: + # Extra int() os.kill(int(pidN), signal.SIGTERM) except PermissionError: # seems to happen on win 10 pass + except ValueError: + # Happens if int() check is not valid + logger.error("torPid.txt contained invalid integer. " + + "This indicates corruption " + + "and should not be bypassed for security reasons") + return os.remove(self.dataDir + 'torPid.txt') except ProcessLookupError: pass @@ -162,10 +159,6 @@ class NetController: except KeyboardInterrupt: pass - if 'windows' == platform.system().lower(): - os.system(f'taskkill /PID {pidN} /F') - time.sleep(0.5) - return try: os.kill(int(pidN), signal.SIGKILL) except (ProcessLookupError, PermissionError): diff --git a/src/netcontroller/torcontrol/gentorrc.py b/src/netcontroller/torcontrol/gentorrc.py index 59a76596..dbd1dc4c 100644 --- a/src/netcontroller/torcontrol/gentorrc.py +++ b/src/netcontroller/torcontrol/gentorrc.py @@ -5,6 +5,7 @@ Generate a generate a torrc file for our Onionr instance import base64 import os import subprocess +from typing import TYPE_CHECKING from .. import getopenport from . import customtorrc @@ -12,6 +13,10 @@ from . import addbridges from . import torbinary from utils import identifyhome import config + +if TYPE_CHECKING: + from netcontroller import NetController + from onionrtypes import LoopBackIP """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +35,8 @@ import config add_bridges = addbridges.add_bridges -def generate_torrc(net_controller, api_server_ip): +def generate_torrc(net_controller: 'NetController', + api_server_ip: 'LoopBackIP'): """Generate a torrc file for our tor instance.""" socks_port = net_controller.socksPort hs_port = net_controller.hsPort @@ -43,13 +49,14 @@ def generate_torrc(net_controller, api_server_ip): Set the Tor control password. Meant to make it harder to manipulate our Tor instance """ - plaintext = base64.b85encode(os.urandom(50)).decode() + plaintext = base64.b85encode( + os.urandom(50)).decode() config.set('tor.controlpassword', plaintext, savefile=True) config.set('tor.socksport', socks_port, savefile=True) - controlPort = getopenport.get_open_port() + control_port = getopenport.get_open_port() - config.set('tor.controlPort', controlPort, savefile=True) + config.set('tor.controlPort', control_port, savefile=True) hashedPassword = subprocess.Popen([torbinary.tor_binary(), '--hash-password', @@ -66,7 +73,7 @@ DataDirectory """ + home_dir + """tordata/ CookieAuthentication 1 KeepalivePeriod 40 CircuitsAvailableTimeout 86400 -ControlPort """ + str(controlPort) + """ +ControlPort """ + str(control_port) + """ HashedControlPassword """ + str(password) + """ """ if config.get('general.security_level', 1) == 0: diff --git a/src/onionrtypes/__init__.py b/src/onionrtypes/__init__.py index ebfe109b..afd0f7ee 100644 --- a/src/onionrtypes/__init__.py +++ b/src/onionrtypes/__init__.py @@ -3,7 +3,8 @@ from typing import NewType UserID = NewType('UserID', str) UserIDSecretKey = NewType('UserIDSecretKey', str) -LANIP = NewType('LANIP', 'str') +LANIP = NewType('LANIP', str) +LoopBackIP = NewType('LoopBackIP', str) DeterministicKeyPassphrase = NewType('DeterministicKeyPassphrase', str)