From a40034f7d6cb894f8d7899bc8411142305f836ae Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sun, 4 Sep 2016 18:25:33 +1200 Subject: [PATCH 1/2] Enable high-priority alerts to put the RPC into safe mode This reverts the changes in 986b5e257e2bb9d7aaed5111ca335732f8808b2d and adds a priority check. Closes #1106 --- src/alert.cpp | 6 ++++-- src/alert.h | 4 ++-- src/main.cpp | 3 +++ src/main.h | 2 ++ src/sendalert.cpp | 2 ++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/alert.cpp b/src/alert.cpp index aa7ac748..6e41b11a 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -41,7 +41,7 @@ void CUnsignedAlert::SetNull() strComment.clear(); strStatusBar.clear(); - strReserved.clear(); + strRPCError.clear(); } std::string CUnsignedAlert::ToString() const @@ -66,6 +66,7 @@ std::string CUnsignedAlert::ToString() const " nPriority = %d\n" " strComment = \"%s\"\n" " strStatusBar = \"%s\"\n" + " strRPCError = \"%s\"\n" ")\n", nVersion, nRelayUntil, @@ -78,7 +79,8 @@ std::string CUnsignedAlert::ToString() const strSetSubVer, nPriority, strComment, - strStatusBar); + strStatusBar, + strRPCError); } void CAlert::SetNull() diff --git a/src/alert.h b/src/alert.h index 746967c4..b5e1cd11 100644 --- a/src/alert.h +++ b/src/alert.h @@ -44,7 +44,7 @@ public: // Actions std::string strComment; std::string strStatusBar; - std::string strReserved; + std::string strRPCError; ADD_SERIALIZE_METHODS; @@ -64,7 +64,7 @@ public: READWRITE(LIMITED_STRING(strComment, 65536)); READWRITE(LIMITED_STRING(strStatusBar, 256)); - READWRITE(LIMITED_STRING(strReserved, 256)); + READWRITE(LIMITED_STRING(strRPCError, 256)); } void SetNull(); diff --git a/src/main.cpp b/src/main.cpp index d0321ff6..f13d20bc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4069,6 +4069,9 @@ string GetWarnings(string strFor) { nPriority = alert.nPriority; strStatusBar = alert.strStatusBar; + if (alert.nPriority >= ALERT_PRIORITY_SAFE_MODE) { + strRPC = alert.strRPCError; + } } } } diff --git a/src/main.h b/src/main.h index 9c875d8c..842e7985 100644 --- a/src/main.h +++ b/src/main.h @@ -57,6 +57,8 @@ static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0; static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000; /** Default for accepting alerts from the P2P network. */ static const bool DEFAULT_ALERTS = true; +/** Minimum alert priority for enabling safe mode. */ +static const int ALERT_PRIORITY_SAFE_MODE = 4000; /** The maximum size for transactions we're willing to relay/mine */ static const unsigned int MAX_STANDARD_TX_SIZE = 100000; /** Maximum number of signature check operations in an IsStandard() P2SH script */ diff --git a/src/sendalert.cpp b/src/sendalert.cpp index d68b38f9..07607ef1 100644 --- a/src/sendalert.cpp +++ b/src/sendalert.cpp @@ -85,9 +85,11 @@ void ThreadSendAlert() // 1000 for Misc warnings like out of disk space and clock is wrong // 2000 for longer invalid proof-of-work chain // Higher numbers mean higher priority + // 4000 or higher will put the RPC into safe mode alert.nPriority = 5000; alert.strComment = ""; alert.strStatusBar = "URGENT: Upgrade required: see https://z.cash"; + alert.strRPCError = "URGENT: Upgrade required: see https://z.cash"; // Set specific client version/versions here. If setSubVer is empty, no filtering on subver is done: // alert.setSubVer.insert(std::string("/Satoshi:0.7.2/")); From 6567a7b534209284b423e9bfbe2dce9992d264b9 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 23 Sep 2016 17:26:03 +1200 Subject: [PATCH 2/2] Add tests for alerts enabling RPC safe mode --- src/test/alert_tests.cpp | 49 ++++++++++++++++++++++++++++++++--- src/test/data/alertTests.raw | Bin 1280 -> 1602 bytes 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/test/alert_tests.cpp b/src/test/alert_tests.cpp index ccfb6132..c9afafa9 100644 --- a/src/test/alert_tests.cpp +++ b/src/test/alert_tests.cpp @@ -13,6 +13,8 @@ #include "data/alertTests.raw.h" #include "main.h" +#include "rpcprotocol.h" +#include "rpcserver.h" #include "serialize.h" #include "streams.h" #include "util.h" @@ -25,6 +27,7 @@ #include #include #include +#include "json/json_spirit_reader_template.h" #include "key.h" #include "alertkeys.h" @@ -182,9 +185,22 @@ void GenerateAlertTests() ++alert.nID; SignAndSerialize(alert, sBuffer); + ++alert.nID; + alert.nPriority = 5000; + alert.strStatusBar = "Alert 3, disables RPC"; + alert.strRPCError = "RPC disabled"; + SignAndSerialize(alert, sBuffer); + + ++alert.nID; + alert.nPriority = 5000; + alert.strStatusBar = "Alert 4, re-enables RPC"; + alert.strRPCError = ""; + SignAndSerialize(alert, sBuffer); + ++alert.nID; alert.nMinVer = 11; alert.nMaxVer = 22; + alert.nPriority = 100; SignAndSerialize(alert, sBuffer); ++alert.nID; @@ -320,7 +336,7 @@ BOOST_AUTO_TEST_CASE(AlertNotify) alert.ProcessAlert(alertKey, false); std::vector r = read_lines(temp); - BOOST_CHECK_EQUAL(r.size(), 4u); + BOOST_CHECK_EQUAL(r.size(), 6u); // Windows built-in echo semantics are different than posixy shells. Quotes and // whitespace are printed literally. @@ -329,16 +345,43 @@ BOOST_AUTO_TEST_CASE(AlertNotify) BOOST_CHECK_EQUAL(r[0], "Alert 1"); BOOST_CHECK_EQUAL(r[1], "Alert 2, cancels 1"); BOOST_CHECK_EQUAL(r[2], "Alert 2, cancels 1"); - BOOST_CHECK_EQUAL(r[3], "Evil Alert; /bin/ls; echo "); // single-quotes should be removed + BOOST_CHECK_EQUAL(r[3], "Alert 3, disables RPC"); + BOOST_CHECK_EQUAL(r[4], "Alert 4, reenables RPC"); // dashes should be removed + BOOST_CHECK_EQUAL(r[5], "Evil Alert; /bin/ls; echo "); // single-quotes should be removed #else BOOST_CHECK_EQUAL(r[0], "'Alert 1' "); BOOST_CHECK_EQUAL(r[1], "'Alert 2, cancels 1' "); BOOST_CHECK_EQUAL(r[2], "'Alert 2, cancels 1' "); - BOOST_CHECK_EQUAL(r[3], "'Evil Alert; /bin/ls; echo ' "); + BOOST_CHECK_EQUAL(r[3], "'Alert 3, disables RPC' "); + BOOST_CHECK_EQUAL(r[4], "'Alert 4, reenables RPC' "); // dashes should be removed + BOOST_CHECK_EQUAL(r[5], "'Evil Alert; /bin/ls; echo ' "); #endif boost::filesystem::remove(temp); SetMockTime(0); + mapAlerts.clear(); +} + +BOOST_AUTO_TEST_CASE(AlertDisablesRPC) +{ + SetMockTime(11); + const std::vector& alertKey = Params(CBaseChainParams::MAIN).AlertKey(); + + // Command should work before alerts + BOOST_CHECK_EQUAL(GetWarnings("rpc"), ""); + + // First alert should disable RPC + alerts[5].ProcessAlert(alertKey, false); + BOOST_CHECK_EQUAL(alerts[5].strRPCError, "RPC disabled"); + BOOST_CHECK_EQUAL(GetWarnings("rpc"), "RPC disabled"); + + // Second alert should re-enable RPC + alerts[6].ProcessAlert(alertKey, false); + BOOST_CHECK_EQUAL(alerts[6].strRPCError, ""); + BOOST_CHECK_EQUAL(GetWarnings("rpc"), ""); + + SetMockTime(0); + mapAlerts.clear(); } static bool falseFunc() { return false; } diff --git a/src/test/data/alertTests.raw b/src/test/data/alertTests.raw index 019f2b0df7b1ce6d483dff6d22a148970c652d26..23fbfa98f6a119fde9887e57242550b4b837447f 100644 GIT binary patch delta 610 zcmZqRI>fU_sg!0VWkT2!KtoS&PU znpYwU;Th{Fq+}K+Cgr3SD+C2N^8hhSAjQqVg-L;h?dgubNsL~fj?Q@Rf2=V){1|&n z;F~wax$b9$GfP#AZJ89z|1N#ERC-cj-m5*OQOggVYX5Ce_qONXVf_bPjy4Yucn412 z&MaFGau^P`h(p|BqN7lhs+*bzcMSvB1#XuW;&t|<9z#MKj&pMV2BwMgS06W5cHIjK79osKVw-Hv ztXz-NZg&G$CPjuh@~g!@M4I|;`nRAosnY23+t)JJ+7%>MF4cC5iVKcd$fO`v?Yh3E zN>`C5AgQn>ckR>qXYzulJ+#`%G3_g`P5WNb0S4vV45SD4*AAXYuB`^X#o;%LJr z%_nw`E;;3!%)0S^&X*>R50B>Byp-E3&!ixWNJf-8;^mTXz>% delta 279 zcmX@a)4;Vsky*@#k%58128cmmPaufLz`!!Om_>QA0h3h3<|dhKDZ5k`zddjJLt*=| z-MKdwbqXvg_$|6S>!4_AdkB+)y&%st#;ky}zkki*r*N%}YVdo!j-xgVBR;KHO(u2Wi{w`W6K`vK7l-mc$0o-({zf6$Mkd0r^bg=AB!n@kE7 zw(jCCCc94^-Sd3@(G$^6-o>`L@y5QL_>a4F3X{o8g|NwSEV7divf4X+nEI=Z=~Z4# z}5vov}87G;ae-~DMT6=+{z%%tFy8nE^h&zh9;ja=Ijj9XTnU6|&$OjNeQ MPHMp^mbgcY0KWNXHvj+t