Skip to content

Commit 4e36e9b

Browse files
committed
setban: rewrite to UniValue, allow absolute bantime
1 parent 3de24d7 commit 4e36e9b

File tree

6 files changed

+46
-25
lines changed

6 files changed

+46
-25
lines changed

src/net.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -484,15 +484,15 @@ bool CNode::IsBanned(CSubNet subnet)
484484
return fResult;
485485
}
486486

487-
void CNode::Ban(const CNetAddr& addr, int64_t bantimeoffset) {
487+
void CNode::Ban(const CNetAddr& addr, int64_t bantimeoffset, bool sinceUnixEpoch) {
488488
CSubNet subNet(addr.ToString()+(addr.IsIPv4() ? "/32" : "/128"));
489-
Ban(subNet, bantimeoffset);
489+
Ban(subNet, bantimeoffset, sinceUnixEpoch);
490490
}
491491

492-
void CNode::Ban(const CSubNet& subNet, int64_t bantimeoffset) {
492+
void CNode::Ban(const CSubNet& subNet, int64_t bantimeoffset, bool sinceUnixEpoch) {
493493
int64_t banTime = GetTime()+GetArg("-bantime", 60*60*24); // Default 24-hour ban
494494
if (bantimeoffset > 0)
495-
banTime = GetTime()+bantimeoffset;
495+
banTime = (sinceUnixEpoch ? 0 : GetTime() )+bantimeoffset;
496496

497497
LOCK(cs_setBanned);
498498
if (setBanned[subNet] < banTime)

src/net.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,8 @@ class CNode
608608
static void ClearBanned(); // needed for unit testing
609609
static bool IsBanned(CNetAddr ip);
610610
static bool IsBanned(CSubNet subnet);
611-
static void Ban(const CNetAddr &ip, int64_t bantimeoffset = 0);
612-
static void Ban(const CSubNet &subNet, int64_t bantimeoffset = 0);
611+
static void Ban(const CNetAddr &ip, int64_t bantimeoffset = 0, bool sinceUnixEpoch = false);
612+
static void Ban(const CSubNet &subNet, int64_t bantimeoffset = 0, bool sinceUnixEpoch = false);
613613
static bool Unban(const CNetAddr &ip);
614614
static bool Unban(const CSubNet &ip);
615615
static void GetBanned(std::map<CSubNet, int64_t> &banmap);

src/rpcclient.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
9494
{ "prioritisetransaction", 1 },
9595
{ "prioritisetransaction", 2 },
9696
{ "setban", 2 },
97+
{ "setban", 3 },
9798
};
9899

99100
class CRPCConvertTable

src/rpcnet.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -466,20 +466,21 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp)
466466
return obj;
467467
}
468468

469-
Value setban(const Array& params, bool fHelp)
469+
UniValue setban(const UniValue& params, bool fHelp)
470470
{
471471
string strCommand;
472472
if (params.size() >= 2)
473473
strCommand = params[1].get_str();
474474
if (fHelp || params.size() < 2 ||
475475
(strCommand != "add" && strCommand != "remove"))
476476
throw runtime_error(
477-
"setban \"ip(/netmask)\" \"add|remove\" (bantime)\n"
477+
"setban \"ip(/netmask)\" \"add|remove\" (bantime) (absolute)\n"
478478
"\nAttempts add or remove a IP/Subnet from the banned list.\n"
479479
"\nArguments:\n"
480480
"1. \"ip(/netmask)\" (string, required) The IP/Subnet (see getpeerinfo for nodes ip) with a optional netmask (default is /32 = single ip)\n"
481481
"2. \"command\" (string, required) 'add' to add a IP/Subnet to the list, 'remove' to remove a IP/Subnet from the list\n"
482-
"1. \"bantime\" (numeric, optional) time in seconds how long the ip is banned (0 or empty means using the default time of 24h which can also be overwritten by the -bantime startup argument)\n"
482+
"3. \"bantime\" (numeric, optional) time in seconds how long (or until when if [absolute] is set) the ip is banned (0 or empty means using the default time of 24h which can also be overwritten by the -bantime startup argument)\n"
483+
"4. \"absolute\" (boolean, optional) If set, the bantime must be a absolute timestamp in seconds since epoch (Jan 1 1970 GMT)\n"
483484
"\nExamples:\n"
484485
+ HelpExampleCli("setban", "\"192.168.0.6\" \"add\" 86400")
485486
+ HelpExampleCli("setban", "\"192.168.0.0/24\" \"add\"")
@@ -507,10 +508,14 @@ Value setban(const Array& params, bool fHelp)
507508
throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: IP/Subnet already banned");
508509

509510
int64_t banTime = 0; //use standard bantime if not specified
510-
if (params.size() == 3 && !params[2].is_null())
511+
if (params.size() >= 3 && !params[2].isNull())
511512
banTime = params[2].get_int64();
512513

513-
isSubnet ? CNode::Ban(subNet, banTime) : CNode::Ban(netAddr, banTime);
514+
bool absolute = false;
515+
if (params.size() == 4 && params[3].isTrue())
516+
absolute = true;
517+
518+
isSubnet ? CNode::Ban(subNet, banTime, absolute) : CNode::Ban(netAddr, banTime, absolute);
514519

515520
//disconnect possible nodes
516521
while(CNode *bannedNode = (isSubnet ? FindNode(subNet) : FindNode(netAddr)))
@@ -522,10 +527,10 @@ Value setban(const Array& params, bool fHelp)
522527
throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: Unban failed");
523528
}
524529

525-
return Value::null;
530+
return NullUniValue;
526531
}
527532

