| #include "casbin/pch.h" |
| |
| #ifndef IPNET_CPP |
| #define IPNET_CPP |
| |
| #include "casbin/ip_parser/parser/IPNet.h" |
| |
| namespace casbin { |
| |
| std::string IPNet ::NETIP_toString() { |
| std::string ip1, ip2, ip3, ip4; |
| std::stringstream ss1, ss2, ss3, ss4; |
| ss1 << net_ip.ip[0]; |
| ss1 >> ip1; |
| ss2 << net_ip.ip[1]; |
| ss2 >> ip2; |
| ss3 << net_ip.ip[2]; |
| ss3 >> ip3; |
| ss4 << net_ip.ip[3]; |
| ss4 >> ip4; |
| return ip1 + "." + ip2 + "." + ip3 + "." + ip4; |
| } |
| |
| std::string IPNet ::IPMask_toString() { |
| std::string mask1, mask2, mask3, mask4; |
| std::stringstream ss1, ss2, ss3, ss4; |
| ss1 << mask[0]; |
| ss1 >> mask1; |
| ss2 << mask[1]; |
| ss2 >> mask2; |
| ss3 << mask[2]; |
| ss3 >> mask3; |
| ss4 << mask[3]; |
| ss4 >> mask4; |
| return mask1 + "." + mask2 + "." + mask3 + "." + mask4; |
| } |
| |
| // Contains reports whether the network includes ip. |
| bool IPNet ::contains(IP ipNew) { |
| std::pair<IP, IPMask> p = networkNumberAndMask(*this); |
| IP x; |
| x = ipNew.To4(); |
| if (x.isLegal == true) { |
| ipNew = x; |
| } |
| int l = int(ipNew.ip.size()); |
| if (l != p.first.ip.size()) { |
| return false; |
| } |
| for (int i = 0; i < l; i++) { |
| if ((p.first.ip[i] & p.second[i]) != (ipNew.ip[i] & p.second[i])) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| std::pair<IP, IPMask> IPNet ::networkNumberAndMask(IPNet n) { |
| IP newIp; |
| newIp = n.net_ip.To4(); |
| std::pair<IP, IPMask> p; |
| p.first = newIp; |
| if (newIp.isLegal == false) { |
| newIp = n.net_ip; |
| if (newIp.ip.size() != IP ::IPv6len) { |
| p.first.isLegal = false; |
| return p; |
| } |
| } |
| IPMask m = n.mask; |
| p.second = m; |
| const byte ipv4len = IP ::IPv4len; |
| const byte ipv6len = IP ::IPv6len; |
| if (m.size() == ipv4len) { |
| if (newIp.ip.size() != IP ::IPv4len) { |
| p.first.isLegal = false; |
| } |
| } else if (m.size() == ipv6len) { |
| if (newIp.ip.size() == IP ::IPv4len) { |
| IPMask newM(m.begin() + 12, m.end()); |
| m = newM; |
| p.first = newIp; |
| p.second = m; |
| } |
| } else { |
| p.first.isLegal = false; |
| } |
| return p; |
| } |
| |
| } // namespace casbin |
| |
| #endif // IPNET_CPP |