From 6f21cf1a3ea09a427de45e42cf6156df08a9b656 Mon Sep 17 00:00:00 2001
From: inso <insomniak.fr@gmaiL.com>
Date: Fri, 13 Jan 2017 04:56:44 +0100
Subject: [PATCH] Fix missing signature when certifying

---
 src/sakia/data/processors/certifications.py        |  2 +-
 src/sakia/gui/dialogs/certification/controller.py  |  4 +++-
 src/sakia/gui/dialogs/transfer/controller.py       |  1 +
 src/sakia/gui/main_window/toolbar/model.py         |  2 +-
 src/sakia/gui/navigation/graphs/base/controller.py |  5 ++---
 src/sakia/gui/navigation/graphs/base/node.py       |  2 +-
 src/sakia/gui/navigation/graphs/base/scene.py      |  3 ++-
 src/sakia/gui/widgets/context_menu.py              |  1 -
 src/sakia/services/documents.py                    | 13 ++++++++++---
 9 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/sakia/data/processors/certifications.py b/src/sakia/data/processors/certifications.py
index 78979327..82e0021f 100644
--- a/src/sakia/data/processors/certifications.py
+++ b/src/sakia/data/processors/certifications.py
@@ -1,7 +1,7 @@
 import attr
 import asyncio
 from duniterpy.api import bma, errors
-from duniterpy.documents import BlockUID
+from duniterpy.documents import block_uid
 from ..connectors import BmaConnector
 from ..processors import NodesProcessor
 from ..entities import Certification, Identity
diff --git a/src/sakia/gui/dialogs/certification/controller.py b/src/sakia/gui/dialogs/certification/controller.py
index f7a8615a..c656ede2 100644
--- a/src/sakia/gui/dialogs/certification/controller.py
+++ b/src/sakia/gui/dialogs/certification/controller.py
@@ -80,6 +80,7 @@ class CertificationController(QObject):
         """
         dialog = cls.create(parent, app)
         dialog.view.combo_pubkey.setCurrentText(connection.title())
+        dialog.user_information.change_identity(identity)
         dialog.refresh()
         return await dialog.async_exec()
 
@@ -125,7 +126,8 @@ class CertificationController(QObject):
             QApplication.restoreOverrideCursor()
             self.view.button_box.setEnabled(True)
 
-    def reject(self):
+    @asyncify
+    async def reject(self):
         self.view.reject()
 
     def refresh(self):
diff --git a/src/sakia/gui/dialogs/transfer/controller.py b/src/sakia/gui/dialogs/transfer/controller.py
index d1b3c086..3e0ba57e 100644
--- a/src/sakia/gui/dialogs/transfer/controller.py
+++ b/src/sakia/gui/dialogs/transfer/controller.py
@@ -71,6 +71,7 @@ class TransferController(QObject):
     async def send_money_to_identity(cls, parent, app, connection, identity):
         dialog = cls.create(parent, app)
         dialog.view.combo_connections.setCurrentText(connection.title())
+        dialog.user_information.change_identity(identity)
         dialog.view.edit_pubkey.setText(identity.pubkey)
         dialog.view.radio_pubkey.setChecked(True)
 
diff --git a/src/sakia/gui/main_window/toolbar/model.py b/src/sakia/gui/main_window/toolbar/model.py
index a7b32325..abf8adb0 100644
--- a/src/sakia/gui/main_window/toolbar/model.py
+++ b/src/sakia/gui/main_window/toolbar/model.py
@@ -34,7 +34,7 @@ class ToolbarModel(QObject):
         version_url = ""
         if not latest[0]:
             version_info = "Latest release : {version}" \
-                            .format(version='.'.join(latest[1]))
+                            .format(version=latest[1])
             version_url = latest[2]
 
         new_version_text = """
diff --git a/src/sakia/gui/navigation/graphs/base/controller.py b/src/sakia/gui/navigation/graphs/base/controller.py
index 5d5f42ea..e1af19ac 100644
--- a/src/sakia/gui/navigation/graphs/base/controller.py
+++ b/src/sakia/gui/navigation/graphs/base/controller.py
@@ -62,12 +62,11 @@ class BaseGraphController(QObject):
         """
         raise NotImplementedError("refresh not implemented")
 
-    def node_context_menu(self, pubkey):
+    def node_context_menu(self, identity):
         """
         Open the node context menu
