diff sat/plugins/plugin_xep_0166.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 945e53cde9b2
children ab2696e34d29
line wrap: on
line diff
--- a/sat/plugins/plugin_xep_0166.py	Sun Apr 28 08:55:13 2019 +0200
+++ b/sat/plugins/plugin_xep_0166.py	Sun Apr 28 08:55:13 2019 +0200
@@ -121,7 +121,7 @@
 
     def _buildJingleElt(self, client, session, action):
         iq_elt = client.IQ("set")
-        iq_elt["from"] = client.jid.full()
+        iq_elt["from"] = session['local_jid'].full()
         iq_elt["to"] = session["peer_jid"].full()
         jingle_elt = iq_elt.addElement("jingle", NS_JINGLE)
         jingle_elt["sid"] = session["id"]
@@ -353,7 +353,8 @@
         @return D(unicode): jingle session id
         """
         assert contents  # there must be at least one content
-        if peer_jid == client.jid:
+        if (peer_jid == client.jid
+            or client.is_component and peer_jid.host == client.jid.host):
             raise ValueError(_(u"You can't do a jingle session with yourself"))
         initiator = client.jid
         sid = unicode(uuid.uuid4())
@@ -363,6 +364,7 @@
             "state": STATE_PENDING,
             "initiator": initiator,
             "role": XEP_0166.ROLE_INITIATOR,
+            "local_jid": client.jid,
             "peer_jid": peer_jid,
             "started": time.time(),
             "contents": {},
@@ -538,6 +540,9 @@
                 "state": STATE_PENDING,
                 "initiator": peer_jid,
                 "role": XEP_0166.ROLE_RESPONDER,
+                # we store local_jid using request['to'] because for a component the jid
+                # used may not be client.jid (if a local part is used).
+                "local_jid": jid.JID(request['to']),
                 "peer_jid": peer_jid,
                 "started": time.time(),
             }
@@ -832,7 +837,7 @@
         iq_elt, jingle_elt = self._buildJingleElt(
             client, session, XEP_0166.A_SESSION_ACCEPT
         )
-        jingle_elt["responder"] = client.jid.full()
+        jingle_elt["responder"] = session['local_jid'].full()
 
         # contents