fix resolution and file_list bugs

This commit is contained in:
Jack Robison 2017-04-09 16:10:07 -04:00
parent 33c4856f00
commit 04c119543f
2 changed files with 103 additions and 26 deletions

View file

@ -17,11 +17,12 @@ from lbryum.commands import known_commands, Commands
from lbryschema.uri import parse_lbry_uri from lbryschema.uri import parse_lbry_uri
from lbryschema.claim import ClaimDict from lbryschema.claim import ClaimDict
from lbryschema.error import DecodeError from lbryschema.error import DecodeError
from lbryschema.decode import smart_decode
from lbrynet.core.sqlite_helpers import rerun_if_locked from lbrynet.core.sqlite_helpers import rerun_if_locked
from lbrynet.interfaces import IRequestCreator, IQueryHandlerFactory, IQueryHandler, IWallet from lbrynet.interfaces import IRequestCreator, IQueryHandlerFactory, IQueryHandler, IWallet
from lbrynet.core.client.ClientRequest import ClientRequest from lbrynet.core.client.ClientRequest import ClientRequest
from lbrynet.core.Error import RequestCanceledError, InsufficientFundsError from lbrynet.core.Error import RequestCanceledError, InsufficientFundsError, UnknownNameError
from lbrynet.db_migrator.migrate1to2 import UNSET_NOUT from lbrynet.db_migrator.migrate1to2 import UNSET_NOUT
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -450,8 +451,20 @@ class Wallet(object):
###### ######
@defer.inlineCallbacks
def get_claim(self, claim_id): def get_claim(self, claim_id):
return self._get_claim_by_claimid(claim_id) claim = yield self._get_claim_by_claimid(claim_id)
try:
decoded = smart_decode(claim['value'])
claim['value'] = decoded.claim_dict
claim['hex'] = decoded.serialized.encode('hex')
except DecodeError:
claim['hex'] = claim['value']
claim['value'] = None
claim['error'] = "Failed to decode"
log.warning("Failed to decode claim value for lbry://%s#%s", claim['name'],
claim['claim_id'])
defer.returnValue(claim)
def get_claimid(self, name, txid, nout): def get_claimid(self, name, txid, nout):
def _get_id_for_return(claim_id): def _get_id_for_return(claim_id):
@ -484,48 +497,82 @@ class Wallet(object):
break break
defer.returnValue(my_claim) defer.returnValue(my_claim)
def get_claim_info(self, name, txid=None, nout=None): @defer.inlineCallbacks
if txid is None or nout is None: def get_claim_info(self, name, txid=None, nout=None, claim_id=None):
return self.get_claim_by_name(name) if claim_id is not None:
results = yield self.get_claim(claim_id)
if results['name'] != name:
raise Exception("Name does not match claim referenced by id")
elif txid is None or nout is None:
results = yield self.get_claim_by_name(name)
else: else:
return self.get_claim_by_outpoint(ClaimOutpoint(txid, nout)) results = yield self.get_claim_by_outpoint(ClaimOutpoint(txid, nout))
defer.returnValue(results)
@defer.inlineCallbacks @defer.inlineCallbacks
def _handle_claim_result(self, results): def _handle_claim_result(self, results):
if not results:
raise UnknownNameError("No results to return")
if 'error' in results: if 'error' in results:
raise Exception(results['error']) if results['error'] == 'name is not claimed':
elif 'claim' in results: raise UnknownNameError(results['error'])
else:
raise Exception(results['error'])
if 'claim' in results:
claim = results['claim'] claim = results['claim']
if 'has_signature' in claim and claim['has_signature']: if 'has_signature' in claim and claim['has_signature']:
if not claim['signature_is_valid']: if not claim['signature_is_valid']:
raise Exception("Claim has invalid signature") log.warning("lbry://%s#%s has an invalid signature",
claim['name'], claim['claim_id'])
decoded = ClaimDict.load_dict(claim['value'])
claim_dict = decoded.claim_dict
claim['value'] = claim_dict
defer.returnValue(claim)
try: try:
decoded = ClaimDict.load_dict(claim['value']) decoded = ClaimDict.load_dict(claim['value'])
claim_dict = decoded.claim_dict claim_dict = decoded.claim_dict
outpoint = ClaimOutpoint(claim['txid'], claim['nout']) outpoint = ClaimOutpoint(claim['txid'], claim['nout'])
name = claim['name'] name = claim['name']
claim['value'] = claim_dict claim['value'] = claim_dict
claim['hex'] = decoded.serialized.encode('hex')
yield self._save_name_metadata(name, outpoint, decoded.source_hash) yield self._save_name_metadata(name, outpoint, decoded.source_hash)
yield self._update_claimid(claim['claim_id'], name, outpoint) yield self._update_claimid(claim['claim_id'], name, outpoint)
except (TypeError, ValueError, KeyError, DecodeError): except DecodeError:
claim = claim['value'] claim['hex'] = claim['value']
log.warning(results) claim['value'] = None
claim['error'] = "Failed to decode value"
results = claim results = claim
elif 'value' in results: elif 'value' in results:
if 'has_signature' in results and results['has_signature']: if 'has_signature' in results and results['has_signature']:
if not results['signature_is_valid']: if not results['signature_is_valid']:
raise Exception("Claim has invalid signature") log.warning("lbry://%s#%s has an invalid signature",
results['name'], results['claim_id'])
decoded = ClaimDict.load_dict(results['value'])
claim_dict = decoded.claim_dict
results['value'] = claim_dict
defer.returnValue(results)
try: try:
decoded = ClaimDict.load_dict(results['value']) decoded = ClaimDict.load_dict(results['value'])
claim_dict = decoded.claim_dict claim_dict = decoded.claim_dict
claim_hex = decoded.serialized.encode('hex')
claim_err = None
outpoint = ClaimOutpoint(results['txid'], results['nout']) outpoint = ClaimOutpoint(results['txid'], results['nout'])
name = results['name'] name = results['name']
yield self._save_name_metadata(name, outpoint, decoded.source_hash) yield self._save_name_metadata(name, outpoint, decoded.source_hash)
yield self._update_claimid(results['claim_id'], name, outpoint) yield self._update_claimid(results['claim_id'], name, outpoint)
except (TypeError, ValueError, KeyError, DecodeError): except DecodeError:
claim_dict = results['value'] claim_dict = None
log.warning(results) claim_hex = results['value']
claim_err = "Failed to decode value"
if claim_err:
results['error'] = claim_err
results['hex'] = claim_hex
results['value'] = claim_dict results['value'] = claim_dict
log.info("get claim info lbry://%s#%s", results['name'], results['claim_id']) log.info("get claim info lbry://%s#%s", results['name'], results['claim_id'])
defer.returnValue(results) defer.returnValue(results)
@ -565,8 +612,19 @@ class Wallet(object):
claims = result['claims'] claims = result['claims']
claims_for_return = [] claims_for_return = []
for claim in claims: for claim in claims:
claim['value'] = ClaimDict.load_dict(claim['value']).claim_dict try:
claims_for_return.append(claim) decoded = smart_decode(claim['value'])
claim['value'] = decoded.claim_dict
claim['hex'] = decoded.serialized.encode('hex')
claims_for_return.append(claim)
except DecodeError:
claim['hex'] = claim['value']
claim['value'] = None
claim['error'] = "Failed to decode"
log.warning("Failed to decode claim value for lbry://%s#%s", claim['name'],
claim['claim_id'])
claims_for_return.append(claim)
result['claims'] = claims_for_return result['claims'] = claims_for_return
defer.returnValue(result) defer.returnValue(result)
@ -1070,7 +1128,7 @@ class LBRYumWallet(Wallet):
def _get_claim_by_outpoint(self, txid, nout): def _get_claim_by_outpoint(self, txid, nout):
return self._run_cmd_as_defer_to_thread('getclaimbyoutpoint', txid, nout) return self._run_cmd_as_defer_to_thread('getclaimbyoutpoint', txid, nout)
def get_claim_by_claimid(self, claim_id): def _get_claim_by_claimid(self, claim_id):
return self._run_cmd_as_defer_to_thread('getclaimbyid', claim_id) return self._run_cmd_as_defer_to_thread('getclaimbyid', claim_id)
def _get_balance_for_address(self, address): def _get_balance_for_address(self, address):

