work on the ability to attach to existing Tor

This commit is contained in:
Kevin Froman 2020-01-31 18:23:48 -06:00
parent 8bf1389a48
commit ea47ae456b
8 changed files with 68 additions and 18 deletions

View File

@ -22,6 +22,7 @@ lock_file = home + 'onionr.lock'
site_cache = home + 'onionr-sites.txt' site_cache = home + 'onionr-sites.txt'
tor_hs_loc = home + 'hs/'
tor_hs_address_file = home + 'hs/hostname' tor_hs_address_file = home + 'hs/hostname'
run_check_file = home + '.runcheck' run_check_file = home + '.runcheck'

View File

@ -12,7 +12,6 @@ import multiprocessing
import platform # For windows sigkill workaround import platform # For windows sigkill workaround
from onionrtypes import BooleanSuccessState from onionrtypes import BooleanSuccessState
import config
import logger import logger
from .. import getopenport from .. import getopenport
from .. import watchdog from .. import watchdog
@ -36,7 +35,6 @@ from utils import identifyhome
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
config.reload()
TOR_KILL_WAIT = 3 TOR_KILL_WAIT = 3
addbridges = addbridges.add_bridges addbridges = addbridges.add_bridges

View File

@ -1,4 +1,30 @@
"""Onionr - Private P2P Communication. """Onionr - Private P2P Communication.
Create an ephemeral onion service Create an ephemeral onion service
""" """
from .torcontroller import get_controller
"""
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
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
def create_onion_service(port=80):
controller = get_controller()
hs = controller.create_ephemeral_hidden_service(
{80: port},
key_type='NEW',
key_content='ED25519-V3',
await_publication=True,
detached=True)
return (hs.service_id, hs.private_key)

View File

@ -1,9 +1,16 @@
from stem.control import Controller from stem.control import Controller
import config import config
config.reload()
def get_controller(): def get_controller() -> Controller:
c = Controller.from_port(port=config.get('tor.controlPort')) """Create and return a Tor controller connection."""
c.authenticate(config.get('tor.controlpassword')) port = config.get('tor.controlPort', 0)
password = config.get('tor.controlpassword', '')
if config.get('tor.use_existing_tor', False):
port = config.get('tor.existing_control_port', 0)
password = config.get('tor.existing_control_password', '')
c = Controller.from_port(port=port)
c.authenticate(password)
return c return c

View File

@ -20,6 +20,7 @@ import logger
import communicator import communicator
from onionrplugins import onionrevents as events from onionrplugins import onionrevents as events
from netcontroller import NetController from netcontroller import NetController
from netcontroller import get_open_port
from onionrutils import localcommand from onionrutils import localcommand
import filepaths import filepaths
from etc import onionrvalues, cleanup from etc import onionrvalues, cleanup
@ -29,7 +30,8 @@ import runtests
from httpapi import daemoneventsapi from httpapi import daemoneventsapi
from .. import version from .. import version
from .getapihost import get_api_host_until_available from .getapihost import get_api_host_until_available
from .bettersleep import better_sleep from utils.bettersleep import better_sleep
from netcontroller.torcontrol.onionservicecreator import create_onion_service
""" """
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -105,14 +107,23 @@ def daemon():
shared_state.get(onionrstatistics.tor.TorStats) shared_state.get(onionrstatistics.tor.TorStats)
security_level = config.get('general.security_level', 1)
use_existing_tor = config.get('tor.use_existing_tor', False)
if not offline_mode: if not offline_mode:
logger.info('Tor is starting...', terminal=True) if use_existing_tor:
if not net.startTor(): net.socksPort = config.get('tor.existing_socks_port')
localcommand.local_command('shutdown') net.myID = create_onion_service(port=get_open_port())
cleanup.delete_run_files() with open(filepaths.tor_hs_address_file, 'w') as tor_file:
sys.exit(1) tor_file.write(net.myID)
if len(net.myID) > 0 and config.get('general.security_level', 1) == 0: else:
logger.info('Tor is starting...', terminal=True)
if not net.startTor():
localcommand.local_command('shutdown')
cleanup.delete_run_files()
sys.exit(1)
if len(net.myID) > 0 and security_level == 0:
logger.debug('Started .onion service: %s' % logger.debug('Started .onion service: %s' %
(logger.colors.underline + net.myID)) (logger.colors.underline + net.myID))
else: else:
@ -128,7 +139,7 @@ def daemon():
events.event('daemon_start') events.event('daemon_start')
communicator.startCommunicator(shared_state) communicator.startCommunicator(shared_state)
if not offline_mode: if not offline_mode and not use_existing_tor:
net.killTor() net.killTor()
better_sleep(5) better_sleep(5)

View File

@ -15,3 +15,5 @@ JSONSerializable = NewType('JSONSerializable', str)
# Return value of some functions or methods, denoting operation success # Return value of some functions or methods, denoting operation success
# Do not use for new code # Do not use for new code
BooleanSuccessState = NewType('BooleanSuccessState', bool) BooleanSuccessState = NewType('BooleanSuccessState', bool)
OnionAddressString = NewType('OnionAddressString', str)

View File

@ -22,10 +22,14 @@ from . import identifyhome
import filepaths import filepaths
home = identifyhome.identify_home() home = identifyhome.identify_home()
def create_dirs(): def create_dirs():
"""Creates onionr data-related directories in order of the hardcoded list below, """Create onionr data-related directories in
order of the hardcoded list below,
then trigger creation of DBs""" then trigger creation of DBs"""
gen_dirs = [home, filepaths.block_data_location, filepaths.contacts_location, filepaths.export_location] gen_dirs = [home, filepaths.block_data_location,
filepaths.contacts_location, filepaths.export_location,
filepaths.tor_hs_loc]
for path in gen_dirs: for path in gen_dirs:
if not os.path.exists(path): if not os.path.exists(path):
os.mkdir(path) os.mkdir(path)

View File

@ -55,9 +55,10 @@
"use_bridge": false, "use_bridge": false,
"bridge_ip": "", "bridge_ip": "",
"bridge_fingerprint": "", "bridge_fingerprint": "",
"use_existing_tor": false,
"existing_control_port": 0, "existing_control_port": 0,
"existing_control_password": "", "existing_control_password": "",
"temp_transport": false "existing_socks_port": 0
}, },
"allocations": { "allocations": {