From 9cbe9c815c08f4b2c27dbda089c7507c701f80fa Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Thu, 17 Sep 2015 20:03:02 +0200
Subject: [PATCH] Fix identity lookup going in infinite loop

---
 src/cutecoin/core/registry/identities.py | 63 +++++++++++++-----------
 1 file changed, 33 insertions(+), 30 deletions(-)

diff --git a/src/cutecoin/core/registry/identities.py b/src/cutecoin/core/registry/identities.py
index 23848505..fdb8ff10 100644
--- a/src/cutecoin/core/registry/identities.py
+++ b/src/cutecoin/core/registry/identities.py
@@ -45,36 +45,39 @@ class IdentitiesRegistry:
         return {'registry': identities_json}
 
     @asyncio.coroutine
-    def future_find(self, pubkey, community):
-        def lookup():
-            nonlocal identity
-            lookup_tries = 0
-            while lookup_tries < 3 and identity.local_state == LocalState.NOT_FOUND:
-                try:
-                    data = yield from community.bma_access.simple_request(bma.wot.Lookup,
-                                                                req_args={'search': pubkey})
-                    timestamp = 0
-                    for result in data['results']:
-                        if result["pubkey"] == identity.pubkey:
-                            uids = result['uids']
-                            identity_uid = ""
-                            for uid_data in uids:
-                                if uid_data["meta"]["timestamp"] > timestamp:
-                                    timestamp = uid_data["meta"]["timestamp"]
-                                    identity_uid = uid_data["uid"]
-                            identity.uid = identity_uid
-                            identity.blockchain_state = BlockchainState.BUFFERED
-                            identity.local_state = LocalState.PARTIAL
-                            logging.debug("Lookup : found {0}".format(identity))
-                except ValueError as e:
-                    lookup_tries += 1
-                except asyncio.TimeoutError:
-                    lookup_tries += 1
-                except ClientError:
-                    lookup_tries += 1
-                except NoPeerAvailable:
-                    return identity
+    def _find_by_lookup(self, pubkey, community):
+        identity = self._instances[pubkey]
+        lookup_tries = 0
+        while lookup_tries < 3:
+            try:
+                data = yield from community.bma_access.simple_request(bma.wot.Lookup,
+                                                            req_args={'search': pubkey})
+                timestamp = 0
+                for result in data['results']:
+                    if result["pubkey"] == identity.pubkey:
+                        uids = result['uids']
+                        identity_uid = ""
+                        for uid_data in uids:
+                            if uid_data["meta"]["timestamp"] > timestamp:
+                                timestamp = uid_data["meta"]["timestamp"]
+                                identity_uid = uid_data["uid"]
+                                identity.uid = identity_uid
+                                identity.blockchain_state = BlockchainState.BUFFERED
+                                identity.local_state = LocalState.PARTIAL
+                return identity
+                logging.debug("Lookup : found {0}".format(identity))
+            except ValueError as e:
+                lookup_tries += 1
+            except asyncio.TimeoutError:
+                lookup_tries += 1
+            except ClientError:
+                lookup_tries += 1
+            except NoPeerAvailable:
+                return identity
+        return identity
 
+    @asyncio.coroutine
+    def future_find(self, pubkey, community):
         if pubkey in self._instances:
             identity = self._instances[pubkey]
         else:
@@ -89,7 +92,7 @@ class IdentitiesRegistry:
                     identity.blockchain_state = BlockchainState.VALIDATED
                 except ValueError as e:
                     if '404' in str(e) or '400' in str(e):
-                        yield from lookup()
+                        identity = yield from self._find_by_lookup(pubkey, community)
                         return identity
                     else:
                         tries += 1
-- 
GitLab