Changeset View
Changeset View
Standalone View
Standalone View
test/functional/p2p_leak.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2017-2019 The Bitcoin Core developers | # Copyright (c) 2017-2019 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test message sending before handshake completion. | """Test message sending before handshake completion. | ||||
A node should never send anything other than VERSION/VERACK/REJECT until it's | A node should never send anything other than VERSION/VERACK until it's | ||||
received a VERACK. | received a VERACK. | ||||
This test connects to a node and sends it a few messages, trying to entice it | This test connects to a node and sends it a few messages, trying to entice it | ||||
into sending us something it shouldn't. | into sending us something it shouldn't. | ||||
""" | """ | ||||
import time | import time | ||||
Show All 25 Lines | class CLazyNode(P2PInterface): | ||||
def on_open(self): | def on_open(self): | ||||
self.ever_connected = True | self.ever_connected = True | ||||
def on_version(self, message): self.bad_message(message) | def on_version(self, message): self.bad_message(message) | ||||
def on_verack(self, message): self.bad_message(message) | def on_verack(self, message): self.bad_message(message) | ||||
def on_reject(self, message): self.bad_message(message) | |||||
def on_inv(self, message): self.bad_message(message) | def on_inv(self, message): self.bad_message(message) | ||||
def on_addr(self, message): self.bad_message(message) | def on_addr(self, message): self.bad_message(message) | ||||
def on_getdata(self, message): self.bad_message(message) | def on_getdata(self, message): self.bad_message(message) | ||||
def on_getblocks(self, message): self.bad_message(message) | def on_getblocks(self, message): self.bad_message(message) | ||||
Show All 33 Lines | class CNodeNoVersionMisbehavior(CLazyNode): | ||||
# Send enough veracks without a message to reach the peer discouragement | # Send enough veracks without a message to reach the peer discouragement | ||||
# threshold. This should get us disconnected. NOTE: implementation-specific | # threshold. This should get us disconnected. NOTE: implementation-specific | ||||
# test; update if our discouragement policy for peer misbehavior changes. | # test; update if our discouragement policy for peer misbehavior changes. | ||||
def on_open(self): | def on_open(self): | ||||
super().on_open() | super().on_open() | ||||
for _ in range(DISCOURAGEMENT_THRESHOLD): | for _ in range(DISCOURAGEMENT_THRESHOLD): | ||||
self.send_message(msg_verack()) | self.send_message(msg_verack()) | ||||
def on_reject(self, message): pass | |||||
# Node that never sends a version. This one just sits idle and hopes to receive | # Node that never sends a version. This one just sits idle and hopes to receive | ||||
# any message (it shouldn't!) | # any message (it shouldn't!) | ||||
class CNodeNoVersionIdle(CLazyNode): | class CNodeNoVersionIdle(CLazyNode): | ||||
def __init__(self): | def __init__(self): | ||||
super().__init__() | super().__init__() | ||||
# Node that sends a version but not a verack. | # Node that sends a version but not a verack. | ||||
class CNodeNoVerackIdle(CLazyNode): | class CNodeNoVerackIdle(CLazyNode): | ||||
def __init__(self): | def __init__(self): | ||||
self.version_received = False | self.version_received = False | ||||
super().__init__() | super().__init__() | ||||
def on_reject(self, message): pass | |||||
def on_verack(self, message): pass | def on_verack(self, message): pass | ||||
# When version is received, don't reply with a verack. Instead, see if the | # When version is received, don't reply with a verack. Instead, see if the | ||||
# node will give us a message that it shouldn't. This is not an exhaustive | # node will give us a message that it shouldn't. This is not an exhaustive | ||||
# list! | # list! | ||||
def on_version(self, message): | def on_version(self, message): | ||||
self.version_received = True | self.version_received = True | ||||
self.send_message(msg_ping()) | self.send_message(msg_ping()) | ||||
▲ Show 20 Lines • Show All 51 Lines • Show Last 20 Lines |