diff --git a/src/cpp/ripple/CallRPC.cpp b/src/cpp/ripple/CallRPC.cpp index 9058cdb3ea..13c29361e6 100644 --- a/src/cpp/ripple/CallRPC.cpp +++ b/src/cpp/ripple/CallRPC.cpp @@ -558,13 +558,14 @@ Json::Value RPCParser::parseRipplePathFind(const Json::Value& jvParams) // sign/submit any transaction to the network // -// sign private_key json -// submit private_key json -// submit tx_blob +// sign offline +// submit +// submit Json::Value RPCParser::parseSignSubmit(const Json::Value& jvParams) { Json::Value txJSON; Json::Reader reader; + bool bOffline = 3 == jvParams.size() && jvParams[2u].asString() == "offline"; if (1 == jvParams.size()) { @@ -576,13 +577,16 @@ Json::Value RPCParser::parseSignSubmit(const Json::Value& jvParams) return jvRequest; } - // Submitting tx_json. - else if (reader.parse(jvParams[1u].asString(), txJSON)) + else if ((2 == jvParams.size() || bOffline) + && reader.parse(jvParams[1u].asString(), txJSON)) { + // Signing or submitting tx_json. Json::Value jvRequest; jvRequest["secret"] = jvParams[0u].asString(); jvRequest["tx_json"] = txJSON; + if (bOffline) + jvRequest["offline"] = true; return jvRequest; } @@ -767,7 +771,7 @@ Json::Value RPCParser::parseCommand(std::string strMethod, Json::Value jvParams) { "proof_verify", &RPCParser::parseProofVerify, 2, 4 }, { "random", &RPCParser::parseAsIs, 0, 0 }, { "ripple_path_find", &RPCParser::parseRipplePathFind, 1, 2 }, - { "sign", &RPCParser::parseSignSubmit, 2, 2 }, + { "sign", &RPCParser::parseSignSubmit, 2, 3 }, { "sms", &RPCParser::parseSMS, 1, 1 }, { "submit", &RPCParser::parseSignSubmit, 1, 2 }, { "server_info", &RPCParser::parseAsIs, 0, 0 }, diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index ea1931e2b7..39c27d5c18 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -78,7 +78,7 @@ Json::Value RPCHandler::transactionSign(Json::Value jvRequest, bool bSubmit, Sco Json::Value jvResult; RippleAddress naSeed; RippleAddress raSrcAddressID; - bool bOffline = jvRequest.isMember("offline"); + bool bOffline = jvRequest.isMember("offline") && jvRequest["offline"].asBool(); WriteLog (lsDEBUG, RPCHandler) << boost::str(boost::format("transactionSign: %s") % jvRequest); @@ -231,13 +231,16 @@ Json::Value RPCHandler::transactionSign(Json::Value jvRequest, bool bSubmit, Sco if (!txJSON.isMember("Flags")) txJSON["Flags"] = 0; - Ledger::pointer lpCurrent = mNetOps->getCurrentSnapshot(); - SLE::pointer sleAccountRoot = mNetOps->getSLEi(lpCurrent, Ledger::getAccountRootIndex(raSrcAddressID.getAccountID())); - - if (!sleAccountRoot) + if (!bOffline) { - // XXX Ignore transactions for accounts not created. - return rpcError(rpcSRC_ACT_NOT_FOUND); + Ledger::pointer lpCurrent = mNetOps->getCurrentSnapshot(); + SLE::pointer sleAccountRoot = mNetOps->getSLEi(lpCurrent, Ledger::getAccountRootIndex(raSrcAddressID.getAccountID())); + + if (!sleAccountRoot) + { + // XXX Ignore transactions for accounts not created. + return rpcError(rpcSRC_ACT_NOT_FOUND); + } } bool bHaveAuthKey = false;