Mercurial > libervia-backend
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