TrackerZero: add support of persistent onion addresses
This commit is contained in:
parent
9a8519b487
commit
a36b2c9241
1 changed files with 44 additions and 18 deletions
|
@ -1,6 +1,7 @@
|
||||||
import atexit
|
import atexit
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
@ -21,7 +22,6 @@ class TrackerZero(object):
|
||||||
self.load()
|
self.load()
|
||||||
atexit.register(self.save)
|
atexit.register(self.save)
|
||||||
|
|
||||||
|
|
||||||
def logOnce(self, message):
|
def logOnce(self, message):
|
||||||
if message in self.log_once:
|
if message in self.log_once:
|
||||||
return
|
return
|
||||||
|
@ -190,11 +190,23 @@ class TrackerZero(object):
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def registerSharedAddresses(self, file_server, port_open):
|
def registerTrackerAddress(self, message, address, port):
|
||||||
tracker_storage = self.getTrackerStorage()
|
_tracker_storage = self.getTrackerStorage()
|
||||||
if not tracker_storage:
|
if not _tracker_storage:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
my_tracker_address = "zero://%s:%s" % (address, port)
|
||||||
|
if _tracker_storage.onTrackerFound(my_tracker_address, my=True):
|
||||||
|
self.logOnce("listening on %s: %s" % (message, my_tracker_address))
|
||||||
|
self.enabled_addresses.append("%s:%s" % (address, port))
|
||||||
|
|
||||||
|
def registerTrackerAddresses(self, file_server, port_open):
|
||||||
|
_tracker_storage = self.getTrackerStorage()
|
||||||
|
if not _tracker_storage:
|
||||||
|
return
|
||||||
|
|
||||||
|
tor_manager = file_server.tor_manager
|
||||||
|
|
||||||
settings = self.config.get("settings", {})
|
settings = self.config.get("settings", {})
|
||||||
|
|
||||||
if not settings.get("enable"):
|
if not settings.get("enable"):
|
||||||
|
@ -209,22 +221,36 @@ class TrackerZero(object):
|
||||||
|
|
||||||
if settings.get("listen_on_public_ips") and port_open and not config.tor == "always":
|
if settings.get("listen_on_public_ips") and port_open and not config.tor == "always":
|
||||||
for ip in file_server.ip_external_list:
|
for ip in file_server.ip_external_list:
|
||||||
my_tracker_address = "zero://%s:%s" % (ip, config.fileserver_port)
|
self.registerTrackerAddress("public IP", ip, config.fileserver_port)
|
||||||
if tracker_storage.onTrackerFound(my_tracker_address, my=True):
|
|
||||||
self.logOnce("listening on public IP: %s" % my_tracker_address)
|
|
||||||
self.enabled_addresses.append(my_tracker_address)
|
|
||||||
|
|
||||||
if settings.get("listen_on_temporary_onion_address") and file_server.tor_manager.enabled:
|
if settings.get("listen_on_temporary_onion_address") and tor_manager.enabled:
|
||||||
onion = file_server.tor_manager.getOnion(config.homepage)
|
onion = tor_manager.getOnion(config.homepage)
|
||||||
if onion:
|
if onion:
|
||||||
my_tracker_address = "zero://%s.onion:%s" % (onion, file_server.tor_manager.fileserver_port)
|
self.registerTrackerAddress("temporary onion address", onion, tor_manager.fileserver_port)
|
||||||
if tracker_storage.onTrackerFound(my_tracker_address, my=True):
|
|
||||||
self.logOnce("listening on temporary onion address: %s" % my_tracker_address)
|
|
||||||
self.enabled_addresses.append(my_tracker_address)
|
|
||||||
|
|
||||||
if settings.get("listen_on_persistent_onion_address") and file_server.tor_manager.enabled:
|
if settings.get("listen_on_persistent_onion_address") and tor_manager.enabled:
|
||||||
# FIXME: not implemented
|
persistent_addresses = self.config.setdefault("persistent_addresses", {})
|
||||||
pass
|
if len(persistent_addresses) == 0:
|
||||||
|
result = tor_manager.makeOnionAndKey()
|
||||||
|
if result:
|
||||||
|
onion_address, onion_privatekey = result
|
||||||
|
persistent_addresses[onion_address] = {
|
||||||
|
"private_key": onion_privatekey
|
||||||
|
}
|
||||||
|
self.registerTrackerAddress("persistent onion address", onion_address, tor_manager.fileserver_port)
|
||||||
|
else:
|
||||||
|
for address, d in persistent_addresses.items():
|
||||||
|
private_key = d.get("private_key")
|
||||||
|
if not private_key:
|
||||||
|
continue
|
||||||
|
res = tor_manager.request(
|
||||||
|
"ADD_ONION RSA1024:%s port=%s" % (private_key, tor_manager.fileserver_port)
|
||||||
|
)
|
||||||
|
match = re.search("ServiceID=([A-Za-z0-9]+)", res)
|
||||||
|
if match:
|
||||||
|
onion_address = match.groups()[0]
|
||||||
|
if onion_address == address:
|
||||||
|
self.registerTrackerAddress("persistent onion address", onion_address, tor_manager.fileserver_port)
|
||||||
|
|
||||||
return len(self.enabled_addresses) > 0
|
return len(self.enabled_addresses) > 0
|
||||||
|
|
||||||
|
@ -246,7 +272,7 @@ class FileRequestPlugin(object):
|
||||||
class FileServerPlugin(object):
|
class FileServerPlugin(object):
|
||||||
def portCheck(self, *args, **kwargs):
|
def portCheck(self, *args, **kwargs):
|
||||||
res = super(FileServerPlugin, self).portCheck(*args, **kwargs)
|
res = super(FileServerPlugin, self).portCheck(*args, **kwargs)
|
||||||
tracker_zero.registerSharedAddresses(self, res)
|
tracker_zero.registerTrackerAddresses(self, res)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue