From e19f2d01557d3cf69ad58b4a866cef6110f22559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Mon, 14 Apr 2014 10:36:08 -0400 Subject: [PATCH] sip: match account based on sockaddr rather than string --- daemon/src/ip_utils.cpp | 11 +++++++++++ daemon/src/ip_utils.h | 9 ++++++++- daemon/src/sip/sipaccount.cpp | 14 ++++++-------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/daemon/src/ip_utils.cpp b/daemon/src/ip_utils.cpp index 3d2a9783b7..7262686739 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 e6410cf4f7..cdae791fa4 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 b9aabf928d..6bcaed0b27 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() -- GitLab