528-
Value listbanned(const Array& params, bool fHelp)
533+
UniValue listbanned(const UniValue& params, bool fHelp)
529534
{
530535
if (fHelp || params.size() != 0)
531536
throw runtime_error(
@@ -539,10 +544,10 @@ Value listbanned(const Array& params, bool fHelp)
539544
std::map<CSubNet, int64_t> banMap;
540545
CNode::GetBanned(banMap);
541546

542-
Array bannedAddresses;
547+
UniValue bannedAddresses(UniValue::VARR);
543548
for (std::map<CSubNet, int64_t>::iterator it = banMap.begin(); it != banMap.end(); it++)
544549
{
545-
Object rec;
550+
UniValue rec(UniValue::VOBJ);
546551
rec.push_back(Pair("address", (*it).first.ToString()));
547552
rec.push_back(Pair("banned_untill", (*it).second));
548553
bannedAddresses.push_back(rec);
@@ -551,7 +556,7 @@ Value listbanned(const Array& params, bool fHelp)
551556
return bannedAddresses;
552557
}
553558

554-
Value clearbanned(const Array& params, bool fHelp)
559+
UniValue clearbanned(const UniValue& params, bool fHelp)
555560
{
556561
if (fHelp || params.size() != 0)
557562
throw runtime_error(
@@ -564,5 +569,5 @@ Value clearbanned(const Array& params, bool fHelp)
564569

565570
CNode::ClearBanned();
566571

567-
return Value::null;
572+
return NullUniValue;
568573
}

src/rpcserver.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ extern UniValue addnode(const UniValue& params, bool fHelp);
154154
extern UniValue disconnectnode(const UniValue& params, bool fHelp);
155155
extern UniValue getaddednodeinfo(const UniValue& params, bool fHelp);
156156
extern UniValue getnettotals(const UniValue& params, bool fHelp);
157-
extern UniValue setban(const json_spirit::Array& params, bool fHelp);
158-
extern UniValue listbanned(const json_spirit::Array& params, bool fHelp);
159-
extern UniValue clearbanned(const json_spirit::Array& params, bool fHelp);
157+
extern UniValue setban(const UniValue& params, bool fHelp);
158+
extern UniValue listbanned(const UniValue& params, bool fHelp);
159+
extern UniValue clearbanned(const UniValue& params, bool fHelp);
160160

161161
extern UniValue dumpprivkey(const UniValue& params, bool fHelp); // in rpcdump.cpp
162162
extern UniValue importprivkey(const UniValue& params, bool fHelp);

src/test/rpc_tests.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,25 +181,40 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
181181
{
182182
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
183183

184-
Value r;
184+
UniValue r;
185185
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0 add")));
186186
BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.0.0:8334")), runtime_error); //portnumber for setban not allowed
187187
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
188-
Array ar = r.get_array();
189-
Object o1 = ar[0].get_obj();
190-
Value adr = find_value(o1, "address");
188+
UniValue ar = r.get_array();
189+
UniValue o1 = ar[0].get_obj();
190+
UniValue adr = find_value(o1, "address");
191191
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.255");
192192
BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0 remove")));;
193193
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
194194
ar = r.get_array();
195195
BOOST_CHECK_EQUAL(ar.size(), 0);
196196

197-
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/24 add")));
197+
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/24 add 1607731200 true")));
198+
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
199+
ar = r.get_array();
200+
o1 = ar[0].get_obj();
201+
adr = find_value(o1, "address");
202+
UniValue banned_until = find_value(o1, "banned_untill");
203+
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.0");
204+
BOOST_CHECK_EQUAL(banned_until.get_int64(), 1607731200); // absolute time check
205+
206+
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
207+
208+
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/24 add 200")));
198209
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
199210
ar = r.get_array();
200211
o1 = ar[0].get_obj();
201212
adr = find_value(o1, "address");
213+
banned_until = find_value(o1, "banned_untill");
202214
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.0");
215+
int64_t now = GetTime();
216+
BOOST_CHECK(banned_until.get_int64() > now);
217+
BOOST_CHECK(banned_until.get_int64()-now <= 200);
203218

204219
// must throw an exception because 127.0.0.1 is in already banned suubnet range
205220
BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.0.1 add")), runtime_error);

0 commit comments

Comments
 (0)