diff sat/plugins/plugin_xep_0260.py @ 2927:69e4716d6268

plugins (jingle) file transfer: use initial "from" attribute as local jid instead of client.jid: while client.jid is fine in a client context, for components it's not the right jid to use: it is the jid of the component itself while the file transfer/jingle session entity may be established with this jid + a local part (e.g. if client is files.example.net, session may be established with louise@files.example.net, in which case "from" is louise@files.example.net, while client.jid will be files.example.net). As a consequence, using client.jid was causing trouble with components. This patch fixes it for jingle and plugins linked to file transfer by keeping a "local_jid" variable in the session, where the jid from the original "from" attribute is used.
author Goffi <goffi@goffi.org>
date Sun, 28 Apr 2019 08:55:13 +0200
parents 003b8b4b56a7
children ab2696e34d29
line wrap: on
line diff
--- a/sat/plugins/plugin_xep_0260.py	Sun Apr 28 08:55:13 2019 +0200
+++ b/sat/plugins/plugin_xep_0260.py	Sun Apr 28 08:55:13 2019 +0200
@@ -140,13 +140,14 @@
         transport_data = content_data["transport_data"]
         sid = transport_data["sid"] = unicode(uuid.uuid4())
         session_hash = transport_data["session_hash"] = self._s5b.getSessionHash(
-            client.jid, session["peer_jid"], sid
+            session[u"local_jid"], session["peer_jid"], sid
         )
         transport_data["peer_session_hash"] = self._s5b.getSessionHash(
-            session["peer_jid"], client.jid, sid
+            session["peer_jid"], session[u"local_jid"], sid
         )  # requester and target are inversed for peer candidates
         transport_data["stream_d"] = self._s5b.registerHash(client, session_hash, None)
-        candidates = transport_data["candidates"] = yield self._s5b.getCandidates(client)
+        candidates = transport_data["candidates"] = yield self._s5b.getCandidates(
+            client, session["local_jid"])
         mode = "tcp"  # XXX: we only manage tcp for now
         transport_elt = self._buildCandidates(
             session, candidates, sid, session_hash, client, mode
@@ -249,7 +250,7 @@
                 log.debug(
                     u"Candidates have same priority, we select the one choosed by initiator"
                 )
-                if session["initiator"] == client.jid:
+                if session["initiator"] == session[u"local_jid"]:
                     choosed_candidate = best_candidate
                 else:
                     choosed_candidate = peer_best_candidate
@@ -425,12 +426,12 @@
             assert "peer_candidates" not in transport_data
             sid = transport_data["sid"] = transport_elt["sid"]
             session_hash = transport_data["session_hash"] = self._s5b.getSessionHash(
-                client.jid, session["peer_jid"], sid
+                session["local_jid"], session["peer_jid"], sid
             )
             peer_session_hash = transport_data[
                 "peer_session_hash"
             ] = self._s5b.getSessionHash(
-                session["peer_jid"], client.jid, sid
+                session["peer_jid"], session["local_jid"], sid
             )  # requester and target are inversed for peer candidates
             peer_candidates = transport_data["peer_candidates"] = self._parseCandidates(
                 transport_elt
@@ -444,7 +445,7 @@
             d.addCallback(
                 self._foundPeerCandidate, session, transport_data, content_name, client
             )
-            candidates = yield self._s5b.getCandidates(client)
+            candidates = yield self._s5b.getCandidates(client, session["local_jid"])
             # we remove duplicate candidates
             candidates = [
                 candidate for candidate in candidates if candidate not in peer_candidates