From 3133818c3d87a4aaec15e823aeb8842a5abbf15d Mon Sep 17 00:00:00 2001 From: inso <insomniak.fr@gmaiL.com> Date: Wed, 4 May 2016 07:27:28 +0200 Subject: [PATCH] Check peer document signatures ( # 411 ) --- src/sakia/core/net/network.py | 34 +++++++++++++++++++--------------- src/sakia/core/net/node.py | 9 ++++----- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/sakia/core/net/network.py b/src/sakia/core/net/network.py index 878ae5fb..a4cc6766 100644 --- a/src/sakia/core/net/network.py +++ b/src/sakia/core/net/network.py @@ -10,6 +10,7 @@ import aiohttp import time import asyncio from duniterpy.documents import Peer, Block, BlockUID, MalformedDocumentError +from duniterpy.key import VerifyingKey from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QTimer from collections import Counter @@ -353,22 +354,25 @@ class Network(QObject): logging.debug("End of network discovery") - @pyqtSlot(Peer, str) - def handle_new_node(self, peer, pubkey): - pubkeys = [n.pubkey for n in self.nodes] - if peer.pubkey not in pubkeys: - logging.debug("New node found : {0}".format(peer.pubkey[:5])) - try: - node = Node.from_peer(self.currency, peer, pubkey, self.session) - node.refresh(manual=True) - self.add_node(node) - self.nodes_changed.emit() - except InvalidNodeCurrency as e: - logging.debug(str(e)) + def handle_new_node(self, peer): + key = VerifyingKey(peer.pubkey) + if key.verify_document(peer): + pubkeys = [n.pubkey for n in self.nodes] + if peer.pubkey not in pubkeys: + logging.debug("New node found : {0}".format(peer.pubkey[:5])) + try: + node = Node.from_peer(self.currency, peer, self.session) + node.refresh(manual=True) + self.add_node(node) + self.nodes_changed.emit() + except InvalidNodeCurrency as e: + logging.debug(str(e)) + else: + node = [n for n in self.nodes if n.pubkey == peer.pubkey][0] + if node.peer.blockUID.number < peer.blockUID.number: + node.peer = peer else: - node = [n for n in self.nodes if n.pubkey == pubkey][0] - if node.peer.blockUID.number < peer.blockUID.number: - node.peer = peer + logging.debug("Wrong document received : {0}".format(peer.signed_raw())) @pyqtSlot() def handle_identity_change(self): diff --git a/src/sakia/core/net/node.py b/src/sakia/core/net/node.py index 3549e889..f3221ba0 100644 --- a/src/sakia/core/net/node.py +++ b/src/sakia/core/net/node.py @@ -43,7 +43,7 @@ class Node(QObject): changed = pyqtSignal() error = pyqtSignal() identity_changed = pyqtSignal() - neighbour_found = pyqtSignal(Peer, str) + neighbour_found = pyqtSignal(Peer) def __init__(self, peer, uid, pubkey, block, state, last_change, last_merkle, @@ -105,7 +105,7 @@ class Node(QObject): return node @classmethod - def from_peer(cls, currency, peer, pubkey, session): + def from_peer(cls, currency, peer, session): """ Factory method to get a node from a peer document. @@ -119,7 +119,7 @@ class Node(QObject): if peer.currency != currency: raise InvalidNodeCurrency(peer.currency, currency) - node = cls(peer, "", pubkey, None, + node = cls(peer, "", peer.pubkey, None, Node.OFFLINE, time.time(), {'root': "", 'leaves': []}, "", "", 0, session) @@ -626,8 +626,7 @@ class Node(QObject): str_doc = "{0}{1}\n".format(peer_data['raw'], peer_data['signature']) peer_doc = Peer.from_signed_raw(str_doc) - pubkey = peer_data['pubkey'] - self.neighbour_found.emit(peer_doc, pubkey) + self.neighbour_found.emit(peer_doc) except MalformedDocumentError as e: logging.debug(str(e)) else: -- GitLab