From 72f0c003017bb889ef551e373cb2cf90b3fd4565 Mon Sep 17 00:00:00 2001
From: inso <insomniak.fr@gmaiL.com>
Date: Fri, 13 Jan 2017 21:10:06 +0100
Subject: [PATCH] Only one connection per pubkey

---
 src/sakia/data/connectors/bma.py              |  6 +++
 .../gui/dialogs/connection_cfg/controller.py  | 39 +++++++++++--------
 src/sakia/gui/dialogs/connection_cfg/model.py |  2 +
 src/sakia/services/network.py                 | 18 +++++----
 4 files changed, 41 insertions(+), 24 deletions(-)

diff --git a/src/sakia/data/connectors/bma.py b/src/sakia/data/connectors/bma.py
index 38177631..65e639f7 100644
--- a/src/sakia/data/connectors/bma.py
+++ b/src/sakia/data/connectors/bma.py
@@ -90,6 +90,12 @@ def _filter_data(request, data):
         filtered["history"].pop("sending")
         filtered["history"].pop("receiving")
         filtered["history"].pop("pending")
+    elif request is bma.wot.requirements:
+        filtered = copy.deepcopy(data)
+        for idty in filtered["identities"]:
+            for c in idty["certifications"]:
+                c.pop("expiresIn")
+
     return filtered
 
 
diff --git a/src/sakia/gui/dialogs/connection_cfg/controller.py b/src/sakia/gui/dialogs/connection_cfg/controller.py
index 3bc124a0..f272621f 100644
--- a/src/sakia/gui/dialogs/connection_cfg/controller.py
+++ b/src/sakia/gui/dialogs/connection_cfg/controller.py
@@ -244,16 +244,20 @@ class ConnectionConfigController(QObject):
             password = self.view.edit_password.text()
             self.model.set_scrypt_infos(salt, password, self.view.scrypt_params)
             self.model.set_uid(self.view.edit_uid.text())
-            registered, found_identity = await self.model.check_registered()
-            self.view.button_connect.setEnabled(True)
-            self.view.button_register.setEnabled(True)
-            if registered[0] is False and registered[2] is None:
-                self.view.display_info(self.tr("Could not find your identity on the network."))
-            elif registered[0] is False and registered[2]:
-                self.view.display_info(self.tr("""Your pubkey or UID is different on the network.
-Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
+            if not self.model.key_exists():
+                registered, found_identity = await self.model.check_registered()
+                self.view.button_connect.setEnabled(True)
+                self.view.button_register.setEnabled(True)
+                if registered[0] is False and registered[2] is None:
+                    self.view.display_info(self.tr("Could not find your identity on the network."))
+                elif registered[0] is False and registered[2]:
+                    self.view.display_info(self.tr("""Your pubkey or UID is different on the network.
+    Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
+                else:
+                    self.step_key.set_result(found_identity)
             else:
-                self.step_key.set_result(found_identity)
+                self.view.display_info(self.tr("A connection already exists using this key."))
+
         except NoPeerAvailable:
             self.config_dialog.label_error.setText(self.tr("Could not connect. Check node peering entry"))
 
@@ -266,14 +270,17 @@ Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
             password = self.view.edit_password.text()
             self.model.set_scrypt_infos(salt, password, self.view.scrypt_params)
             self.model.set_uid(self.view.edit_uid.text())
-            registered, found_identity = await self.model.check_registered()
-            if registered[0] is False and registered[2] is None:
-                self.step_key.set_result(None)
-            elif registered[0] is False and registered[2]:
-                self.view.display_info(self.tr("""Your pubkey or UID was already found on the network.
-Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
+            if not self.model.key_exists():
+                registered, found_identity = await self.model.check_registered()
+                if registered[0] is False and registered[2] is None:
+                    self.step_key.set_result(None)
+                elif registered[0] is False and registered[2]:
+                    self.view.display_info(self.tr("""Your pubkey or UID was already found on the network.
+    Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
+                else:
+                    self.view.display_info("Your account already exists on the network")
             else:
-                self.view.display_info("Your account already exists on the network")
+                self.view.display_info(self.tr("A connection already exists using this key."))
         except NoPeerAvailable:
             self.view.display_info(self.tr("Could not connect. Check node peering entry"))
 
diff --git a/src/sakia/gui/dialogs/connection_cfg/model.py b/src/sakia/gui/dialogs/connection_cfg/model.py
index 318269e3..c1a7c3b9 100644
--- a/src/sakia/gui/dialogs/connection_cfg/model.py
+++ b/src/sakia/gui/dialogs/connection_cfg/model.py
@@ -202,3 +202,5 @@ Current database is storing {1} network.""".format(node_connector.node.currency,
 
         return registered, found_identity
 
+    def key_exists(self):
+        return self.connection.pubkey in ConnectionsProcessor.instanciate(self.app).pubkeys()
diff --git a/src/sakia/services/network.py b/src/sakia/services/network.py
index d5864639..472a72b6 100644
--- a/src/sakia/services/network.py
+++ b/src/sakia/services/network.py
@@ -1,11 +1,10 @@
 import asyncio
 import logging
 import time
-import aiohttp
 from collections import Counter
 
 from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject
-
+from duniterpy.api import errors
 from duniterpy.key import VerifyingKey
 from sakia.data.connectors import NodeConnector
 from sakia.data.entities import Node
@@ -213,12 +212,15 @@ class NetworkService(QObject):
                     except InvalidNodeCurrency as e:
                         self._logger.debug(str(e))
                 if node:
-                    identity = await self._identities_service.find_from_pubkey(node.pubkey)
-                    identity = await self._identities_service.load_requirements(identity)
-                    node.member = identity.member
-                    node.uid = identity.uid
-                    self._processor.update_node(node)
-                    self.nodes_changed.emit()
+                    try:
+                        identity = await self._identities_service.find_from_pubkey(node.pubkey)
+                        identity = await self._identities_service.load_requirements(identity)
+                        node.member = identity.member
+                        node.uid = identity.uid
+                        self._processor.update_node(node)
+                        self.nodes_changed.emit()
+                    except errors.DuniterError as e:
+                        self._logger.error(e.message)
 
                 self._app.db.commit()
             except IndexError:
-- 
GitLab