From fae5d22e86929583d04e9197f9e1c12dd0b1890a Mon Sep 17 00:00:00 2001 From: shortcutme Date: Fri, 14 Apr 2017 16:05:42 +0200 Subject: [PATCH] Rev2054, Outgoing socket binding support --- src/Config.py | 2 +- src/Connection/Connection.py | 3 +-- src/main.py | 9 ++++++++- src/util/helper.py | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Config.py b/src/Config.py index 3842f361..3a196e86 100644 --- a/src/Config.py +++ b/src/Config.py @@ -10,7 +10,7 @@ class Config(object): def __init__(self, argv): self.version = "0.5.4" - self.rev = 2050 + self.rev = 2054 self.argv = argv self.action = None self.config_file = "zeronet.conf" diff --git a/src/Connection/Connection.py b/src/Connection/Connection.py index 21089449..234053db 100644 --- a/src/Connection/Connection.py +++ b/src/Connection/Connection.py @@ -98,8 +98,7 @@ class Connection(object): raise Exception("Can't connect to onion addresses, no Tor controller present") self.sock = self.server.tor_manager.createSocket(self.ip, self.port) else: - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.connect((self.ip, int(self.port))) + self.sock = socket.create_connection((self.ip, int(self.port))) # Implicit SSL if self.cert_pin: diff --git a/src/main.py b/src/main.py index d0db50f7..fa8ef59b 100644 --- a/src/main.py +++ b/src/main.py @@ -116,7 +116,7 @@ if config.stack_size: if config.msgpack_purepython: os.environ["MSGPACK_PUREPYTHON"] = "True" -# Socks Proxy monkey patch +# Socket monkey patch if config.proxy: from util import SocksProxy import urllib2 @@ -132,6 +132,13 @@ elif config.tor == "always": config.fileserver_ip = '127.0.0.1' # Do not accept connections anywhere but localhost SocksProxy.monkeyPatch(*config.tor_proxy.split(":")) config.disable_udp = True +elif config.bind: + bind = config.bind + if ":" not in config.bind: + bind += ":0" + from util import helper + helper.socketBindMonkeyPatch(*bind.split(":")) + # -- Actions -- diff --git a/src/util/helper.py b/src/util/helper.py index 597a8d75..ac3037af 100644 --- a/src/util/helper.py +++ b/src/util/helper.py @@ -179,3 +179,18 @@ def timerCaller(secs, func, *args, **kwargs): def timer(secs, func, *args, **kwargs): gevent.spawn_later(secs, timerCaller, secs, func, *args, **kwargs) + + +def create_connection(address, timeout=None, source_address=None): + if address in config.ip_local: + sock = socket.create_connection_original(address, timeout, source_address) + else: + sock = socket.create_connection_original(address, timeout, socket.bind_addr) + return sock + +def socketBindMonkeyPatch(bind_ip, bind_port): + import socket + logging.info("Monkey patching socket to bind to: %s:%s" % (bind_ip, bind_port)) + socket.bind_addr = (bind_ip, int(bind_port)) + socket.create_connection_original = socket.create_connection + socket.create_connection = create_connection