From cc68227f5e88d2af877eb02a2361c35faa59ed22 Mon Sep 17 00:00:00 2001 From: svost Date: Fri, 24 Dec 2021 13:13:18 +0300 Subject: [PATCH] Refresh bitcoinrpc --- src/bitcoinrpc.cpp | 150 +++++++++++++++++++++++----------------------------- 1 files changed, 67 insertions(+), 83 deletions(-) diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index 7a5b92a..445f68c 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -12,27 +12,15 @@ #include "db.h" #undef printf -#include + #include #include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include + #include #define printf OutputDebugStringF -using namespace std; -using namespace boost; using namespace json_spirit; std::unique_ptr g_server; @@ -46,7 +34,7 @@ static inline unsigned short GetDefaultRPCPort() return GetBoolArg("-testnet", false) ? 18344 : 8344; } -Object JSONRPCError(int code, const string& message) +Object JSONRPCError(int code, const std::string& message) { Object error; error.push_back(Pair("code", code)); @@ -55,11 +43,11 @@ Object JSONRPCError(int code, const string& message) } void RPCTypeCheck(const Array& params, - const list& typesExpected, + const std::list& typesExpected, bool fAllowNull) { unsigned int i = 0; - BOOST_FOREACH(Value_type t, typesExpected) + for(Value_type t : typesExpected) { if (params.size() <= i) break; @@ -67,7 +55,7 @@ void RPCTypeCheck(const Array& params, const Value& v = params[i]; if (!((v.type() == t) || (fAllowNull && (v.type() == null_type)))) { - string err = strprintf("Expected type %s, got %s", + std::string err = strprintf("Expected type %s, got %s", Value_type_name[t], Value_type_name[v.type()]); throw JSONRPCError(RPC_TYPE_ERROR, err); } @@ -76,10 +64,10 @@ void RPCTypeCheck(const Array& params, } void RPCTypeCheck(const Object& o, - const map& typesExpected, + const std::map& typesExpected, bool fAllowNull) { - BOOST_FOREACH(const PAIRTYPE(string, Value_type)& t, typesExpected) + for(const auto& t : typesExpected) { const Value& v = find_value(o, t.first); if (!fAllowNull && v.type() == null_type) @@ -87,7 +75,7 @@ void RPCTypeCheck(const Object& o, if (!((v.type() == t.second) || (fAllowNull && (v.type() == null_type)))) { - string err = strprintf("Expected type %s for %s, got %s", + std::string err = strprintf("Expected type %s for %s, got %s", Value_type_name[t.second], t.first.c_str(), Value_type_name[v.type()]); throw JSONRPCError(RPC_TYPE_ERROR, err); } @@ -125,9 +113,9 @@ std::string HexBits(unsigned int nBits) // Utilities: convert hex-encoded Values // (throws error if not hex). // -uint256 ParseHashV(const Value& v, string strName) +uint256 ParseHashV(const Value& v, std::string strName) { - string strHex; + std::string strHex; if (v.type() == str_type) strHex = v.get_str(); if (!IsHex(strHex)) // Note: IsHex("") is false @@ -137,14 +125,14 @@ uint256 ParseHashV(const Value& v, string strName) return result; } -uint256 ParseHashO(const Object& o, string strKey) +uint256 ParseHashO(const Object& o, std::string strKey) { return ParseHashV(find_value(o, strKey), strKey); } -vector ParseHexV(const Value& v, string strName) +std::vector ParseHexV(const Value& v, std::string strName) { - string strHex; + std::string strHex; if (v.type() == str_type) strHex = v.get_str(); if (!IsHex(strHex)) @@ -152,7 +140,7 @@ vector ParseHexV(const Value& v, string strName) return ParseHex(strHex); } -vector ParseHexO(const Object& o, string strKey) +std::vector ParseHexO(const Object& o, std::string strKey) { return ParseHexV(find_value(o, strKey), strKey); } @@ -162,16 +150,16 @@ vector ParseHexO(const Object& o, string strKey) /// Note: This interface may still be subject to change. /// -string CRPCTable::help(string strCommand) const +std::string CRPCTable::help(std::string strCommand) const { - string strRet; - set setDone; - for (map::const_iterator mi = mapCommands.begin(); mi != mapCommands.end(); ++mi) + std::string strRet; + std::set setDone; + for (std::map::const_iterator mi = mapCommands.begin(); mi != mapCommands.end(); ++mi) { const CRPCCommand *pcmd = mi->second; - string strMethod = mi->first; + std::string strMethod = mi->first; // We already filter duplicates, but these deprecated screw up the sort order - if (strMethod.find("label") != string::npos) + if (strMethod.find("label") != std::string::npos) continue; if (!strCommand.empty() && strMethod != strCommand) continue; @@ -185,11 +173,11 @@ string CRPCTable::help(string strCommand) const catch (std::exception& e) { // Help text is returned in an exception - string strHelp = string(e.what()); + std::string strHelp = std::string(e.what()); if (strCommand.empty()) - if (strHelp.find('\n') != string::npos) + if (strHelp.find('\n') != std::string::npos) strHelp = strHelp.substr(0, strHelp.find('\n')); - strRet += strHelp + "\n"; + strRet += strHelp + '\n'; } } if (strRet.empty()) @@ -201,11 +189,11 @@ string CRPCTable::help(string strCommand) const Value help(const Array& params, bool fHelp) { if (fHelp || params.size() > 1) - throw runtime_error( + throw std::runtime_error( "help [command]\n" "List commands, or get help for a command."); - string strCommand; + std::string strCommand; if (params.size() > 0) strCommand = params[0].get_str(); @@ -216,7 +204,7 @@ Value help(const Array& params, bool fHelp) Value stop(const Array& params, bool fHelp) { if (fHelp || params.size() > 1) - throw runtime_error( + throw std::runtime_error( "stop \n" " is true or false to detach the database or not for this stop only\n" "Stop NovaCoin server (and possibly override the detachdb config value)."); @@ -337,21 +325,21 @@ CRPCTable::CRPCTable() } } -const CRPCCommand *CRPCTable::operator[](string name) const +const CRPCCommand *CRPCTable::operator[](std::string name) const { - map::const_iterator it = mapCommands.find(name); + std::map::const_iterator it = mapCommands.find(name); if (it == mapCommands.end()) - return NULL; + return nullptr; return (*it).second; } bool HTTPAuthorized(ix::WebSocketHttpHeaders& mapHeaders) { - string strAuth = mapHeaders["authorization"]; + std::string strAuth = mapHeaders["authorization"]; if (strAuth.substr(0,6) != "Basic ") return false; - string strUserPass64 = strAuth.substr(6); boost::trim(strUserPass64); - string strUserPass = DecodeBase64(strUserPass64); + std::string strUserPass64 = strAuth.substr(6); boost::algorithm::trim(strUserPass64); + std::string strUserPass = DecodeBase64(strUserPass64); return TimingResistantEqual(strUserPass, strRPCUserColonPass); } @@ -365,7 +353,7 @@ bool HTTPAuthorized(ix::WebSocketHttpHeaders& mapHeaders) // http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx // -string JSONRPCRequest(const string& strMethod, const Array& params, const Value& id) +std::string JSONRPCRequest(const std::string& strMethod, const Array& params, const Value& id) { Object request; request.push_back(Pair("method", strMethod)); @@ -386,13 +374,13 @@ Object JSONRPCReplyObj(const Value& result, const Value& error, const Value& id) return reply; } -string JSONRPCReply(const Value& result, const Value& error, const Value& id) +std::string JSONRPCReply(const Value& result, const Value& error, const Value& id) { Object reply = JSONRPCReplyObj(result, error, id); return write_string(Value(reply), false) + "\n"; } -string ErrorReply(const Object& objError, const Value& id) +std::string ErrorReply(const Object& objError, const Value& id) { // Send error reply from json-rpc error object int nStatus = HTTP_INTERNAL_SERVER_ERROR; @@ -406,7 +394,7 @@ class JSONRequest { public: Value id; - string strMethod; + std::string strMethod; Array params; JSONRequest() { id = Value::null; } @@ -467,7 +455,7 @@ static Object JSONRPCExecOne(const Value& req) return rpc_result; } -static string JSONRPCExecBatch(const Array& vReq) +static std::string JSONRPCExecBatch(const Array& vReq) { Array ret; for (unsigned int reqIdx = 0; reqIdx < vReq.size(); reqIdx++) @@ -485,7 +473,7 @@ void StartRPCServer() { unsigned char rand_pwd[32]; RAND_bytes(rand_pwd, 32); - string strWhatAmI = "To use novacoind"; + std::string strWhatAmI = "To use novacoind"; if (mapArgs.count("-server")) strWhatAmI = strprintf(_("To use the %s option"), "\"-server\""); else if (mapArgs.count("-daemon")) @@ -505,7 +493,7 @@ void StartRPCServer() return; } - string host = GetArg("-rpchost", "127.0.0.1"); + std::string host = GetArg("-rpchost", "127.0.0.1"); int port = GetArg("-rpcport", GetDefaultRPCPort()); g_server = std::unique_ptr(new ix::HttpServer(port, host)); @@ -515,8 +503,8 @@ void StartRPCServer() g_server->setOnConnectionCallback([](ix::HttpRequestPtr request, std::shared_ptr connectionState) -> ix::HttpResponsePtr { ix::WebSocketHttpHeaders headers; - headers["Server"] = string("novacoin-json-rpc/") + FormatFullVersion(); - headers["WWW-Authenticate"] = "Basic realm=\"jsonrpc\""; + headers["Server"] = std::string("novacoin-json-rpc/") + FormatFullVersion(); + headers["WWW-Authenticate"] = R"(Basic realm="jsonrpc")"; if (!HTTPAuthorized(request->headers)) { @@ -539,7 +527,7 @@ void StartRPCServer() if (!read_string(request->body, valRequest)) throw JSONRPCError(RPC_PARSE_ERROR, "Parse error"); - string strReply; + std::string strReply; // singleton request if (valRequest.type() == obj_type) { @@ -601,10 +589,10 @@ json_spirit::Value CRPCTable::execute(const std::string &strMethod, const json_s throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found"); // Observe safe mode - string strWarning = GetWarnings("rpc"); + std::string strWarning = GetWarnings("rpc"); if (!strWarning.empty() && !GetBoolArg("-disablesafemode") && !pcmd->okSafeMode) - throw JSONRPCError(RPC_FORBIDDEN_BY_SAFE_MODE, string("Safe mode: ") + strWarning); + throw JSONRPCError(RPC_FORBIDDEN_BY_SAFE_MODE, std::string("Safe mode: ") + strWarning); try { @@ -629,18 +617,14 @@ json_spirit::Value CRPCTable::execute(const std::string &strMethod, const json_s std::vector CRPCTable::listCommands() const { std::vector commandList; - typedef std::map commandMap; - - std::transform( mapCommands.begin(), mapCommands.end(), - std::back_inserter(commandList), - boost::bind(&commandMap::value_type::first,_1) ); + for (const auto& i : mapCommands) commandList.emplace_back(i.first); return commandList; } -Object CallRPC(const string& strMethod, const Array& params) +Object CallRPC(const std::string& strMethod, const Array& params) { if (mapArgs["-rpcuser"].empty() && mapArgs["-rpcpassword"].empty()) - throw runtime_error(strprintf( + throw std::runtime_error(strprintf( _("You must set rpcpassword= in the configuration file:\n%s\n" "If the file does not exist, create it with owner-readable-only file permissions."), GetConfigFile().string().c_str())); @@ -654,8 +638,8 @@ Object CallRPC(const string& strMethod, const Array& params) // HTTP basic authentication ix::WebSocketHttpHeaders mapRequestHeaders; - string strUserPass64 = EncodeBase64(mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]); - mapRequestHeaders["Authorization"] = string("Basic ") + strUserPass64; + std::string strUserPass64 = EncodeBase64(mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]); + mapRequestHeaders["Authorization"] = std::string("Basic ") + strUserPass64; args->extraHeaders = mapRequestHeaders; // Timeouts @@ -663,32 +647,32 @@ Object CallRPC(const string& strMethod, const Array& params) args->transferTimeout = GetArgInt("-rpc_transfertimeout", 30000); bool fUseSSL = GetBoolArg("-rpcssl"); - string url = string(fUseSSL ? "https://" : "http://") + GetArg("-rpcconnect", "127.0.0.1") + ":" + GetArg("-rpcport", itostr(GetDefaultRPCPort())); + std::string url = std::string(fUseSSL ? "https://" : "http://") + GetArg("-rpcconnect", "127.0.0.1") + ":" + GetArg("-rpcport", itostr(GetDefaultRPCPort())); // Send request - string strRequest = JSONRPCRequest(strMethod, params, GetRandInt(INT32_MAX)); + std::string strRequest = JSONRPCRequest(strMethod, params, GetRandInt(INT32_MAX)); auto out = httpClient.post(url, strRequest, args); // Process reply int nStatus = out->statusCode; - string strReply = out->body; + std::string strReply = out->body; ix::WebSocketHttpHeaders mapHeaders = out->headers; // Receive reply if (nStatus == HTTP_UNAUTHORIZED) - throw runtime_error("incorrect rpcuser or rpcpassword (authorization failed)"); + throw std::runtime_error("incorrect rpcuser or rpcpassword (authorization failed)"); else if (nStatus >= 400 && nStatus != HTTP_BAD_REQUEST && nStatus != HTTP_NOT_FOUND && nStatus != HTTP_INTERNAL_SERVER_ERROR) - throw runtime_error(strprintf("server returned HTTP error %d", nStatus)); + throw std::runtime_error(strprintf("server returned HTTP error %d", nStatus)); else if (strReply.empty()) - throw runtime_error("no response from server"); + throw std::runtime_error("no response from server"); // Parse reply Value valReply; if (!read_string(strReply, valReply)) - throw runtime_error("couldn't parse reply from server"); + throw std::runtime_error("couldn't parse reply from server"); const Object& reply = valReply.get_obj(); if (reply.empty()) - throw runtime_error("expected reply to have result, error and id properties"); + throw std::runtime_error("expected reply to have result, error and id properties"); return reply; } @@ -705,9 +689,9 @@ void ConvertTo(Value& value, bool fAllowNull=false) { // reinterpret string as unquoted json value Value value2; - string strJSON = value.get_str(); + std::string strJSON = value.get_str(); if (!read_string(strJSON, value2)) - throw runtime_error(string("Error parsing JSON:")+strJSON); + throw std::runtime_error(std::string("Error parsing JSON:")+strJSON); ConvertTo(value2, fAllowNull); value = value2; } @@ -721,7 +705,7 @@ void ConvertTo(Value& value, bool fAllowNull=false) Array RPCConvertValues(const std::string &strMethod, const std::vector &strParams) { Array params; - BOOST_FOREACH(const std::string ¶m, strParams) + for(const auto ¶m : strParams) params.push_back(param); size_t n = params.size(); @@ -794,7 +778,7 @@ Array RPCConvertValues(const std::string &strMethod, const std::vector strParams(&argv[2], &argv[argc]); @@ -839,14 +823,14 @@ int CommandLineRPC(int argc, char *argv[]) strPrint = write_string(result, true); } } - catch (std::exception& e) + catch (const std::exception& e) { - strPrint = string("error: ") + e.what(); + strPrint = std::string("error: ") + e.what(); nRet = 87; } catch (...) { - PrintException(NULL, "CommandLineRPC()"); + PrintException(nullptr, "CommandLineRPC()"); } if (!strPrint.empty()) -- 1.7.1