-        :param str pubkey: the pubkey of the node to open
+        :param sakia.data.entities.Identity identity: the identity of the node to open
         """
-        identity = self.model.get_identity(pubkey)
         menu = ContextMenu.from_data(self.view, self.model.app, self.model.connection, (identity,))
         menu.view_identity_in_wot.connect(self.draw_graph)
 
diff --git a/src/sakia/gui/navigation/graphs/base/node.py b/src/sakia/gui/navigation/graphs/base/node.py
index 33362993..f0780252 100644
--- a/src/sakia/gui/navigation/graphs/base/node.py
+++ b/src/sakia/gui/navigation/graphs/base/node.py
@@ -66,5 +66,5 @@ class BaseNode(QGraphicsEllipseItem):
 
         :param event: scene context menu event
         """
-        self.scene().node_context_menu_requested.emit(self.id)
+        self.scene().node_context_menu_requested.emit(self.metadata['identity'])
 
diff --git a/src/sakia/gui/navigation/graphs/base/scene.py b/src/sakia/gui/navigation/graphs/base/scene.py
index 36cd7288..3c5a46e5 100644
--- a/src/sakia/gui/navigation/graphs/base/scene.py
+++ b/src/sakia/gui/navigation/graphs/base/scene.py
@@ -1,10 +1,11 @@
+from sakia.data.entities import Identity
 from PyQt5.QtCore import pyqtSignal
 from PyQt5.QtWidgets import QGraphicsScene, QGraphicsSceneContextMenuEvent
 
 
 class BaseScene(QGraphicsScene):
     # This defines signals taking string arguments
-    node_context_menu_requested = pyqtSignal(str)
+    node_context_menu_requested = pyqtSignal(Identity)
     node_hovered = pyqtSignal(str)
     node_clicked = pyqtSignal(str, dict)
 
diff --git a/src/sakia/gui/widgets/context_menu.py b/src/sakia/gui/widgets/context_menu.py
index 13072b76..340ee208 100644
--- a/src/sakia/gui/widgets/context_menu.py
+++ b/src/sakia/gui/widgets/context_menu.py
@@ -134,7 +134,6 @@ class ContextMenu(QObject):
     @asyncify
     async def send_money(self, identity):
         await TransferController.send_money_to_identity(None, self._app, self._connection, identity)
-        self._app.refresh_transfers.emit()
 
     def view_wot(self, identity):
         self.view_identity_in_wot.emit(identity)
diff --git a/src/sakia/services/documents.py b/src/sakia/services/documents.py
index 9448d1cb..27bb0274 100644
--- a/src/sakia/services/documents.py
+++ b/src/sakia/services/documents.py
@@ -1,13 +1,11 @@
 import asyncio
 import attr
 import logging
-import jsonschema
-from collections import Counter
 
 from duniterpy.key import SigningKey
 from duniterpy import PROTOCOL_VERSION
 from duniterpy.documents import BlockUID, Block, Certification, Membership, Revocation, InputSource, \
-    OutputSource, SIGParameter, Unlock
+    OutputSource, SIGParameter, Unlock, block_uid
 from duniterpy.documents import Identity as IdentityDoc
 from duniterpy.documents import Transaction as TransactionDoc
 from duniterpy.documents.transaction import reduce_base
@@ -142,6 +140,15 @@ class DocumentsService:
         """
         self._logger.debug("Certdata")
         blockUID = self._blockchain_processor.current_buid(connection.currency)
+        if not identity.signature:
+            lookup_data = await self._bma_connector.get(connection.currency, bma.wot.lookup,
+                                                     req_args={'search': identity.pubkey})
+            for uid_data in next(data["uids"] for data in lookup_data["results"] if data["pubkey"] == identity.pubkey):
+                if uid_data["uid"] == identity.uid and block_uid(uid_data["meta"]["timestamp"]) == identity.blockstamp:
+                    identity.signature = uid_data["self"]
+                    break
+            else:
+                return False, "Could not find certified identity signature"
 
         certification = Certification(10, connection.currency,
                                       connection.pubkey, identity.pubkey, blockUID, None)
-- 
GitLab