mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 11:57:28 -03:00
cc87ee4c39
When initiating a v2 connection and being immediately disconnected, a node cannot know if the disconnect happens because the peer only supports v1, or because it has banned you, so it schedules to reconnect with v1. If the test doesn't wait for that, the reconnect can happen at a bad time, resulting in failure in a later connect_nodes call. Also add the test with --v2transport to the test runner.
88 lines
3.4 KiB
Python
Executable file
88 lines
3.4 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# Copyright (c) 2015-2021 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
"""Test the setban rpc call."""
|
|
|
|
from contextlib import ExitStack
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import (
|
|
p2p_port,
|
|
assert_equal,
|
|
)
|
|
|
|
class SetBanTests(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
self.num_nodes = 2
|
|
self.setup_clean_chain = True
|
|
self.extra_args = [[],[]]
|
|
|
|
def is_banned(self, node, addr):
|
|
return any(e['address'] == addr for e in node.listbanned())
|
|
|
|
def run_test(self):
|
|
# Node 0 connects to Node 1, check that the noban permission is not granted
|
|
self.connect_nodes(0, 1)
|
|
peerinfo = self.nodes[1].getpeerinfo()[0]
|
|
assert not "noban" in peerinfo["permissions"]
|
|
|
|
# Node 0 get banned by Node 1
|
|
self.nodes[1].setban("127.0.0.1", "add")
|
|
|
|
# Node 0 should not be able to reconnect
|
|
context = ExitStack()
|
|
context.enter_context(self.nodes[1].assert_debug_log(expected_msgs=['dropped (banned)\n'], timeout=50))
|
|
# When disconnected right after connecting, a v2 node will attempt to reconnect with v1.
|
|
# Wait for that to happen so that it cannot mess with later tests.
|
|
if self.options.v2transport:
|
|
context.enter_context(self.nodes[0].assert_debug_log(expected_msgs=['trying v1 connection'], timeout=50))
|
|
with context:
|
|
self.restart_node(1, [])
|
|
self.nodes[0].addnode("127.0.0.1:" + str(p2p_port(1)), "onetry")
|
|
|
|
# However, node 0 should be able to reconnect if it has noban permission
|
|
self.restart_node(1, ['-whitelist=127.0.0.1'])
|
|
self.connect_nodes(0, 1)
|
|
peerinfo = self.nodes[1].getpeerinfo()[0]
|
|
assert "noban" in peerinfo["permissions"]
|
|
|
|
# If we remove the ban, Node 0 should be able to reconnect even without noban permission
|
|
self.nodes[1].setban("127.0.0.1", "remove")
|
|
self.restart_node(1, [])
|
|
self.connect_nodes(0, 1)
|
|
peerinfo = self.nodes[1].getpeerinfo()[0]
|
|
assert not "noban" in peerinfo["permissions"]
|
|
|
|
self.log.info("Test that a non-IP address can be banned/unbanned")
|
|
node = self.nodes[1]
|
|
tor_addr = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"
|
|
ip_addr = "1.2.3.4"
|
|
assert not self.is_banned(node, tor_addr)
|
|
assert not self.is_banned(node, ip_addr)
|
|
|
|
node.setban(tor_addr, "add")
|
|
assert self.is_banned(node, tor_addr)
|
|
assert not self.is_banned(node, ip_addr)
|
|
|
|
self.log.info("Test the ban list is preserved through restart")
|
|
|
|
self.restart_node(1)
|
|
assert self.is_banned(node, tor_addr)
|
|
assert not self.is_banned(node, ip_addr)
|
|
|
|
node.setban(tor_addr, "remove")
|
|
assert not self.is_banned(self.nodes[1], tor_addr)
|
|
assert not self.is_banned(node, ip_addr)
|
|
|
|
self.restart_node(1)
|
|
assert not self.is_banned(node, tor_addr)
|
|
assert not self.is_banned(node, ip_addr)
|
|
|
|
self.log.info("Test -bantime")
|
|
self.restart_node(1, ["-bantime=1234"])
|
|
self.nodes[1].setban("127.0.0.1", "add")
|
|
banned = self.nodes[1].listbanned()[0]
|
|
assert_equal(banned['ban_duration'], 1234)
|
|
|
|
if __name__ == '__main__':
|
|
SetBanTests().main()
|