add requires decorator

This commit is contained in:
hackrush 2018-07-24 12:30:47 -04:00 committed by Jack Robison
parent 5a2075019c
commit 2d61ba629f
No known key found for this signature in database
GPG key ID: DF25C68FE0239BB2
2 changed files with 78 additions and 4 deletions

View file

@ -1018,6 +1018,7 @@ class Daemon(AuthJSONRPCServer):
"""
return self._render_response(sorted([command for command in self.callable_methods.keys()]))
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_wallet_balance(self, address=None, include_unconfirmed=False):
"""
Return the balance of the wallet
@ -1039,6 +1040,7 @@ class Daemon(AuthJSONRPCServer):
return self._render_response(float(
self.wallet.get_address_balance(address, include_unconfirmed)))
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_wallet_unlock(self, password):
"""
@ -1065,6 +1067,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_wallet_decrypt(self):
"""
@ -1084,6 +1087,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_wallet_encrypt(self, new_password):
"""
@ -1124,6 +1128,7 @@ class Daemon(AuthJSONRPCServer):
reactor.callLater(0.1, reactor.fireSystemEvent, "shutdown")
defer.returnValue(response)
@AuthJSONRPCServer.requires("file_manager")
@defer.inlineCallbacks
def jsonrpc_file_list(self, sort=None, **kwargs):
"""
@ -1195,6 +1200,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_resolve_name(self, name, force=False):
"""
@ -1220,6 +1226,7 @@ class Daemon(AuthJSONRPCServer):
else:
defer.returnValue(metadata)
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_claim_show(self, txid=None, nout=None, claim_id=None):
"""
@ -1265,6 +1272,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(claim_results)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_resolve(self, force=False, uri=None, uris=[]):
"""
@ -1355,6 +1363,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(results)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet", "file_manager", "session", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_get(self, uri, file_name=None, timeout=None):
"""
@ -1443,6 +1452,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("file_manager")
@defer.inlineCallbacks
def jsonrpc_file_set_status(self, status, **kwargs):
"""
@ -1483,6 +1493,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(msg)
defer.returnValue(response)
@AuthJSONRPCServer.requires("file_manager")
@defer.inlineCallbacks
def jsonrpc_file_delete(self, delete_from_download_dir=False, delete_all=False, **kwargs):
"""
@ -1543,6 +1554,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet", "session", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_stream_cost_estimate(self, uri, size=None):
"""
@ -1563,6 +1575,7 @@ class Daemon(AuthJSONRPCServer):
cost = yield self.get_est_cost(uri, size)
defer.returnValue(cost)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_channel_new(self, channel_name, amount):
"""
@ -1619,6 +1632,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_channel_list(self):
"""
@ -1639,6 +1653,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet")
@AuthJSONRPCServer.deprecated("channel_list")
def jsonrpc_channel_list_mine(self):
"""
@ -1656,6 +1671,7 @@ class Daemon(AuthJSONRPCServer):
return self.jsonrpc_channel_list()
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_channel_export(self, claim_id):
"""
@ -1674,6 +1690,7 @@ class Daemon(AuthJSONRPCServer):
result = yield self.wallet.export_certificate_info(claim_id)
defer.returnValue(result)
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_channel_import(self, serialized_certificate_info):
"""
@ -1692,6 +1709,7 @@ class Daemon(AuthJSONRPCServer):
result = yield self.wallet.import_certificate_info(serialized_certificate_info)
defer.returnValue(result)
@AuthJSONRPCServer.requires("wallet", "file_manager", "session", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_publish(self, name, bid, metadata=None, file_path=None, fee=None, title=None,
description=None, author=None, language=None, license=None,
@ -1903,6 +1921,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_claim_abandon(self, claim_id=None, txid=None, nout=None):
"""
@ -1935,6 +1954,7 @@ class Daemon(AuthJSONRPCServer):
self.analytics_manager.send_claim_action('abandon')
defer.returnValue(result)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_claim_new_support(self, name, claim_id, amount):
"""
@ -1962,6 +1982,7 @@ class Daemon(AuthJSONRPCServer):
self.analytics_manager.send_claim_action('new_support')
defer.returnValue(result)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_claim_renew(self, outpoint=None, height=None):
"""
@ -2004,6 +2025,7 @@ class Daemon(AuthJSONRPCServer):
result = yield self.wallet.claim_renew_all_before_expiration(height)
defer.returnValue(result)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_claim_send_to_address(self, claim_id, address, amount=None):
"""
@ -2036,6 +2058,7 @@ class Daemon(AuthJSONRPCServer):
defer.returnValue(response)
# TODO: claim_list_mine should be merged into claim_list, but idk how to authenticate it -Grin
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_claim_list_mine(self):
"""
List my name claims
@ -2073,6 +2096,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda claims: self._render_response(claims))
return d
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_claim_list(self, name):
"""
@ -2111,6 +2135,7 @@ class Daemon(AuthJSONRPCServer):
sort_claim_results(claims['claims'])
defer.returnValue(claims)
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_claim_list_by_channel(self, page=0, page_size=10, uri=None, uris=[]):
"""
@ -2200,6 +2225,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(results)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_transaction_list(self):
"""
List transactions belonging to wallet
@ -2261,6 +2287,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda r: self._render_response(r))
return d
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_transaction_show(self, txid):
"""
Get a decoded transaction from a txid
@ -2279,6 +2306,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda r: self._render_response(r))
return d
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_wallet_is_address_mine(self, address):
"""
Checks if an address is associated with the current wallet.
@ -2297,6 +2325,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda is_mine: self._render_response(is_mine))
return d
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_wallet_public_key(self, address):
"""
Get public key from wallet address
@ -2316,6 +2345,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda r: self._render_response(r))
return d
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_wallet_list(self):
"""
@ -2335,6 +2365,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(addresses)
defer.returnValue(response)
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_wallet_new_address(self):
"""
Generate a new wallet address
@ -2358,6 +2389,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda address: self._render_response(address))
return d
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_wallet_unused_address(self):
"""
Return an address containing no balance, will create
@ -2382,6 +2414,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda address: self._render_response(address))
return d
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@AuthJSONRPCServer.deprecated("wallet_send")
@defer.inlineCallbacks
def jsonrpc_send_amount_to_address(self, amount, address):
@ -2411,6 +2444,7 @@ class Daemon(AuthJSONRPCServer):
self.analytics_manager.send_credits_sent()
defer.returnValue(True)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_wallet_send(self, amount, address=None, claim_id=None):
"""
@ -2459,6 +2493,7 @@ class Daemon(AuthJSONRPCServer):
self.analytics_manager.send_claim_action('new_support')
defer.returnValue(result)
@AuthJSONRPCServer.requires("wallet", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_wallet_prefill_addresses(self, num_addresses, amount, no_broadcast=False):
"""
@ -2489,6 +2524,7 @@ class Daemon(AuthJSONRPCServer):
tx['broadcast'] = broadcast
defer.returnValue(tx)
@AuthJSONRPCServer.requires("wallet")
@defer.inlineCallbacks
def jsonrpc_utxo_list(self):
"""
@ -2528,6 +2564,7 @@ class Daemon(AuthJSONRPCServer):
defer.returnValue(unspent)
@AuthJSONRPCServer.requires("wallet")
def jsonrpc_block_show(self, blockhash=None, height=None):
"""
Get contents of a block
@ -2555,6 +2592,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda r: self._render_response(r))
return d
@AuthJSONRPCServer.requires("wallet", "session", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_blob_get(self, blob_hash, timeout=None, encoding=None, payment_rate_manager=None):
"""
@ -2598,6 +2636,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(result)
defer.returnValue(response)
@AuthJSONRPCServer.requires("session")
@defer.inlineCallbacks
def jsonrpc_blob_delete(self, blob_hash):
"""
@ -2625,6 +2664,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response("Deleted %s" % blob_hash)
defer.returnValue(response)
@AuthJSONRPCServer.requires("dht")
@defer.inlineCallbacks
def jsonrpc_peer_list(self, blob_hash, timeout=None):
"""
@ -2663,6 +2703,7 @@ class Daemon(AuthJSONRPCServer):
]
defer.returnValue(results)
@AuthJSONRPCServer.requires("database")
@defer.inlineCallbacks
def jsonrpc_blob_announce(self, blob_hash=None, stream_hash=None, sd_hash=None):
"""
@ -2699,6 +2740,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(True)
defer.returnValue(response)
@AuthJSONRPCServer.requires("file_manager")
@defer.inlineCallbacks
def jsonrpc_file_reflect(self, **kwargs):
"""
@ -2734,6 +2776,7 @@ class Daemon(AuthJSONRPCServer):
results = yield reupload.reflect_file(lbry_file, reflector_server=reflector_server)
defer.returnValue(results)
@AuthJSONRPCServer.requires("database", "session", "wallet")
@defer.inlineCallbacks
def jsonrpc_blob_list(self, uri=None, stream_hash=None, sd_hash=None, needed=None,
finished=None, page_size=None, page=None):
@ -2797,6 +2840,7 @@ class Daemon(AuthJSONRPCServer):
response = yield self._render_response(blob_hashes_for_return)
defer.returnValue(response)
@AuthJSONRPCServer.requires("session")
def jsonrpc_blob_reflect(self, blob_hashes, reflector_server=None):
"""
Reflects specified blobs
@ -2815,6 +2859,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda r: self._render_response(r))
return d
@AuthJSONRPCServer.requires("session")
def jsonrpc_blob_reflect_all(self):
"""
Reflects all saved blobs
@ -2834,6 +2879,7 @@ class Daemon(AuthJSONRPCServer):
d.addCallback(lambda r: self._render_response(r))
return d
@AuthJSONRPCServer.requires("dht")
@defer.inlineCallbacks
def jsonrpc_peer_ping(self, node_id):
"""
@ -2863,6 +2909,7 @@ class Daemon(AuthJSONRPCServer):
result = {'error': 'ping timeout'}
defer.returnValue(result)
@AuthJSONRPCServer.requires("dht")
def jsonrpc_routing_table_get(self):
"""
Get DHT routing information
@ -2938,6 +2985,8 @@ class Daemon(AuthJSONRPCServer):
result['node_id'] = self.dht_node.node_id.encode('hex')
return self._render_response(result)
# the single peer downloader needs wallet access
@AuthJSONRPCServer.requires("dht", "wallet", wallet=lambda wallet: wallet.check_locked())
def jsonrpc_blob_availability(self, blob_hash, search_timeout=None, blob_timeout=None):
"""
Get blob availability
@ -2962,6 +3011,7 @@ class Daemon(AuthJSONRPCServer):
return self._blob_availability(blob_hash, search_timeout, blob_timeout)
@AuthJSONRPCServer.requires("session", "wallet", "dht", wallet=lambda wallet: wallet.check_locked())
@AuthJSONRPCServer.deprecated("stream_availability")
def jsonrpc_get_availability(self, uri, sd_timeout=None, peer_timeout=None):
"""
@ -2982,6 +3032,7 @@ class Daemon(AuthJSONRPCServer):
return self.jsonrpc_stream_availability(uri, peer_timeout, sd_timeout)
@AuthJSONRPCServer.requires("session", "wallet", "dht", wallet=lambda wallet: wallet.check_locked())
@defer.inlineCallbacks
def jsonrpc_stream_availability(self, uri, search_timeout=None, blob_timeout=None):
"""

View file

@ -4,6 +4,7 @@ import json
import inspect
from decimal import Decimal
from functools import wraps
from zope.interface import implements
from twisted.web import server, resource
from twisted.internet import defer
@ -15,6 +16,7 @@ from traceback import format_exc
from lbrynet import conf
from lbrynet.core.Error import InvalidAuthenticationToken
from lbrynet.core import utils
from lbrynet.core.Error import ComponentsNotStarted, ComponentStartConditionNotMet
from lbrynet.daemon.auth.util import APIKey, get_auth_message
from lbrynet.daemon.auth.client import LBRY_SECRET
from lbrynet.undecorated import undecorated
@ -141,6 +143,31 @@ class AuthorizedBase(object):
return f
return _deprecated_wrapper
@staticmethod
def requires(*components, **component_conditionals):
def _wrap(fn):
@defer.inlineCallbacks
@wraps(fn)
def _inner(*args, **kwargs):
if component_conditionals:
for component_name, condition in component_conditionals.iteritems():
if not callable(condition):
raise SyntaxError("The specified condition is invalid/not callable")
if args[0].component_manager.all_components_running(component_name):
if not (yield condition(args[0].component_manager.get_component(component_name))):
raise ComponentStartConditionNotMet(
"Not all conditions required to do this operation are met")
else:
raise ComponentsNotStarted("%s component is not setup.\nConditional cannot be checked"
% component_name)
if args[0].component_manager.all_components_running(*components):
result = yield fn(*args, **kwargs)
defer.returnValue(result)
else:
raise ComponentsNotStarted("Not all required components are set up:", components)
return _inner
return _wrap
class AuthJSONRPCServer(AuthorizedBase):
"""
@ -149,7 +176,6 @@ class AuthJSONRPCServer(AuthorizedBase):
API methods are named with a leading "jsonrpc_"
Attributes:
allowed_during_startup (list): list of api methods that are callable before the server has finished startup
sessions (dict): (dict): {<session id>: <lbrynet.daemon.auth.util.APIKey>}
callable_methods (dict): {<api method name>: <api method>}
@ -416,9 +442,6 @@ class AuthJSONRPCServer(AuthorizedBase):
def _verify_method_is_callable(self, function_path):
if function_path not in self.callable_methods:
raise UnknownAPIMethodError(function_path)
if not self.announced_startup:
if function_path not in self.allowed_during_startup:
raise NotAllowedDuringStartupError(function_path)
def _get_jsonrpc_method(self, function_path):
if function_path in self.deprecated_methods: