aboutsummaryrefslogtreecommitdiff
path: root/src/rpcnet.cpp
diff options
context:
space:
mode:
authorJonas Schnelli <jonas.schnelli@include7.ch>2015-05-19 10:07:46 +0200
committerJonas Schnelli <jonas.schnelli@include7.ch>2015-06-17 21:40:55 +0200
commitd930b26a264ed7eae6ce239f3bfb4ff023df8195 (patch)
treecb7fbc9f01aac0da47b4ff2c67f8045c576ee4c6 /src/rpcnet.cpp
parent2252fb91cd19832c8baa63a10aaf7ce32bb400f8 (diff)
[RPC] add setban/listbanned/clearbanned RPC commands
Diffstat (limited to 'src/rpcnet.cpp')
-rw-r--r--src/rpcnet.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp
index aeaf54814f..6157a2d0a0 100644
--- a/src/rpcnet.cpp
+++ b/src/rpcnet.cpp
@@ -465,3 +465,92 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp)
obj.push_back(Pair("warnings", GetWarnings("statusbar")));
return obj;
}
+
+Value setban(const Array& params, bool fHelp)
+{
+ string strCommand;
+ if (params.size() >= 2)
+ strCommand = params[1].get_str();
+ if (fHelp || params.size() < 2 ||
+ (strCommand != "add" && strCommand != "remove"))
+ throw runtime_error(
+ "setban \"node\" \"add|remove\" (bantime)\n"
+ "\nAttempts add or remove a IP from the banned list.\n"
+ "\nArguments:\n"
+ "1. \"ip\" (string, required) The IP (see getpeerinfo for nodes ip)\n"
+ "2. \"command\" (string, required) 'add' to add a IP to the list, 'remove' to remove a IP from the list\n"
+ "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"
+ "\nExamples:\n"
+ + HelpExampleCli("setban", "\"192.168.0.6\" \"add\" 86400")
+ + HelpExampleRpc("setban", "\"192.168.0.6\", \"add\" 86400")
+ );
+
+ CNetAddr netAddr(params[0].get_str());
+ if (!netAddr.IsValid())
+ throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: Invalid IP Address");
+
+ if (strCommand == "add")
+ {
+ if (CNode::IsBanned(netAddr))
+ throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: IP already banned");
+
+ int64_t banTime = 0; //use standard bantime if not specified
+ if (params.size() == 3 && !params[2].is_null())
+ banTime = params[2].get_int64();
+
+ CNode::Ban(netAddr, banTime);
+
+ //disconnect possible nodes
+ while(CNode *bannedNode = FindNode(netAddr))
+ bannedNode->CloseSocketDisconnect();
+ }
+ else if(strCommand == "remove")
+ {
+ if (!CNode::Unban(netAddr))
+ throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: Unban failed");
+ }
+
+ return Value::null;
+}
+
+Value listbanned(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() != 0)
+ throw runtime_error(
+ "listbanned\n"
+ "\nList all banned IPs.\n"
+ "\nExamples:\n"
+ + HelpExampleCli("listbanned", "")
+ + HelpExampleRpc("listbanned", "")
+ );
+
+ std::map<CNetAddr, int64_t> banMap;
+ CNode::GetBanned(banMap);
+
+ Array bannedAddresses;
+ for (std::map<CNetAddr, int64_t>::iterator it = banMap.begin(); it != banMap.end(); it++)
+ {
+ Object rec;
+ rec.push_back(Pair("address", (*it).first.ToString()));
+ rec.push_back(Pair("bannedtill", (*it).second));
+ bannedAddresses.push_back(rec);
+ }
+
+ return bannedAddresses;
+}
+
+Value clearbanned(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() != 0)
+ throw runtime_error(
+ "clearbanned\n"
+ "\nClear all banned IPs.\n"
+ "\nExamples:\n"
+ + HelpExampleCli("clearbanned", "")
+ + HelpExampleRpc("clearbanned", "")
+ );
+
+ CNode::ClearBanned();
+
+ return Value::null;
+}