diff --git a/src/sakia/core/account.py b/src/sakia/core/account.py index 5f3da1111c884bae0adc70afac6e1749b130521c..723205015cb31c8b56a72b69b387f752a1f2c545 100644 --- a/src/sakia/core/account.py +++ b/src/sakia/core/account.py @@ -8,6 +8,7 @@ from ucoinpy.documents import Membership, SelfCertification, Certification, Revo from ucoinpy.key import SigningKey from ucoinpy.api import bma from ucoinpy.api.bma import PROTOCOL_VERSION +from ucoinpy.api import errors import logging import asyncio @@ -386,8 +387,9 @@ class Account(QObject): if data: registered = parsers[request](data) tries += 1 - except ValueError as e: - if '404' in str(e) or '400' in str(e): + except errors.UcoinError as e: + if e.ucode in (errors.NO_MEMBER_MATCHING_PUB_OR_UID, + e.ucode == errors.NO_MATCHING_IDENTITY): if request == bma.wot.CertifiersOf: request = bma.wot.Lookup tries = 0 @@ -431,9 +433,11 @@ class Account(QObject): block_data = await community.bma_access.simple_request(bma.blockchain.Current) signed_raw = "{0}{1}\n".format(block_data['raw'], block_data['signature']) block_uid = Block.from_signed_raw(signed_raw).blockUID - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.NO_CURRENT_BLOCK: block_uid = BlockUID.empty() + else: + raise selfcert = SelfCertification(PROTOCOL_VERSION, community.currency, self.pubkey, diff --git a/src/sakia/core/community.py b/src/sakia/core/community.py index cf4ee97e5fc1e7063b967656b2ca733415e9bfc1..9b3fd3f6ab1bd932eac6d9c6c511abc9ae28979b 100644 --- a/src/sakia/core/community.py +++ b/src/sakia/core/community.py @@ -5,18 +5,14 @@ Created on 1 févr. 2014 """ import logging -import hashlib import re -import time -import asyncio import math -from PyQt5.QtCore import QObject, pyqtSignal +from PyQt5.QtCore import QObject from ..tools.exceptions import NoPeerAvailable from .net.network import Network -from ucoinpy.api import bma -from ucoinpy.documents import Block, BlockUID +from ucoinpy.api import bma, errors from .net.api.bma.access import BmaAccess @@ -172,8 +168,8 @@ class Community(QObject): return block else: return None - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: logging.debug(str(e)) return None except NoPeerAvailable as e: @@ -207,8 +203,8 @@ class Community(QObject): block = await self.bma_access.future_request(bma.blockchain.Block, req_args={'number': block_number}) return block['membersCount'] - except ValueError as e: - if '404' in e: + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: return 0 except NoPeerAvailable as e: logging.debug(str(e)) @@ -228,8 +224,8 @@ class Community(QObject): block = await self.bma_access.future_request(bma.blockchain.Block, req_args={'number': block_number}) return block['medianTime'] - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: return 0 except NoPeerAvailable as e: logging.debug(str(e)) diff --git a/src/sakia/core/net/api/bma/access.py b/src/sakia/core/net/api/bma/access.py index b4b95e2534beff5ca4f7ae41fd4b910095849b13..76c0249cbd2deb94ef29b8818b88a9564756f24e 100644 --- a/src/sakia/core/net/api/bma/access.py +++ b/src/sakia/core/net/api/bma/access.py @@ -1,5 +1,6 @@ from PyQt5.QtCore import QObject, pyqtSlot from ucoinpy.api import bma +from ucoinpy.api import errors from .....tools.exceptions import NoPeerAvailable from ..... import __version__ import logging @@ -240,11 +241,7 @@ class BmaAccess(QObject): json_data = await req.get(**get_args, session=self._network.session) self._update_cache(request, req_args, get_args, json_data) return json_data - except ValueError as e: - if '404' in str(e) or '400' in str(e): - raise - tries += 1 - except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError) as e: + except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError, ValueError) as e: tries += 1 #except jsonschema.ValidationError as e: # logging.debug(str(e)) @@ -272,11 +269,7 @@ class BmaAccess(QObject): try: json_data = await req.get(**get_args, session=self._network.session) return json_data - except ValueError as e: - if '404' in str(e) or '400' in str(e): - raise - tries += 1 - except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError) as e: + except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError, ValueError) as e: tries += 1 #except jsonschema.ValidationError as e: # logging.debug(str(e)) @@ -317,9 +310,6 @@ class BmaAccess(QObject): try: result = await asyncio.gather(*replies) return tuple(result) - except ValueError as e: - if '404' in str(e) or '400' in str(e): - raise - except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError) as e: + except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError, ValueError) as e: pass return () diff --git a/src/sakia/core/net/node.py b/src/sakia/core/net/node.py index ae54e077c0615f73307f242eef0e63813308f26c..e79574c7d0a9e73ea872202c3fd02382c79a9d12 100644 --- a/src/sakia/core/net/node.py +++ b/src/sakia/core/net/node.py @@ -8,7 +8,7 @@ from ucoinpy.documents.peer import Peer, Endpoint, BMAEndpoint from ucoinpy.documents import Block, BlockUID, MalformedDocumentError from ...tools.exceptions import InvalidNodeCurrency from ...tools.decorators import asyncify -from ucoinpy.api import bma as bma +from ucoinpy.api import bma, errors from ucoinpy.api.bma import ConnectionHandler from aiohttp.errors import WSClientDisconnectedError, WSServerHandshakeError, ClientResponseError @@ -364,10 +364,7 @@ class Node(QObject): break elif msg.tp == aiohttp.MsgType.error: break - except ValueError as e: - logging.debug("Websocket block {0} : {1} - {2}".format(type(e).__name__, str(e), self.pubkey[:5])) - await self.request_current_block() - except (WSServerHandshakeError, WSClientDisconnectedError, ClientResponseError) as e: + except (WSServerHandshakeError, WSClientDisconnectedError, ClientResponseError, ValueError) as e: logging.debug("Websocket block {0} : {1} - {2}".format(type(e).__name__, str(e), self.pubkey[:5])) await self.request_current_block() except (ClientError, gaierror, TimeoutError, DisconnectedError) as e: @@ -390,8 +387,8 @@ class Node(QObject): conn_handler = self.endpoint.conn_handler() block_data = await bma.blockchain.Current(conn_handler).get(self._session) await self.refresh_block(block_data) - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: self.main_chain_previous_block = None self.set_block(None) else: @@ -399,7 +396,7 @@ class Node(QObject): logging.debug("Error in block reply : {0}".format(self.pubkey[:5])) logging.debug(str(e)) self.changed.emit() - except (ClientError, gaierror, TimeoutError, DisconnectedError) as e: + except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e: logging.debug("{0} : {1}".format(str(e), self.pubkey[:5])) self.state = Node.OFFLINE except jsonschema.ValidationError as e: @@ -423,15 +420,15 @@ class Node(QObject): if self.block: self.main_chain_previous_block = await bma.blockchain.Block(conn_handler, self.block['number']).get(self._session) - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: self.main_chain_previous_block = None else: self.state = Node.OFFLINE logging.debug("Error in previous block reply : {0}".format(self.pubkey[:5])) logging.debug(str(e)) self.changed.emit() - except (ClientError, gaierror, TimeoutError, DisconnectedError) as e: + except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e: logging.debug("{0} : {1}".format(str(e), self.pubkey[:5])) self.state = Node.OFFLINE except jsonschema.ValidationError as e: @@ -471,11 +468,12 @@ class Node(QObject): logging.debug("Change : new state corrupted") self.changed.emit() - except ValueError as e: - logging.debug("Error in peering reply : {0}".format(str(e))) - self.state = Node.OFFLINE - self.changed.emit() - except (ClientError, gaierror, TimeoutError, DisconnectedError) as e: + except errors.UcoinError as e: + if e.ucode == errors.PEER_NOT_FOUND: + logging.debug("Error in peering reply : {0}".format(str(e))) + self.state = Node.OFFLINE + self.changed.emit() + except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e: logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey[:5])) self.state = Node.OFFLINE except jsonschema.ValidationError as e: @@ -499,11 +497,7 @@ class Node(QObject): self.fork_window = summary_data["ucoin"]["forkWindowSize"] else: self.fork_window = 0 - except ValueError as e: - logging.debug("Error in summary : {0}".format(e)) - self.state = Node.OFFLINE - self.changed.emit() - except (ClientError, gaierror, TimeoutError, DisconnectedError) as e: + except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e: logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey[:5])) self.state = Node.OFFLINE except jsonschema.ValidationError as e: @@ -532,14 +526,14 @@ class Node(QObject): if self._uid != uid: self._uid = uid self.identity_changed.emit() - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.NO_MATCHING_IDENTITY: logging.debug("UID not found : {0}".format(self.pubkey[:5])) else: logging.debug("error in uid reply : {0}".format(self.pubkey[:5])) self.state = Node.OFFLINE self.identity_changed.emit() - except (ClientError, gaierror, TimeoutError, DisconnectedError) as e: + except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e: logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey[:5])) self.state = Node.OFFLINE except jsonschema.ValidationError as e: @@ -569,10 +563,7 @@ class Node(QObject): break elif msg.tp == aiohttp.MsgType.error: break - except ValueError as e: - logging.debug("Websocket peer {0} : {1} - {2}".format(type(e).__name__, str(e), self.pubkey[:5])) - await self.request_peers() - except (WSServerHandshakeError, WSClientDisconnectedError, ClientResponseError) as e: + except (WSServerHandshakeError, WSClientDisconnectedError, ClientResponseError, ValueError) as e: logging.debug("Websocket peer {0} : {1} - {2}".format(type(e).__name__, str(e), self.pubkey[:5])) await self.request_peers() except (ClientError, gaierror, TimeoutError, DisconnectedError) as e: @@ -603,7 +594,7 @@ class Node(QObject): leaf_data = await bma.network.peering.Peers(conn_handler).get(leaf=leaf_hash, session=self._session) self.refresh_peer_data(leaf_data['leaf']['value']) - except (AttributeError, ValueError) as e: + except (AttributeError, ValueError, errors.UcoinError) as e: logging.debug("{pubkey} : Incorrect peer data in {leaf}".format(pubkey=self.pubkey[:5], leaf=leaf_hash)) self.state = Node.OFFLINE @@ -617,10 +608,11 @@ class Node(QObject): self.state = Node.CORRUPTED self._last_merkle = {'root' : peers_data['root'], 'leaves': peers_data['leaves']} - except ValueError as e: - logging.debug("Error in peers reply") - self.state = Node.OFFLINE - self.changed.emit() + except errors.UcoinError as e: + if e.ucode == errors.PEER_NOT_FOUND: + logging.debug("Error in peers reply") + self.state = Node.OFFLINE + self.changed.emit() except (ClientError, gaierror, TimeoutError, DisconnectedError) as e: logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey)) self.state = Node.OFFLINE diff --git a/src/sakia/core/registry/identities.py b/src/sakia/core/registry/identities.py index b0125279744dfad71127a8bc2fcf10de711e7343..864b2bf5f55508a4fcad46327951b867bbdec8de 100644 --- a/src/sakia/core/registry/identities.py +++ b/src/sakia/core/registry/identities.py @@ -1,4 +1,4 @@ -from ucoinpy.api import bma +from ucoinpy.api import bma, errors from ucoinpy.documents import BlockUID from .identity import Identity, LocalState, BlockchainState from pkg_resources import parse_version @@ -80,8 +80,9 @@ class IdentitiesRegistry: identity.local_state = LocalState.PARTIAL timestamp = identity.sigdate return identity - except ValueError: - lookup_tries += 1 + except errors.UcoinError as e: + if e.ucode == errors.NO_MATCHING_IDENTITY: + lookup_tries += 1 except asyncio.TimeoutError: lookup_tries += 1 except ClientError: @@ -112,8 +113,8 @@ class IdentitiesRegistry: identity.sigdate = BlockUID.from_str(data['sigDate']) identity.local_state = LocalState.PARTIAL identity.blockchain_state = BlockchainState.VALIDATED - except ValueError as e: - if '404' in str(e) or '400' in str(e): + except errors.UcoinError as e: + if errors.NO_MEMBER_MATCHING_PUB_OR_UID: identity = await self._find_by_lookup(pubkey, community) return identity else: diff --git a/src/sakia/core/registry/identity.py b/src/sakia/core/registry/identity.py index 1393f73784764391a7d01c5315a1402e7ec11785..c98176dc7853b026ce5e4fb7ea4e313ca8949605 100644 --- a/src/sakia/core/registry/identity.py +++ b/src/sakia/core/registry/identity.py @@ -10,7 +10,7 @@ from enum import Enum from pkg_resources import parse_version from ucoinpy.documents import BlockUID, SelfCertification, MalformedDocumentError -from ucoinpy.api import bma as bma +from ucoinpy.api import bma, errors from ucoinpy.api.bma import PROTOCOL_VERSION from ...tools.exceptions import Error, NoPeerAvailable,\ @@ -142,8 +142,8 @@ class Identity(QObject): uid, timestamp, signature) - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.NO_MATCHING_IDENTITY: raise LookupFailureError(self.pubkey, community) except MalformedDocumentError: raise LookupFailureError(self.pubkey, community) @@ -166,8 +166,8 @@ class Identity(QObject): block = await community.bma_access.future_request(bma.blockchain.Block, req_args={'number': membership_data['blockNumber']}) return block['medianTime'] - except ValueError as e: - if '404' in str(e) or '400' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.NO_MEMBER_MATCHING_PUB_OR_UID: raise MembershipNotFoundError(self.pubkey, community.name) except NoPeerAvailable as e: logging.debug(str(e)) @@ -186,7 +186,7 @@ class Identity(QObject): expiration_date = join_date + parameters['sigValidity'] except NoPeerAvailable: expiration_date = None - except ValueError as e: + except errors.UcoinError as e: logging.debug("Expiration date not found") expiration_date = None except MembershipNotFoundError: @@ -222,8 +222,8 @@ class Identity(QObject): else: raise MembershipNotFoundError(self.pubkey, community.name) - except ValueError as e: - if '404' in str(e) or '400' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.NO_MEMBER_MATCHING_PUB_OR_UID: raise MembershipNotFoundError(self.pubkey, community.name) except NoPeerAvailable as e: logging.debug(str(e)) @@ -245,9 +245,9 @@ class Identity(QObject): person_uid = uid_data["uid"] if person_uid == self.uid: return True - except ValueError as e: - if '404' in str(e): - return False + except errors.UcoinError as e: + if e.ucode in (errors.NO_MATCHING_IDENTITY): + logging.debug("Lookup error : {0}".format(str(e))) except NoPeerAvailable as e: logging.debug(str(e)) return False @@ -258,9 +258,9 @@ class Identity(QObject): try: await community.bma_access.future_request(bma.wot.CertifiersOf, {'search': self.pubkey}) - except ValueError as e: - if '404' in str(e) or '400' in str(e): - return True + except errors.UcoinError as e: + if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID): + logging.debug("Certifiers of error : {0}".format(str(e))) return False async def is_member(self, community): @@ -274,8 +274,8 @@ class Identity(QObject): certifiers = await community.bma_access.future_request(bma.wot.CertifiersOf, {'search': self.pubkey}) return certifiers['isMember'] - except ValueError as e: - if '404' in str(e) or '400' in str(e): + except errors.UcoinError as e: + if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID): pass else: raise @@ -311,9 +311,9 @@ class Identity(QObject): certifier['block_number'] = None certifiers.append(certifier) - except ValueError as e: - if '404' in str(e): - logging.debug('bma.wot.CertifiersOf request error') + except errors.UcoinError as e: + if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID): + logging.debug("Certifiers of error : {0}".format(str(e))) else: logging.debug(str(e)) except NoPeerAvailable as e: @@ -341,8 +341,9 @@ class Identity(QObject): certifier['block_number'] = None certifiers.append(certifier) - except ValueError as e: - logging.debug("Lookup error : {0}".format(str(e))) + except errors.UcoinError as e: + if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID): + logging.debug("Lookup error : {0}".format(str(e))) except NoPeerAvailable as e: logging.debug(str(e)) return certifiers @@ -402,9 +403,9 @@ class Identity(QObject): else: certified['block_number'] = None certified_list.append(certified) - except ValueError as e: - if '404' in str(e): - logging.debug('bma.wot.CertifiedBy request error') + except errors.UcoinError as e: + if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID): + logging.debug("Certified by error : {0}".format(str(e))) except NoPeerAvailable as e: logging.debug(str(e)) @@ -423,9 +424,9 @@ class Identity(QObject): certified['cert_time'] = None certified['block_number'] = None certified_list.append(certified) - except ValueError as e: - if '404' in str(e): - logging.debug('bma.wot.Lookup request error') + except errors.UcoinError as e: + if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID): + logging.debug("Lookup error : {0}".format(str(e))) except NoPeerAvailable as e: logging.debug(str(e)) return certified_list @@ -488,7 +489,7 @@ class Identity(QObject): if len(certified) > 0: latest_time = max([c['cert_time'] for c in certified]) parameters = await community.parameters() - if parameters: + if parameters and latest_time: current_time = time.time() if current_time - latest_time < parameters['sigPeriod']: return parameters['sigPeriod'] - (current_time - latest_time) diff --git a/src/sakia/core/txhistory.py b/src/sakia/core/txhistory.py index aa862d486464832d74a213310e8501542b5e7d7d..67f36b3a4142cc84a1d412d6d1d4f49b6f2635ac 100644 --- a/src/sakia/core/txhistory.py +++ b/src/sakia/core/txhistory.py @@ -3,7 +3,7 @@ import logging import hashlib from ucoinpy.documents.transaction import SimpleTransaction from ucoinpy.documents.block import Block -from ucoinpy.api import bma +from ucoinpy.api import bma, errors from .transfer import Transfer, TransferState from .net.network import MAX_CONFIRMATIONS from ..tools.exceptions import LookupFailureError, NoPeerAvailable @@ -110,8 +110,8 @@ class TxHistory(): logging.debug("Error in {0}".format(number)) block = None tries += 1 - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: block = None tries += 1 return block_doc @@ -237,8 +237,8 @@ class TxHistory(): if d['block_number'] < parsed_block: dividends.remove(d) return dividends - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: pass return {} @@ -379,8 +379,9 @@ class TxHistory(): logging.debug("Starts a new refresh") task = asyncio.ensure_future(self._refresh(community, block_from, current_block, received_list)) self._running_refresh.append(task) - except ValueError as e: - logging.debug("Block not found") + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: + logging.debug("Block not found") except NoPeerAvailable: logging.debug("No peer available") diff --git a/src/sakia/gui/certification.py b/src/sakia/gui/certification.py index 63cb6f30a7731319bf245a6ceaf5ea35957d770a..2bdb1db3e1d0ba099d327fdb893f30d35583c518 100644 --- a/src/sakia/gui/certification.py +++ b/src/sakia/gui/certification.py @@ -5,18 +5,16 @@ Created on 24 dec. 2014 """ import asyncio import logging - +from ucoinpy.api import errors from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QApplication, QMessageBox - from PyQt5.QtCore import Qt, QObject, QLocale, QDateTime -from ..gen_resources.certification_uic import Ui_CertificationDialog from .widgets import toast from .widgets.dialogs import QAsyncMessageBox from .member import MemberDialog from ..tools.decorators import asyncify, once_at_a_time from ..tools.exceptions import NoPeerAvailable - +from ..gen_resources.certification_uic import Ui_CertificationDialog class CertificationDialog(QObject): """ @@ -181,8 +179,8 @@ class CertificationDialog(QObject): is_member = await account_identity.is_member(self.community) try: block_0 = await self.community.get_block(0) - except ValueError as e: - if '404' in str(e) or '000' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: block_0 = None except NoPeerAvailable as e: logging.debug(str(e)) diff --git a/src/sakia/gui/community_tile.py b/src/sakia/gui/community_tile.py index d7a8bcaedd00d5ae992b8371a38fd3aed2eb38e5..08ec8cba28937c39272a3fcdb671511ccbe14855 100644 --- a/src/sakia/gui/community_tile.py +++ b/src/sakia/gui/community_tile.py @@ -2,12 +2,12 @@ @author: inso """ -import asyncio import enum from PyQt5.QtWidgets import QFrame, QLabel, QVBoxLayout, QLayout from PyQt5.QtCore import QSize, pyqtSignal from ucoinpy.documents.block import Block +from ucoinpy.api import errors from ..tools.decorators import asyncify, once_at_a_time, cancel_once_task from ..tools.exceptions import NoPeerAvailable @@ -130,8 +130,8 @@ background-color: palette(base); message=self.tr("Not connected")) self.text_label.setText(description) self._state = CommunityState.OFFLINE - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: description = """<html> <body> <p> diff --git a/src/sakia/gui/community_view.py b/src/sakia/gui/community_view.py index 88d8de5f0fda92c39be8cfaefceac704616c1b20..102c6eec8aee64a9d359fb1b9569245e3a289b61 100644 --- a/src/sakia/gui/community_view.py +++ b/src/sakia/gui/community_view.py @@ -6,7 +6,7 @@ Created on 2 févr. 2014 import logging import time - +from ucoinpy.api import errors from PyQt5.QtCore import pyqtSlot, QDateTime, QLocale, QEvent, QT_TRANSLATE_NOOP, Qt from PyQt5.QtGui import QIcon, QPixmap from PyQt5.QtWidgets import QWidget, QMessageBox, QDialog, QPushButton, QTabBar, QAction @@ -241,8 +241,9 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): except NoPeerAvailable as e: logging.debug(str(e)) text += " ( ### ) " - except ValueError as e: - logging.debug(str(e)) + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: + logging.debug(str(e)) if len(self.community.network.synced_nodes) == 0: self.button_membership.setEnabled(False) diff --git a/src/sakia/gui/identities_tab.py b/src/sakia/gui/identities_tab.py index a3be7ad03025d83c27b10e48e753ba0b93208830..a5e73ff868c2eb5e8469130df1031257e0bdfd77 100644 --- a/src/sakia/gui/identities_tab.py +++ b/src/sakia/gui/identities_tab.py @@ -10,7 +10,7 @@ from PyQt5.QtCore import Qt, pyqtSignal, QEvent, QT_TRANSLATE_NOOP, QObject from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import QWidget, QAction, QMenu, QDialog, \ QAbstractItemView -from ucoinpy.api import bma +from ucoinpy.api import bma, errors from ucoinpy.documents import BlockUID from ..models.identities import IdentitiesFilterProxyModel, IdentitiesTableModel @@ -133,7 +133,10 @@ class IdentitiesTabWidget(QObject): self.ui.edit_textsearch.clear() self.ui.edit_textsearch.setPlaceholderText(text) await self.refresh_identities(identities) - except ValueError as e: + except errors.UcoinError as e: + if e.ucode == errors.BLOCK_NOT_FOUND: + logging.debug(str(e)) + except NoPeerAvailable as e: logging.debug(str(e)) finally: self.ui.busy.hide() diff --git a/src/sakia/gui/process_cfg_community.py b/src/sakia/gui/process_cfg_community.py index d7b0b44172bf19f4b7bf8a011b9b8de0629b452b..b924e04075bea4cb99da7a55d4b2ec98af72b5c6 100644 --- a/src/sakia/gui/process_cfg_community.py +++ b/src/sakia/gui/process_cfg_community.py @@ -8,7 +8,7 @@ import logging import asyncio import aiohttp -from ucoinpy.api.bma import UcoinError +from ucoinpy.api import errors from ucoinpy.documents import MalformedDocumentError from PyQt5.QtWidgets import QDialog, QMenu, QApplication from PyQt5.QtGui import QCursor @@ -106,6 +106,8 @@ Yours : {0}, the network : {1}""".format(registered[1], registered[2]))) self.config_dialog.label_error.setText(str(e)) except (MalformedDocumentError, ValueError) as e: self.config_dialog.label_error.setText(str(e)) + except NoPeerAvailable: + self.config_dialog.label_error.setText(self.tr("Could not connect. Check node peering entry")) @asyncify async def check_register(self, checked=False): @@ -144,7 +146,7 @@ Yours : {0}, the network : {1}""".format(registered[1], registered[2]))) Yours : {0}, the network : {1}""".format(registered[1], registered[2]))) else: self.config_dialog.label_error.setText(self.tr("Your account already exists on the network")) - except (MalformedDocumentError, ValueError, UcoinError, + except (MalformedDocumentError, ValueError, errors.UcoinError, aiohttp.errors.ClientError, aiohttp.errors.DisconnectedError) as e: session.close() self.config_dialog.label_error.setText(str(e)) diff --git a/src/sakia/gui/transactions_tab.py b/src/sakia/gui/transactions_tab.py index 5c7892a00b07c23df681cb3a60edc1cbaf883cfb..8fdf12a6fe086e85c4af1e873c2c848372c85279 100644 --- a/src/sakia/gui/transactions_tab.py +++ b/src/sakia/gui/transactions_tab.py @@ -1,6 +1,6 @@ import logging -import asyncio +from ucoinpy.api import errors from PyQt5.QtWidgets import QWidget, QAbstractItemView, QHeaderView from PyQt5.QtCore import Qt, QObject, QDateTime, QTime, QModelIndex, pyqtSignal, pyqtSlot, QEvent from PyQt5.QtGui import QCursor @@ -106,7 +106,7 @@ class TransactionsTabWidget(QObject): self.ui.date_to.setMaximumDateTime(tomorrow_datetime) except NoPeerAvailable as e: logging.debug(str(e)) - except ValueError as e: + except errors.UcoinError as e: logging.debug(str(e)) def refresh(self): diff --git a/src/sakia/gui/widgets/search_user.py b/src/sakia/gui/widgets/search_user.py index e93b906e39abfcfd01d07b1a66651055ef9beaba..2fb326cdcc8f2e4c0556a6545c71694df93c76d9 100644 --- a/src/sakia/gui/widgets/search_user.py +++ b/src/sakia/gui/widgets/search_user.py @@ -3,7 +3,7 @@ import logging from PyQt5.QtCore import QEvent, pyqtSignal, QT_TRANSLATE_NOOP, Qt from PyQt5.QtWidgets import QComboBox, QWidget -from ucoinpy.api import bma +from ucoinpy.api import bma, errors from ...tools.decorators import asyncify from ...tools.exceptions import NoPeerAvailable @@ -81,8 +81,8 @@ class SearchUserWidget(QWidget, Ui_SearchUserWidget): self.combobox_search.addItem(uid) self.blockSignals(False) self.combobox_search.showPopup() - except ValueError as e: - if '404' in str(e): + except errors.UcoinError as e: + if e.ucode == errors.NO_MATCHING_IDENTITY: self.nodes = list() self.blockSignals(True) self.combobox_search.clear() diff --git a/src/sakia/tests/functional/process_cfg_community/test_add_community.py b/src/sakia/tests/functional/process_cfg_community/test_add_community.py index 92287575241237542f2d312078fb7600d1dcbf4c..a2acd3ec1ae4fb1bff3bea924483abb78418f378 100644 --- a/src/sakia/tests/functional/process_cfg_community/test_add_community.py +++ b/src/sakia/tests/functional/process_cfg_community/test_add_community.py @@ -74,17 +74,17 @@ class ProcessAddCommunity(unittest.TestCase, QuamashTest): await asyncio.sleep(5) self.assertEqual(mock.get_request(5).method, 'GET') self.assertEqual(mock.get_request(5).url, - '/wot/lookup/john') - for i in range(6, 8): + '/wot/certifiers-of/john') + for i in range(6, 9): self.assertEqual(mock.get_request(i).method, 'GET') self.assertEqual(mock.get_request(i).url, '/wot/lookup/john') - self.assertEqual(mock.get_request(8).url, '/blockchain/current') - self.assertEqual(mock.get_request(8).method, 'GET') + self.assertEqual(mock.get_request(9).url, '/blockchain/current') + self.assertEqual(mock.get_request(9).method, 'GET') - self.assertEqual(mock.get_request(9).url[:8], '/wot/add') - self.assertEqual(mock.get_request(9).method, 'POST') + self.assertEqual(mock.get_request(10).url[:8], '/wot/add') + self.assertEqual(mock.get_request(10).method, 'POST') self.assertEqual(process_community.label_error.text(), "Broadcasting identity...") await asyncio.sleep(1) @@ -175,7 +175,7 @@ class ProcessAddCommunity(unittest.TestCase, QuamashTest): self.assertEqual(mock.get_request(0).url, '/network/peering') self.assertEqual(mock.get_request(1).method, 'GET') self.assertEqual(mock.get_request(1).url, - '/wot/lookup/john') + '/wot/certifiers-of/wrong_pubkey') self.assertEqual(process_community.label_error.text(), """Your pubkey or UID is different on the network. Yours : wrong_pubkey, the network : 7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ""") process_community.close() diff --git a/src/sakia/tests/mocks/bma/init_new_community.py b/src/sakia/tests/mocks/bma/init_new_community.py index 81f34691fbc2f53c6a30a42d7085dd2e98a77fa5..ef4cf44ea565eb40390b05163b517551545d50a8 100644 --- a/src/sakia/tests/mocks/bma/init_new_community.py +++ b/src/sakia/tests/mocks/bma/init_new_community.py @@ -1,4 +1,5 @@ from ..server import MockServer +from ucoinpy.api import errors bma_lookup_test_john = { "partial": False, @@ -91,12 +92,15 @@ def get_mock(loop): mock.add_route('GET', '/blockchain/parameters', bma_parameters, 200) - mock.add_route('GET', '/blockchain/block/0', {"message": "Block not found"}, 404) + mock.add_route('GET', '/blockchain/block/0', {'ucode': errors.BLOCK_NOT_FOUND, + "message": "Block not found"}, 404) - mock.add_route('GET', '/blockchain/current', {'message': "Block not found"}, 404) + mock.add_route('GET', '/blockchain/current', {'ucode': errors.NO_CURRENT_BLOCK, + 'message': "Block not found"}, 404) mock.add_route('GET', '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', - {'message': "No member matching this pubkey or uid"}, 404) + {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, + 'message': "No member matching this pubkey or uid"}, 404) mock.add_route('GET', '/wot/lookup/john', bma_lookup_test_john, 200) diff --git a/src/sakia/tests/mocks/bma/new_blockchain.py b/src/sakia/tests/mocks/bma/new_blockchain.py index b1496cdb54f0b769f893d8caecf69e2276c01e62..34fcca1099dfcd90f04c90be2f3bd28ad22d8e87 100644 --- a/src/sakia/tests/mocks/bma/new_blockchain.py +++ b/src/sakia/tests/mocks/bma/new_blockchain.py @@ -1,5 +1,5 @@ from ..server import MockServer - +from ucoinpy.api import errors bma_wot_add = { "pubkey": "7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ", @@ -43,21 +43,33 @@ def get_mock(loop): mock.add_route('GET', '/blockchain/parameters', bma_parameters, 200) - mock.add_route('GET', '/blockchain/block/0', {'message': "Block not found"}, 404) + mock.add_route('GET', '/blockchain/block/0', {'ucode': errors.BLOCK_NOT_FOUND, + 'message': "Block not found"}, 404) - mock.add_route('GET', '/blockchain/current', {'message': "Block not found"}, 404) + mock.add_route('GET', '/blockchain/current', {'ucode': errors.NO_CURRENT_BLOCK, + 'message': "Block not found"}, 404) mock.add_route('GET', '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', - {'message': "No member matching this pubkey or uid"}, 404) + {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, + 'message': "No member matching this pubkey or uid"}, 404) mock.add_route('GET', '/wot/lookup/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', - {'message': "No member matching this pubkey or uid"}, 404) + {'ucode': errors.NO_MATCHING_IDENTITY, + 'message': "No member matching this pubkey or uid"}, 404) mock.add_route('GET', '/wot/lookup/john', - {'message': "No member matching this pubkey or uid"}, 404) + {'ucode': errors.NO_MATCHING_IDENTITY, + 'message': "No member matching this pubkey or uid"}, 404) + + mock.add_route('GET', '/wot/certifiers-of/john', + {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404) mock.add_route('GET', '/wot/lookup/doe', - {'message': "No member matching this pubkey or uid"}, 404) + {'ucode': errors.NO_MATCHING_IDENTITY, + 'message': "No member matching this pubkey or uid"}, 404) + + mock.add_route('GET', '/wot/certifiers-of/doe', + {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404) mock.add_route('POST', '/wot/add', bma_wot_add, 200) diff --git a/src/sakia/tests/mocks/bma/nice_blockchain.py b/src/sakia/tests/mocks/bma/nice_blockchain.py index ea4b198df93b817d3b27a53631546214ba2978d9..9b34498a62ec973c271eca171c37f24b6df35333 100644 --- a/src/sakia/tests/mocks/bma/nice_blockchain.py +++ b/src/sakia/tests/mocks/bma/nice_blockchain.py @@ -1,4 +1,5 @@ from ..server import MockServer +from ucoinpy.api import errors bma_lookup_john = { "partial": False, @@ -480,6 +481,9 @@ def get_mock(loop): mock.add_route('GET', '/ud/history/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', bma_udhistory_john, 200) + mock.add_route('GET', '/wot/certifiers-of/john', bma_certifiers_of_john, + 200) + mock.add_route('GET', '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', bma_certifiers_of_john, 200) @@ -496,11 +500,23 @@ def get_mock(loop): mock.add_route('GET', '/blockchain/memberships/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', bma_membership_john, 200) + mock.add_route('GET', '/wot/lookup/wrong_pubkey', + {'ucode': errors.NO_MATCHING_IDENTITY, 'message': "No member matching this pubkey or uid"}, 404) + + mock.add_route('GET', '/wot/certifiers-of/wrong_pubkey', + {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404) + + mock.add_route('GET', '/wot/lookup/wrong_uid', + {'ucode': errors.NO_MATCHING_IDENTITY, 'message': "No member matching this pubkey or uid"}, 404) + + mock.add_route('GET', '/wot/certifiers-of/wrong_uid', + {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404) + mock.add_route('GET', '/wot/certifiers-of/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn', - {'error': "No member matching this pubkey or uid"}, 404) + {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404) mock.add_route('GET', '/blockchain/memberships/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn', - {'error': "No member matching this pubkey or uid"}, 404) + {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404) mock.add_route('POST', '/tx/process', {}, 200, ) diff --git a/src/sakia/tests/unit/core/test_network.py b/src/sakia/tests/unit/core/test_network.py index 575e880168f58bbfb77140da9c6a4f55c86b189c..c312f5fa6f9667b16fc7f6ed3ed5d856d8fe3bad 100644 --- a/src/sakia/tests/unit/core/test_network.py +++ b/src/sakia/tests/unit/core/test_network.py @@ -15,12 +15,3 @@ class TestCommunity(unittest.TestCase, QuamashTest): def tearDown(self): self.tearDownQuamash() - - def test_confirmations(self): - network = Network("test_currency", [], Mock("aiohttp.ClientSession")) - Network.current_blockUID = PropertyMock(return_value=BlockUID(1000, "fbf9271d0df23ee03044795aebca8be06dd7f998".upper())) - - self.assertEqual(network.confirmations(996), 5) - self.assertEqual(network.confirmations(900), 101) - with self.assertRaises(ValueError): - network.confirmations(1002)