View file

@ -908,9 +908,13 @@ class Daemon(AuthJSONRPCServer):
else: else:
size = None size = None
message = None message = None
claim = yield self.session.wallet.get_claim_info(lbry_file.name,
lbry_file.txid, if lbry_file.claim_id:
lbry_file.nout) claim = yield self.session.wallet.get_claim(lbry_file.claim_id)
else:
claim = yield self.session.wallet.get_claim_info(lbry_file.name,
lbry_file.txid,
lbry_file.nout)
try: try:
metadata = claim['value'] metadata = claim['value']
except: except:
@ -920,7 +924,16 @@ class Daemon(AuthJSONRPCServer):
except TypeError: except TypeError:
outpoint = None outpoint = None
defer.returnValue({ if claim and 'has_signature' in claim:
has_signature = claim['has_signature']
else:
has_signature = None
if claim and 'signature_is_valid' in claim:
signature_is_valid = claim['signature_is_valid']
else:
signature_is_valid = None
result = {
'completed': lbry_file.completed, 'completed': lbry_file.completed,
'file_name': lbry_file.file_name, 'file_name': lbry_file.file_name,
'download_directory': lbry_file.download_directory, 'download_directory': lbry_file.download_directory,
@ -940,7 +953,12 @@ class Daemon(AuthJSONRPCServer):
'written_bytes': written_bytes, 'written_bytes': written_bytes,
'message': message, 'message': message,
'metadata': metadata 'metadata': metadata
}) }
if has_signature is not None:
result['has_signature'] = has_signature
if signature_is_valid is not None:
result['signature_is_valid'] = signature_is_valid
defer.returnValue(result)
@defer.inlineCallbacks @defer.inlineCallbacks
def _get_lbry_file(self, search_by, val, return_json=False, full_status=False): def _get_lbry_file(self, search_by, val, return_json=False, full_status=False):
@ -1374,7 +1392,7 @@ class Daemon(AuthJSONRPCServer):
""" """
return self.jsonrpc_claim_show(**kwargs) return self.jsonrpc_claim_show(**kwargs)
def jsonrpc_claim_show(self, name, txid=None, nout=None): def jsonrpc_claim_show(self, name, txid=None, nout=None, claim_id=None):
""" """
Resolve claim info from a LBRY name Resolve claim info from a LBRY name
@ -1383,6 +1401,7 @@ class Daemon(AuthJSONRPCServer):
'name': (str) name to look up, do not include lbry:// prefix 'name': (str) name to look up, do not include lbry:// prefix
'txid'(optional): (str) if specified, look for claim with this txid 'txid'(optional): (str) if specified, look for claim with this txid
'nout'(optional): (int) if specified, look for claim with this nout 'nout'(optional): (int) if specified, look for claim with this nout
'claim_id'(optional): (str) if specified, look for claim with this claim_id
Returns: Returns:
(dict) Dictionary contaning claim info, (bool) false if claim is not (dict) Dictionary contaning claim info, (bool) false if claim is not
resolvable resolvable
@ -1398,7 +1417,7 @@ class Daemon(AuthJSONRPCServer):
} }
""" """
d = self.session.wallet.get_claim_info(name, txid, nout) d = self.session.wallet.get_claim_info(name, txid, nout, claim_id)
d.addCallback(format_json_out_amount_as_float) d.addCallback(format_json_out_amount_as_float)
d.addCallback(lambda r: self._render_response(r)) d.addCallback(lambda r: self._render_response(r))
return d return d