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