From 416472c5d883088dc520ba16f1965907f9c9d183 Mon Sep 17 00:00:00 2001 From: Jack Robison Date: Thu, 25 Oct 2018 17:51:17 -0400 Subject: [PATCH 1/4] log stream update failure --- lbrynet/daemon/Daemon.py | 2 +- lbrynet/database/storage.py | 4 +++- tests/unit/database/test_SQLiteStorage.py | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lbrynet/daemon/Daemon.py b/lbrynet/daemon/Daemon.py index 2cd0fb0de..33faa1f7c 100644 --- a/lbrynet/daemon/Daemon.py +++ b/lbrynet/daemon/Daemon.py @@ -2295,7 +2295,7 @@ class Daemon(AuthJSONRPCServer): except DecodeError as err: # there was a problem with a metadata field, raise an error here rather than # waiting to find out when we go to publish the claim (after having made the stream) - raise Exception("invalid publish metadata: %s" % err.message) + raise Exception(f"invalid publish metadata: {err}") certificate = None if channel_id or channel_name: diff --git a/lbrynet/database/storage.py b/lbrynet/database/storage.py index 3e8900bd0..56643d0de 100644 --- a/lbrynet/database/storage.py +++ b/lbrynet/database/storage.py @@ -709,7 +709,9 @@ class SQLiteStorage: "select claim_id from claim where claim_outpoint=?", current_associated_content ).fetchone()[0] if current_associated_claim_id != new_claim_id: - raise Exception("invalid stream update") + raise Exception( + f"mismatching claim ids when updating stream {current_associated_claim_id} vs {new_claim_id}" + ) # update the claim associated to the file transaction.execute("insert or replace into content_claim values (?, ?)", (stream_hash, claim_outpoint)) diff --git a/tests/unit/database/test_SQLiteStorage.py b/tests/unit/database/test_SQLiteStorage.py index 60d61aa11..ce2783932 100644 --- a/tests/unit/database/test_SQLiteStorage.py +++ b/tests/unit/database/test_SQLiteStorage.py @@ -334,7 +334,9 @@ class ContentClaimStorageTests(StorageTest): invalid_update_info['nout'] = 0 invalid_update_info['claim_id'] = "beef0002" * 5 invalid_update_outpoint = "%s:%i" % (invalid_update_info['txid'], invalid_update_info['nout']) - with self.assertRaisesRegex(Exception, "invalid stream update"): + with self.assertRaisesRegex(Exception, "mismatching claim ids when updating stream " + "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef " + "vs beef0002beef0002beef0002beef0002beef0002"): yield self.storage.save_claims([invalid_update_info]) yield self.storage.save_content_claim(stream_hash, invalid_update_outpoint) current_claim_info = yield self.storage.get_content_claim(stream_hash) From e1dcdcf4db946732bbb5ff2dce4bbf7562e06e50 Mon Sep 17 00:00:00 2001 From: Jack Robison Date: Thu, 25 Oct 2018 18:54:07 -0400 Subject: [PATCH 2/4] catch claim signature error --- lbrynet/daemon/json_response_encoder.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lbrynet/daemon/json_response_encoder.py b/lbrynet/daemon/json_response_encoder.py index 1ceaadf56..a265bd8f9 100644 --- a/lbrynet/daemon/json_response_encoder.py +++ b/lbrynet/daemon/json_response_encoder.py @@ -2,6 +2,7 @@ from decimal import Decimal from binascii import hexlify from datetime import datetime from json import JSONEncoder +from ecdsa import BadSignatureError from lbrynet.wallet.transaction import Transaction, Output from lbrynet.wallet.dewies import dewies_to_lbc from lbrynet.wallet.ledger import MainNetLedger @@ -68,9 +69,12 @@ class JSONResponseEncoder(JSONEncoder): output['valid_signature'] = None if txo.channel is not None: output['channel_name'] = txo.channel.claim_name - output['valid_signature'] = claim.validate_signature( - txo.get_address(self.ledger), txo.channel.claim - ) + try: + output['valid_signature'] = claim.validate_signature( + txo.get_address(self.ledger), txo.channel.claim + ) + except BadSignatureError: + output['valid_signature'] = False if txo.script.is_claim_name: output['type'] = 'claim' From 5f2f06c269ba7c5dae8684ff3f8721983879ab6a Mon Sep 17 00:00:00 2001 From: Jack Robison Date: Fri, 26 Oct 2018 12:41:10 -0400 Subject: [PATCH 3/4] fix loggly --- lbrynet/core/log_support.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lbrynet/core/log_support.py b/lbrynet/core/log_support.py index ec8d9b4b4..c0c497a6f 100644 --- a/lbrynet/core/log_support.py +++ b/lbrynet/core/log_support.py @@ -30,7 +30,7 @@ class HTTPSHandler(logging.Handler): @defer.inlineCallbacks def _emit(self, record): payload = self.format(record) - response = yield treq.post(self.url, data=payload, cookies=self.cookies) + response = yield treq.post(self.url, data=payload.encode(), cookies=self.cookies) self.cookies.update(response.cookies()) def emit(self, record): From d9b1be6214bbbc82daa4340418d80b6246be17c2 Mon Sep 17 00:00:00 2001 From: Jack Robison Date: Fri, 26 Oct 2018 12:42:12 -0400 Subject: [PATCH 4/4] add aioupnp version to upnp status -set non-blank not found message if upnp fails --- lbrynet/daemon/Components.py | 4 +++- lbrynet/daemon/Daemon.py | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lbrynet/daemon/Components.py b/lbrynet/daemon/Components.py index acfabdd53..f5e16a919 100644 --- a/lbrynet/daemon/Components.py +++ b/lbrynet/daemon/Components.py @@ -8,6 +8,7 @@ from hashlib import sha256 from types import SimpleNamespace from twisted.internet import defer, threads, reactor, error, task import lbryschema +from aioupnp import __version__ as aioupnp_version from aioupnp.upnp import UPnP from aioupnp.fault import UPnPError from lbrynet import conf @@ -792,8 +793,9 @@ class UPnPComponent(Component): def get_status(self): return { + 'aioupnp_version': aioupnp_version, 'redirects': self.upnp_redirects, - 'gateway': '' if not self.upnp else self.upnp.gateway.manufacturer_string, + 'gateway': 'No gateway found' if not self.upnp else self.upnp.gateway.manufacturer_string, 'dht_redirect_set': 'UDP' in self.upnp_redirects, 'peer_redirect_set': 'TCP' in self.upnp_redirects, 'external_ip': self.external_ip diff --git a/lbrynet/daemon/Daemon.py b/lbrynet/daemon/Daemon.py index 33faa1f7c..ddc15251d 100644 --- a/lbrynet/daemon/Daemon.py +++ b/lbrynet/daemon/Daemon.py @@ -773,6 +773,7 @@ class Daemon(AuthJSONRPCServer): 'managed_files': (int) count of files in the file manager, }, 'upnp': { + 'aioupnp_version': (str), 'redirects': { : (int) external_port, },