X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/703ad5b9a14dc2a42849669d3618a8ba1136bb92..49083e0e0d34cae603af6b7cdf60948747b738f0:/include/stg/user_ips.h diff --git a/include/stg/user_ips.h b/include/stg/user_ips.h index 17bb59be..fa107fc9 100644 --- a/include/stg/user_ips.h +++ b/include/stg/user_ips.h @@ -44,64 +44,37 @@ #include "stg/common.h" #include "os_int.h" -using namespace std; - //------------------------------------------------------------------------- struct IP_MASK { IP_MASK() : ip(0), mask(0) {} -IP_MASK(const IP_MASK & ipm) : ip(ipm.ip), mask(ipm.mask) {} uint32_t ip; uint32_t mask; }; //------------------------------------------------------------------------- class USER_IPS { - friend std::ostream & operator<< (ostream & o, const USER_IPS & i); - //friend stringstream & operator<< (stringstream & s, const USER_IPS & i); - friend const USER_IPS StrToIPS(const string & ipsStr) throw(string); + friend std::ostream & operator<< (std::ostream & o, const USER_IPS & i); + friend const USER_IPS StrToIPS(const std::string & ipsStr); public: - USER_IPS(); - USER_IPS(const USER_IPS &); - USER_IPS & operator=(const USER_IPS &); - const IP_MASK & operator[](int idx) const; + typedef std::vector ContainerType; + typedef ContainerType::size_type IndexType; + + const IP_MASK & operator[](IndexType idx) const { return ips[idx]; } std::string GetIpStr() const; bool IsIPInIPS(uint32_t ip) const; bool OnlyOneIP() const; - int Count() const; - void Add(const IP_MASK &im); - void Erase(); + bool IsAnyIP() const; + size_t Count() const { return ips.size(); } + void Add(const IP_MASK &im) { ips.push_back(im); } private: uint32_t CalcMask(unsigned int msk) const; - std::vector ips; + ContainerType ips; }; //------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -inline -USER_IPS::USER_IPS() - : ips() -{} -//----------------------------------------------------------------------------- -inline -USER_IPS::USER_IPS(const USER_IPS & i) - : ips(i.ips) -{} -//----------------------------------------------------------------------------- -inline -USER_IPS & USER_IPS::operator=(const USER_IPS & i) -{ -ips = i.ips; -return *this; -} -//----------------------------------------------------------------------------- -inline -const IP_MASK & USER_IPS::operator[](int idx) const -{ -return ips[idx]; -} //----------------------------------------------------------------------------- inline std::string USER_IPS::GetIpStr() const @@ -116,8 +89,8 @@ if (ips[0].ip == 0) return "*"; } -std::vector::const_iterator it(ips.begin()); -std::stringstream s; +ContainerType::const_iterator it(ips.begin()); +std::ostringstream s; s << inet_ntostring(it->ip); ++it; for (; it != ips.end(); ++it) @@ -128,9 +101,11 @@ return s.str(); } //----------------------------------------------------------------------------- inline -int USER_IPS::Count() const +uint32_t USER_IPS::CalcMask(unsigned int msk) const { -return ips.size(); +if (msk > 32) + return 0; +return htonl(0xFFffFFff << (32 - msk)); } //----------------------------------------------------------------------------- inline @@ -144,7 +119,7 @@ if (ips.empty()) if (ips.front().ip == 0) return true; -for (std::vector::const_iterator it(ips.begin()); it != ips.end(); ++it) +for (ContainerType::const_iterator it(ips.begin()); it != ips.end(); ++it) { uint32_t mask(CalcMask(it->mask)); if ((ip & mask) == (it->ip & mask)) @@ -156,30 +131,16 @@ return false; inline bool USER_IPS::OnlyOneIP() const { -if (ips.size() == 1 && ips.front().mask == 32) +if (ips.size() == 1 && ips.front().mask == 32 && ips.front().ip != 0) return true; return false; } //----------------------------------------------------------------------------- inline -uint32_t USER_IPS::CalcMask(unsigned int msk) const -{ -if (msk > 32) - return 0; -return htonl(0xFFffFFff << (32 - msk)); -} -//----------------------------------------------------------------------------- -inline -void USER_IPS::Add(const IP_MASK &im) -{ -ips.push_back(im); -} -//----------------------------------------------------------------------------- -inline -void USER_IPS::Erase() +bool USER_IPS::IsAnyIP() const { -ips.erase(ips.begin(), ips.end()); + return !ips.empty() && ips.front().ip == 0; } //----------------------------------------------------------------------------- inline @@ -188,21 +149,13 @@ std::ostream & operator<<(std::ostream & o, const USER_IPS & i) return o << i.GetIpStr(); } //----------------------------------------------------------------------------- -/*inline -stringstream & operator<<(std::stringstream & s, const USER_IPS & i) -{ -s << i.GetIpStr(); -return s; -}*/ -//----------------------------------------------------------------------------- inline -const USER_IPS StrToIPS(const std::string & ipsStr) throw(std::string) +const USER_IPS StrToIPS(const std::string & ipsStr) { USER_IPS ips; char * paddr; IP_MASK im; std::vector ipMask; -std::string err; if (ipsStr.empty()) { return ips; @@ -216,18 +169,18 @@ if (ipsStr[0] == '*' && ipsStr.size() == 1) return ips; } -char * str = new char[ipsStr.size() + 1]; -strcpy(str, ipsStr.c_str()); -char * pstr = str; +char * tmp = new char[ipsStr.size() + 1]; +strcpy(tmp, ipsStr.c_str()); +char * pstr = tmp; while ((paddr = strtok(pstr, ","))) { pstr = NULL; ipMask.push_back(paddr); } -delete[] str; +delete[] tmp; -for (unsigned int i = 0; i < ipMask.size(); i++) +for (USER_IPS::IndexType i = 0; i < ipMask.size(); i++) { char str[128]; char * strIp; @@ -236,7 +189,6 @@ for (unsigned int i = 0; i < ipMask.size(); i++) strIp = strtok(str, "/"); if (strIp == NULL) { - err = "Incorrect IP address " + ipsStr; return ips; } strMask = strtok(NULL, "/"); @@ -244,7 +196,6 @@ for (unsigned int i = 0; i < ipMask.size(); i++) im.ip = inet_addr(strIp); if (im.ip == INADDR_NONE) { - err = "Incorrect IP address: " + std::string(strIp); return ips; } @@ -254,20 +205,17 @@ for (unsigned int i = 0; i < ipMask.size(); i++) int m = 0; if (str2x(strMask, m) != 0) { - err = "Incorrect mask: " + std::string(strMask); return ips; } im.mask = m; if (im.mask > 32) { - err = "Incorrect mask: " + std::string(strMask); return ips; } if ((im.ip & ips.CalcMask(im.mask)) != im.ip) { - err = "Address does'n match mask: " + std::string(strIp) + "/" + std::string(strMask); return ips; } }