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