diff --git a/Builds/VisualStudio2013/RippleD.vcxproj b/Builds/VisualStudio2013/RippleD.vcxproj
index b74bbb82cb..0e4476a2f3 100644
--- a/Builds/VisualStudio2013/RippleD.vcxproj
+++ b/Builds/VisualStudio2013/RippleD.vcxproj
@@ -2725,6 +2725,9 @@
+
+ True
+
True
@@ -2773,9 +2776,6 @@
True
-
- True
-
True
@@ -2921,6 +2921,8 @@
+
+
diff --git a/Builds/VisualStudio2013/RippleD.vcxproj.filters b/Builds/VisualStudio2013/RippleD.vcxproj.filters
index 4801708798..2dd6a79392 100644
--- a/Builds/VisualStudio2013/RippleD.vcxproj.filters
+++ b/Builds/VisualStudio2013/RippleD.vcxproj.filters
@@ -3888,6 +3888,9 @@
ripple\module\rpc\handlers
+
+ ripple\module\rpc\handlers
+
ripple\module\rpc\handlers
@@ -3936,9 +3939,6 @@
ripple\module\rpc\handlers
-
- ripple\module\rpc\handlers
-
ripple\module\rpc\handlers
@@ -4095,6 +4095,9 @@
ripple\module\rpc\impl
+
+ ripple\module\rpc
+
ripple\module\rpc
diff --git a/src/ripple/module/app/main/RPCHTTPServer.cpp b/src/ripple/module/app/main/RPCHTTPServer.cpp
index c70b0b8492..5212ff3b9c 100644
--- a/src/ripple/module/app/main/RPCHTTPServer.cpp
+++ b/src/ripple/module/app/main/RPCHTTPServer.cpp
@@ -58,8 +58,8 @@ public:
{
m_context.reset (RippleSSLContext::createAuthenticated (
getConfig ().RPC_SSL_KEY,
- getConfig ().RPC_SSL_CERT,
- getConfig ().RPC_SSL_CHAIN));
+ getConfig ().RPC_SSL_CERT,
+ getConfig ().RPC_SSL_CHAIN));
}
}
@@ -74,7 +74,7 @@ public:
if (! getConfig ().getRpcIP().empty () &&
getConfig ().getRpcPort() != 0)
{
- beast::IP::Endpoint ep (beast::IP::Endpoint::from_string (getConfig().getRpcIP()));
+ auto ep = beast::IP::Endpoint::from_string (getConfig().getRpcIP());
// VFALCO TODO IP address should not have an "unspecified" state
//if (! is_unspecified (ep))
@@ -143,18 +143,11 @@ public:
return;
}
-#if 0
- // Synchronous version that doesn't use job queue
- Job job;
- processSession (job, session);
-
-#else
session.detach();
m_jobQueue.addJob (jtCLIENT, "RPC-Client", std::bind (
&RPCHTTPServerImp::processSession, this, std::placeholders::_1,
std::ref (session)));
-#endif
}
void
@@ -174,15 +167,9 @@ public:
// Dispatched on the job queue
void processSession (Job& job, HTTP::Session& session)
{
-#if 0
- // Goes through the old code
- session.write (m_deprecatedHandler.processRequest (
- session.content(), session.remoteAddress().at_port(0)));
-#else
auto const s (to_string(session.message().body));
session.write (processRequest (to_string(session.message().body),
session.remoteAddress().at_port(0)));
-#endif
if (session.message().keep_alive())
{
@@ -219,7 +206,7 @@ public:
}
}
- Config::Role const role (getConfig ().getAdminRole (jvRequest, remoteIPAddress));
+ auto const role = getConfig ().getAdminRole (jvRequest, remoteIPAddress);
Resource::Consumer usage;
@@ -233,34 +220,30 @@ public:
// Parse id now so errors from here on will have the id
//
- // VFALCO NOTE Except that "id" isn't included in the following errors...
+ // VFALCO NOTE Except that "id" isn't included in the following errors.
//
Json::Value const id = jvRequest ["id"];
Json::Value const method = jvRequest ["method"];
if (method.isNull ())
- {
return createResponse (400, "Null method");
- }
- else if (! method.isString ())
- {
+
+ if (! method.isString ())
return createResponse (400, "method is not string");
- }
std::string strMethod = method.asString ();
+ if (strMethod.empty())
+ return createResponse (400, "method is empty");
// Parse params
Json::Value params = jvRequest ["params"];
if (params.isNull ())
- {
params = Json::Value (Json::arrayValue);
- }
+
else if (!params.isArray ())
- {
return HTTPReply (400, "params unparseable");
- }
// VFALCO TODO Shouldn't we handle this earlier?
//
@@ -272,20 +255,19 @@ public:
return HTTPReply (403, "Forbidden");
}
+
std::string response;
+ RPCHandler rpcHandler (m_networkOPs);
+ Resource::Charge loadType = Resource::feeReferenceRPC;
m_journal.debug << "Query: " << strMethod << params;
- RPCHandler rpcHandler (m_networkOPs);
-
- Resource::Charge loadType = Resource::feeReferenceRPC;
-
Json::Value const result (rpcHandler.doRpcCommand (
strMethod, params, role, loadType));
+ m_journal.debug << "Reply: " << result;
usage.charge (loadType);
- m_journal.debug << "Reply: " << result;
response = JSONRPCReply (result, Json::Value (), id);
@@ -314,9 +296,12 @@ RPCHTTPServer::RPCHTTPServer (Stoppable& parent)
//------------------------------------------------------------------------------
std::unique_ptr
-make_RPCHTTPServer (beast::Stoppable& parent, beast::Journal journal,
- JobQueue& jobQueue, NetworkOPs& networkOPs,
- Resource::Manager& resourceManager)
+make_RPCHTTPServer (
+ beast::Stoppable& parent,
+ beast::Journal journal,
+ JobQueue& jobQueue,
+ NetworkOPs& networkOPs,
+ Resource::Manager& resourceManager)
{
return std::make_unique (
parent, journal, jobQueue, networkOPs, resourceManager);
diff --git a/src/ripple/module/rpc/InternalHandler.h b/src/ripple/module/rpc/InternalHandler.h
new file mode 100644
index 0000000000..665e0e8588
--- /dev/null
+++ b/src/ripple/module/rpc/InternalHandler.h
@@ -0,0 +1,50 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of rippled: https://github.com/ripple/rippled
+ Copyright (c) 2012, 2013 Ripple Labs Inc.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef RIPPLE_APP_RPC_INTERNAL_HANDLER
+#define RIPPLE_APP_RPC_INTERNAL_HANDLER
+
+namespace ripple {
+namespace RPC {
+
+/** To dynamically add custom or experimental RPC handlers, construct a new
+ * instance of InternalHandler with your own handler function. */
+struct InternalHandler
+{
+ typedef Json::Value (*handler_t) (const Json::Value&);
+
+ InternalHandler (const std::string& name, handler_t handler)
+ : name_ (name),
+ handler_ (handler)
+ {
+ nextHandler_ = InternalHandler::headHandler;
+ InternalHandler::headHandler = this;
+ }
+
+ InternalHandler* nextHandler_;
+ std::string name_;
+ handler_t handler_;
+
+ static InternalHandler* headHandler;
+};
+
+} // RPC
+} // ripple
+
+#endif
diff --git a/src/ripple/module/rpc/Manager.h b/src/ripple/module/rpc/Manager.h
index d69605195a..685058dce8 100644
--- a/src/ripple/module/rpc/Manager.h
+++ b/src/ripple/module/rpc/Manager.h
@@ -34,7 +34,6 @@ public:
virtual ~Manager () = 0;
/** Add a handler for the specified JSON-RPC command. */
- /** @{ */
template
void add (std::string const& method)
{
@@ -47,17 +46,16 @@ public:
}
virtual void add (std::string const& method, handler_type&& handler) = 0;
- /** @} */
/** Dispatch the JSON-RPC request.
- @return `true` If the command was found.
+ @return `true` if the command was found.
*/
virtual bool dispatch (Request& req) = 0;
};
std::unique_ptr make_Manager (beast::Journal journal);
-}
-}
+} // RPC
+} // ripple
#endif
diff --git a/src/ripple/module/rpc/RPCHandler.h b/src/ripple/module/rpc/RPCHandler.h
index 30416ab898..a368d47859 100644
--- a/src/ripple/module/rpc/RPCHandler.h
+++ b/src/ripple/module/rpc/RPCHandler.h
@@ -32,52 +32,31 @@
namespace ripple {
// used by the RPCServer or WSDoor to carry out these RPC commands
-class NetworkOPs;
class InfoSub;
+class NetworkOPs;
class RPCHandler
{
public:
- explicit RPCHandler (NetworkOPs& netOps);
-
- RPCHandler (NetworkOPs& netOps, InfoSub::pointer infoSub);
+ explicit RPCHandler (
+ NetworkOPs& netOps, InfoSub::pointer infoSub = nullptr);
Json::Value doCommand (
- Json::Value const& jvRequest, Config::Role role,
+ Json::Value const& request,
+ Config::Role role,
Resource::Charge& loadType);
Json::Value doRpcCommand (
- std::string const& strCommand, Json::Value const& jvParams,
- Config::Role iRole, Resource::Charge& loadType);
-
- // Utilities
+ std::string const& command,
+ Json::Value const& params,
+ Config::Role role,
+ Resource::Charge& loadType);
private:
- NetworkOPs* mNetOps;
- InfoSub::pointer mInfoSub;
+ NetworkOPs& netOps_;
+ InfoSub::pointer infoSub_;
- Config::Role mRole;
-};
-
-class RPCInternalHandler
-{
-public:
- typedef Json::Value (*handler_t) (Json::Value const&);
-
-public:
- RPCInternalHandler (std::string const& name, handler_t handler);
- static Json::Value runHandler (
- std::string const& name, Json::Value const& params);
-
-private:
- // VFALCO TODO Replace with a singleton with a well defined interface and
- // a lock free stack (if necessary).
- //
- static RPCInternalHandler* sHeadHandler;
-
- RPCInternalHandler* mNextHandler;
- std::string mName;
- handler_t mHandler;
+ Config::Role role_ = Config::FORBID;
};
} // ripple
diff --git a/src/ripple/module/rpc/RPCServerHandler.h b/src/ripple/module/rpc/RPCServerHandler.h
index 8d4f1f6721..5d78f01127 100644
--- a/src/ripple/module/rpc/RPCServerHandler.h
+++ b/src/ripple/module/rpc/RPCServerHandler.h
@@ -29,14 +29,14 @@ class NetworkOPs;
class RPCServerHandler : public RPCServer::Handler
{
public:
- explicit RPCServerHandler (NetworkOPs& networkOPs, Resource::Manager& resourceManager);
+ RPCServerHandler (NetworkOPs&, Resource::Manager&);
std::string createResponse (int statusCode, std::string const& description);
-
bool isAuthorized (std::map const& headers);
- std::string processRequest (std::string const& request,
- beast::IP::Endpoint const& remoteIPAddress);
+ std::string processRequest (
+ std::string const& request,
+ beast::IP::Endpoint const& remoteIPAddress);
private:
NetworkOPs& m_networkOPs;
diff --git a/src/ripple/module/rpc/Request.h b/src/ripple/module/rpc/Request.h
index 804a2f59cd..94ee705c5f 100644
--- a/src/ripple/module/rpc/Request.h
+++ b/src/ripple/module/rpc/Request.h
@@ -23,18 +23,19 @@
#include
#include
-
namespace ripple {
-class Application; // forward declare
+class Application;
namespace RPC {
struct Request
{
- explicit Request (beast::Journal journal_,
- std::string const& method_, Json::Value& params_,
- Application& app_)
+ explicit Request (
+ beast::Journal journal_,
+ std::string const& method_,
+ Json::Value& params_,
+ Application& app_)
: journal (journal_)
, method (method_)
, params (params_)
diff --git a/src/ripple/module/rpc/Tuning.h b/src/ripple/module/rpc/Tuning.h
index 45a452b932..dfa6736b8a 100644
--- a/src/ripple/module/rpc/Tuning.h
+++ b/src/ripple/module/rpc/Tuning.h
@@ -28,8 +28,7 @@ const int MAX_PATHFINDS_IN_PROGRESS = 2;
const int MAX_PATHFIND_JOB_COUNT = 50;
const int MAX_JOB_QUEUE_CLIENTS = 500;
const int MAX_VALIDATED_LEDGER_AGE = 120;
-
-// TODO(tom): Shouldn't DEFAULT_AUTO_FILL_FEE_MULTIPLIER be floating point?
+const int MAX_REQUEST_SIZE = 1000000;
} // RPC
} // ripple
diff --git a/src/ripple/module/rpc/handlers/AccountInfo.cpp b/src/ripple/module/rpc/handlers/AccountInfo.cpp
index 845e1baf3f..ce4d21f35a 100644
--- a/src/ripple/module/rpc/handlers/AccountInfo.cpp
+++ b/src/ripple/module/rpc/handlers/AccountInfo.cpp
@@ -22,10 +22,13 @@ namespace ripple {
// {
// account: ,
// account_index : // optional
-// strict: // true, only allow public keys and addresses. false, default.
+// strict:
+// if true, only allow public keys and addresses. false, default.
// ledger_hash :
// ledger_index :
// }
+
+// TODO(tom): what is that "default"?
Json::Value doAccountInfo (RPC::Context& context)
{
auto& params = context.params_;
diff --git a/src/ripple/module/rpc/handlers/AccountLines.cpp b/src/ripple/module/rpc/handlers/AccountLines.cpp
index 7d6decc2f4..c85a902bf2 100644
--- a/src/ripple/module/rpc/handlers/AccountLines.cpp
+++ b/src/ripple/module/rpc/handlers/AccountLines.cpp
@@ -85,22 +85,22 @@ Json::Value doAccountLines (RPC::Context& context)
if (!raPeer.isValid () ||
raPeer.getAccountID () == line->getAccountIDPeer ())
{
- STAmount const& saBalance = line->getBalance ();
- STAmount const& saLimit = line->getLimit ();
- STAmount const& saLimitPeer = line->getLimitPeer ();
+ STAmount const& saBalance = line->getBalance ();
+ STAmount const& saLimit = line->getLimit ();
+ STAmount const& saLimitPeer = line->getLimitPeer ();
- Json::Value& jPeer = jsonLines.append (Json::objectValue);
+ Json::Value& jPeer = jsonLines.append (Json::objectValue);
- jPeer[jss::account] = to_string (line->getAccountIDPeer ());
+ jPeer[jss::account] = to_string (line->getAccountIDPeer ());
// Amount reported is positive if current account holds other
// account's IOUs.
//
// Amount reported is negative if other account holds current
// account's IOUs.
- jPeer[jss::balance] = saBalance.getText ();
- jPeer[jss::currency] = saBalance.getHumanCurrency ();
- jPeer[jss::limit] = saLimit.getText ();
- jPeer[jss::limit_peer] = saLimitPeer.getText ();
+ jPeer[jss::balance] = saBalance.getText ();
+ jPeer[jss::currency] = saBalance.getHumanCurrency ();
+ jPeer[jss::limit] = saLimit.getText ();
+ jPeer[jss::limit_peer] = saLimitPeer.getText ();
jPeer[jss::quality_in]
= static_cast (line->getQualityIn ());
jPeer[jss::quality_out]
diff --git a/src/ripple/module/rpc/handlers/AccountOffers.cpp b/src/ripple/module/rpc/handlers/AccountOffers.cpp
index ec5c1e85f1..45985820f4 100644
--- a/src/ripple/module/rpc/handlers/AccountOffers.cpp
+++ b/src/ripple/module/rpc/handlers/AccountOffers.cpp
@@ -73,10 +73,11 @@ Json::Value doAccountOffers (RPC::Context& context)
return rpcError (rpcACT_NOT_FOUND);
Json::Value& jvsOffers = (result[jss::offers] = Json::arrayValue);
- ledger->visitAccountItems (raAccount.getAccountID (),
- std::bind (&offerAdder, std::ref (jvsOffers),
- std::placeholders::_1));
-
+ auto adder = std::bind (
+ &offerAdder,
+ std::ref (jvsOffers),
+ std::placeholders::_1);
+ ledger->visitAccountItems (raAccount.getAccountID (), adder);
context.loadType_ = Resource::feeMediumBurdenRPC;
return result;
diff --git a/src/ripple/module/rpc/handlers/Handlers.h b/src/ripple/module/rpc/handlers/Handlers.h
index 60b0cbb546..70495ca329 100644
--- a/src/ripple/module/rpc/handlers/Handlers.h
+++ b/src/ripple/module/rpc/handlers/Handlers.h
@@ -53,7 +53,6 @@ Json::Value doPathFind (RPC::Context&);
Json::Value doPeers (RPC::Context&);
Json::Value doPing (RPC::Context&);
Json::Value doPrint (RPC::Context&);
-Json::Value doProfile (RPC::Context&);
Json::Value doProofCreate (RPC::Context&);
Json::Value doProofSolve (RPC::Context&);
Json::Value doProofVerify (RPC::Context&);
diff --git a/src/ripple/module/rpc/handlers/Internal.cpp b/src/ripple/module/rpc/handlers/Internal.cpp
new file mode 100644
index 0000000000..e969a9a421
--- /dev/null
+++ b/src/ripple/module/rpc/handlers/Internal.cpp
@@ -0,0 +1,53 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of rippled: https://github.com/ripple/rippled
+ Copyright (c) 2012-2014 Ripple Labs Inc.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+//==============================================================================
+
+#include
+
+namespace ripple {
+
+RPC::InternalHandler* RPC::InternalHandler::headHandler = nullptr;
+
+Json::Value doInternal (RPC::Context& context)
+{
+ // Used for debug or special-purpose RPC commands
+ if (!context.params_.isMember ("internal_command"))
+ return rpcError (rpcINVALID_PARAMS);
+
+ auto name = context.params_["internal_command"].asString ();
+ auto params = context.params_["params"];
+
+ for (auto* h = RPC::InternalHandler::headHandler; h; )
+ {
+ if (name == h->name_)
+ {
+ WriteLog (lsWARNING, RPCHandler)
+ << "Internal command " << name << ": " << params;
+ Json::Value ret = h->handler_ (params);
+ WriteLog (lsWARNING, RPCHandler)
+ << "Internal command returns: " << ret;
+ return ret;
+ }
+
+ h = h->nextHandler_;
+ }
+
+ return rpcError (rpcBAD_SYNTAX);
+}
+
+} // ripple
diff --git a/src/ripple/module/rpc/handlers/LedgerAccept.cpp b/src/ripple/module/rpc/handlers/LedgerAccept.cpp
index b969a8dcda..cdec028a60 100644
--- a/src/ripple/module/rpc/handlers/LedgerAccept.cpp
+++ b/src/ripple/module/rpc/handlers/LedgerAccept.cpp
@@ -27,7 +27,7 @@ Json::Value doLedgerAccept (RPC::Context& context)
if (!getConfig ().RUN_STANDALONE)
{
- jvResult["error"] = "notStandAlone";
+ jvResult["error"] = "notStandAlone";
}
else
{
diff --git a/src/ripple/module/rpc/handlers/LedgerClosed.cpp b/src/ripple/module/rpc/handlers/LedgerClosed.cpp
index 0db9e809f9..5a2064bba4 100644
--- a/src/ripple/module/rpc/handlers/LedgerClosed.cpp
+++ b/src/ripple/module/rpc/handlers/LedgerClosed.cpp
@@ -22,13 +22,11 @@ namespace ripple {
Json::Value doLedgerClosed (RPC::Context& context)
{
- Json::Value jvResult;
-
uint256 uLedger = context.netOps_.getClosedLedgerHash ();
- jvResult["ledger_index"] = context.netOps_.getLedgerID (uLedger);
- jvResult["ledger_hash"] = to_string (uLedger);
- //jvResult["ledger_time"] = uLedger.
+ Json::Value jvResult;
+ jvResult["ledger_index"] = context.netOps_.getLedgerID (uLedger);
+ jvResult["ledger_hash"] = to_string (uLedger);
return jvResult;
}
diff --git a/src/ripple/module/rpc/handlers/LedgerCurrent.cpp b/src/ripple/module/rpc/handlers/LedgerCurrent.cpp
index 5d31326079..91d6af777c 100644
--- a/src/ripple/module/rpc/handlers/LedgerCurrent.cpp
+++ b/src/ripple/module/rpc/handlers/LedgerCurrent.cpp
@@ -23,9 +23,7 @@ namespace ripple {
Json::Value doLedgerCurrent (RPC::Context& context)
{
Json::Value jvResult;
-
- jvResult["ledger_current_index"] = context.netOps_.getCurrentLedgerID ();
-
+ jvResult["ledger_current_index"] = context.netOps_.getCurrentLedgerID ();
return jvResult;
}
diff --git a/src/ripple/module/rpc/handlers/OwnerInfo.cpp b/src/ripple/module/rpc/handlers/OwnerInfo.cpp
index 5ee34657fc..490797726a 100644
--- a/src/ripple/module/rpc/handlers/OwnerInfo.cpp
+++ b/src/ripple/module/rpc/handlers/OwnerInfo.cpp
@@ -24,12 +24,14 @@ namespace ripple {
// 'ident' : ,
// 'account_index' : // optional
// }
-// XXX This would be better if it took the ledger.
Json::Value doOwnerInfo (RPC::Context& context)
{
auto lock = getApp().masterLock();
- if (!context.params_.isMember ("account") && !context.params_.isMember ("ident"))
+ if (!context.params_.isMember ("account") &&
+ !context.params_.isMember ("ident"))
+ {
return RPC::missing_field_error ("account");
+ }
std::string strIdent = context.params_.isMember ("account")
? context.params_["account"].asString ()
@@ -38,25 +40,35 @@ Json::Value doOwnerInfo (RPC::Context& context)
int iIndex = context.params_.isMember ("account_index")
? context.params_["account_index"].asUInt () : 0;
RippleAddress raAccount;
-
Json::Value ret;
// Get info on account.
+ auto const& closedLedger = context.netOps_.getClosedLedger ();
Json::Value jAccepted = RPC::accountFromString (
- context.netOps_.getClosedLedger (), raAccount, bIndex, strIdent, iIndex,
- false, context.netOps_);
+ closedLedger,
+ raAccount,
+ bIndex,
+ strIdent,
+ iIndex,
+ false,
+ context.netOps_);
- ret["accepted"] = jAccepted.empty ()
- ? context.netOps_.getOwnerInfo (
- context.netOps_.getClosedLedger (), raAccount) : jAccepted;
+ ret["accepted"] = jAccepted.empty () ? context.netOps_.getOwnerInfo (
+ closedLedger, raAccount) : jAccepted;
+ auto const& currentLedger = context.netOps_.getCurrentLedger ();
Json::Value jCurrent = RPC::accountFromString (
- context.netOps_.getCurrentLedger (), raAccount, bIndex, strIdent, iIndex,
- false, context.netOps_);
+ currentLedger,
+ raAccount,
+ bIndex,
+ strIdent,
+ iIndex,
+ false,
+ context.netOps_);
ret["current"] = jCurrent.empty () ? context.netOps_.getOwnerInfo (
- context.netOps_.getCurrentLedger (), raAccount) : jCurrent;
+ currentLedger, raAccount) : jCurrent;
return ret;
}
diff --git a/src/ripple/module/rpc/handlers/Peers.cpp b/src/ripple/module/rpc/handlers/Peers.cpp
index 5fe4ef9788..2d1ec409e6 100644
--- a/src/ripple/module/rpc/handlers/Peers.cpp
+++ b/src/ripple/module/rpc/handlers/Peers.cpp
@@ -29,7 +29,7 @@ Json::Value doPeers (RPC::Context& context)
{
auto lock = getApp().masterLock();
- jvResult["peers"] = getApp().overlay ().json ();
+ jvResult["peers"] = getApp().overlay ().json ();
getApp().getUNL().addClusterStatus(jvResult);
}
diff --git a/src/ripple/module/rpc/handlers/Profile.cpp b/src/ripple/module/rpc/handlers/Profile.cpp
deleted file mode 100644
index 9a0345511c..0000000000
--- a/src/ripple/module/rpc/handlers/Profile.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-//------------------------------------------------------------------------------
-/*
- This file is part of rippled: https://github.com/ripple/rippled
- Copyright (c) 2012-2014 Ripple Labs Inc.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-*/
-//==============================================================================
-
-
-namespace ripple {
-
-// profile offers
-// [submit]
-//
-// profile 0:offers 1:pass_a 2:account_a 3:currency_offer_a 4:account_b
-// 5:currency_offer_b 6: 7:[submit]
-//
-// issuer is the offering account
-//
-// --> submit: 'submit|true|false': defaults to false
-//
-// Prior to running allow each to have a credit line of what they will be
-// getting from the other account.
-Json::Value doProfile (RPC::Context& context)
-{
- /* need to fix now that sharedOfferCreate is gone
- int iArgs = context.params_.size();
- RippleAddress naSeedA;
- RippleAddress naAccountA;
- Currency uCurrencyOfferA;
- RippleAddress naSeedB;
- RippleAddress naAccountB;
- Currency uCurrencyOfferB;
- uint32 iCount = 100;
- bool bSubmit = false;
-
- if (iArgs < 6 || "offers" != context.params_[0u].asString())
- {
- return rpcError(rpcINVALID_PARAMS);
- }
-
- if (!naSeedA.setSeedGeneric(context.params_[1u].asString())) //
- return rpcError(rpcINVALID_PARAMS);
-
- naAccountA.setAccountID(context.params_[2u].asString()); //
-
- if (!to_currency(uCurrencyOfferA, context.params_[3u].asString())) //
- return rpcError(rpcINVALID_PARAMS);
-
- naAccountB.setAccountID(context.params_[4u].asString()); //
- if (!to_currency(uCurrencyOfferB, context.params_[5u].asString())) //
- return rpcError(rpcINVALID_PARAMS);
-
- iCount = lexicalCast (context.params_[6u].asString());
-
- if (iArgs >= 8 && "false" != context.params_[7u].asString())
- bSubmit = true;
-
- boost::posix_time::ptime ptStart(boost::posix_time::microsec_clock::local_time());
-
- for(unsigned int n=0; ngetSeq(), // uSeq
- getConfig ().FEE_DEFAULT,
- 0, // uSourceTag,
- false, // bPassive
- STAmount(uCurrencyOfferA, naAccountA.getAccountID(), 1), // saTakerPays
- STAmount(uCurrencyOfferB, naAccountB.getAccountID(), 1+n), // saTakerGets
- 0); // uExpiration
-
- if (bSubmit)
- tpOfferA = context.netOps_.submitTransactionSync(tpOfferA); // FIXME: Don't use synch interface
- }
-
- boost::posix_time::ptime ptEnd(boost::posix_time::microsec_clock::local_time());
- boost::posix_time::time_duration tdInterval = ptEnd-ptStart;
- long lMicroseconds = tdInterval.total_microseconds();
- int iTransactions = iCount;
- float fRate = lMicroseconds ? iTransactions/(lMicroseconds/1000000.0) : 0.0;
-
- Json::Value obj(Json::objectValue);
-
- obj["transactions"] = iTransactions;
- obj["submit"] = bSubmit;
- obj["start"] = boost::posix_time::to_simple_string(ptStart);
- obj["end"] = boost::posix_time::to_simple_string(ptEnd);
- obj["interval"] = boost::posix_time::to_simple_string(tdInterval);
- obj["rate_per_second"] = fRate;
- */
- Json::Value obj (Json::objectValue);
- return obj;
-}
-
-} // ripple
diff --git a/src/ripple/module/rpc/handlers/ProofCreate.cpp b/src/ripple/module/rpc/handlers/ProofCreate.cpp
index 1be2bf8150..81c260bf95 100644
--- a/src/ripple/module/rpc/handlers/ProofCreate.cpp
+++ b/src/ripple/module/rpc/handlers/ProofCreate.cpp
@@ -55,12 +55,12 @@ Json::Value doProofCreate (RPC::Context& context)
if (context.params_.isMember ("secret"))
{
- uint256 uSecret (context.params_["secret"].asString ());
+ uint256 uSecret (context.params_["secret"].asString ());
pgGen->setSecret (uSecret);
}
- jvResult["token"] = pgGen->getProof ().getToken ();
- jvResult["secret"] = to_string (pgGen->getSecret ());
+ jvResult["token"] = pgGen->getProof ().getToken ();
+ jvResult["secret"] = to_string (pgGen->getSecret ());
}
else
{
diff --git a/src/ripple/module/rpc/handlers/ProofVerify.cpp b/src/ripple/module/rpc/handlers/ProofVerify.cpp
index 4e9ebb3590..04367a0121 100644
--- a/src/ripple/module/rpc/handlers/ProofVerify.cpp
+++ b/src/ripple/module/rpc/handlers/ProofVerify.cpp
@@ -39,7 +39,7 @@ Json::Value doProofVerify (RPC::Context& context)
if (!context.params_.isMember ("solution"))
return RPC::missing_field_error ("solution");
- std::string strToken = context.params_["token"].asString ();
+ std::string strToken = context.params_["token"].asString ();
uint256 uSolution (context.params_["solution"].asString ());
PowResult prResult;
@@ -60,7 +60,7 @@ Json::Value doProofVerify (RPC::Context& context)
if (iDifficulty < 0 ||
iDifficulty > ProofOfWorkFactory::kMaxDifficulty)
{
- return RPC::missing_field_error ("difficulty");
+ return RPC::invalid_field_error ("difficulty");
}
pgGen->setDifficulty (iDifficulty);
@@ -68,12 +68,12 @@ Json::Value doProofVerify (RPC::Context& context)
if (context.params_.isMember ("secret"))
{
- uint256 uSecret (context.params_["secret"].asString ());
+ uint256 uSecret (context.params_["secret"].asString ());
pgGen->setSecret (uSecret);
}
- prResult = pgGen->checkProof (strToken, uSolution);
- jvResult["secret"] = to_string (pgGen->getSecret ());
+ prResult = pgGen->checkProof (strToken, uSolution);
+ jvResult["secret"] = to_string (pgGen->getSecret ());
}
else
{
@@ -87,9 +87,9 @@ Json::Value doProofVerify (RPC::Context& context)
ProofOfWork::calcResultInfo (prResult, sToken, sHuman);
- jvResult["proof_result"] = sToken;
- jvResult["proof_result_code"] = prResult;
- jvResult["proof_result_message"] = sHuman;
+ jvResult["proof_result"] = sToken;
+ jvResult["proof_result_code"] = prResult;
+ jvResult["proof_result_message"] = sHuman;
return jvResult;
}
diff --git a/src/ripple/module/rpc/handlers/Random.cpp b/src/ripple/module/rpc/handlers/Random.cpp
index 71ef3c0f06..8ce5a4ca0a 100644
--- a/src/ripple/module/rpc/handlers/Random.cpp
+++ b/src/ripple/module/rpc/handlers/Random.cpp
@@ -26,10 +26,11 @@ namespace ripple {
// }
Json::Value doRandom (RPC::Context& context)
{
- uint256 rand;
-
+ // TODO(tom): the try/catch is almost certainly redundant, we catch at the
+ // top level too.
try
{
+ uint256 rand;
RandomNumbers::getInstance ().fillBytes (rand.begin (), rand.size ());
Json::Value jvResult;
diff --git a/src/ripple/module/rpc/handlers/TransactionEntry.cpp b/src/ripple/module/rpc/handlers/TransactionEntry.cpp
index 1c6260d269..f474f6f7f2 100644
--- a/src/ripple/module/rpc/handlers/TransactionEntry.cpp
+++ b/src/ripple/module/rpc/handlers/TransactionEntry.cpp
@@ -30,8 +30,10 @@ namespace ripple {
Json::Value doTransactionEntry (RPC::Context& context)
{
Ledger::pointer lpLedger;
- Json::Value jvResult
- = RPC::lookupLedger (context.params_, lpLedger, context.netOps_);
+ Json::Value jvResult = RPC::lookupLedger (
+ context.params_,
+ lpLedger,
+ context.netOps_);
if (!lpLedger)
return jvResult;
diff --git a/src/ripple/module/rpc/handlers/Tx.cpp b/src/ripple/module/rpc/handlers/Tx.cpp
index 2ec4c30998..c69203f233 100644
--- a/src/ripple/module/rpc/handlers/Tx.cpp
+++ b/src/ripple/module/rpc/handlers/Tx.cpp
@@ -44,6 +44,7 @@ Json::Value doTx (RPC::Context& context)
return rpcError (rpcTXN_NOT_FOUND);
#ifdef READY_FOR_NEW_TX_FORMAT
+ // TODO(tom): what new format is this?
Json::Value ret;
ret[jss::transaction] = txn->getJson (0, binary);
#else
@@ -52,12 +53,9 @@ Json::Value doTx (RPC::Context& context)
if (txn->getLedger () != 0)
{
- auto lgr = context.netOps_.getLedgerBySeq (txn->getLedger ());
-
- if (lgr)
+ if (auto lgr = context.netOps_.getLedgerBySeq (txn->getLedger ()))
{
bool okay = false;
-
if (binary)
{
std::string meta;
@@ -71,7 +69,6 @@ Json::Value doTx (RPC::Context& context)
else
{
TransactionMetaSet::pointer set;
-
if (lgr->getTransactionMeta (txid, set))
{
okay = true;
diff --git a/src/ripple/module/rpc/handlers/UnlAdd.cpp b/src/ripple/module/rpc/handlers/UnlAdd.cpp
index 13a436e2bf..1d63732536 100644
--- a/src/ripple/module/rpc/handlers/UnlAdd.cpp
+++ b/src/ripple/module/rpc/handlers/UnlAdd.cpp
@@ -33,20 +33,18 @@ Json::Value doUnlAdd (RPC::Context& context)
std::string strComment = context.params_.isMember ("comment")
? context.params_["comment"].asString () : "";
- RippleAddress raNodePublic;
+ RippleAddress raNodePublic;
if (raNodePublic.setNodePublic (strNode))
{
getApp().getUNL ().nodeAddPublic (
raNodePublic, UniqueNodeList::vsManual, strComment);
-
return "adding node by public key";
}
else
{
getApp().getUNL ().nodeAddDomain (
strNode, UniqueNodeList::vsManual, strComment);
-
return "adding node by domain";
}
}
diff --git a/src/ripple/module/rpc/handlers/UnlDelete.cpp b/src/ripple/module/rpc/handlers/UnlDelete.cpp
index c4ccbbc9cd..639c595943 100644
--- a/src/ripple/module/rpc/handlers/UnlDelete.cpp
+++ b/src/ripple/module/rpc/handlers/UnlDelete.cpp
@@ -30,20 +30,17 @@ Json::Value doUnlDelete (RPC::Context& context)
if (!context.params_.isMember ("node"))
return rpcError (rpcINVALID_PARAMS);
- std::string strNode = context.params_["node"].asString ();
-
- RippleAddress raNodePublic;
+ auto strNode = context.params_["node"].asString ();
+ RippleAddress raNodePublic;
if (raNodePublic.setNodePublic (strNode))
{
getApp().getUNL ().nodeRemovePublic (raNodePublic);
-
return "removing node by public key";
}
else
{
getApp().getUNL ().nodeRemoveDomain (strNode);
-
return "removing node by domain";
}
}
diff --git a/src/ripple/module/rpc/handlers/Unsubscribe.cpp b/src/ripple/module/rpc/handlers/Unsubscribe.cpp
index 8776ed55a0..ad23519622 100644
--- a/src/ripple/module/rpc/handlers/Unsubscribe.cpp
+++ b/src/ripple/module/rpc/handlers/Unsubscribe.cpp
@@ -41,7 +41,6 @@ Json::Value doUnsubscribe (RPC::Context& context)
return rpcError (rpcNO_PERMISSION);
std::string strUrl = context.params_["url"].asString ();
-
ispSub = context.netOps_.findRpcSub (strUrl);
if (!ispSub)
@@ -70,7 +69,7 @@ Json::Value doUnsubscribe (RPC::Context& context)
context.netOps_.unsubTransactions (ispSub->getSeq ());
else if (streamName == "transactions_proposed"
- || streamName == "rt_transactions") // DEPRECATED
+ || streamName == "rt_transactions") // DEPRECATED
context.netOps_.unsubRTTransactions (ispSub->getSeq ());
else
@@ -116,44 +115,40 @@ Json::Value doUnsubscribe (RPC::Context& context)
}
else
{
- for (auto& jvSubRequest: context.params_["books"])
+ for (auto& jv: context.params_["books"])
{
- if (!jvSubRequest.isObject ()
- || !jvSubRequest.isMember ("taker_pays")
- || !jvSubRequest.isMember ("taker_gets")
- || !jvSubRequest["taker_pays"].isObject ()
- || !jvSubRequest["taker_gets"].isObject ())
+ if (!jv.isObject ()
+ || !jv.isMember ("taker_pays")
+ || !jv.isMember ("taker_gets")
+ || !jv["taker_pays"].isObject ()
+ || !jv["taker_gets"].isObject ())
return rpcError (rpcINVALID_PARAMS);
- Currency pay_currency;
- Account pay_issuer;
- Currency get_currency;
- Account get_issuer;
- bool bBoth = (jvSubRequest.isMember ("both") &&
- jvSubRequest["both"].asBool ())
- || (jvSubRequest.isMember ("both_sides") &&
- jvSubRequest["both_sides"].asBool ()); // DEPRECATED
+ bool bBoth = (jv.isMember ("both") && jv["both"].asBool ()) ||
+ (jv.isMember ("both_sides") && jv["both_sides"].asBool ());
+ // both_sides is deprecated.
- Json::Value taker_pays = jvSubRequest["taker_pays"];
- Json::Value taker_gets = jvSubRequest["taker_gets"];
+ Json::Value taker_pays = jv["taker_pays"];
+ Json::Value taker_gets = jv["taker_gets"];
+
+ Book book;
// Parse mandatory currency.
if (!taker_pays.isMember ("currency")
|| !to_currency (
- pay_currency, taker_pays["currency"].asString ()))
+ book.in.currency, taker_pays["currency"].asString ()))
{
WriteLog (lsINFO, RPCHandler) << "Bad taker_pays currency.";
-
return rpcError (rpcSRC_CUR_MALFORMED);
}
// Parse optional issuer.
else if (((taker_pays.isMember ("issuer"))
&& (!taker_pays["issuer"].isString ()
|| !to_issuer (
- pay_issuer, taker_pays["issuer"].asString ())))
+ book.in.account, taker_pays["issuer"].asString ())))
// Don't allow illegal issuers.
- || (!pay_currency != !pay_issuer)
- || noAccount() == pay_issuer)
+ || !isConsistent (book.in)
+ || noAccount() == book.in.account)
{
WriteLog (lsINFO, RPCHandler) << "Bad taker_pays issuer.";
@@ -162,7 +157,7 @@ Json::Value doUnsubscribe (RPC::Context& context)
// Parse mandatory currency.
if (!taker_gets.isMember ("currency")
- || !to_currency (get_currency,
+ || !to_currency (book.out.currency,
taker_gets["currency"].asString ()))
{
WriteLog (lsINFO, RPCHandler) << "Bad taker_pays currency.";
@@ -172,26 +167,24 @@ Json::Value doUnsubscribe (RPC::Context& context)
// Parse optional issuer.
else if (((taker_gets.isMember ("issuer"))
&& (!taker_gets["issuer"].isString ()
- || !to_issuer (get_issuer,
+ || !to_issuer (book.out.account,
taker_gets["issuer"].asString ())))
// Don't allow illegal issuers.
- || (!get_currency != !get_issuer)
- || noAccount() == get_issuer)
+ || !isConsistent (book.out)
+ || noAccount() == book.out.account)
{
WriteLog (lsINFO, RPCHandler) << "Bad taker_gets issuer.";
return rpcError (rpcDST_ISR_MALFORMED);
}
- if (pay_currency == get_currency
- && pay_issuer == get_issuer)
+ if (book.in == book.out)
{
- WriteLog (lsINFO, RPCHandler) << "taker_gets same as taker_pays.";
-
+ WriteLog (lsINFO, RPCHandler)
+ << "taker_gets same as taker_pays.";
return rpcError (rpcBAD_MARKET);
}
- Book book{{pay_currency, pay_issuer}, {get_currency, get_issuer}};
context.netOps_.unsubBook (ispSub->getSeq (), book);
if (bBoth)
diff --git a/src/ripple/module/rpc/impl/AccountFromString.cpp b/src/ripple/module/rpc/impl/AccountFromString.cpp
index e98f212092..b3ee7437aa 100644
--- a/src/ripple/module/rpc/impl/AccountFromString.cpp
+++ b/src/ripple/module/rpc/impl/AccountFromString.cpp
@@ -25,65 +25,66 @@ namespace RPC {
// --> strIdent: public key, account ID, or regular seed.
// --> bStrict: Only allow account id or public key.
// <-- bIndex: true if iIndex > 0 and used the index.
-Json::Value accountFromString (Ledger::ref lrLedger, RippleAddress& naAccount,
- bool& bIndex, std::string const& strIdent,
- const int iIndex, const bool bStrict, NetworkOPs& netOps)
+Json::Value accountFromString (
+ Ledger::ref lrLedger,
+ RippleAddress& naAccount,
+ bool& bIndex,
+ std::string const& strIdent,
+ int const iIndex,
+ bool const bStrict,
+ NetworkOPs& netOps)
{
RippleAddress naSeed;
- if (naAccount.setAccountPublic (strIdent) || naAccount.setAccountID (strIdent))
+ if (naAccount.setAccountPublic (strIdent) ||
+ naAccount.setAccountID (strIdent))
{
// Got the account.
- bIndex = false;
+ bIndex = false;
+ return Json::Value (Json::objectValue);
}
- else if (bStrict)
+
+ if (bStrict)
{
- return naAccount.setAccountID (strIdent, Base58::getBitcoinAlphabet ())
- ? rpcError (rpcACT_BITCOIN)
- : rpcError (rpcACT_MALFORMED);
+ auto success = naAccount.setAccountID (
+ strIdent, Base58::getBitcoinAlphabet ());
+ return rpcError (success ? rpcACT_BITCOIN : rpcACT_MALFORMED);
}
- // Must be a seed.
- else if (!naSeed.setSeedGeneric (strIdent))
- {
+
+ // Otherwise, it must be a seed.
+ if (!naSeed.setSeedGeneric (strIdent))
return rpcError (rpcBAD_SEED);
- }
- else
+
+ // We allow the use of the seeds to access #0.
+ // This is poor practice and merely for debugging convenience.
+ RippleAddress naRegular0Public;
+ RippleAddress naRegular0Private;
+
+ auto naGenerator = RippleAddress::createGeneratorPublic (naSeed);
+
+ naRegular0Public.setAccountPublic (naGenerator, 0);
+ naRegular0Private.setAccountPrivate (naGenerator, naSeed, 0);
+
+ SLE::pointer sleGen = netOps.getGenerator (
+ lrLedger, naRegular0Public.getAccountID ());
+
+ if (sleGen)
{
- // We allow the use of the seeds to access #0.
- // This is poor practice and merely for debuging convenience.
- RippleAddress naRegular0Public;
- RippleAddress naRegular0Private;
+ // Found master public key.
+ Blob vucCipher = sleGen->getFieldVL (sfGenerator);
+ Blob vucMasterGenerator = naRegular0Private.accountPrivateDecrypt (
+ naRegular0Public, vucCipher);
- RippleAddress naGenerator = RippleAddress::createGeneratorPublic (naSeed);
+ if (vucMasterGenerator.empty ())
+ rpcError (rpcNO_GEN_DECRYPT);
- naRegular0Public.setAccountPublic (naGenerator, 0);
- naRegular0Private.setAccountPrivate (naGenerator, naSeed, 0);
-
- // Account uGeneratorID = naRegular0Public.getAccountID();
- SLE::pointer sleGen = netOps.getGenerator (lrLedger, naRegular0Public.getAccountID ());
-
- if (!sleGen)
- {
- // Didn't find a generator map, assume it is a master generator.
- }
- else
- {
- // Found master public key.
- Blob vucCipher = sleGen->getFieldVL (sfGenerator);
- Blob vucMasterGenerator = naRegular0Private.accountPrivateDecrypt (naRegular0Public, vucCipher);
-
- if (vucMasterGenerator.empty ())
- {
- rpcError (rpcNO_GEN_DECRYPT);
- }
-
- naGenerator.setGenerator (vucMasterGenerator);
- }
-
- bIndex = !iIndex;
-
- naAccount.setAccountPublic (naGenerator, iIndex);
+ naGenerator.setGenerator (vucMasterGenerator);
}
+ // Otherwise, if we didn't find a generator map, assume it is a master
+ // generator.
+
+ bIndex = !iIndex;
+ naAccount.setAccountPublic (naGenerator, iIndex);
return Json::Value (Json::objectValue);
}
diff --git a/src/ripple/module/rpc/impl/Manager.cpp b/src/ripple/module/rpc/impl/Manager.cpp
index 3c309bc7ad..4ef2b95c73 100644
--- a/src/ripple/module/rpc/impl/Manager.cpp
+++ b/src/ripple/module/rpc/impl/Manager.cpp
@@ -40,8 +40,9 @@ public:
void add (std::string const& method, handler_type&& handler)
{
- m_map.emplace (std::piecewise_construct, std::forward_as_tuple (method),
- std::forward_as_tuple (std::move (handler)));
+ m_map.emplace (std::piecewise_construct,
+ std::forward_as_tuple (method),
+ std::forward_as_tuple (std::move (handler)));
}
bool dispatch (Request& req)
@@ -63,7 +64,6 @@ Manager::~Manager ()
std::unique_ptr make_Manager (beast::Journal journal)
{
std::unique_ptr m (std::make_unique (journal));
-
m->add ("print");
return m;
diff --git a/src/ripple/module/rpc/impl/ParseAccountIds.cpp b/src/ripple/module/rpc/impl/ParseAccountIds.cpp
index 29e6543eed..204b3c3469 100644
--- a/src/ripple/module/rpc/impl/ParseAccountIds.cpp
+++ b/src/ripple/module/rpc/impl/ParseAccountIds.cpp
@@ -24,24 +24,21 @@ namespace RPC {
hash_set parseAccountIds (Json::Value const& jvArray)
{
- hash_set usnaResult;
+ hash_set result;
- for (Json::Value::const_iterator it = jvArray.begin (); it != jvArray.end (); it++)
+ for (auto const& jv: jvArray)
{
- RippleAddress naString;
+ RippleAddress address;
- if (! (*it).isString () || !naString.setAccountID ((*it).asString ()))
+ if (!(jv.isString () && address.setAccountID ((jv.asString ()))))
{
- usnaResult.clear ();
+ result.clear ();
break;
}
- else
- {
- (void) usnaResult.insert (naString);
- }
+ result.insert (address);
}
- return usnaResult;
+ return result;
}
} // RPC
diff --git a/src/ripple/module/rpc/impl/RPCHandler.cpp b/src/ripple/module/rpc/impl/RPCHandler.cpp
index 5861c1eaad..74b4132a5b 100644
--- a/src/ripple/module/rpc/impl/RPCHandler.cpp
+++ b/src/ripple/module/rpc/impl/RPCHandler.cpp
@@ -27,23 +27,10 @@
namespace ripple {
-//
-// Carries out the RPC.
-//
-
-RPCHandler::RPCHandler (NetworkOPs& netOps)
- : mNetOps (&netOps)
- , mRole (Config::FORBID)
-{
- assert (mNetOps);
-}
-
RPCHandler::RPCHandler (NetworkOPs& netOps, InfoSub::pointer infoSub)
- : mNetOps (&netOps)
- , mInfoSub (infoSub)
- , mRole (Config::FORBID)
+ : netOps_ (netOps)
+ , infoSub_ (infoSub)
{
- assert (mNetOps);
}
// Provide the JSON-RPC "result" value.
@@ -52,8 +39,10 @@ RPCHandler::RPCHandler (NetworkOPs& netOps, InfoSub::pointer infoSub)
// transport for a command and a request object. The command is the method. The
// request object is supplied as the first element of the params.
Json::Value RPCHandler::doRpcCommand (
- std::string const& strMethod, Json::Value const& jvParams,
- Config::Role iRole, Resource::Charge& loadType)
+ const std::string& strMethod,
+ Json::Value const& jvParams,
+ Config::Role role,
+ Resource::Charge& loadType)
{
WriteLog (lsTRACE, RPCHandler)
<< "doRpcCommand:" << strMethod << ":" << jvParams;
@@ -61,16 +50,16 @@ Json::Value RPCHandler::doRpcCommand (
if (!jvParams.isArray () || jvParams.size () > 1)
return logRPCError (rpcError (rpcINVALID_PARAMS));
- Json::Value params = jvParams.size () ? jvParams[0u]
+ Json::Value params = jvParams.size () ? jvParams[0u]
: Json::Value (Json::objectValue);
if (!params.isObject ())
return logRPCError (rpcError (rpcINVALID_PARAMS));
// Provide the JSON-RPC method as the field "command" in the request.
- params[jss::command] = strMethod;
+ params[jss::command] = strMethod;
- Json::Value jvResult = doCommand (params, iRole, loadType);
+ Json::Value jvResult = doCommand (params, role, loadType);
// Always report "status". On an error report the request as received.
if (jvResult.isMember ("error"))
@@ -86,22 +75,12 @@ Json::Value RPCHandler::doRpcCommand (
return logRPCError (jvResult);
}
-// TODO(tom): this should go with the other handlers.
-Json::Value doInternal (RPC::Context& context)
-{
- // Used for debug or special-purpose RPC commands
- if (!context.params_.isMember ("internal_command"))
- return rpcError (rpcINVALID_PARAMS);
-
- return RPCInternalHandler::runHandler (
- context.params_["internal_command"].asString (),
- context.params_["params"]);
-}
-
Json::Value RPCHandler::doCommand (
- Json::Value const& params, Config::Role iRole, Resource::Charge& loadType)
+ const Json::Value& params,
+ Config::Role role,
+ Resource::Charge& loadType)
{
- if (iRole != Config::ADMIN)
+ if (role != Config::ADMIN)
{
// VFALCO NOTE Should we also add up the jtRPC jobs?
//
@@ -121,22 +100,22 @@ Json::Value RPCHandler::doCommand (
WriteLog (lsTRACE, RPCHandler) << "COMMAND:" << strCommand;
WriteLog (lsTRACE, RPCHandler) << "REQUEST:" << params;
- mRole = iRole;
+ role_ = role;
- const RPC::Handler* handler = RPC::getHandler(strCommand);
+ auto handler = RPC::getHandler(strCommand);
if (!handler)
return rpcError (rpcUNKNOWN_COMMAND);
- if (handler->role_ == Config::ADMIN && mRole != Config::ADMIN)
+ if (handler->role_ == Config::ADMIN && role_ != Config::ADMIN)
return rpcError (rpcNO_PERMISSION);
if ((handler->condition_ & RPC::NEEDS_NETWORK_CONNECTION) &&
- (mNetOps->getOperatingMode () < NetworkOPs::omSYNCING))
+ (netOps_.getOperatingMode () < NetworkOPs::omSYNCING))
{
WriteLog (lsINFO, RPCHandler)
<< "Insufficient network mode for RPC: "
- << mNetOps->strOperatingMode ();
+ << netOps_.strOperatingMode ();
return rpcError (rpcNO_NETWORK);
}
@@ -150,16 +129,16 @@ Json::Value RPCHandler::doCommand (
}
if ((handler->condition_ & RPC::NEEDS_CLOSED_LEDGER) &&
- !mNetOps->getClosedLedger ())
+ !netOps_.getClosedLedger ())
{
- return rpcError (rpcNO_CLOSED);
+ return rpcError (rpcNO_CLOSED);
}
try
{
LoadEvent::autoptr ev = getApp().getJobQueue().getLoadEventAP(
jtGENERIC, "cmd:" + strCommand);
- RPC::Context context{params, loadType, *mNetOps, mInfoSub, mRole};
+ RPC::Context context {params, loadType, netOps_, infoSub_, role_};
Json::Value jvRaw = handler->method_(context);
// Regularize result.
@@ -183,36 +162,4 @@ Json::Value RPCHandler::doCommand (
}
}
-RPCInternalHandler* RPCInternalHandler::sHeadHandler = nullptr;
-
-RPCInternalHandler::RPCInternalHandler (
- std::string const& name, handler_t Handler)
- : mName (name),
- mHandler (Handler)
-{
- mNextHandler = sHeadHandler;
- sHeadHandler = this;
-}
-
-Json::Value RPCInternalHandler::runHandler (
- std::string const& name, Json::Value const& params)
-{
- for (RPCInternalHandler* h = sHeadHandler; h != nullptr; )
- {
- if (name == h->mName)
- {
- WriteLog (lsWARNING, RPCHandler)
- << "Internal command " << name << ": " << params;
- Json::Value ret = h->mHandler (params);
- WriteLog (lsWARNING, RPCHandler)
- << "Internal command returns: " << ret;
- return ret;
- }
-
- h = h->mNextHandler;
- }
-
- return rpcError (rpcBAD_SYNTAX);
-}
-
} // ripple
diff --git a/src/ripple/module/rpc/impl/RPCServerHandler.cpp b/src/ripple/module/rpc/impl/RPCServerHandler.cpp
index d7f754fb6d..aee146860b 100644
--- a/src/ripple/module/rpc/impl/RPCServerHandler.cpp
+++ b/src/ripple/module/rpc/impl/RPCServerHandler.cpp
@@ -20,10 +20,13 @@
#include
#include
#include
+#include
namespace ripple {
-RPCServerHandler::RPCServerHandler (NetworkOPs& networkOPs, Resource::Manager& resourceManager)
+RPCServerHandler::RPCServerHandler (
+ NetworkOPs& networkOPs,
+ Resource::Manager& resourceManager)
: m_networkOPs (networkOPs)
, m_resourceManager (resourceManager)
{
@@ -42,14 +45,15 @@ bool RPCServerHandler::isAuthorized (
return HTTPAuthorized (headers);
}
-std::string RPCServerHandler::processRequest (std::string const& request,
- beast::IP::Endpoint const& remoteIPAddress)
+std::string RPCServerHandler::processRequest (
+ std::string const& request,
+ beast::IP::Endpoint const& remoteIPAddress)
{
Json::Value jsonRequest;
{
Json::Reader reader;
- if ((request.size() > 1000000) ||
+ if ((request.size() > RPC::MAX_REQUEST_SIZE) ||
! reader.parse (request, jsonRequest) ||
jsonRequest.isNull () ||
! jsonRequest.isObject ())
@@ -58,14 +62,19 @@ std::string RPCServerHandler::processRequest (std::string const& request,
}
}
- Config::Role const role (getConfig ().getAdminRole (jsonRequest, remoteIPAddress));
+ auto const role = getConfig ().getAdminRole (jsonRequest, remoteIPAddress);
Resource::Consumer usage;
if (role == Config::ADMIN)
- usage = m_resourceManager.newAdminEndpoint (remoteIPAddress.to_string());
+ {
+ usage = m_resourceManager.newAdminEndpoint (
+ remoteIPAddress.to_string());
+ }
else
+ {
usage = m_resourceManager.newInboundEndpoint (remoteIPAddress);
+ }
if (usage.disconnect ())
return createResponse (503, "Server is overloaded");
@@ -75,19 +84,17 @@ std::string RPCServerHandler::processRequest (std::string const& request,
// VFALCO NOTE Except that "id" isn't included in the following errors...
//
Json::Value const& id = jsonRequest ["id"];
-
Json::Value const& method = jsonRequest ["method"];
if (method.isNull ())
- {
return createResponse (400, "Null method");
- }
- else if (! method.isString ())
- {
- return createResponse (400, "method is not string");
- }
- std::string strMethod = method.asString ();
+ if (! method.isString ())
+ return createResponse (400, "method is not string");
+
+ auto strMethod = method.asString ();
+ if (strMethod.empty())
+ return createResponse (400, "method is empty");
if (jsonRequest["params"].isNull())
jsonRequest["params"] = Json::Value (Json::arrayValue);
@@ -149,7 +156,6 @@ std::string RPCServerHandler::processRequest (std::string const& request,
usage.charge (fee);
WriteLog (lsDEBUG, RPCServer) << "Reply: " << result;
-
response = JSONRPCReply (result, Json::Value (), id);
return createResponse (200, response);
diff --git a/src/ripple/module/rpc/impl/TransactionSign.cpp b/src/ripple/module/rpc/impl/TransactionSign.cpp
index 606af92373..95596c899e 100644
--- a/src/ripple/module/rpc/impl/TransactionSign.cpp
+++ b/src/ripple/module/rpc/impl/TransactionSign.cpp
@@ -47,8 +47,11 @@ namespace RPC {
@param result A JSON object for injecting error results, if any
@param admin `true` if this is called by an administrative endpoint.
*/
-static void autofill_fee (Json::Value& request,
- Ledger::pointer ledger, Json::Value& result, bool admin)
+static void autofill_fee (
+ Json::Value& request,
+ Ledger::pointer ledger,
+ Json::Value& result,
+ bool admin)
{
Json::Value& tx (request["tx_json"]);
if (tx.isMember ("Fee"))
@@ -88,7 +91,6 @@ static void autofill_fee (Json::Value& request,
tx ["Fee"] = static_cast(fee);
}
-
static Json::Value signPayment(
Json::Value const& params,
Json::Value& tx_json,
@@ -150,12 +152,20 @@ static Json::Value signPayment(
bool bValid;
auto cache = std::make_shared (lSnapshot);
- Pathfinder pf (cache, raSrcAddressID, dstAccountID,
- saSendMax.getCurrency (), saSendMax.getIssuer (),
- amount, bValid);
+ Pathfinder pf (
+ cache,
+ raSrcAddressID,
+ dstAccountID,
+ saSendMax.getCurrency (),
+ saSendMax.getIssuer (),
+ amount, bValid);
STPath extraPath;
- if (!bValid || !pf.findPaths (getConfig ().PATH_SEARCH_OLD, 4, spsPaths, extraPath))
+ if (!bValid ||
+ !pf.findPaths (getConfig ().PATH_SEARCH_OLD,
+ 4,
+ spsPaths,
+ extraPath))
{
WriteLog (lsDEBUG, RPCHandler)
<< "transactionSign: build_path: No paths found.";
@@ -179,7 +189,10 @@ static Json::Value signPayment(
// submit the tranaction
//
Json::Value transactionSign (
- Json::Value params, bool bSubmit, bool bFailHard, NetworkOPs& netOps,
+ Json::Value params,
+ bool bSubmit,
+ bool bFailHard,
+ NetworkOPs& netOps,
int role)
{
Json::Value jvResult;
@@ -242,8 +255,9 @@ Json::Value transactionSign (
{
// If not offline and did not find account, error.
WriteLog (lsDEBUG, RPCHandler)
- << "transactionSign: Failed to find source account in current ledger: "
- << raSrcAddressID.humanAccountID ();
+ << "transactionSign: Failed to find source account "
+ << "in current ledger: "
+ << raSrcAddressID.humanAccountID ();
return rpcError (rpcSRC_ACT_NOT_FOUND);
}
@@ -255,7 +269,12 @@ Json::Value transactionSign (
if ("Payment" == sType)
{
- auto e = signPayment(params, tx_json, raSrcAddressID, lSnapshot, role);
+ auto e = signPayment(
+ params,
+ tx_json,
+ raSrcAddressID,
+ lSnapshot,
+ role);
if (contains_error(e))
return e;
}
@@ -287,12 +306,12 @@ Json::Value transactionSign (
return rpcError (rpcSRC_ACT_NOT_FOUND);
}
- RippleAddress naSecret = RippleAddress::createSeedGeneric (
+ RippleAddress secret = RippleAddress::createSeedGeneric (
params["secret"].asString ());
- RippleAddress naMasterGenerator = RippleAddress::createGeneratorPublic (
- naSecret);
+ RippleAddress masterGenerator = RippleAddress::createGeneratorPublic (
+ secret);
RippleAddress masterAccountPublic = RippleAddress::createAccountPublic (
- naMasterGenerator, 0);
+ masterGenerator, 0);
if (verify)
{
@@ -323,7 +342,9 @@ Json::Value transactionSign (
return jvResult;
}
std::unique_ptr sopTrans = std::move(parsed.object);
- sopTrans->setFieldVL (sfSigningPubKey, masterAccountPublic.getAccountPublic ());
+ sopTrans->setFieldVL (
+ sfSigningPubKey,
+ masterAccountPublic.getAccountPublic ());
SerializedTransaction::pointer stpTrans;
@@ -348,9 +369,10 @@ Json::Value transactionSign (
jvResult["tx_signing_hash"] = to_string (stpTrans->getSigningHash ());
}
- // FIXME: For performance, transactions should not be signed in this code path.
+ // FIXME: For performance, transactions should not be signed in this code
+ // path.
RippleAddress naAccountPrivate = RippleAddress::createAccountPrivate (
- naMasterGenerator, naSecret, 0);
+ masterGenerator, secret, 0);
stpTrans->sign (naAccountPrivate);
@@ -358,7 +380,7 @@ Json::Value transactionSign (
try
{
- tpTrans = std::make_shared (stpTrans, false);
+ tpTrans = std::make_shared (stpTrans, false);
}
catch (std::exception&)
{
@@ -416,9 +438,12 @@ class JSONRPC_test : public beast::unit_test::suite
public:
void testAutoFillFees ()
{
- RippleAddress rootSeedMaster = RippleAddress::createSeedGeneric ("masterpassphrase");
- RippleAddress rootGeneratorMaster = RippleAddress::createGeneratorPublic (rootSeedMaster);
- RippleAddress rootAddress = RippleAddress::createAccountPublic (rootGeneratorMaster, 0);
+ RippleAddress rootSeedMaster
+ = RippleAddress::createSeedGeneric ("masterpassphrase");
+ RippleAddress rootGeneratorMaster
+ = RippleAddress::createGeneratorPublic (rootSeedMaster);
+ RippleAddress rootAddress
+ = RippleAddress::createAccountPublic (rootGeneratorMaster, 0);
std::uint64_t startAmount (100000);
Ledger::pointer ledger (std::make_shared (
rootAddress, startAmount));
diff --git a/src/ripple/unity/rpcx.cpp b/src/ripple/unity/rpcx.cpp
index 0f496cdaee..8706f8c4fb 100644
--- a/src/ripple/unity/rpcx.cpp
+++ b/src/ripple/unity/rpcx.cpp
@@ -53,6 +53,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -69,7 +70,6 @@
#include
#include
#include
-#include
#include
#include
#include