rpcnet.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // ECOin - Copyright (c) - 2014/2022 - GPLv3 - epsylon@riseup.net (https://03c8.net)
  2. #include "net.h"
  3. #include "ecoinrpc.h"
  4. #include "alert.h"
  5. #include "wallet.h"
  6. #include "db.h"
  7. #include "walletdb.h"
  8. using namespace json_spirit;
  9. using namespace std;
  10. Value getconnectioncount(const Array& params, bool fHelp)
  11. {
  12. if (fHelp || params.size() != 0)
  13. throw runtime_error(
  14. "getconnectioncount\n"
  15. "Returns the number of connections to other nodes.");
  16. LOCK(cs_vNodes);
  17. return (int)vNodes.size();
  18. }
  19. static void CopyNodeStats(std::vector<CNodeStats>& vstats)
  20. {
  21. vstats.clear();
  22. LOCK(cs_vNodes);
  23. vstats.reserve(vNodes.size());
  24. BOOST_FOREACH(CNode* pnode, vNodes) {
  25. CNodeStats stats;
  26. pnode->copyStats(stats);
  27. vstats.push_back(stats);
  28. }
  29. }
  30. Value getpeerinfo(const Array& params, bool fHelp)
  31. {
  32. if (fHelp || params.size() != 0)
  33. throw runtime_error(
  34. "getpeerinfo\n"
  35. "Returns data about each connected network node.");
  36. vector<CNodeStats> vstats;
  37. CopyNodeStats(vstats);
  38. Array ret;
  39. BOOST_FOREACH(const CNodeStats& stats, vstats) {
  40. Object obj;
  41. obj.push_back(Pair("addr", stats.addrName));
  42. obj.push_back(Pair("services", strprintf("%08" PRI64x, stats.nServices)));
  43. obj.push_back(Pair("lastsend", (boost::int64_t)stats.nLastSend));
  44. obj.push_back(Pair("lastrecv", (boost::int64_t)stats.nLastRecv));
  45. obj.push_back(Pair("conntime", (boost::int64_t)stats.nTimeConnected));
  46. obj.push_back(Pair("version", stats.nVersion));
  47. obj.push_back(Pair("subver", stats.strSubVer));
  48. obj.push_back(Pair("inbound", stats.fInbound));
  49. obj.push_back(Pair("releasetime", (boost::int64_t)stats.nReleaseTime));
  50. obj.push_back(Pair("startingheight", stats.nStartingHeight));
  51. obj.push_back(Pair("banscore", stats.nMisbehavior));
  52. ret.push_back(obj);
  53. }
  54. return ret;
  55. }
  56. extern CCriticalSection cs_mapAlerts;
  57. extern map<uint256, CAlert> mapAlerts;
  58. Value sendalert(const Array& params, bool fHelp)
  59. {
  60. if (fHelp || params.size() < 6)
  61. throw runtime_error(
  62. "sendalert <message> <privatekey> <minver> <maxver> <priority> <id> [cancelupto]\n"
  63. "<message> is the alert text message\n"
  64. "<privatekey> is hex string of alert master private key\n"
  65. "<minver> is the minimum applicable internal client version\n"
  66. "<maxver> is the maximum applicable internal client version\n"
  67. "<priority> is integer priority number\n"
  68. "<id> is the alert id\n"
  69. "[cancelupto] cancels all alert id's up to this number\n"
  70. "Returns true or false.");
  71. CAlert alert;
  72. CKey key;
  73. alert.strStatusBar = params[0].get_str();
  74. alert.nMinVer = params[2].get_int();
  75. alert.nMaxVer = params[3].get_int();
  76. alert.nPriority = params[4].get_int();
  77. alert.nID = params[5].get_int();
  78. if (params.size() > 6)
  79. alert.nCancel = params[6].get_int();
  80. alert.nVersion = PROTOCOL_VERSION;
  81. alert.nRelayUntil = GetAdjustedTime() + 365*24*60*60;
  82. alert.nExpiration = GetAdjustedTime() + 365*24*60*60;
  83. CDataStream sMsg(SER_NETWORK, PROTOCOL_VERSION);
  84. sMsg << (CUnsignedAlert)alert;
  85. alert.vchMsg = vector<unsigned char>(sMsg.begin(), sMsg.end());
  86. vector<unsigned char> vchPrivKey = ParseHex(params[1].get_str());
  87. key.SetPrivKey(CPrivKey(vchPrivKey.begin(), vchPrivKey.end())); // if key is not correct openssl may crash
  88. if (!key.Sign(Hash(alert.vchMsg.begin(), alert.vchMsg.end()), alert.vchSig))
  89. throw runtime_error(
  90. "Unable to sign alert, check private key?\n");
  91. if(!alert.ProcessAlert())
  92. throw runtime_error(
  93. "Failed to process alert.\n");
  94. // Relay alert
  95. {
  96. LOCK(cs_vNodes);
  97. BOOST_FOREACH(CNode* pnode, vNodes)
  98. alert.RelayTo(pnode);
  99. }
  100. Object result;
  101. result.push_back(Pair("strStatusBar", alert.strStatusBar));
  102. result.push_back(Pair("nVersion", alert.nVersion));
  103. result.push_back(Pair("nMinVer", alert.nMinVer));
  104. result.push_back(Pair("nMaxVer", alert.nMaxVer));
  105. result.push_back(Pair("nPriority", alert.nPriority));
  106. result.push_back(Pair("nID", alert.nID));
  107. if (alert.nCancel > 0)
  108. result.push_back(Pair("nCancel", alert.nCancel));
  109. return result;
  110. }