blob: 1cff14c161f630417c6ebca3125a77f1f4074ce0 [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