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