fix resolution and file_list bugs
This commit is contained in:
parent
33c4856f00
commit
04c119543f
2 changed files with 103 additions and 26 deletions
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue