rippled
Handler.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/rpc/handlers/Handlers.h>
21 #include <ripple/rpc/handlers/Version.h>
22 #include <ripple/rpc/impl/Handler.h>
23 #include <ripple/rpc/impl/RPCHelpers.h>
24 
25 namespace ripple {
26 namespace RPC {
27 namespace {
28 
30 template <typename Function>
31 Handler::Method<Json::Value>
32 byRef(Function const& f)
33 {
34  return [f](JsonContext& context, Json::Value& result) {
35  result = f(context);
36  if (result.type() != Json::objectValue)
37  {
38  assert(false);
39  result = RPC::makeObjectValue(result);
40  }
41 
42  return Status();
43  };
44 }
45 
46 template <class Object, class HandlerImpl>
47 Status
48 handle(JsonContext& context, Object& object)
49 {
50  HandlerImpl handler(context);
51 
52  auto status = handler.check();
53  if (status)
54  status.inject(object);
55  else
56  handler.writeResult(object);
57  return status;
58 };
59 
60 Handler const handlerArray[]{
61  // Some handlers not specified here are added to the table via addHandler()
62  // Request-response methods
63  {"account_info", byRef(&doAccountInfo), Role::USER, NO_CONDITION},
64  {"account_currencies",
65  byRef(&doAccountCurrencies),
66  Role::USER,
67  NO_CONDITION},
68  {"account_lines", byRef(&doAccountLines), Role::USER, NO_CONDITION},
69  {"account_channels", byRef(&doAccountChannels), Role::USER, NO_CONDITION},
70  {"account_nfts", byRef(&doAccountNFTs), Role::USER, NO_CONDITION},
71  {"account_objects", byRef(&doAccountObjects), Role::USER, NO_CONDITION},
72  {"account_offers", byRef(&doAccountOffers), Role::USER, NO_CONDITION},
73  {"account_tx", byRef(&doAccountTxJson), Role::USER, NO_CONDITION},
74  {"amm_info", byRef(&doAMMInfo), Role::USER, NO_CONDITION},
75  {"blacklist", byRef(&doBlackList), Role::ADMIN, NO_CONDITION},
76  {"book_changes", byRef(&doBookChanges), Role::USER, NO_CONDITION},
77  {"book_offers", byRef(&doBookOffers), Role::USER, NO_CONDITION},
78  {"can_delete", byRef(&doCanDelete), Role::ADMIN, NO_CONDITION},
79  {"channel_authorize", byRef(&doChannelAuthorize), Role::USER, NO_CONDITION},
80  {"channel_verify", byRef(&doChannelVerify), Role::USER, NO_CONDITION},
81  {"connect", byRef(&doConnect), Role::ADMIN, NO_CONDITION},
82  {"consensus_info", byRef(&doConsensusInfo), Role::ADMIN, NO_CONDITION},
83  {"crawl_shards", byRef(&doCrawlShards), Role::ADMIN, NO_CONDITION},
84  {"deposit_authorized",
85  byRef(&doDepositAuthorized),
86  Role::USER,
87  NO_CONDITION},
88  {"download_shard", byRef(&doDownloadShard), Role::ADMIN, NO_CONDITION},
89 #ifdef RIPPLED_REPORTING
90  {"gateway_balances", byRef(&doGatewayBalances), Role::ADMIN, NO_CONDITION},
91 #else
92  {"gateway_balances", byRef(&doGatewayBalances), Role::USER, NO_CONDITION},
93 #endif
94  {"get_counts", byRef(&doGetCounts), Role::ADMIN, NO_CONDITION},
95  {"feature", byRef(&doFeature), Role::ADMIN, NO_CONDITION},
96  {"fee", byRef(&doFee), Role::USER, NEEDS_CURRENT_LEDGER},
97  {"fetch_info", byRef(&doFetchInfo), Role::ADMIN, NO_CONDITION},
98  {"ledger_accept",
99  byRef(&doLedgerAccept),
100  Role::ADMIN,
102  {"ledger_cleaner",
103  byRef(&doLedgerCleaner),
104  Role::ADMIN,
106  {"ledger_closed", byRef(&doLedgerClosed), Role::USER, NEEDS_CLOSED_LEDGER},
107  {"ledger_current",
108  byRef(&doLedgerCurrent),
109  Role::USER,
111  {"ledger_data", byRef(&doLedgerData), Role::USER, NO_CONDITION},
112  {"ledger_entry", byRef(&doLedgerEntry), Role::USER, NO_CONDITION},
113  {"ledger_header", byRef(&doLedgerHeader), Role::USER, NO_CONDITION},
114  {"ledger_request", byRef(&doLedgerRequest), Role::ADMIN, NO_CONDITION},
115  {"log_level", byRef(&doLogLevel), Role::ADMIN, NO_CONDITION},
116  {"logrotate", byRef(&doLogRotate), Role::ADMIN, NO_CONDITION},
117  {"manifest", byRef(&doManifest), Role::USER, NO_CONDITION},
118  {"nft_buy_offers", byRef(&doNFTBuyOffers), Role::USER, NO_CONDITION},
119  {"nft_sell_offers", byRef(&doNFTSellOffers), Role::USER, NO_CONDITION},
120  {"node_to_shard", byRef(&doNodeToShard), Role::ADMIN, NO_CONDITION},
121  {"noripple_check", byRef(&doNoRippleCheck), Role::USER, NO_CONDITION},
122  {"owner_info", byRef(&doOwnerInfo), Role::USER, NEEDS_CURRENT_LEDGER},
123  {"peers", byRef(&doPeers), Role::ADMIN, NO_CONDITION},
124  {"path_find", byRef(&doPathFind), Role::USER, NEEDS_CURRENT_LEDGER},
125  {"ping", byRef(&doPing), Role::USER, NO_CONDITION},
126  {"print", byRef(&doPrint), Role::ADMIN, NO_CONDITION},
127  // { "profile", byRef (&doProfile), Role::USER,
128  // NEEDS_CURRENT_LEDGER },
129  {"random", byRef(&doRandom), Role::USER, NO_CONDITION},
130  {"peer_reservations_add",
131  byRef(&doPeerReservationsAdd),
132  Role::ADMIN,
133  NO_CONDITION},
134  {"peer_reservations_del",
135  byRef(&doPeerReservationsDel),
136  Role::ADMIN,
137  NO_CONDITION},
138  {"peer_reservations_list",
139  byRef(&doPeerReservationsList),
140  Role::ADMIN,
141  NO_CONDITION},
142  {"ripple_path_find", byRef(&doRipplePathFind), Role::USER, NO_CONDITION},
143  {"server_definitions",
144  byRef(&doServerDefinitions),
145  Role::USER,
146  NO_CONDITION},
147  {"server_info", byRef(&doServerInfo), Role::USER, NO_CONDITION},
148  {"server_state", byRef(&doServerState), Role::USER, NO_CONDITION},
149  {"sign", byRef(&doSign), Role::USER, NO_CONDITION},
150  {"sign_for", byRef(&doSignFor), Role::USER, NO_CONDITION},
151  {"stop", byRef(&doStop), Role::ADMIN, NO_CONDITION},
152  {"submit", byRef(&doSubmit), Role::USER, NEEDS_CURRENT_LEDGER},
153  {"submit_multisigned",
154  byRef(&doSubmitMultiSigned),
155  Role::USER,
157  {"transaction_entry", byRef(&doTransactionEntry), Role::USER, NO_CONDITION},
158  {"tx", byRef(&doTxJson), Role::USER, NEEDS_NETWORK_CONNECTION},
159  {"tx_history", byRef(&doTxHistory), Role::USER, NO_CONDITION},
160  {"tx_reduce_relay", byRef(&doTxReduceRelay), Role::USER, NO_CONDITION},
161  {"unl_list", byRef(&doUnlList), Role::ADMIN, NO_CONDITION},
162  {"validation_create",
163  byRef(&doValidationCreate),
164  Role::ADMIN,
165  NO_CONDITION},
166  {"validators", byRef(&doValidators), Role::ADMIN, NO_CONDITION},
167  {"validator_list_sites",
168  byRef(&doValidatorListSites),
169  Role::ADMIN,
170  NO_CONDITION},
171  {"validator_info", byRef(&doValidatorInfo), Role::ADMIN, NO_CONDITION},
172  {"wallet_propose", byRef(&doWalletPropose), Role::ADMIN, NO_CONDITION},
173  // Evented methods
174  {"subscribe", byRef(&doSubscribe), Role::USER, NO_CONDITION},
175  {"unsubscribe", byRef(&doUnsubscribe), Role::USER, NO_CONDITION},
176 };
177 
178 class HandlerTable
179 {
180 private:
181  template <std::size_t N>
182  explicit HandlerTable(const Handler (&entries)[N])
183  {
184  for (std::size_t i = 0; i < N; ++i)
185  {
186  auto const& entry = entries[i];
187  assert(table_.find(entry.name_) == table_.end());
188  table_[entry.name_] = entry;
189  }
190 
191  // This is where the new-style handlers are added.
192  addHandler<LedgerHandler>();
193  addHandler<VersionHandler>();
194  }
195 
196 public:
197  static HandlerTable const&
198  instance()
199  {
200  static HandlerTable const handlerTable(handlerArray);
201  return handlerTable;
202  }
203 
204  Handler const*
205  getHandler(unsigned version, bool betaEnabled, std::string const& name)
206  const
207  {
208  if (version < RPC::apiMinimumSupportedVersion ||
209  version > (betaEnabled ? RPC::apiBetaVersion
211  return nullptr;
212  auto i = table_.find(name);
213  return i == table_.end() ? nullptr : &i->second;
214  }
215 
217  getHandlerNames() const
218  {
220  ret.reserve(table_.size());
221  for (auto const& i : table_)
222  ret.push_back(i.second.name_);
223  return ret;
224  }
225 
226 private:
228 
229  template <class HandlerImpl>
230  void
231  addHandler()
232  {
233  assert(table_.find(HandlerImpl::name()) == table_.end());
234 
235  Handler h;
236  h.name_ = HandlerImpl::name();
237  h.valueMethod_ = &handle<Json::Value, HandlerImpl>;
238  h.role_ = HandlerImpl::role();
239  h.condition_ = HandlerImpl::condition();
240 
241  table_[HandlerImpl::name()] = h;
242  }
243 };
244 
245 } // namespace
246 
247 Handler const*
248 getHandler(unsigned version, bool betaEnabled, std::string const& name)
249 {
250  return HandlerTable::instance().getHandler(version, betaEnabled, name);
251 }
252 
255 {
256  return HandlerTable::instance().getHandlerNames();
257 };
258 
259 } // namespace RPC
260 } // namespace ripple
ripple::doAccountNFTs
Json::Value doAccountNFTs(RPC::JsonContext &context)
General RPC command that can retrieve objects in the account root.
Definition: AccountObjects.cpp:51
ripple::doFeature
Json::Value doFeature(RPC::JsonContext &context)
Definition: Feature1.cpp:35
ripple::doLedgerAccept
Json::Value doLedgerAccept(RPC::JsonContext &)
Definition: LedgerAccept.cpp:35
ripple::doUnlList
Json::Value doUnlList(RPC::JsonContext &)
Definition: UnlList.cpp:30
ripple::doGetCounts
Json::Value doGetCounts(RPC::JsonContext &context)
Definition: GetCounts.cpp:161
ripple::doLedgerEntry
Json::Value doLedgerEntry(RPC::JsonContext &)
Definition: LedgerEntry.cpp:42
ripple::doLedgerCurrent
Json::Value doLedgerCurrent(RPC::JsonContext &)
Definition: LedgerCurrent.cpp:30
ripple::doAccountCurrencies
Json::Value doAccountCurrencies(RPC::JsonContext &context)
Definition: AccountCurrenciesHandler.cpp:32
std::string
STL class.
ripple::doValidationCreate
Json::Value doValidationCreate(RPC::JsonContext &)
Definition: ValidationCreate.cpp:45
ripple::doOwnerInfo
Json::Value doOwnerInfo(RPC::JsonContext &)
Definition: OwnerInfo.cpp:35
ripple::doPathFind
Json::Value doPathFind(RPC::JsonContext &)
Definition: PathFind.cpp:33
ripple::doDownloadShard
Json::Value doDownloadShard(RPC::JsonContext &context)
RPC command that downloads and import shard archives.
Definition: DownloadShard.cpp:49
ripple::doAccountInfo
Json::Value doAccountInfo(RPC::JsonContext &context)
Definition: AccountInfo.cpp:50
ripple::doRipplePathFind
Json::Value doRipplePathFind(RPC::JsonContext &)
Definition: RipplePathFind.cpp:32
ripple::doSignFor
Json::Value doSignFor(RPC::JsonContext &)
Definition: SignFor.cpp:35
ripple::RPC::getHandler
Handler const * getHandler(unsigned version, bool betaEnabled, std::string const &name)
Definition: Handler.cpp:248
ripple::doAccountObjects
Json::Value doAccountObjects(RPC::JsonContext &context)
Definition: AccountObjects.cpp:164
std::vector::reserve
T reserve(T... args)
std::vector
STL class.
ripple::doServerDefinitions
Json::Value doServerDefinitions(RPC::JsonContext &)
Definition: ServerInfo.cpp:299
ripple::doValidators
Json::Value doValidators(RPC::JsonContext &)
Definition: Validators.cpp:29
ripple::doValidatorListSites
Json::Value doValidatorListSites(RPC::JsonContext &)
Definition: ValidatorListSites.cpp:29
ripple::doTxReduceRelay
Json::Value doTxReduceRelay(RPC::JsonContext &)
Definition: TxReduceRelay.cpp:28
ripple::doChannelVerify
Json::Value doChannelVerify(RPC::JsonContext &)
Definition: PayChanClaim.cpp:100
ripple::RPC::NEEDS_NETWORK_CONNECTION
@ NEEDS_NETWORK_CONNECTION
Definition: Handler.h:41
ripple::doPrint
Json::Value doPrint(RPC::JsonContext &)
Definition: Print.cpp:29
ripple::doGatewayBalances
Json::Value doGatewayBalances(RPC::JsonContext &context)
Definition: GatewayBalances.cpp:54
ripple::doManifest
Json::Value doManifest(RPC::JsonContext &)
Definition: rpc/handlers/Manifest.cpp:30
ripple::doPeers
Json::Value doPeers(RPC::JsonContext &)
Definition: Peers.cpp:32
ripple::doSubmitMultiSigned
Json::Value doSubmitMultiSigned(RPC::JsonContext &)
Definition: SubmitMultiSigned.cpp:36
ripple::RPC::apiBetaVersion
constexpr unsigned int apiBetaVersion
Definition: RPCHelpers.h:244
std::vector::push_back
T push_back(T... args)
ripple::doNFTBuyOffers
Json::Value doNFTBuyOffers(RPC::JsonContext &)
Definition: NFTOffers.cpp:165
ripple::doCrawlShards
Json::Value doCrawlShards(RPC::JsonContext &context)
RPC command that reports stored shards by nodes.
Definition: CrawlShards.cpp:44
ripple::doTxHistory
Json::Value doTxHistory(RPC::JsonContext &)
Definition: TxHistory.cpp:43
ripple::doLogLevel
Json::Value doLogLevel(RPC::JsonContext &)
Definition: LogLevel.cpp:32
ripple::doSubmit
Json::Value doSubmit(RPC::JsonContext &)
Definition: Submit.cpp:48
ripple::Role::ADMIN
@ ADMIN
Json::objectValue
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:43
ripple::doPing
Json::Value doPing(RPC::JsonContext &)
Definition: Ping.cpp:32
ripple::doLedgerRequest
Json::Value doLedgerRequest(RPC::JsonContext &)
Definition: LedgerRequest.cpp:40
ripple::doNFTSellOffers
Json::Value doNFTSellOffers(RPC::JsonContext &)
Definition: NFTOffers.cpp:151
ripple::Role::USER
@ USER
ripple::doChannelAuthorize
Json::Value doChannelAuthorize(RPC::JsonContext &)
Definition: PayChanClaim.cpp:44
ripple::RPC::NEEDS_CURRENT_LEDGER
@ NEEDS_CURRENT_LEDGER
Definition: Handler.h:42
ripple::doRandom
Json::Value doRandom(RPC::JsonContext &)
Definition: Random.cpp:39
ripple::doValidatorInfo
Json::Value doValidatorInfo(RPC::JsonContext &)
Definition: ValidatorInfo.cpp:30
ripple::doStop
Json::Value doStop(RPC::JsonContext &)
Definition: Stop.cpp:33
ripple::doWalletPropose
Json::Value doWalletPropose(RPC::JsonContext &)
Definition: WalletPropose.cpp:67
ripple::RPC::NO_CONDITION
@ NO_CONDITION
Definition: Handler.h:40
ripple::doCanDelete
Json::Value doCanDelete(RPC::JsonContext &context)
Definition: CanDelete.cpp:35
ripple::doConsensusInfo
Json::Value doConsensusInfo(RPC::JsonContext &context)
Definition: ConsensusInfo.cpp:31
ripple::doLedgerData
Json::Value doLedgerData(RPC::JsonContext &)
Definition: LedgerData.cpp:45
ripple::doAccountOffers
Json::Value doAccountOffers(RPC::JsonContext &context)
Definition: AccountOffers.cpp:57
ripple::doLogRotate
Json::Value doLogRotate(RPC::JsonContext &)
Definition: LogRotate.cpp:28
ripple::doNoRippleCheck
Json::Value doNoRippleCheck(RPC::JsonContext &)
Definition: NoRippleCheck.cpp:61
ripple::RPC::NEEDS_CLOSED_LEDGER
@ NEEDS_CLOSED_LEDGER
Definition: Handler.h:43
std::map
STL class.
ripple::doLedgerClosed
Json::Value doLedgerClosed(RPC::JsonContext &)
Definition: LedgerClosed.cpp:29
ripple::doBookOffers
Json::Value doBookOffers(RPC::JsonContext &context)
Definition: BookOffers.cpp:36
std::experimental::filesystem::status
T status(T... args)
ripple::doPeerReservationsList
Json::Value doPeerReservationsList(RPC::JsonContext &)
Definition: Reservations.cpp:121
ripple::doAMMInfo
Json::Value doAMMInfo(RPC::JsonContext &context)
Definition: AMMInfo.cpp:73
ripple::NodeStore::Status
Status
Return codes from Backend operations.
Definition: nodestore/Types.h:45
ripple::doTransactionEntry
Json::Value doTransactionEntry(RPC::JsonContext &)
Definition: TransactionEntry.cpp:37
ripple::doUnsubscribe
Json::Value doUnsubscribe(RPC::JsonContext &)
Definition: Unsubscribe.cpp:32
ripple::RPC::apiMinimumSupportedVersion
constexpr unsigned int apiMinimumSupportedVersion
Definition: RPCHelpers.h:242
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::doBlackList
Json::Value doBlackList(RPC::JsonContext &context)
Definition: BlackList.cpp:28
ripple::doAccountTxJson
Json::Value doAccountTxJson(RPC::JsonContext &context)
Definition: AccountTx.cpp:386
ripple::doSign
Json::Value doSign(RPC::JsonContext &)
Definition: SignHandler.cpp:33
ripple::doPeerReservationsDel
Json::Value doPeerReservationsDel(RPC::JsonContext &)
Definition: Reservations.cpp:91
ripple::doTxJson
Json::Value doTxJson(RPC::JsonContext &)
Definition: Tx.cpp:347
ripple::RPC::apiMaximumSupportedVersion
constexpr unsigned int apiMaximumSupportedVersion
Definition: RPCHelpers.h:243
ripple::doNodeToShard
Json::Value doNodeToShard(RPC::JsonContext &)
Definition: NodeToShard.cpp:33
ripple::RPC::makeObjectValue
Json::Value makeObjectValue(Value const &value, Json::StaticString const &field=jss::message)
Return a Json::objectValue with a single entry.
Definition: Handler.h:63
std::size_t
ripple::doAccountChannels
Json::Value doAccountChannels(RPC::JsonContext &context)
Definition: AccountChannels.cpp:68
ripple::doServerInfo
Json::Value doServerInfo(RPC::JsonContext &)
Definition: ServerInfo.cpp:322
ripple::doLedgerHeader
Json::Value doLedgerHeader(RPC::JsonContext &)
Definition: rpc/handlers/LedgerHeader.cpp:33
ripple::doFetchInfo
Json::Value doFetchInfo(RPC::JsonContext &context)
Definition: FetchInfo.cpp:31
ripple::doServerState
Json::Value doServerState(RPC::JsonContext &)
Definition: ServerState.cpp:31
ripple::doConnect
Json::Value doConnect(RPC::JsonContext &context)
Definition: Connect.cpp:38
ripple::doLedgerCleaner
Json::Value doLedgerCleaner(RPC::JsonContext &)
Definition: LedgerCleanerHandler.cpp:29
ripple::RPC::getHandlerNames
std::vector< char const * > getHandlerNames()
Return names of all methods.
Definition: Handler.cpp:254
ripple::doDepositAuthorized
Json::Value doDepositAuthorized(RPC::JsonContext &context)
Definition: DepositAuthorized.cpp:38
ripple::doPeerReservationsAdd
Json::Value doPeerReservationsAdd(RPC::JsonContext &)
Definition: Reservations.cpp:35
ripple::doBookChanges
Json::Value doBookChanges(RPC::JsonContext &context)
Definition: BookOffers.cpp:205
ripple::doAccountLines
Json::Value doAccountLines(RPC::JsonContext &context)
Definition: AccountLines.cpp:77
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::doFee
Json::Value doFee(RPC::JsonContext &context)
Definition: Fee1.cpp:30
ripple::doSubscribe
Json::Value doSubscribe(RPC::JsonContext &)
Definition: Subscribe.cpp:37