|
15 | 15 | from test_framework.messages import msg_getaddr, msg_ping, msg_verack
|
16 | 16 | from test_framework.mininode import mininode_lock, P2PInterface
|
17 | 17 | from test_framework.test_framework import BitcoinTestFramework
|
18 |
| -from test_framework.util import wait_until |
| 18 | +from test_framework.util import ( |
| 19 | + assert_equal, |
| 20 | + assert_greater_than_or_equal, |
| 21 | + wait_until, |
| 22 | +) |
19 | 23 |
|
20 | 24 | banscore = 10
|
21 | 25 |
|
@@ -86,6 +90,14 @@ def on_version(self, message):
|
86 | 90 | self.send_message(msg_getaddr())
|
87 | 91 |
|
88 | 92 |
|
| 93 | +class P2PVersionStore(P2PInterface): |
| 94 | + version_received = None |
| 95 | + |
| 96 | + def on_version(self, msg): |
| 97 | + super().on_version(msg) |
| 98 | + self.version_received = msg |
| 99 | + |
| 100 | + |
89 | 101 | class P2PLeakTest(BitcoinTestFramework):
|
90 | 102 | def set_test_params(self):
|
91 | 103 | self.num_nodes = 1
|
@@ -123,6 +135,18 @@ def run_test(self):
|
123 | 135 | assert no_version_idlenode.unexpected_msg == False
|
124 | 136 | assert no_verack_idlenode.unexpected_msg == False
|
125 | 137 |
|
| 138 | + self.log.info('Check that the version message does not leak the local address of the node') |
| 139 | + time_begin = int(time.time()) |
| 140 | + p2p_version_store = self.nodes[0].add_p2p_connection(P2PVersionStore()) |
| 141 | + time_end = time.time() |
| 142 | + ver = p2p_version_store.version_received |
| 143 | + assert_greater_than_or_equal(ver.nTime, time_begin) |
| 144 | + assert_greater_than_or_equal(time_end, ver.nTime) |
| 145 | + assert_equal(ver.addrFrom.port, 0) |
| 146 | + assert_equal(ver.addrFrom.ip, '0.0.0.0') |
| 147 | + assert_equal(ver.nStartingHeight, 201) |
| 148 | + assert_equal(ver.nRelay, 1) |
| 149 | + |
126 | 150 |
|
127 | 151 | if __name__ == '__main__':
|
128 | 152 | P2PLeakTest().main()
|
0 commit comments