|
|
@ -38,7 +38,16 @@ using namespace json_spirit; |
|
|
|
|
|
|
|
|
|
|
|
void ThreadRPCServer2(void* parg); |
|
|
|
void ThreadRPCServer2(void* parg); |
|
|
|
typedef Value(*rpcfn_type)(const Array& params, bool fHelp); |
|
|
|
typedef Value(*rpcfn_type)(const Array& params, bool fHelp); |
|
|
|
extern map<string, rpcfn_type> mapCallTable; |
|
|
|
|
|
|
|
|
|
|
|
class CRPCCommand |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
public: |
|
|
|
|
|
|
|
string name; |
|
|
|
|
|
|
|
rpcfn_type actor; |
|
|
|
|
|
|
|
bool okSafeMode; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern map<string, CRPCCommand*> mapCommands; |
|
|
|
|
|
|
|
|
|
|
|
static std::string strRPCUserColonPass; |
|
|
|
static std::string strRPCUserColonPass; |
|
|
|
|
|
|
|
|
|
|
@ -182,9 +191,10 @@ Value help(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
|
|
|
|
string strRet; |
|
|
|
string strRet; |
|
|
|
set<rpcfn_type> setDone; |
|
|
|
set<rpcfn_type> setDone; |
|
|
|
for (map<string, rpcfn_type>::iterator mi = mapCallTable.begin(); mi != mapCallTable.end(); ++mi) |
|
|
|
for (map<string, CRPCCommand*>::iterator mi = mapCommands.begin(); mi != mapCommands.end(); ++mi) |
|
|
|
{ |
|
|
|
{ |
|
|
|
string strMethod = (*mi).first; |
|
|
|
CRPCCommand *pcmd = mi->second; |
|
|
|
|
|
|
|
string strMethod = mi->first; |
|
|
|
// We already filter duplicates, but these deprecated screw up the sort order
|
|
|
|
// We already filter duplicates, but these deprecated screw up the sort order
|
|
|
|
if (strMethod == "getamountreceived" || |
|
|
|
if (strMethod == "getamountreceived" || |
|
|
|
strMethod == "getallreceived" || |
|
|
|
strMethod == "getallreceived" || |
|
|
@ -196,7 +206,7 @@ Value help(const Array& params, bool fHelp) |
|
|
|
try |
|
|
|
try |
|
|
|
{ |
|
|
|
{ |
|
|
|
Array params; |
|
|
|
Array params; |
|
|
|
rpcfn_type pfn = (*mi).second; |
|
|
|
rpcfn_type pfn = pcmd->actor; |
|
|
|
if (setDone.insert(pfn).second) |
|
|
|
if (setDone.insert(pfn).second) |
|
|
|
(*pfn)(params, true); |
|
|
|
(*pfn)(params, true); |
|
|
|
} |
|
|
|
} |
|
|
@ -2003,85 +2013,76 @@ Value getblock(const Array& params, bool fHelp) |
|
|
|
// Call Table
|
|
|
|
// Call Table
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
pair<string, rpcfn_type> pCallTable[] = |
|
|
|
|
|
|
|
{ |
|
|
|
static CRPCCommand vRPCCommands[] = |
|
|
|
make_pair("help", &help), |
|
|
|
{ // name function safe mode?
|
|
|
|
make_pair("stop", &stop), |
|
|
|
// ------------------------ ----------------------- ----------
|
|
|
|
make_pair("getblockcount", &getblockcount), |
|
|
|
{ "help", &help, true }, |
|
|
|
make_pair("getblocknumber", &getblocknumber), |
|
|
|
{ "stop", &stop, true }, |
|
|
|
make_pair("getconnectioncount", &getconnectioncount), |
|
|
|
{ "getblockcount", &getblockcount, true }, |
|
|
|
make_pair("getdifficulty", &getdifficulty), |
|
|
|
{ "getblocknumber", &getblocknumber, true }, |
|
|
|
make_pair("getgenerate", &getgenerate), |
|
|
|
{ "getconnectioncount", &getconnectioncount, true }, |
|
|
|
make_pair("setgenerate", &setgenerate), |
|
|
|
{ "getdifficulty", &getdifficulty, true }, |
|
|
|
make_pair("gethashespersec", &gethashespersec), |
|
|
|
{ "getgenerate", &getgenerate, true }, |
|
|
|
make_pair("getinfo", &getinfo), |
|
|
|
{ "setgenerate", &setgenerate, true }, |
|
|
|
make_pair("getmininginfo", &getmininginfo), |
|
|
|
{ "gethashespersec", &gethashespersec, true }, |
|
|
|
make_pair("getnewaddress", &getnewaddress), |
|
|
|
{ "getinfo", &getinfo, true }, |
|
|
|
make_pair("getaccountaddress", &getaccountaddress), |
|
|
|
{ "getmininginfo", &getmininginfo, true }, |
|
|
|
make_pair("setaccount", &setaccount), |
|
|
|
{ "getnewaddress", &getnewaddress, true }, |
|
|
|
make_pair("getaccount", &getaccount), |
|
|
|
{ "getaccountaddress", &getaccountaddress, true }, |
|
|
|
make_pair("getaddressesbyaccount", &getaddressesbyaccount), |
|
|
|
{ "setaccount", &setaccount, true }, |
|
|
|
make_pair("sendtoaddress", &sendtoaddress), |
|
|
|
{ "getaccount", &getaccount, false }, |
|
|
|
make_pair("getreceivedbyaddress", &getreceivedbyaddress), |
|
|
|
{ "getaddressesbyaccount", &getaddressesbyaccount, true }, |
|
|
|
make_pair("getreceivedbyaccount", &getreceivedbyaccount), |
|
|
|
{ "sendtoaddress", &sendtoaddress, false }, |
|
|
|
make_pair("listreceivedbyaddress", &listreceivedbyaddress), |
|
|
|
{ "getreceivedbyaddress", &getreceivedbyaddress, false }, |
|
|
|
make_pair("listreceivedbyaccount", &listreceivedbyaccount), |
|
|
|
{ "getreceivedbyaccount", &getreceivedbyaccount, false }, |
|
|
|
make_pair("backupwallet", &backupwallet), |
|
|
|
{ "listreceivedbyaddress", &listreceivedbyaddress, false }, |
|
|
|
make_pair("keypoolrefill", &keypoolrefill), |
|
|
|
{ "listreceivedbyaccount", &listreceivedbyaccount, false }, |
|
|
|
make_pair("walletpassphrase", &walletpassphrase), |
|
|
|
{ "backupwallet", &backupwallet, true }, |
|
|
|
make_pair("walletpassphrasechange", &walletpassphrasechange), |
|
|
|
{ "keypoolrefill", &keypoolrefill, true }, |
|
|
|
make_pair("walletlock", &walletlock), |
|
|
|
{ "walletpassphrase", &walletpassphrase, true }, |
|
|
|
make_pair("encryptwallet", &encryptwallet), |
|
|
|
{ "walletpassphrasechange", &walletpassphrasechange, false }, |
|
|
|
make_pair("validateaddress", &validateaddress), |
|
|
|
{ "walletlock", &walletlock, true }, |
|
|
|
make_pair("getbalance", &getbalance), |
|
|
|
{ "encryptwallet", &encryptwallet, false }, |
|
|
|
make_pair("move", &movecmd), |
|
|
|
{ "validateaddress", &validateaddress, true }, |
|
|
|
make_pair("sendfrom", &sendfrom), |
|
|
|
{ "getbalance", &getbalance, false }, |
|
|
|
make_pair("sendmany", &sendmany), |
|
|
|
{ "move", &movecmd, false }, |
|
|
|
make_pair("addmultisigaddress", &addmultisigaddress), |
|
|
|
{ "sendfrom", &sendfrom, false }, |
|
|
|
make_pair("getblock", &getblock), |
|
|
|
{ "sendmany", &sendmany, false }, |
|
|
|
make_pair("getblockhash", &getblockhash), |
|
|
|
{ "addmultisigaddress", &addmultisigaddress, false }, |
|
|
|
make_pair("gettransaction", &gettransaction), |
|
|
|
{ "getblock", &getblock, false }, |
|
|
|
make_pair("listtransactions", &listtransactions), |
|
|
|
{ "getblockhash", &getblockhash, false }, |
|
|
|
make_pair("signmessage", &signmessage), |
|
|
|
{ "gettransaction", &gettransaction, false }, |
|
|
|
make_pair("verifymessage", &verifymessage), |
|
|
|
{ "listtransactions", &listtransactions, false }, |
|
|
|
make_pair("getwork", &getwork), |
|
|
|
{ "signmessage", &signmessage, false }, |
|
|
|
make_pair("listaccounts", &listaccounts), |
|
|
|
{ "verifymessage", &verifymessage, false }, |
|
|
|
make_pair("settxfee", &settxfee), |
|
|
|
{ "getwork", &getwork, true }, |
|
|
|
make_pair("getmemorypool", &getmemorypool), |
|
|
|
{ "listaccounts", &listaccounts, false }, |
|
|
|
make_pair("listsinceblock", &listsinceblock), |
|
|
|
{ "settxfee", &settxfee, false }, |
|
|
|
make_pair("dumpprivkey", &dumpprivkey), |
|
|
|
{ "getmemorypool", &getmemorypool, true }, |
|
|
|
make_pair("importprivkey", &importprivkey) |
|
|
|
{ "listsinceblock", &listsinceblock, false }, |
|
|
|
}; |
|
|
|
{ "dumpprivkey", &dumpprivkey, false }, |
|
|
|
map<string, rpcfn_type> mapCallTable(pCallTable, pCallTable + sizeof(pCallTable)/sizeof(pCallTable[0])); |
|
|
|
{ "importprivkey", &importprivkey, false }, |
|
|
|
|
|
|
|
|
|
|
|
string pAllowInSafeMode[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
"help", |
|
|
|
|
|
|
|
"stop", |
|
|
|
|
|
|
|
"getblockcount", |
|
|
|
|
|
|
|
"getblocknumber", // deprecated
|
|
|
|
|
|
|
|
"getconnectioncount", |
|
|
|
|
|
|
|
"getdifficulty", |
|
|
|
|
|
|
|
"getgenerate", |
|
|
|
|
|
|
|
"setgenerate", |
|
|
|
|
|
|
|
"gethashespersec", |
|
|
|
|
|
|
|
"getinfo", |
|
|
|
|
|
|
|
"getmininginfo", |
|
|
|
|
|
|
|
"getnewaddress", |
|
|
|
|
|
|
|
"getaccountaddress", |
|
|
|
|
|
|
|
"getaccount", |
|
|
|
|
|
|
|
"getaddressesbyaccount", |
|
|
|
|
|
|
|
"backupwallet", |
|
|
|
|
|
|
|
"keypoolrefill", |
|
|
|
|
|
|
|
"walletpassphrase", |
|
|
|
|
|
|
|
"walletlock", |
|
|
|
|
|
|
|
"validateaddress", |
|
|
|
|
|
|
|
"getwork", |
|
|
|
|
|
|
|
"getmemorypool", |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
set<string> setAllowInSafeMode(pAllowInSafeMode, pAllowInSafeMode + sizeof(pAllowInSafeMode)/sizeof(pAllowInSafeMode[0])); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
map<string, CRPCCommand*> mapCommands; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void RegisterRPCCommands() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
static bool registered = false; |
|
|
|
|
|
|
|
if (registered) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
registered = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsigned int vcidx; |
|
|
|
|
|
|
|
for (vcidx = 0; vcidx < (sizeof(vRPCCommands) / sizeof(vRPCCommands[0])); vcidx++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
CRPCCommand *pcmd; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pcmd = &vRPCCommands[vcidx]; |
|
|
|
|
|
|
|
mapCommands[pcmd->name] = pcmd; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -2362,6 +2363,8 @@ void ThreadRPCServer2(void* parg) |
|
|
|
{ |
|
|
|
{ |
|
|
|
printf("ThreadRPCServer started\n"); |
|
|
|
printf("ThreadRPCServer started\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RegisterRPCCommands(); |
|
|
|
|
|
|
|
|
|
|
|
strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]; |
|
|
|
strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]; |
|
|
|
if (mapArgs["-rpcpassword"] == "") |
|
|
|
if (mapArgs["-rpcpassword"] == "") |
|
|
|
{ |
|
|
|
{ |
|
|
@ -2513,13 +2516,15 @@ void ThreadRPCServer2(void* parg) |
|
|
|
throw JSONRPCError(-32600, "Params must be an array"); |
|
|
|
throw JSONRPCError(-32600, "Params must be an array"); |
|
|
|
|
|
|
|
|
|
|
|
// Find method
|
|
|
|
// Find method
|
|
|
|
map<string, rpcfn_type>::iterator mi = mapCallTable.find(strMethod); |
|
|
|
if (!mapCommands.count(strMethod)) |
|
|
|
if (mi == mapCallTable.end()) |
|
|
|
|
|
|
|
throw JSONRPCError(-32601, "Method not found"); |
|
|
|
throw JSONRPCError(-32601, "Method not found"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CRPCCommand *pcmd = mapCommands[strMethod]; |
|
|
|
|
|
|
|
|
|
|
|
// Observe safe mode
|
|
|
|
// Observe safe mode
|
|
|
|
string strWarning = GetWarnings("rpc"); |
|
|
|
string strWarning = GetWarnings("rpc"); |
|
|
|
if (strWarning != "" && !GetBoolArg("-disablesafemode") && !setAllowInSafeMode.count(strMethod)) |
|
|
|
if (strWarning != "" && !GetBoolArg("-disablesafemode") && |
|
|
|
|
|
|
|
!pcmd->okSafeMode) |
|
|
|
throw JSONRPCError(-2, string("Safe mode: ") + strWarning); |
|
|
|
throw JSONRPCError(-2, string("Safe mode: ") + strWarning); |
|
|
|
|
|
|
|
|
|
|
|
try |
|
|
|
try |
|
|
@ -2528,7 +2533,7 @@ void ThreadRPCServer2(void* parg) |
|
|
|
Value result; |
|
|
|
Value result; |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK2(cs_main, pwalletMain->cs_wallet); |
|
|
|
LOCK2(cs_main, pwalletMain->cs_wallet); |
|
|
|
result = (*(*mi).second)(params, false); |
|
|
|
result = pcmd->actor(params, false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Send reply
|
|
|
|
// Send reply
|
|
|
|