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