diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 8c81e7411..dd8be86dc 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1165,11 +1165,10 @@ std::map NetworkOPs::getAffectedAccounts(const SerializedTra const STAccount* sa = dynamic_cast(&it); if (sa) { - bool found = false; RippleAddress na = sa->getValueNCA(); accounts[na]=true; }else - { + { if( it.getFName() == sfLimitAmount ) { const STAmount* amount = dynamic_cast(&it); diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 3102eb408..22402b394 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1313,13 +1313,15 @@ Json::Value RPCHandler::doCommand(const std::string& command, Json::Value& param cLog(lsTRACE) << "RPC:" << command; cLog(lsTRACE) << "RPC params:" << params; + mRole = role; + static struct { const char* pCommand; doFuncPtr dfpFunc; int iMinParams; int iMaxParams; - bool mAdminRequired; - bool mEvented; + bool bAdminRequired; + bool bEvented; unsigned int iOptions; } commandsA[] = { // Request-response methods @@ -1336,6 +1338,7 @@ Json::Value RPCHandler::doCommand(const std::string& command, Json::Value& param { "ledger_closed", &RPCHandler::doLedgerClosed, 0, 0, false, false, optClosed }, { "ledger_current", &RPCHandler::doLedgerCurrent, 0, 0, false, false, optCurrent }, { "ledger_entry", &RPCHandler::doLedgerEntry, -1, -1, false, false, optCurrent }, + { "ledger_header", &RPCHandler::doLedgerHeader, -1, -1, false, false, optCurrent }, { "log_level", &RPCHandler::doLogLevel, 0, 2, true }, { "logrotate", &RPCHandler::doLogRotate, 0, 0, true }, { "nickname_info", &RPCHandler::doNicknameInfo, 1, 1, false, false, optCurrent }, @@ -1381,11 +1384,11 @@ Json::Value RPCHandler::doCommand(const std::string& command, Json::Value& param { return rpcError(rpcUNKNOWN_COMMAND); } - else if (commandsA[i].mAdminRequired && role != ADMIN) + else if (commandsA[i].bAdminRequired && mRole != ADMIN) { return rpcError(rpcNO_PERMISSION); } - else if (commandsA[i].mEvented && mInfoSub == NULL) + else if (commandsA[i].bEvented && mInfoSub == NULL) { return rpcError(rpcNO_EVENTS); } @@ -1706,15 +1709,13 @@ Json::Value RPCHandler::doTransactionEntry(const Json::Value& jvRequest) return jvResult; } -Json::Value RPCHandler::doLedgerEntry(const Json::Value& jvRequest) +Json::Value RPCHandler::lookupLedger(const Json::Value& jvRequest, Ledger::pointer& lpLedger) { Json::Value jvResult; uint256 uLedger = jvRequest.isMember("ledger_hash") ? uint256(jvRequest["ledger_hash"].asString()) : 0; uint32 uLedgerIndex = jvRequest.isMember("ledger_index") && jvRequest["ledger_index"].isNumeric() ? jvRequest["ledger_index"].asUInt() : 0; - Ledger::pointer lpLedger; - if (!!uLedger) { // Ledger directly specified. @@ -1757,6 +1758,17 @@ Json::Value RPCHandler::doLedgerEntry(const Json::Value& jvRequest) jvResult["ledger_current_index"] = uLedgerIndex; } + return jvResult; +} + +Json::Value RPCHandler::doLedgerEntry(const Json::Value& jvRequest) +{ + Ledger::pointer lpLedger; + Json::Value jvResult = lookupLedger(jvRequest, lpLedger); + + if (!lpLedger) + return jvResult; + uint256 uNodeIndex; bool bNodeBinary = false; @@ -1952,6 +1964,25 @@ Json::Value RPCHandler::doLedgerEntry(const Json::Value& jvRequest) return jvResult; } +Json::Value RPCHandler::doLedgerHeader(const Json::Value& jvRequest) +{ + Ledger::pointer lpLedger; + Json::Value jvResult = lookupLedger(jvRequest, lpLedger); + + if (!lpLedger) + return jvResult; + + Serializer s; + + lpLedger->addRaw(s); + + jvResult["ledger_data"] = strHex(s.peekData()); + + if (mRole == ADMIN) + lpLedger->addJson(jvResult, 0); + + return jvRequest; +} boost::unordered_set RPCHandler::parseAccountIds(const Json::Value& jvArray) { diff --git a/src/cpp/ripple/RPCHandler.h b/src/cpp/ripple/RPCHandler.h index 7be97a6d5..0b742c8dd 100644 --- a/src/cpp/ripple/RPCHandler.h +++ b/src/cpp/ripple/RPCHandler.h @@ -8,6 +8,7 @@ class RPCHandler { NetworkOPs* mNetOps; InfoSub* mInfoSub; + int mRole; typedef Json::Value (RPCHandler::*doFuncPtr)(const Json::Value ¶ms); enum { @@ -22,6 +23,8 @@ class RPCHandler int getParamCount(const Json::Value& params); bool extractString(std::string& param, const Json::Value& params, int index); + Json::Value lookupLedger(const Json::Value& jvRequest, Ledger::pointer& lpLedger); + Json::Value getMasterGenerator(const uint256& uLedger, const RippleAddress& naRegularSeed, RippleAddress& naMasterGenerator); Json::Value authorize(const uint256& uLedger, const RippleAddress& naRegularSeed, const RippleAddress& naSrcAccountID, RippleAddress& naAccountPublic, RippleAddress& naAccountPrivate, @@ -86,6 +89,7 @@ class RPCHandler Json::Value doLedgerClosed(const Json::Value& params); Json::Value doLedgerCurrent(const Json::Value& params); Json::Value doLedgerEntry(const Json::Value& params); + Json::Value doLedgerHeader(const Json::Value& params); Json::Value doTransactionEntry(const Json::Value& params); Json::Value doSubscribe(const Json::Value& params); diff --git a/src/js/remote.js b/src/js/remote.js index 5909108e6..9e3ee7497 100644 --- a/src/js/remote.js +++ b/src/js/remote.js @@ -530,21 +530,16 @@ Remote.prototype.request = function (request) { }; Remote.prototype.request_server_info = function () { - var request = new Request(this, 'rpc'); - - request.message.command = 'server_info'; - - return request; + return new Request(this, 'server_info'); }; Remote.prototype.request_ledger = function (params) { // XXX Does this require the server to be trusted? //assert(this.trusted); - var request = new Request(this, 'rpc'); + var request = new Request(this, 'ledger'); - request.message.command = 'ledger'; - request.message.params = params; + request.message.params = params; return request; }; @@ -553,21 +548,19 @@ Remote.prototype.request_ledger = function (params) { Remote.prototype.request_ledger_hash = function () { assert(this.trusted); // If not trusted, need to check proof. - var request = new Request(this, 'rpc'); - - request.message.command = 'ledger_closed'; + return new Request(this, 'ledger_closed'); +}; - return request; +// .ledger() +// .ledger_index() +Remote.prototype.request_ledger_header = function () { + return new Request(this, 'ledger_header'); }; // Get the current proposed ledger entry. May be closed (and revised) at any time (even before returning). // Only for unit testing. Remote.prototype.request_ledger_current = function () { - var request = new Request(this, 'rpc'); - - request.message.command = 'ledger_current'; - - return request; + return new Request(this, 'ledger_current'); }; // --> type : the type of ledger entry. @@ -578,9 +571,7 @@ Remote.prototype.request_ledger_entry = function (type) { assert(this.trusted); // If not trusted, need to check proof, maybe talk packet protocol. var self = this; - var request = new Request(this, 'rpc'); - - request.message.command = 'ledger_entry'; + var request = new Request(this, 'ledger_entry'); if (type) this.type = type; @@ -662,11 +653,7 @@ Remote.prototype.request_unsubscribe = function (streams) { Remote.prototype.request_transaction_entry = function (hash) { assert(this.trusted); // If not trusted, need to check proof, maybe talk packet protocol. - var request = new Request(this, 'rpc'); - - request.message.command = 'transaction_entry'; - - return request + return (new Request(this, 'transaction_entry')) .tx_hash(hash); }; @@ -674,9 +661,8 @@ Remote.prototype.request_ripple_lines_get = function (accountID) { // XXX Does this require the server to be trusted? //assert(this.trusted); - var request = new Request(this, 'rpc'); + var request = new Request(this, 'ripple_lines_get'); - request.message.command = 'ripple_lines_get'; // XXX Convert API call to JSON request.message.params = [accountID]; @@ -687,9 +673,8 @@ Remote.prototype.request_wallet_accounts = function (key) { // XXX Does this require the server to be trusted? //assert(this.trusted); - var request = new Request(this, 'rpc'); + var request = new Request(this, 'wallet_accounts'); - request.message.command = 'wallet_accounts'; // XXX Convert API call to JSON request.message.params = [key]; @@ -700,9 +685,8 @@ Remote.prototype.request_account_tx = function (accountID, minLedger, maxLedger) // XXX Does this require the server to be trusted? //assert(this.trusted); - var request = new Request(this, 'rpc'); + var request = new Request(this, 'account_tx'); - request.message.command = 'account_tx'; // XXX Convert API call to JSON request.message.params = [accountID, minLedger, maxLedger]; @@ -751,9 +735,7 @@ Remote.prototype.submit = function (transaction) { .request(); } else { - var submit_request = new Request(this, 'rpc'); - - submit_request.message.command = 'submit_json'; + var submit_request = new Request(this, 'submit_json'); submit_request.tx_json(transaction.tx_json); submit_request.secret(transaction.secret); @@ -808,9 +790,7 @@ Remote.prototype._server_subscribe = function () { Remote.prototype.ledger_accept = function () { if (this.stand_alone || undefined === this.stand_alone) { - var request = new Request(this, 'rpc'); - - request.message.command = 'ledger_accept'; + var request = new Request(this, 'ledger_accept'); request .request(); @@ -957,43 +937,32 @@ Remote.prototype.request_ripple_balance = function (account, issuer, currency, c } Remote.prototype.request_unl_list = function () { - var request = new Request(this, 'rpc'); - - request.message.command = 'unl_list'; - - return request; + return new Request(this, 'unl_list'); }; Remote.prototype.request_unl_add = function (addr, note) { - var request = new Request(this, 'rpc'); + var request = new Request(this, 'unl_add'); - request.message.command = 'unl_add'; request.message.params = [addr, note]; return request; }; Remote.prototype.request_unl_delete = function (publicKey) { - var request = new Request(this, 'rpc'); + var request = new Request(this, 'unl_delete'); - request.message.command = 'unl_delete'; request.message.params = [publicKey]; return request; }; Remote.prototype.request_peers = function () { - var request = new Request(this, 'rpc'); - - request.message.command = 'peers'; - - return request; + return new Request(this, 'peers'); }; Remote.prototype.request_connect = function (ip, port) { - var request = new Request(this, 'rpc'); + var request = new Request(this, 'connect'); - request.message.command = 'connect'; request.message.params = [ip, port]; return request;