| #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 |