|
|
@ -7,6 +7,7 @@ import socket |
|
|
|
from test_framework.socks5 import Socks5Configuration, Socks5Command, Socks5Server, AddressType |
|
|
|
from test_framework.socks5 import Socks5Configuration, Socks5Command, Socks5Server, AddressType |
|
|
|
from test_framework.test_framework import BitcoinTestFramework |
|
|
|
from test_framework.test_framework import BitcoinTestFramework |
|
|
|
from test_framework.util import * |
|
|
|
from test_framework.util import * |
|
|
|
|
|
|
|
from test_framework.netutil import test_ipv6_local |
|
|
|
''' |
|
|
|
''' |
|
|
|
Test plan: |
|
|
|
Test plan: |
|
|
|
- Start bitcoind's with different proxy configurations |
|
|
|
- Start bitcoind's with different proxy configurations |
|
|
@ -34,6 +35,7 @@ addnode connect to generic DNS name |
|
|
|
|
|
|
|
|
|
|
|
class ProxyTest(BitcoinTestFramework): |
|
|
|
class ProxyTest(BitcoinTestFramework): |
|
|
|
def __init__(self): |
|
|
|
def __init__(self): |
|
|
|
|
|
|
|
self.have_ipv6 = test_ipv6_local() |
|
|
|
# Create two proxies on different ports |
|
|
|
# Create two proxies on different ports |
|
|
|
# ... one unauthenticated |
|
|
|
# ... one unauthenticated |
|
|
|
self.conf1 = Socks5Configuration() |
|
|
|
self.conf1 = Socks5Configuration() |
|
|
@ -45,29 +47,36 @@ class ProxyTest(BitcoinTestFramework): |
|
|
|
self.conf2.addr = ('127.0.0.1', 14000 + (os.getpid() % 1000)) |
|
|
|
self.conf2.addr = ('127.0.0.1', 14000 + (os.getpid() % 1000)) |
|
|
|
self.conf2.unauth = True |
|
|
|
self.conf2.unauth = True |
|
|
|
self.conf2.auth = True |
|
|
|
self.conf2.auth = True |
|
|
|
|
|
|
|
if self.have_ipv6: |
|
|
|
# ... one on IPv6 with similar configuration |
|
|
|
# ... one on IPv6 with similar configuration |
|
|
|
self.conf3 = Socks5Configuration() |
|
|
|
self.conf3 = Socks5Configuration() |
|
|
|
self.conf3.af = socket.AF_INET6 |
|
|
|
self.conf3.af = socket.AF_INET6 |
|
|
|
self.conf3.addr = ('::1', 15000 + (os.getpid() % 1000)) |
|
|
|
self.conf3.addr = ('::1', 15000 + (os.getpid() % 1000)) |
|
|
|
self.conf3.unauth = True |
|
|
|
self.conf3.unauth = True |
|
|
|
self.conf3.auth = True |
|
|
|
self.conf3.auth = True |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
print "Warning: testing without local IPv6 support" |
|
|
|
|
|
|
|
|
|
|
|
self.serv1 = Socks5Server(self.conf1) |
|
|
|
self.serv1 = Socks5Server(self.conf1) |
|
|
|
self.serv1.start() |
|
|
|
self.serv1.start() |
|
|
|
self.serv2 = Socks5Server(self.conf2) |
|
|
|
self.serv2 = Socks5Server(self.conf2) |
|
|
|
self.serv2.start() |
|
|
|
self.serv2.start() |
|
|
|
|
|
|
|
if self.have_ipv6: |
|
|
|
self.serv3 = Socks5Server(self.conf3) |
|
|
|
self.serv3 = Socks5Server(self.conf3) |
|
|
|
self.serv3.start() |
|
|
|
self.serv3.start() |
|
|
|
|
|
|
|
|
|
|
|
def setup_nodes(self): |
|
|
|
def setup_nodes(self): |
|
|
|
# Note: proxies are not used to connect to local nodes |
|
|
|
# Note: proxies are not used to connect to local nodes |
|
|
|
# this is because the proxy to use is based on CService.GetNetwork(), which return NET_UNROUTABLE for localhost |
|
|
|
# this is because the proxy to use is based on CService.GetNetwork(), which return NET_UNROUTABLE for localhost |
|
|
|
return start_nodes(4, self.options.tmpdir, extra_args=[ |
|
|
|
args = [ |
|
|
|
['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf1.addr),'-proxyrandomize=1'], |
|
|
|
['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf1.addr),'-proxyrandomize=1'], |
|
|
|
['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf1.addr),'-onion=%s:%i' % (self.conf2.addr),'-proxyrandomize=0'], |
|
|
|
['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf1.addr),'-onion=%s:%i' % (self.conf2.addr),'-proxyrandomize=0'], |
|
|
|
['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf2.addr),'-proxyrandomize=1'], |
|
|
|
['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf2.addr),'-proxyrandomize=1'], |
|
|
|
['-listen', '-debug=net', '-debug=proxy', '-proxy=[%s]:%i' % (self.conf3.addr),'-proxyrandomize=0', '-noonion'] |
|
|
|
[] |
|
|
|
]) |
|
|
|
] |
|
|
|
|
|
|
|
if self.have_ipv6: |
|
|
|
|
|
|
|
args[3] = ['-listen', '-debug=net', '-debug=proxy', '-proxy=[%s]:%i' % (self.conf3.addr),'-proxyrandomize=0', '-noonion'] |
|
|
|
|
|
|
|
return start_nodes(4, self.options.tmpdir, extra_args=args) |
|
|
|
|
|
|
|
|
|
|
|
def node_test(self, node, proxies, auth, test_onion=True): |
|
|
|
def node_test(self, node, proxies, auth, test_onion=True): |
|
|
|
rv = [] |
|
|
|
rv = [] |
|
|
@ -84,6 +93,7 @@ class ProxyTest(BitcoinTestFramework): |
|
|
|
assert_equal(cmd.password, None) |
|
|
|
assert_equal(cmd.password, None) |
|
|
|
rv.append(cmd) |
|
|
|
rv.append(cmd) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if self.have_ipv6: |
|
|
|
# Test: outgoing IPv6 connection through node |
|
|
|
# Test: outgoing IPv6 connection through node |
|
|
|
node.addnode("[1233:3432:2434:2343:3234:2345:6546:4534]:5443", "onetry") |
|
|
|
node.addnode("[1233:3432:2434:2343:3234:2345:6546:4534]:5443", "onetry") |
|
|
|
cmd = proxies[1].queue.get() |
|
|
|
cmd = proxies[1].queue.get() |
|
|
@ -135,8 +145,9 @@ class ProxyTest(BitcoinTestFramework): |
|
|
|
rv = self.node_test(self.nodes[2], [self.serv2, self.serv2, self.serv2, self.serv2], True) |
|
|
|
rv = self.node_test(self.nodes[2], [self.serv2, self.serv2, self.serv2, self.serv2], True) |
|
|
|
# Check that credentials as used for -proxyrandomize connections are unique |
|
|
|
# Check that credentials as used for -proxyrandomize connections are unique |
|
|
|
credentials = set((x.username,x.password) for x in rv) |
|
|
|
credentials = set((x.username,x.password) for x in rv) |
|
|
|
assert_equal(len(credentials), 4) |
|
|
|
assert_equal(len(credentials), len(rv)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if self.have_ipv6: |
|
|
|
# proxy on IPv6 localhost |
|
|
|
# proxy on IPv6 localhost |
|
|
|
self.node_test(self.nodes[3], [self.serv3, self.serv3, self.serv3, self.serv3], False, False) |
|
|
|
self.node_test(self.nodes[3], [self.serv3, self.serv3, self.serv3, self.serv3], False, False) |
|
|
|
|
|
|
|
|
|
|
@ -167,6 +178,7 @@ class ProxyTest(BitcoinTestFramework): |
|
|
|
assert_equal(n2[net]['proxy_randomize_credentials'], True) |
|
|
|
assert_equal(n2[net]['proxy_randomize_credentials'], True) |
|
|
|
assert_equal(n2['onion']['reachable'], True) |
|
|
|
assert_equal(n2['onion']['reachable'], True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if self.have_ipv6: |
|
|
|
n3 = networks_dict(self.nodes[3].getnetworkinfo()) |
|
|
|
n3 = networks_dict(self.nodes[3].getnetworkinfo()) |
|
|
|
for net in ['ipv4','ipv6']: |
|
|
|
for net in ['ipv4','ipv6']: |
|
|
|
assert_equal(n3[net]['proxy'], '[%s]:%i' % (self.conf3.addr)) |
|
|
|
assert_equal(n3[net]['proxy'], '[%s]:%i' % (self.conf3.addr)) |
|
|
|