telepathy-gabble: presence-cache: ignore caps nodes when we see google 'ext ' features

Jonny Lamb jonny at kemper.freedesktop.org
Mon Jul 23 07:15:59 PDT 2012


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

Author: Jonny Lamb <jonny.lamb at collabora.co.uk>
Date:   Mon Jul 16 17:45:55 2012 +0100

presence-cache: ignore caps nodes when we see google 'ext' features

Google keeps changing the node for its voice-v1, video-v1, share-v1,
etc. features. Let's just ignore it from now on and if there's no hash
treat it as if it might be Google.

Signed-off-by: Jonny Lamb <jonny.lamb at collabora.co.uk>

---

 src/presence-cache.c                           |  112 +++++++++++++++---------
 tests/twisted/jingle-share/jingleshareutils.py |    7 +-
 2 files changed, 73 insertions(+), 46 deletions(-)

diff --git a/src/presence-cache.c b/src/presence-cache.c
index 9497dd0..23d1e8a 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -497,48 +497,9 @@ static void gabble_presence_cache_add_bundle_caps (GabblePresenceCache *cache,
 static void
 gabble_presence_cache_add_bundles (GabblePresenceCache *cache)
 {
-#define GOOGLE_BUNDLE(cap, features) \
-  gabble_presence_cache_add_bundle_caps (cache, \
-      "http://www.google.com/xmpp/client/caps#" cap, features); \
-  gabble_presence_cache_add_bundle_caps (cache, \
-      "http://talk.google.com/xmpp/client/caps#" cap, features); \
-  gabble_presence_cache_add_bundle_caps (cache, \
-      "http://www.android.com/gtalk/client/caps#" cap, features); \
-  gabble_presence_cache_add_bundle_caps (cache, \
-      "http://www.android.com/gtalk/client/caps2#" cap, features); \
-  gabble_presence_cache_add_bundle_caps (cache, \
-      "http://talk.google.com/xmpp/bot/caps#" cap, features);
-
-  /* Cache various bundle from the Google Talk clients as trusted.  Some old
-   * versions of Google Talk do not reply correctly to discovery requests.
-   * Plus, we know what Google's bundles mean, so it's a waste of time to disco
-   * them, particularly the ones for features we don't support. The desktop
-   * client doesn't currently have all of these, but it doesn't hurt to cache
-   * them anyway.
-   */
-  GOOGLE_BUNDLE ("voice-v1", NS_GOOGLE_FEAT_VOICE);
-  GOOGLE_BUNDLE ("video-v1", NS_GOOGLE_FEAT_VIDEO);
-
-  /* File transfer support */
-  GOOGLE_BUNDLE ("share-v1", NS_GOOGLE_FEAT_SHARE);
-
-  /* Not really sure what this ones is. */
-  GOOGLE_BUNDLE ("sms-v1", NULL);
-
-  /* TODO: remove this when we fix fd.o#22768. */
-  GOOGLE_BUNDLE ("pmuc-v1", NULL);
-
-  /* The camera-v1 bundle seems to mean "I have a camera plugged in". Not
-   * having it doesn't seem to affect anything, and we have no way of exposing
-   * that information anyway.
-   */
-  GOOGLE_BUNDLE ("camera-v1", NULL);
-
-#undef GOOGLE_BUNDLE
-
-  /* We should also cache the ext='' bundles Gabble advertises: older Gabbles
-   * advertise these and don't support hashed caps, and we shouldn't need to
-   * disco them.
+  /* We cache the ext='' bundles Gabble advertises: older Gabbles
+   * advertise these and don't support hashed caps, and we shouldn't
+   * need to disco them.
    */
   gabble_presence_cache_add_bundle_caps (cache,
       NS_GABBLE_CAPS "#" BUNDLE_VOICE_V1, NS_GOOGLE_FEAT_VOICE);
@@ -1503,6 +1464,44 @@ _caps_disco_cb (GabbleDisco *disco,
   g_ptr_array_unref (data_forms);
 }
 
+static gboolean
+get_google_cap (const gchar *fragment,
+    const gchar **ns)
+{
+  if (!tp_strdiff (fragment, "voice-v1"))
+    {
+      *ns = NS_GOOGLE_FEAT_VOICE;
+      return TRUE;
+    }
+  else if (!tp_strdiff (fragment, "video-v1"))
+    {
+      *ns = NS_GOOGLE_FEAT_VIDEO;
+      return TRUE;
+    }
+  else if (!tp_strdiff (fragment, "share-v1"))
+    {
+      *ns = NS_GOOGLE_FEAT_SHARE;
+      return TRUE;
+    }
+  else if (!tp_strdiff (fragment, "sms-v1"))
+    {
+      *ns = NULL;
+      return TRUE;
+    }
+  else if (!tp_strdiff (fragment, "pmuc-v1"))
+    {
+      *ns = NULL;
+      return TRUE;
+    }
+  else if (!tp_strdiff (fragment, "camera-v1"))
+    {
+      *ns = NULL;
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 static void
 _process_caps_uri (GabblePresenceCache *cache,
                    const gchar *from,
@@ -1521,6 +1520,7 @@ _process_caps_uri (GabblePresenceCache *cache,
   TpHandleRepoIface *contact_repo;
   WockyCapsCache *caps_cache;
   gchar *uri = g_strdup_printf ("%s#%s", node, fragment);
+  const gchar *ns = NULL;
 
   priv = cache->priv;
   contact_repo = tp_base_connection_get_handles (
@@ -1588,6 +1588,34 @@ _process_caps_uri (GabblePresenceCache *cache,
       if (cached_caps != NULL)
         gabble_capability_set_free (cached_caps);
     }
+  else if (hash == NULL && get_google_cap (fragment, &ns))
+    {
+      /* if the hash is NULL then are looking at the ext='...' values,
+       * so this is starting to smell like Google */
+      GabblePresence *presence = gabble_presence_cache_get (cache, handle);
+
+      /* we already know about this fragment; apply the known value to
+       * the (handle, resource) */
+      DEBUG ("we know about fragment %s, setting caps for %u (%s)", fragment, handle,
+          from);
+
+      if (presence != NULL)
+        {
+          GabbleCapabilitySet *cap_set = gabble_capability_set_new ();
+
+          if (ns != NULL)
+            gabble_capability_set_add (cap_set, ns);
+
+          gabble_presence_set_capabilities (
+              presence, resource, cap_set, NULL, serial);
+
+          gabble_capability_set_free (cap_set);
+        }
+      else
+        {
+          DEBUG ("presence not found");
+        }
+    }
   else
     {
       GSList *waiters;
diff --git a/tests/twisted/jingle-share/jingleshareutils.py b/tests/twisted/jingle-share/jingleshareutils.py
index 16c75fb..6ade4f5 100644
--- a/tests/twisted/jingle-share/jingleshareutils.py
+++ b/tests/twisted/jingle-share/jingleshareutils.py
@@ -64,19 +64,18 @@ def test_ft_caps_from_contact(q, bus, conn, stream, contact, contact_handle, cli
     c = presence.addElement((ns.CAPS, 'c'))
     c['node'] = client
     c['ext'] = "share-v1"
-    c['ver'] = compute_caps_hash([], [], {})
+    c['ver'] = '1.1'
     stream.send(presence)
 
     # Gabble looks up our capabilities
     event = q.expect('stream-iq', to=contact, query_ns=ns.DISCO_INFO)
     query_node = xpath.queryForNodes('/iq/query', event.stanza)[0]
-    assert query_node.attributes['node'] == \
-        client + '#' + c['ext']
+    assertEquals(client + '#' + c['ver'], query_node.attributes['node'])
 
     # send good reply
     result = make_result_iq(stream, event.stanza)
     query = result.firstChildElement()
-    query['node'] = client + '#' + c['ext']
+    query['node'] = client + '#' + c['ver']
     feature = query.addElement('feature')
     feature['var'] = ns.GOOGLE_FEAT_SHARE
     stream.send(result)



More information about the telepathy-commits mailing list