blob: 66156d441c38a51723f8ea29a16227835f257d38 [file] [log] [blame]
#include "casbin/pch.h"
#ifndef PARSECIDR_CPP
#define PARSECIDR_CPP
#include "casbin/ip_parser/parser/parseCIDR.h"
namespace casbin {
CIDR parseCIDR(std::string s) {
size_t pos = s.find("/");
if(pos == std::string :: npos) {
throw ParserException("Illegal CIDR address.");
}
std::string addr = s.substr(0, pos);
std::string mask = s.substr(pos+1, s.length()-pos-1);
byte iplen = IP :: IPv4len;
IP ip;
ip = parseIPv4(addr);
if(ip.isLegal == false) {
iplen = IP :: IPv6len;
ip = parseIPv6(addr);
}
std::pair<int, int> p = dtoi(mask);
if(ip.isLegal == false || (p.first >= big || p.second==0) || p.second != mask.length() || p.first < 0 || p.first > 8*iplen) {
throw ParserException("Illegal CIDR address.");
}
IPMask m = CIDRMask(p.first, 8*iplen);
CIDR cidr_addr;
cidr_addr.ip = ip;
cidr_addr.net.net_ip = ip.Mask(m);
cidr_addr.net.mask = m;
return cidr_addr;
}
} // namespace casbin
#endif // PARSECIDR_CPP