diff --git a/silkaj/idty_tools.py b/silkaj/idty_tools.py index 46df7b220627832e4ab9507d3c66a9c5f2c7e9c5..7b9b30c44f798411f10836b2e217d8c437264af8 100644 --- a/silkaj/idty_tools.py +++ b/silkaj/idty_tools.py @@ -15,6 +15,7 @@ import shutil import sys +import urllib import click import pendulum @@ -55,12 +56,14 @@ def check_many_identities(idty: Identity, doc_type: str = "Identity"): Returns True if the same identity is found, False if not. """ error_no_identical_id = f"{doc_type} document does not match any valid identity." - # if no id, exit is a bit rough... + try: results_pubkey = wt.wot_lookup(idty.pubkey) results_uid = wt.wot_lookup(idty.uid) - except SystemExit as e: - sys.exit(f"{error_no_identical_id} Error: {e}") + except urllib.error.HTTPError as e: + sys.exit( + f"{error_no_identical_id}\nuid: {idty.uid}\npubkey: {display_pubkey_and_checksum(idty.pubkey)}" + ) # get all matching identities lookup_ids = merge_ids_lists(results_pubkey, results_uid, idty.currency) diff --git a/silkaj/network_tools.py b/silkaj/network_tools.py index db1228693e35dc2c526a300d9d422e2bfba5d250..7370b56aee627a430355beee48a0013c624e0a56 100644 --- a/silkaj/network_tools.py +++ b/silkaj/network_tools.py @@ -91,3 +91,13 @@ def send_document(bma_path, document): print(f"{doc_name} successfully sent") except urllib.error.HTTPError as e: sys.exit(f"Error while publishing {doc_name.lower()}: {e}") + + +def exit_on_http_error(error: urllib.error.HTTPError, err_code: int, message: str): + """ + Nicely displays a message on an expected error code. + Else, displays the HTTP error message. + """ + if error.code == err_code: + sys.exit(message) + sys.exit(error) diff --git a/silkaj/wot.py b/silkaj/wot.py index d66bba6bbd2160db48c15ff10ceafb7e060aaf95..cd82d0fbd1e00761b3d04d5ca0ab1ee1cbd218fd 100644 --- a/silkaj/wot.py +++ b/silkaj/wot.py @@ -13,6 +13,7 @@ # You should have received a copy of the GNU Affero General Public License # along with Silkaj. If not, see <https://www.gnu.org/licenses/>. +import urllib from collections import OrderedDict import click @@ -25,7 +26,7 @@ from silkaj import wot_tools as wt from silkaj.blockchain_tools import BlockchainParams from silkaj.constants import DATE from silkaj.crypto_tools import is_pubkey_and_check -from silkaj.network_tools import ClientInstance +from silkaj.network_tools import ClientInstance, exit_on_http_error from silkaj.tools import message_exit from silkaj.tui import display_pubkey_and_checksum @@ -145,7 +146,11 @@ def id_pubkey_correspondence(uid_pubkey): if checked_pubkey: uid_pubkey = checked_pubkey - lookups = wt.wot_lookup(uid_pubkey) + try: + lookups = wt.wot_lookup(uid_pubkey) + except urllib.error.HTTPError as e: + exit_on_http_error(e, 404, f"No identity found for {uid_pubkey}") + content = f"Public keys or user id found matching '{uid_pubkey}':\n" for lookup in lookups: for identity in lookup["uids"]: @@ -161,7 +166,11 @@ def choose_identity(pubkey_uid): If there is one uid, returns it If there is multiple uids, prompt a selector """ - lookups = wt.wot_lookup(pubkey_uid) + + try: + lookups = wt.wot_lookup(pubkey_uid) + except urllib.error.HTTPError as e: + exit_on_http_error(e, 404, f"No identity found for {pubkey_uid}") # Generate table containing the choices identities_choices = {"id": [], "uid": [], "pubkey": [], "timestamp": []} diff --git a/silkaj/wot_tools.py b/silkaj/wot_tools.py index 958e6d8b09ae76c86cd33c571bb6c680dbaec24f..e0ed1aee8cd96d3f7519f83e70e1bc0417f9f2fd 100644 --- a/silkaj/wot_tools.py +++ b/silkaj/wot_tools.py @@ -14,10 +14,8 @@ # along with Silkaj. If not, see <https://www.gnu.org/licenses/>. import sys -import urllib from duniterpy.api.bma import wot -from duniterpy.api.errors import DuniterError from silkaj.network_tools import ClientInstance @@ -53,13 +51,7 @@ def wot_lookup(identifier): if one identity found """ client = ClientInstance().client - try: - results = client(wot.lookup, identifier) - return results["results"] - except DuniterError as e: - sys.exit(e.message) - except urllib.error.HTTPError as e: - sys.exit(e) + return (client(wot.lookup, identifier))["results"] def identities_from_pubkeys(pubkeys, uids):