[telepathy-gabble/master] check_incoming_connection: check address if access control is Port

Guillaume Desmottes guillaume.desmottes at collabora.co.uk
Thu May 14 07:51:49 PDT 2009


---
 src/tube-stream.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/src/tube-stream.c b/src/tube-stream.c
index 41ebf24..168c99b 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -49,6 +49,7 @@
 #include <gibber/gibber-tcp-transport.h>
 #include <gibber/gibber-transport.h>
 #include <gibber/gibber-unix-transport.h>
+#include <gibber/gibber-util.h>
 
 #include "bytestream-factory.h"
 #include "bytestream-iface.h"
@@ -614,6 +615,61 @@ check_incoming_connection (GabbleTubeStream *self,
        * started yet. */
       return FALSE;
     }
+  else if (priv->access_control == TP_SOCKET_ACCESS_CONTROL_PORT)
+    {
+      struct sockaddr_storage addr;
+      socklen_t len = sizeof (addr);
+      int ret;
+      char peer_host[NI_MAXHOST];
+      char peer_port[NI_MAXSERV];
+      guint port;
+      gchar *host;
+      gchar *tmp;
+
+      if (!gibber_transport_get_peeraddr (transport, &addr, &len))
+        {
+          DEBUG ("gibber_transport_get_peeraddr failed");
+          return FALSE;
+        }
+
+      gibber_normalize_address (&addr);
+
+      g_assert (addr.ss_family == AF_INET || addr.ss_family == AF_INET6);
+
+      ret = getnameinfo ((struct sockaddr *) &addr, len,
+          peer_host, NI_MAXHOST, peer_port, NI_MAXSERV,
+          NI_NUMERICHOST | NI_NUMERICSERV);
+
+      if (ret != 0)
+        {
+          DEBUG ("getnameinfo failed: %s", gai_strerror(ret));
+          return FALSE;
+        }
+
+      dbus_g_type_struct_get (priv->access_control_param,
+          0, &host,
+          1, &port,
+          G_MAXUINT);
+
+      if (tp_strdiff (host, peer_host))
+        {
+          DEBUG ("Wrong ip: %s (%s was expected)", peer_host, host);
+          g_free (host);
+          return FALSE;
+        }
+      g_free (host);
+
+      tmp = g_strdup_printf ("%u", port);
+      if (tp_strdiff (tmp, peer_port))
+        {
+          DEBUG ("Wrong port: %s (%u was expected)", peer_port, port);
+          g_free (tmp);
+          return FALSE;
+        }
+      g_free (tmp);
+
+      return TRUE;
+    }
   else
     {
       /* access_control has already been checked when accepting the tube */
-- 
1.5.6.5




More information about the telepathy-commits mailing list