Make TorManager accept plugins

This commit is contained in:
MuxZeroNet 2017-02-17 01:17:51 +00:00 committed by GitHub
parent d57d82f439
commit ddc3f72afb

View file

@ -20,9 +20,11 @@ except:
from gevent.lock import RLock from gevent.lock import RLock
from util import helper from util import helper
from Debug import Debug from Debug import Debug
from Plugin import PluginManager
class TorManager: @PluginManager.acceptPlugins
class TorManager(object):
def __init__(self, fileserver_ip=None, fileserver_port=None): def __init__(self, fileserver_ip=None, fileserver_port=None):
self.privatekeys = {} # Onion: Privatekey self.privatekeys = {} # Onion: Privatekey
self.site_onions = {} # Site address: Onion self.site_onions = {} # Site address: Onion
@ -58,7 +60,7 @@ class TorManager:
assert self.connect(), "No connection" assert self.connect(), "No connection"
self.log.debug("Tor proxy port %s check ok" % config.tor_proxy) self.log.debug("Tor proxy port %s check ok" % config.tor_proxy)
except Exception, err: except Exception, err:
self.log.debug("Tor proxy port %s check error: %s" % (config.tor_proxy, err)) self.log.info("Starting self-bundled Tor, due to Tor proxy port %s check error: %s" % (config.tor_proxy, err))
self.enabled = False self.enabled = False
# Change to self-bundled Tor ports # Change to self-bundled Tor ports
from lib.PySocks import socks from lib.PySocks import socks
@ -148,12 +150,15 @@ class TorManager:
self.site_onions = {} self.site_onions = {}
self.privatekeys = {} self.privatekeys = {}
return self.connectController()
def connectController(self):
if "socket_noproxy" in dir(socket): # Socket proxy-patched, use non-proxy one if "socket_noproxy" in dir(socket): # Socket proxy-patched, use non-proxy one
conn = socket.socket_noproxy(socket.AF_INET, socket.SOCK_STREAM) conn = socket.socket_noproxy(socket.AF_INET, socket.SOCK_STREAM)
else: else:
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.log.debug("Connecting to %s:%s" % (self.ip, self.port)) self.log.info("Connecting to Tor Controller %s:%s" % (self.ip, self.port))
try: try:
with self.lock: with self.lock:
conn.connect((self.ip, self.port)) conn.connect((self.ip, self.port))
@ -203,19 +208,28 @@ class TorManager:
self.log.error("Tor reset circuits error: %s" % res) self.log.error("Tor reset circuits error: %s" % res)
def addOnion(self): def addOnion(self):
result = self.makeOnionAndKey()
if result:
onion_address, onion_privatekey = result
self.privatekeys[onion_address] = onion_privatekey
self.status = u"OK (%s onions running)" % len(self.privatekeys)
SiteManager.peer_blacklist.append((onion_address + ".onion", self.fileserver_port))
return onion_address
else:
return False
def makeOnionAndKey(self):
res = self.request("ADD_ONION NEW:RSA1024 port=%s" % self.fileserver_port) res = self.request("ADD_ONION NEW:RSA1024 port=%s" % self.fileserver_port)
match = re.search("ServiceID=([A-Za-z0-9]+).*PrivateKey=RSA1024:(.*?)[\r\n]", res, re.DOTALL) match = re.search("ServiceID=([A-Za-z0-9]+).*PrivateKey=RSA1024:(.*?)[\r\n]", res, re.DOTALL)
if match: if match:
onion_address, onion_privatekey = match.groups() onion_address, onion_privatekey = match.groups()
self.privatekeys[onion_address] = onion_privatekey return (onion_address, onion_privatekey)
self.status = u"OK (%s onion running)" % len(self.privatekeys)
SiteManager.peer_blacklist.append((onion_address + ".onion", self.fileserver_port))
return onion_address
else: else:
self.status = u"AddOnion error (%s)" % res self.status = u"AddOnion error (%s)" % res
self.log.error("Tor addOnion error: %s" % res) self.log.error("Tor addOnion error: %s" % res)
return False return False
def delOnion(self, address): def delOnion(self, address):
res = self.request("DEL_ONION %s" % address) res = self.request("DEL_ONION %s" % address)
if "250 OK" in res: if "250 OK" in res: