diff --git a/daemon/src/ip_utils.cpp b/daemon/src/ip_utils.cpp index 3d2a9783b76d97c18d9aa38f0a9c73b6bdbca451..7262686739a92f5e50dd051401b8d7660a62cdcf 100644 --- a/daemon/src/ip_utils.cpp +++ b/daemon/src/ip_utils.cpp @@ -70,6 +70,17 @@ ip_utils::getAddrList(const std::string &name) return ipList; } +bool +ip_utils::haveCommonAddr(const std::vector<pj_sockaddr>& a, const std::vector<pj_sockaddr>& b) +{ + for (const auto &i : a) { + for (const auto &j : b) { + if (pj_sockaddr_cmp(&i, &j) == 0) return true; + } + } + return false; +} + std::string ip_utils::addrToStr(const pj_sockaddr& ip, bool include_port, bool force_ipv6_brackets) { diff --git a/daemon/src/ip_utils.h b/daemon/src/ip_utils.h index e6410cf4f7efcc8e37c40067d5ae7b3c6f195dc4..cdae791fa403692e575ff749ae9b316137a61e67 100644 --- a/daemon/src/ip_utils.h +++ b/daemon/src/ip_utils.h @@ -56,15 +56,22 @@ namespace ip_utils { */ pj_sockaddr strToAddr(const std::string& str); + pj_sockaddr getAnyHostAddr(pj_uint16_t family = pj_AF_UNSPEC()); + /** * Returns true if address is a valid IPv6. */ bool isIPv6(const std::string &address); + + /** + * Return true if address is a valid IP address of specified family (if provided) or of any kind (default). + */ bool isValidAddr(const std::string &address, pj_uint16_t family = pj_AF_UNSPEC()); std::vector<pj_sockaddr> getAddrList(const std::string &name); - pj_sockaddr getAnyHostAddr(pj_uint16_t family = pj_AF_UNSPEC()); + bool haveCommonAddr(const std::vector<pj_sockaddr>& a, const std::vector<pj_sockaddr>& b); + } #endif // IP_UTILS_H_ diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp index b9aabf928d37451d90db25550db10f85fff1bd58..6bcaed0b27dace89d8e5787cf17fb06200825325 100644 --- a/daemon/src/sip/sipaccount.cpp +++ b/daemon/src/sip/sipaccount.cpp @@ -1146,20 +1146,18 @@ bool SIPAccount::hostnameMatch(const std::string& hostname, pjsip_endpoint * /*e { if (hostname == hostname_) return true; - - const std::vector<std::string> a(sip_utils::getIPList(hostname)); - const std::vector<std::string> b(sip_utils::getIPList(hostname_)); - return haveValueInCommon(a, b); + const auto a = ip_utils::getAddrList(hostname); + const auto b = ip_utils::getAddrList(hostname_); + return ip_utils::haveCommonAddr(a, b); } bool SIPAccount::proxyMatch(const std::string& hostname, pjsip_endpoint * /*endpt*/, pj_pool_t * /*pool*/) const { if (hostname == serviceRoute_) return true; - - const std::vector<std::string> a(sip_utils::getIPList(hostname)); - const std::vector<std::string> b(sip_utils::getIPList(serviceRoute_)); - return haveValueInCommon(a, b); + const auto a = ip_utils::getAddrList(hostname); + const auto b = ip_utils::getAddrList(hostname_); + return ip_utils::haveCommonAddr(a, b); } std::string SIPAccount::getLoginName()