net: use CIDR notation in CSubNet::ToString()
This commit is contained in:
parent
53caec66cc
commit
607809f037
3 changed files with 92 additions and 16 deletions
|
@ -1314,15 +1314,17 @@ bool CSubNet::Match(const CNetAddr &addr) const
|
|||
std::string CSubNet::ToString() const
|
||||
{
|
||||
std::string strNetmask;
|
||||
if (network.IsIPv4())
|
||||
strNetmask = strprintf("%u.%u.%u.%u", netmask[12], netmask[13], netmask[14], netmask[15]);
|
||||
else
|
||||
strNetmask = strprintf("%x:%x:%x:%x:%x:%x:%x:%x",
|
||||
netmask[0] << 8 | netmask[1], netmask[2] << 8 | netmask[3],
|
||||
netmask[4] << 8 | netmask[5], netmask[6] << 8 | netmask[7],
|
||||
netmask[8] << 8 | netmask[9], netmask[10] << 8 | netmask[11],
|
||||
netmask[12] << 8 | netmask[13], netmask[14] << 8 | netmask[15]);
|
||||
return network.ToString() + "/" + strNetmask;
|
||||
int cidr = 0;
|
||||
for (int n = network.IsIPv4() ? 12 : 0 ; n < 16; ++n)
|
||||
{
|
||||
uint8_t netmaskpart = netmask[n];
|
||||
while (netmaskpart)
|
||||
{
|
||||
cidr += ( netmaskpart & 0x01 );
|
||||
netmaskpart >>= 1;
|
||||
}
|
||||
}
|
||||
return network.ToString() + strprintf("/%u", cidr);
|
||||
}
|
||||
|
||||
bool CSubNet::IsValid() const
|
||||
|
|
|
@ -155,6 +155,80 @@ BOOST_AUTO_TEST_CASE(subnet_test)
|
|||
BOOST_CHECK(CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).Match(CNetAddr("1:2:3:4:5:6:7:8")));
|
||||
BOOST_CHECK(!CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).Match(CNetAddr("1:2:3:4:5:6:7:9")));
|
||||
BOOST_CHECK(CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).ToString() == "1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
|
||||
|
||||
CSubNet subnet = CSubNet("1.2.3.4/255.255.255.255");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
|
||||
subnet = CSubNet("1.2.3.4/255.255.255.254");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/31");
|
||||
subnet = CSubNet("1.2.3.4/255.255.255.252");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/30");
|
||||
subnet = CSubNet("1.2.3.4/255.255.255.248");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/29");
|
||||
subnet = CSubNet("1.2.3.4/255.255.255.240");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/28");
|
||||
subnet = CSubNet("1.2.3.4/255.255.255.224");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/27");
|
||||
subnet = CSubNet("1.2.3.4/255.255.255.192");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/26");
|
||||
subnet = CSubNet("1.2.3.4/255.255.255.128");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/25");
|
||||
subnet = CSubNet("1.2.3.4/255.255.255.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/24");
|
||||
subnet = CSubNet("1.2.3.4/255.255.254.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.2.0/23");
|
||||
subnet = CSubNet("1.2.3.4/255.255.252.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/22");
|
||||
subnet = CSubNet("1.2.3.4/255.255.248.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/21");
|
||||
subnet = CSubNet("1.2.3.4/255.255.240.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/20");
|
||||
subnet = CSubNet("1.2.3.4/255.255.224.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/19");
|
||||
subnet = CSubNet("1.2.3.4/255.255.192.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/18");
|
||||
subnet = CSubNet("1.2.3.4/255.255.128.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/17");
|
||||
subnet = CSubNet("1.2.3.4/255.255.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/16");
|
||||
subnet = CSubNet("1.2.3.4/255.254.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/15");
|
||||
subnet = CSubNet("1.2.3.4/255.252.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/14");
|
||||
subnet = CSubNet("1.2.3.4/255.248.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/13");
|
||||
subnet = CSubNet("1.2.3.4/255.240.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/12");
|
||||
subnet = CSubNet("1.2.3.4/255.224.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/11");
|
||||
subnet = CSubNet("1.2.3.4/255.192.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/10");
|
||||
subnet = CSubNet("1.2.3.4/255.128.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/9");
|
||||
subnet = CSubNet("1.2.3.4/255.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
|
||||
subnet = CSubNet("1.2.3.4/254.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/7");
|
||||
subnet = CSubNet("1.2.3.4/252.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/6");
|
||||
subnet = CSubNet("1.2.3.4/248.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/5");
|
||||
subnet = CSubNet("1.2.3.4/240.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/4");
|
||||
subnet = CSubNet("1.2.3.4/224.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/3");
|
||||
subnet = CSubNet("1.2.3.4/192.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/2");
|
||||
subnet = CSubNet("1.2.3.4/128.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/1");
|
||||
subnet = CSubNet("1.2.3.4/0.0.0.0");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
|
||||
|
||||
subnet = CSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/128");
|
||||
subnet = CSubNet("1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "1::/16");
|
||||
subnet = CSubNet("1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
BOOST_CHECK_EQUAL(subnet.ToString(), "::/0");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(netbase_getgroup)
|
||||
|
|
|
@ -235,7 +235,7 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
|
|||
UniValue ar = r.get_array();
|
||||
UniValue o1 = ar[0].get_obj();
|
||||
UniValue adr = find_value(o1, "address");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.255");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/32");
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0 remove")));;
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
|
@ -247,7 +247,7 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
|
|||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
UniValue banned_until = find_value(o1, "banned_until");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.0");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/24");
|
||||
BOOST_CHECK_EQUAL(banned_until.get_int64(), 1607731200); // absolute time check
|
||||
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
|
||||
|
@ -258,7 +258,7 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
|
|||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
banned_until = find_value(o1, "banned_until");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.0");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/24");
|
||||
int64_t now = GetTime();
|
||||
BOOST_CHECK(banned_until.get_int64() > now);
|
||||
BOOST_CHECK(banned_until.get_int64()-now <= 200);
|
||||
|
@ -288,15 +288,15 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
|
|||
ar = r.get_array();
|
||||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "fe80::202:b3ff:fe1e:8329/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "fe80::202:b3ff:fe1e:8329/128");
|
||||
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 2001:db8::/30 add")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 2001:db8::/ffff:fffc:0:0:0:0:0:0 add")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "2001:db8::/ffff:fffc:0:0:0:0:0:0");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "2001:db8::/30");
|
||||
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/128 add")));
|
||||
|
@ -304,7 +304,7 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
|
|||
ar = r.get_array();
|
||||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/128");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
|
Loading…
Reference in a new issue