1 #include "../include/ipaddressacl.h"
\r
2 #include "../include/stringfunctions.h"
\r
7 IPAddressACL::IPAddressACL():m_allowbydefault(true)
\r
12 const bool IPAddressACL::Add(const std::string &aclentry)
\r
14 bool allow=m_allowbydefault;
\r
16 std::string::size_type strpos=std::string::npos;
\r
17 std::string entrystr=aclentry;
\r
19 // look for +/- at beginning of string then strip off
\r
20 if(entrystr.size()>0)
\r
22 if(entrystr[0]=='-')
\r
25 entrystr.erase(0,1);
\r
27 else if(entrystr[0]=='+')
\r
30 entrystr.erase(0,1);
\r
34 // look for /mask at end of string then strip off and convert to mask
\r
35 if((strpos=entrystr.find("/"))!=std::string::npos)
\r
37 if(strpos!=entrystr.size()-1)
\r
39 std::string bitmaskstr=entrystr.substr(strpos+1);
\r
40 entrystr.erase(strpos);
\r
42 std::istringstream i(bitmaskstr);
\r
47 entrystr.erase(strpos);
\r
51 // try to parse address
\r
52 Poco::Net::IPAddress ip;
\r
53 if(Poco::Net::IPAddress::tryParse(entrystr,ip))
\r
55 m_entries.push_back(entry(allow,Poco::Net::IPAddress(CreateMask(maskbits)),ip));
\r
64 const std::string IPAddressACL::CreateMask(const int maskbits)
\r
66 int bitsleft=maskbits;
\r
67 int parts[4]={255,255,255,255};
\r
68 std::ostringstream ipstr;
\r
70 for(int i=3; i>=0; i--)
\r
72 for(int b=0; b<8 && bitsleft>0; b++)
\r
74 parts[i]-=pow((float)2,b);
\r
79 ipstr << parts[0] << "." << parts[1] << "." << parts[2] << "." << parts[3];
\r
84 const bool IPAddressACL::IsAllowed(const Poco::Net::IPAddress &addr)
\r
87 bool rval=m_allowbydefault;
\r
89 for(std::vector<entry>::iterator i=m_entries.begin(); i!=m_entries.end() && found==false; i++)
\r
91 Poco::Net::IPAddress ip1=addr;
\r
92 Poco::Net::IPAddress ip2=(*i).m_addr;
\r
94 //ip1.mask((*i).m_mask);
\r
95 //ip2.mask((*i).m_mask);
\r
97 ip1=MaskAddress(ip1,(*i).m_mask);
\r
98 ip2=MaskAddress(ip2,(*i).m_mask);
\r
110 const bool IPAddressACL::IsAllowed(const std::string &addrstr)
\r
112 Poco::Net::IPAddress ip;
\r
113 if(Poco::Net::IPAddress::tryParse(addrstr,ip))
\r
115 return IsAllowed(ip);
\r
123 Poco::Net::IPAddress IPAddressACL::MaskAddress(const Poco::Net::IPAddress &addr, const Poco::Net::IPAddress &mask)
\r
125 Poco::Net::IPAddress raddr=addr;
\r
126 std::vector<std::string> parts1;
\r
127 int intparts1[4]={0,0,0,0};
\r
128 std::vector<std::string> parts2;
\r
129 int intparts2[4]={0,0,0,0};
\r
130 int result[4]={0,0,0,0};
\r
131 std::ostringstream res;
\r
133 StringFunctions::Split(raddr.toString(),".",parts1);
\r
134 StringFunctions::Split(mask.toString(),".",parts2);
\r
136 if(parts1.size()>=4 && parts2.size()>=4)
\r
138 for(int i=0; i<4; i++)
\r
140 StringFunctions::Convert(parts1[i],intparts1[i]);
\r
141 StringFunctions::Convert(parts2[i],intparts2[i]);
\r
142 //result[i]=intparts1[i];
\r
143 //result[i]|=intparts2[i]&~intparts1[i];
\r
144 result[i]=(intparts1[i]&intparts2[i]);
\r
146 res << result[0] << "." << result[1] << "." << result[2] << "." << result[3];
\r
147 Poco::Net::IPAddress::tryParse(res.str(),raddr);
\r