implemented peer announce in torgossip
This commit is contained in:
parent
f4182cb996
commit
227472d4dc
@ -4,6 +4,7 @@ Test Onionr as it is running
|
||||
"""
|
||||
import os
|
||||
from secrets import SystemRandom
|
||||
import traceback
|
||||
|
||||
import logger
|
||||
from onionrutils import epoch
|
||||
@ -56,6 +57,16 @@ class OnionrRunTestManager:
|
||||
self.plugin_tests = []
|
||||
|
||||
def run_tests(self):
|
||||
try:
|
||||
assert 1 == 2
|
||||
except AssertionError:
|
||||
pass
|
||||
else:
|
||||
logger.error(
|
||||
"Cannot perform runtests when Python interpreter is optimized",
|
||||
terminal=True)
|
||||
return
|
||||
|
||||
tests = list(RUN_TESTS)
|
||||
tests.extend(self.plugin_tests)
|
||||
SystemRandom().shuffle(tests)
|
||||
@ -84,7 +95,7 @@ class OnionrRunTestManager:
|
||||
logger.error(last.__name__ + ' failed assertions', terminal=True)
|
||||
except Exception as e:
|
||||
logger.error(last.__name__ + ' failed with non-asserting exception')
|
||||
logger.error(repr(e))
|
||||
logger.error(traceback.format_exc())
|
||||
else:
|
||||
ep = str(epoch.get_epoch())
|
||||
logger.info(f'All runtime tests passed at {ep}', terminal=True)
|
||||
|
@ -2,11 +2,14 @@
|
||||
|
||||
Handle commands for the torgossip server
|
||||
"""
|
||||
import traceback
|
||||
import base64
|
||||
|
||||
import blockio
|
||||
import logger
|
||||
|
||||
import onionrblocks
|
||||
from kasten import Kasten
|
||||
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -23,7 +26,18 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def peer_exchange(peers: 'Peers', num_of_peers: bytes):
|
||||
def announce_peer(peers: 'TorGossipPeers', peer_address):
|
||||
"""command 8: accept a new peer"""
|
||||
try:
|
||||
peers.add_peer(peer_address)
|
||||
except Exception as _:
|
||||
logger.warn("Error accepting announced peer " + base64.b85encode(peer_address).decode('utf-8'), terminal=True)
|
||||
logger.warn(traceback.format_exc(), terminal=True)
|
||||
return b"0"
|
||||
return b"1"
|
||||
|
||||
|
||||
def peer_exchange(peers: 'TorGossipPeers', num_of_peers: bytes):
|
||||
"""command 7: exchange a number of our top performing peers"""
|
||||
num_of_peers = int(chr(int.from_bytes(num_of_peers, 'little')))
|
||||
peers = peers.get_highest_score_peers(num_of_peers)
|
||||
|
@ -59,7 +59,7 @@ class TorGossipPeers: # name it this way to avoid collisions in SharedState
|
||||
peer = self.db.db_conn.firstkey()
|
||||
if peer == b'enc':
|
||||
peer = self.db.db_conn.nextkey(peer)
|
||||
print('p', peer)
|
||||
|
||||
assert len(peer) == 34
|
||||
if not peer:
|
||||
return []
|
||||
@ -104,7 +104,7 @@ class TorGossipPeers: # name it this way to avoid collisions in SharedState
|
||||
self._pack_and_store_info(peer, new_seen=int(time()))
|
||||
|
||||
def add_peer(self, peer):
|
||||
self._pack_and_store_info(peer)
|
||||
self.update_seen(peer)
|
||||
|
||||
def remove_peer(self, peer):
|
||||
peer = self._shrink_peer_address(peer)
|
||||
|
@ -2,6 +2,7 @@ import socket
|
||||
import os
|
||||
import secrets
|
||||
from base64 import b32decode, b32encode
|
||||
from time import sleep
|
||||
|
||||
from utils import identifyhome
|
||||
from onionrblocks import blockcreator
|
||||
@ -13,6 +14,11 @@ import blockio
|
||||
def _fake_onion():
|
||||
return b32encode(os.urandom(34)).decode('utf-8') + ".onion"
|
||||
|
||||
def _shrink_peer_address(peer):
|
||||
# strip .onion and b32decode peer address for lower database mem usage
|
||||
if len(peer) == 62: # constant time
|
||||
return b32decode(peer[:-6]) # O(N)
|
||||
return peer
|
||||
|
||||
def torgossip_runtest(test_manager):
|
||||
|
||||
@ -74,14 +80,32 @@ def torgossip_runtest(test_manager):
|
||||
|
||||
# test peer list
|
||||
fake_peer = _fake_onion()
|
||||
fakes = []
|
||||
for i in range(3):
|
||||
fake = _fake_onion()
|
||||
fakes.append(fake)
|
||||
shared_state.get_by_string('TorGossipPeers').add_peer(fake)
|
||||
shared_state.get_by_string('TorGossipPeers').add_peer(fake_peer)
|
||||
shared_state.get_by_string('TorGossipPeers').add_score(fake_peer, 100000)
|
||||
s.sendall(b'71')
|
||||
stored = s.recv(1000)
|
||||
expected = b32decode(fake_peer.replace('.onion', '')).replace(b'.onion', b'')
|
||||
print(stored, expected)
|
||||
expected = _shrink_peer_address(fake_peer)#b32decode(fake_peer.replace('.onion', '')).replace(b'.onion', b'')
|
||||
try:
|
||||
assert stored == expected
|
||||
except AssertionError:
|
||||
print(stored, '!=', expected)
|
||||
shared_state.get_by_string('TorGossipPeers').remove_peer(fake_peer)
|
||||
for i in fakes:
|
||||
shared_state.get_by_string('TorGossipPeers').remove_peer(i)
|
||||
|
||||
announce_peer = _fake_onion()
|
||||
announce_raw = _shrink_peer_address(announce_peer)
|
||||
s.sendall(b'8' + announce_raw)
|
||||
assert s.recv(1) == b'1'
|
||||
print(type(announce_raw), type(shared_state.get_by_string('TorGossipPeers').get_highest_score_peers(100)[0][0]))
|
||||
assert announce_raw == shared_state.get_by_string('TorGossipPeers').get_highest_score_peers(100)[0][0]
|
||||
shared_state.get_by_string('TorGossipPeers').remove_peer(announce_raw)
|
||||
|
||||
|
||||
s.sendall(b'9')
|
||||
assert s.recv(64) == b"BYE"
|
||||
|
@ -86,6 +86,11 @@ def start_server(shared_state):
|
||||
conn.sendall(
|
||||
commandhandlers.peer_exchange(
|
||||
shared_state.get_by_string('TorGossipPeers'), data))
|
||||
elif cmd == GossipCommands.ANNOUNCE_PEER:
|
||||
conn.sendall(
|
||||
commandhandlers.announce_peer(
|
||||
shared_state.get_by_string('TorGossipPeers'), data)
|
||||
)
|
||||
else:
|
||||
conn.sendall(b'Unknown ' + str(cmd).encode('utf-8'))
|
||||
else:
|
||||
|
Loading…
Reference in New Issue
Block a user