From 7295d7f4bb69ff11071bd77559788e16fb9a3f25 Mon Sep 17 00:00:00 2001 From: Edward Hennis Date: Fri, 27 May 2016 18:33:49 -0400 Subject: [PATCH] RPC fee command checks open ledger rules (RIPD-1183): * Matches internal getMetric() to avoid races. --- src/ripple/app/misc/impl/TxQ.cpp | 1 + src/ripple/app/tests/TxQ_test.cpp | 38 +++++++++++++++++++++++++++++++ src/ripple/rpc/handlers/Fee1.cpp | 15 ++++++++---- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/ripple/app/misc/impl/TxQ.cpp b/src/ripple/app/misc/impl/TxQ.cpp index 27651248dd..b183180b25 100644 --- a/src/ripple/app/misc/impl/TxQ.cpp +++ b/src/ripple/app/misc/impl/TxQ.cpp @@ -1151,6 +1151,7 @@ TxQ::doRPC(Application& app) const auto const view = app.openLedger().current(); auto const metrics = getMetrics(app, *view); + assert(metrics); if (!metrics) return{}; diff --git a/src/ripple/app/tests/TxQ_test.cpp b/src/ripple/app/tests/TxQ_test.cpp index 37e2f740c2..7fb676b612 100644 --- a/src/ripple/app/tests/TxQ_test.cpp +++ b/src/ripple/app/tests/TxQ_test.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -1529,6 +1530,42 @@ public: } } + void testRPC() + { + using namespace jtx; + { + Env env(*this, features(featureFeeEscalation)); + + auto fee = env.rpc("fee"); + + if (expect(fee.isMember(jss::result) && + !RPC::contains_error(fee[jss::result]))) + { + auto const& result = fee[jss::result]; + expect(result.isMember(jss::drops)); + expect(result.isMember(jss::levels)); + expect(result.isMember(jss::current_ledger_size)); + expect(result.isMember(jss::current_queue_size)); + expect(result.isMember(jss::expected_ledger_size)); + } + } + + { + Env env(*this); + + auto fee = env.rpc("fee"); + + if(expect(fee.isMember(jss::result) && + RPC::contains_error(fee[jss::result]))) + { + auto const& result = fee[jss::result]; + expect(result.isMember(jss::error) && + result[jss::error] == + RPC::get_error_info(rpcNOT_ENABLED).token); + } + } + } + void run() { testQueue(); @@ -1546,6 +1583,7 @@ public: testBlockers(); testInFlightBalance(); testConsequences(); + testRPC(); } }; diff --git a/src/ripple/rpc/handlers/Fee1.cpp b/src/ripple/rpc/handlers/Fee1.cpp index 06ce736de2..603070a9c6 100644 --- a/src/ripple/rpc/handlers/Fee1.cpp +++ b/src/ripple/rpc/handlers/Fee1.cpp @@ -18,8 +18,9 @@ //============================================================================== #include +#include +#include #include -#include #include #include #include @@ -29,13 +30,19 @@ namespace ripple Json::Value doFee(RPC::Context& context) { // Bail if fee escalation is not enabled. - if (!context.app.getLedgerMaster().getValidatedRules(). - enabled(featureFeeEscalation, context.app.config().features)) + auto const view = context.app.openLedger().current(); + if (!view || !view->rules().enabled( + featureFeeEscalation, context.app.config().features)) { RPC::inject_error(rpcNOT_ENABLED, context.params); return context.params; } - return context.app.getTxQ().doRPC(context.app); + auto result = context.app.getTxQ().doRPC(context.app); + if (result.type() == Json::objectValue) + return result; + assert(false); + RPC::inject_error(rpcINTERNAL, context.params); + return context.params; } } // ripple