telepathy-gabble: jingle-info: discover a STUN server using SRV

Will Thompson wjt at kemper.freedesktop.org
Thu Dec 6 04:29:03 PST 2012


Module: telepathy-gabble
Branch: master
Commit: 783e0913e2c70290ef99b86241fd60478d4abdba
URL:    http://cgit.freedesktop.org/telepathy/telepathy-gabble/commit/?id=783e0913e2c70290ef99b86241fd60478d4abdba

Author: Will Thompson <will.thompson at collabora.co.uk>
Date:   Fri Nov 23 10:04:08 2012 +0000

jingle-info: discover a STUN server using SRV

Derived from a patch by Mike Ruprecht.

https://bugs.freedesktop.org/show_bug.cgi?id=25961

---

 src/jingle-info.c                   |   71 +++++++++++++++++++++++++++++++++++
 tests/twisted/jingle/stun-server.py |    6 +++
 tests/twisted/main-debug.c          |    3 +
 3 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/src/jingle-info.c b/src/jingle-info.c
index be7c68c..27ca01f 100644
--- a/src/jingle-info.c
+++ b/src/jingle-info.c
@@ -40,6 +40,7 @@ static gboolean jingle_info_cb (
 struct _GabbleJingleInfoPrivate {
     WockyPorter *porter;
     guint jingle_info_handler_id;
+    gchar *jid_domain;
 
     GabbleGoogleRelayResolver *google_resolver;
 
@@ -166,6 +167,10 @@ gabble_jingle_info_constructed (GObject *object)
     parent_class->constructed (object);
 
   g_assert (priv->porter != NULL);
+
+  if (!wocky_decode_jid (wocky_porter_get_bare_jid (priv->porter), NULL,
+          &priv->jid_domain, NULL))
+    g_assert_not_reached ();
 }
 
 static void
@@ -190,6 +195,8 @@ gabble_jingle_info_dispose (GObject *object)
       priv->google_resolver = NULL;
     }
 
+  g_free (priv->jid_domain);
+  priv->jid_domain = NULL;
   gabble_stun_server_free (priv->stun_server);
   priv->stun_server = NULL;
   gabble_stun_server_free (priv->fallback_stun_server);
@@ -570,13 +577,77 @@ gabble_jingle_info_send_google_request (
       '(', "query", ':', NS_GOOGLE_JINGLE_INFO, ')', NULL);
 }
 
+static void
+discover_stun_servers_cb (GObject *resolver,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  GabbleJingleInfo *self = GABBLE_JINGLE_INFO (user_data);
+  GabbleJingleInfoPrivate *priv = self->priv;
+  GError *error = NULL;
+  GList *targets;
+
+  targets = g_resolver_lookup_service_finish (G_RESOLVER (resolver),
+      result, &error);
+
+  if (error != NULL)
+    {
+      DEBUG ("Failed to discover STUN servers on %s: %s",
+          priv->jid_domain, error->message);
+      g_clear_error (&error);
+    }
+  else
+    {
+      DEBUG ("Discovered %d STUN servers on %s", g_list_length (targets),
+          priv->jid_domain);
+
+      /* TODO: use more than just the first. */
+      if (targets != NULL)
+        {
+          GSrvTarget *target = targets->data;
+          const gchar *hostname = g_srv_target_get_hostname (target);
+          guint16 port = g_srv_target_get_port (target);
+
+          DEBUG ("Found STUN server: %s:%d", hostname, port);
+
+          gabble_jingle_info_take_stun_server (self, g_strdup (hostname), port,
+              FALSE);
+        }
+
+      g_resolver_free_targets (targets);
+    }
+
+  g_object_unref (resolver);
+  g_object_unref (self);
+}
+
+static void
+gabble_jingle_info_lookup_srv (
+    GabbleJingleInfo *self)
+{
+  GabbleJingleInfoPrivate *priv = self->priv;
+  GResolver *resolver;
+
+  g_assert (priv->jid_domain != NULL);
+  DEBUG ("Discovering STUN servers on %s", priv->jid_domain);
+
+  resolver = g_resolver_get_default ();
+  g_resolver_lookup_service_async (resolver, "stun", "udp", priv->jid_domain,
+      NULL, discover_stun_servers_cb, g_object_ref (self));
+}
+
 void
 gabble_jingle_info_send_request (
     GabbleJingleInfo *self,
     gboolean google_jingleinfo_supported)
 {
+  /* FIXME: we probably don't want to send either query if the user specified a
+   * stun server (that is, get_stun_from_jingle is FALSE).
+   */
   if (google_jingleinfo_supported)
     gabble_jingle_info_send_google_request (self);
+  else
+    gabble_jingle_info_lookup_srv (self);
 }
 
 /*
diff --git a/tests/twisted/jingle/stun-server.py b/tests/twisted/jingle/stun-server.py
index d47770a..5431e7b 100644
--- a/tests/twisted/jingle/stun-server.py
+++ b/tests/twisted/jingle/stun-server.py
@@ -285,6 +285,9 @@ if __name__ == '__main__':
         google=False, expected_stun_servers=[('5.4.3.2', 54321)]),
         params={'fallback-stun-server': 'resolves-to-5.4.3.2',
             'fallback-stun-port': dbus.UInt16(54321)})
+    exec_test(partial(test_streamed_media, google=False,
+                expected_stun_servers=[('5.4.3.2', 1)]),
+        params={'account': 'test at stunning.localhost'})
 
     if GOOGLE_RELAY_ENABLED:
         exec_test(partial(test_streamed_media,
@@ -315,6 +318,9 @@ if __name__ == '__main__':
             google=False, expected_stun_servers=[('5.4.3.2', 54321)]),
             params={'fallback-stun-server': 'resolves-to-5.4.3.2',
                 'fallback-stun-port': dbus.UInt16(54321)})
+        exec_test(partial(test_call,
+            google=False, expected_stun_servers=[('5.4.3.2', 1)]),
+            params={'account': 'test at stunning.localhost'})
     else:
         print "NOTE: built with --disable-channel-type-call; omitting Call tests"
 
diff --git a/tests/twisted/main-debug.c b/tests/twisted/main-debug.c
index dc8ce1e..cebf89a 100644
--- a/tests/twisted/main-debug.c
+++ b/tests/twisted/main-debug.c
@@ -104,6 +104,9 @@ main (int argc,
   test_resolver_add_A (TEST_RESOLVER (kludged),
       "stun.telepathy.im", "6.7.8.9");
 
+  test_resolver_add_SRV (TEST_RESOLVER (kludged),
+      "stun", "udp", "stunning.localhost", "resolves-to-5.4.3.2", 1);
+
 #ifdef ENABLE_VOIP
   gabble_jingle_info_set_test_mode ();
 #endif



More information about the telepathy-commits mailing list