Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0260.py @ 2138:6e509ee853a8
plugin OTR, core; use of new sendMessage + OTR mini refactoring:
- new client.sendMessage method is used instead of sendMessageToStream
- client.feedback is used in OTR
- OTR now add message processing hints and carbon private element as recommanded by XEP-0364. Explicit Message Encryption is still TODO
- OTR use the new sendMessageFinish trigger, this has a number of advantages:
* there is little risk that OTR is skipped by other plugins (they have to use client.sendMessage as recommanded)
* being at the end of the chain, OTR can check and remove any HTML or other leaking elements
* OTR doesn't have to skip other plugins anymore, this means that things like delivery receipts are now working with OTR
(but because there is not full stanza encryption, they can leak metadata)
* OTR can decide to follow storage hint by letting or deleting "history" key
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 05 Feb 2017 15:00:01 +0100 |
parents | 2daf7b4c6756 |
children | 1d3f73e065e1 |
rev | line source |
---|---|
1934
2daf7b4c6756
use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
1 #!/usr/bin/env python2 |
1560 | 2 # -*- coding: utf-8 -*- |
3 | |
4 # SAT plugin for Jingle (XEP-0260) | |
1766 | 5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org) |
1560 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 from sat.core.i18n import _ | |
21 from sat.core.log import getLogger | |
22 log = getLogger(__name__) | |
23 from sat.core import exceptions | |
24 from wokkel import disco, iwokkel | |
25 from zope.interface import implements | |
26 from twisted.words.xish import domish | |
27 from twisted.words.protocols.jabber import jid | |
28 from twisted.internet import defer | |
29 import uuid | |
30 | |
31 try: | |
32 from twisted.words.protocols.xmlstream import XMPPHandler | |
33 except ImportError: | |
34 from wokkel.subprotocols import XMPPHandler | |
35 | |
36 | |
37 NS_JINGLE_S5B = 'urn:xmpp:jingle:transports:s5b:1' | |
38 | |
39 PLUGIN_INFO = { | |
40 "name": "Jingle SOCKS5 Bytestreams", | |
41 "import_name": "XEP-0260", | |
42 "type": "XEP", | |
43 "protocols": ["XEP-0260"], | |
44 "dependencies": ["XEP-0166", "XEP-0065"], | |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
45 "recommendations": ["XEP-0261"], # needed for fallback |
1560 | 46 "main": "XEP_0260", |
47 "handler": "yes", | |
48 "description": _("""Implementation of Jingle SOCKS5 Bytestreams""") | |
49 } | |
50 | |
51 | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
52 class ProxyError(Exception): |
1756
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
53 |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
54 def __str__(self): |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
55 return "an error happened while trying to use the proxy" |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
56 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
57 |
1560 | 58 class XEP_0260(object): |
59 # TODO: udp handling | |
60 | |
61 def __init__(self, host): | |
62 log.info(_("plugin Jingle SOCKS5 Bytestreams")) | |
63 self.host = host | |
64 self._j = host.plugins["XEP-0166"] # shortcut to access jingle | |
65 self._s5b = host.plugins["XEP-0065"] # and socks5 bytestream | |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
66 try: |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
67 self._jingle_ibb = host.plugins["XEP-0261"] |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
68 except KeyError: |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
69 self._jingle_ibb = None |
1560 | 70 self._j.registerTransport(NS_JINGLE_S5B, self._j.TRANSPORT_STREAMING, self, 100) |
71 | |
72 def getHandler(self, profile): | |
73 return XEP_0260_handler() | |
74 | |
75 def _parseCandidates(self, transport_elt): | |
76 """Parse <candidate> elements | |
77 | |
78 @param transport_elt(domish.Element): parent <transport> element | |
79 @return (list[plugin_xep_0065.Candidate): list of parsed candidates | |
80 """ | |
81 candidates = [] | |
82 for candidate_elt in transport_elt.elements(NS_JINGLE_S5B, 'candidate'): | |
83 try: | |
84 cid = candidate_elt['cid'] | |
85 host = candidate_elt['host'] | |
86 jid_= jid.JID(candidate_elt['jid']) | |
87 port = int(candidate_elt.getAttribute('port', 1080)) | |
88 priority = int(candidate_elt['priority']) | |
89 type_ = candidate_elt.getAttribute('type', self._s5b.TYPE_DIRECT) | |
90 except (KeyError, ValueError): | |
91 raise exceptions.DataError() | |
92 candidate = self._s5b.Candidate(host, port, type_, priority, jid_, cid) | |
93 candidates.append(candidate) | |
94 # self._s5b.registerCandidate(candidate) | |
95 return candidates | |
96 | |
97 def _buildCandidates(self, session, candidates, sid, session_hash, client, mode=None): | |
98 """Build <transport> element with candidates | |
99 | |
100 @param session(dict): jingle session data | |
101 @param candidates(iterator[plugin_xep_0065.Candidate]): iterator of candidates to add | |
102 @param sid(unicode): transport stream id | |
103 @param client: %(doc_client)s | |
104 @param mode(str, None): 'tcp' or 'udp', or None to have no attribute | |
105 @return (domish.Element): parent <transport> element where <candidate> elements must be added | |
106 """ | |
107 proxy = next((candidate for candidate in candidates if candidate.type == self._s5b.TYPE_PROXY), None) | |
108 transport_elt = domish.Element((NS_JINGLE_S5B, "transport")) | |
109 transport_elt['sid'] = sid | |
110 if proxy is not None: | |
111 transport_elt['dstaddr'] = session_hash | |
112 if mode is not None: | |
113 transport_elt['mode'] = 'tcp' # XXX: we only manage tcp for now | |
114 | |
115 for candidate in candidates: | |
116 log.debug(u"Adding candidate: {}".format(candidate)) | |
117 candidate_elt = transport_elt.addElement('candidate', NS_JINGLE_S5B) | |
118 if candidate.id is None: | |
119 candidate.id = unicode(uuid.uuid4()) | |
120 candidate_elt['cid'] = candidate.id | |
121 candidate_elt['host'] = candidate.host | |
122 candidate_elt['jid'] = candidate.jid.full() | |
123 candidate_elt['port'] = unicode(candidate.port) | |
124 candidate_elt['priority'] = unicode(candidate.priority) | |
125 candidate_elt['type'] = candidate.type | |
126 return transport_elt | |
127 | |
128 @defer.inlineCallbacks | |
129 def jingleSessionInit(self, session, content_name, profile): | |
130 client = self.host.getClient(profile) | |
131 content_data = session['contents'][content_name] | |
132 transport_data = content_data['transport_data'] | |
133 sid = transport_data['sid'] = unicode(uuid.uuid4()) | |
1567
268fda4236ca
plugins XE0166, XEP-0234, XEP-0260, XEP-0261: renamed session key managing other peer's jid to "peer_jid" instead of "to_jid"
Goffi <goffi@goffi.org>
parents:
1560
diff
changeset
|
134 session_hash = transport_data['session_hash'] = self._s5b.getSessionHash(client.jid, session['peer_jid'], sid) |
1758
a66d34353f34
plugin XEP-0260, XEP-0065: fixed session hash handling:
Goffi <goffi@goffi.org>
parents:
1757
diff
changeset
|
135 transport_data['peer_session_hash'] = self._s5b.getSessionHash(session['peer_jid'], client.jid, sid) # requester and target are inversed for peer candidates |
1757
abd6d6f89006
plugins XEP-0065, XEP-0260: fixed session creation order: session is created earlied, and file object associated in a second time if needed
Goffi <goffi@goffi.org>
parents:
1756
diff
changeset
|
136 transport_data['stream_d'] = self._s5b.registerHash(session_hash, None, profile) |
1560 | 137 candidates = transport_data['candidates'] = yield self._s5b.getCandidates(profile) |
138 mode = 'tcp' # XXX: we only manage tcp for now | |
139 transport_elt = self._buildCandidates(session, candidates, sid, session_hash, client, mode) | |
140 | |
141 defer.returnValue(transport_elt) | |
142 | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
143 def _proxyActivatedCb(self, iq_result_elt, candidate, session, content_name, profile): |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
144 """Called when activation confirmation has been received from proxy |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
145 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
146 cf XEP-0260 § 2.4 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
147 """ |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
148 # now that the proxy is activated, we have to inform other peer |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
149 iq_elt, transport_elt = self._j.buildAction(self._j.A_TRANSPORT_INFO, session, content_name, profile) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
150 activated_elt = transport_elt.addElement('activated') |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
151 activated_elt['cid'] = candidate.id |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
152 iq_elt.send() |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
153 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
154 def _proxyActivatedEb(self, stanza_error, candidate, session, content_name, profile): |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
155 """Called when activation error has been received from proxy |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
156 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
157 cf XEP-0260 § 2.4 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
158 """ |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
159 # TODO: fallback to IBB |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
160 # now that the proxy is activated, we have to inform other peer |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
161 iq_elt, transport_elt = self._j.buildAction(self._j.A_TRANSPORT_INFO, session, content_name, profile) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
162 transport_elt.addElement('proxy-error') |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
163 iq_elt.send() |
1756
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
164 log.warning(u"Can't activate proxy, we need to fallback to IBB: {reason}" |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
165 .format(reason = stanza_error.value.condition)) |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
166 client = self.host.getClient(profile) |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
167 self.doFallback(session, content_name, client) |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
168 |
1560 | 169 def _foundPeerCandidate(self, candidate, session, transport_data, content_name, client): |
170 """Called when the best candidate from other peer is found | |
171 | |
172 @param candidate(XEP_0065.Candidate, None): selected candidate, | |
173 or None if no candidate is accessible | |
174 @param session(dict): session data | |
175 @param transport_data(dict): transport data | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
176 @param content_name(unicode): name of the current content |
1560 | 177 @param client(unicode): %(doc_client)s |
178 """ | |
179 | |
180 transport_data['best_candidate'] = candidate | |
181 # we need to disconnect all non selected candidates before removing them | |
182 for c in transport_data['peer_candidates']: | |
183 if c is None or c is candidate: | |
184 continue | |
185 c.discard() | |
186 del transport_data['peer_candidates'] | |
187 iq_elt, transport_elt = self._j.buildAction(self._j.A_TRANSPORT_INFO, session, content_name, client.profile) | |
188 if candidate is None: | |
189 log.warning(u"Can't connect to any peer candidate") | |
190 candidate_elt = transport_elt.addElement('candidate-error') | |
191 else: | |
192 log.info(u"Found best peer candidate: {}".format(unicode(candidate))) | |
193 candidate_elt = transport_elt.addElement('candidate-used') | |
194 candidate_elt['cid'] = candidate.id | |
195 iq_elt.send() # TODO: check result stanza | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
196 self._checkCandidates(session, content_name, transport_data, client) |
1560 | 197 |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
198 def _checkCandidates(self, session, content_name, transport_data, client): |
1560 | 199 """Called when a candidate has been choosed |
200 | |
201 if we have both candidates, we select one, or fallback to an other transport | |
202 @param session(dict): session data | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
203 @param content_name(unicode): name of the current content |
1560 | 204 @param transport_data(dict): transport data |
205 @param client(unicode): %(doc_client)s | |
206 """ | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
207 content_data = session['contents'][content_name] |
1560 | 208 try: |
209 best_candidate = transport_data['best_candidate'] | |
210 except KeyError: | |
211 # we have not our best candidate yet | |
212 return | |
213 try: | |
214 peer_best_candidate = transport_data['peer_best_candidate'] | |
215 except KeyError: | |
216 # we have not peer best candidate yet | |
217 return | |
218 | |
219 # at this point we have both candidates, it's time to choose one | |
220 if best_candidate is None or peer_best_candidate is None: | |
221 choosed_candidate = best_candidate or peer_best_candidate | |
222 else: | |
223 if best_candidate.priority == peer_best_candidate.priority: | |
224 # same priority, we choose initiator one according to XEP-0260 §2.4 #4 | |
1758
a66d34353f34
plugin XEP-0260, XEP-0065: fixed session hash handling:
Goffi <goffi@goffi.org>
parents:
1757
diff
changeset
|
225 log.debug(u"Candidates have same priority, we select the one choosed by initiator") |
1560 | 226 if session['initiator'] == client.jid: |
227 choosed_candidate = best_candidate | |
228 else: | |
229 choosed_candidate = peer_best_candidate | |
230 else: | |
231 choosed_candidate = max(best_candidate, peer_best_candidate, key=lambda c:c.priority) | |
232 | |
233 if choosed_candidate is None: | |
234 log.warning(u"Socks5 negociation failed, we need to fallback to IBB") | |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
235 self.doFallback(session, content_name, client) |
1560 | 236 else: |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
237 if choosed_candidate == peer_best_candidate: |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
238 # peer_best_candidate was choosed from the candidates we have sent |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
239 # so our_candidate is true if choosed_candidate is peer_best_candidate |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
240 our_candidate = True |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
241 # than also mean that best_candidate must be discarded ! |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
242 try: |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
243 best_candidate.discard() |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
244 except AttributeError: # but it can be None |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
245 pass |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
246 else: |
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
247 our_candidate = False |
1560 | 248 |
249 log.info(u"Socks5 negociation successful, {who} candidate will be used: {candidate}".format( | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
250 who = u'our' if our_candidate else u'other peer', |
1560 | 251 candidate = choosed_candidate)) |
252 del transport_data['best_candidate'] | |
253 del transport_data['peer_best_candidate'] | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
254 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
255 if choosed_candidate.type == self._s5b.TYPE_PROXY: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
256 # the file transfer need to wait for proxy activation |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
257 # (see XEP-0260 § 2.4) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
258 if our_candidate: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
259 d = self._s5b.connectCandidate(choosed_candidate, transport_data['session_hash'], profile=client.profile) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
260 d.addCallback(lambda dummy: choosed_candidate.activate(transport_data['sid'], session['peer_jid'], client)) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
261 args = [choosed_candidate, session, content_name, client.profile] |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
262 d.addCallbacks(self._proxyActivatedCb, self._proxyActivatedEb, args, None, args) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
263 else: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
264 # this Deferred will be called when we'll receive activation confirmation from other peer |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
265 d = transport_data['activation_d'] = defer.Deferred() |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
266 else: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
267 d = defer.succeed(None) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
268 |
1560 | 269 if content_data['senders'] == session['role']: |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
270 # we can now start the file transfer (or start it after proxy activation) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
271 d.addCallback(lambda dummy: choosed_candidate.startTransfer(transport_data['session_hash'])) |
1756
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
272 d.addErrback(self._startEb, session, content_name, client) |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
273 |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
274 def _startEb(self, fail, session, content_name, client): |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
275 """Called when it's not possible to start the transfer |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
276 |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
277 Will try to fallback to IBB |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
278 """ |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
279 try: |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
280 reason = unicode(fail.value) |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
281 except AttributeError: |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
282 reason = unicode(fail) |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
283 log.warning(u"Cant start transfert, we'll try fallback method: {}".format(reason)) |
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
284 self.doFallback(session, content_name, client) |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
285 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
286 def _candidateInfo(self, candidate_elt, session, content_name, transport_data, client): |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
287 """Called when best candidate has been received from peer (or if none is working) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
288 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
289 @param candidate_elt(domish.Element): candidate-used or candidate-error element |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
290 (see XEP-0260 §2.3) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
291 @param session(dict): session data |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
292 @param content_name(unicode): name of the current content |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
293 @param transport_data(dict): transport data |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
294 @param client(unicode): %(doc_client)s |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
295 """ |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
296 if candidate_elt.name == 'candidate-error': |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
297 # candidate-error, no candidate worked |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
298 transport_data['peer_best_candidate'] = None |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
299 else: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
300 # candidate-used, one candidate was choosed |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
301 try: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
302 cid = candidate_elt.attributes['cid'] |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
303 except KeyError: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
304 log.warning(u"No cid found in <candidate-used>") |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
305 raise exceptions.DataError |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
306 try: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
307 candidate = (c for c in transport_data['candidates'] if c.id == cid).next() |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
308 except StopIteration: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
309 log.warning(u"Given cid doesn't correspond to any known candidate !") |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
310 raise exceptions.DataError # TODO: send an error to other peer, and use better exception |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
311 except KeyError: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
312 # a transport-info can also be intentionaly sent too early by other peer |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
313 # but there is little probability |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
314 log.error(u'"candidates" key doesn\'t exists in transport_data, it should at this point') |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
315 raise exceptions.InternalError |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
316 # at this point we have the candidate choosed by other peer |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
317 transport_data['peer_best_candidate'] = candidate |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
318 log.info(u"Other peer best candidate: {}".format(candidate)) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
319 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
320 del transport_data['candidates'] |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
321 self._checkCandidates(session, content_name, transport_data, client) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
322 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
323 def _proxyActivationInfo(self, proxy_elt, session, content_name, transport_data, client): |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
324 """Called when proxy has been activated (or has sent an error) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
325 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
326 @param proxy_elt(domish.Element): <activated/> or <proxy-error/> element |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
327 (see XEP-0260 §2.4) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
328 @param session(dict): session data |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
329 @param content_name(unicode): name of the current content |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
330 @param transport_data(dict): transport data |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
331 @param client(unicode): %(doc_client)s |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
332 """ |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
333 try: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
334 activation_d = transport_data.pop('activation_d') |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
335 except KeyError: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
336 log.warning(u"Received unexpected transport-info for proxy activation") |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
337 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
338 if proxy_elt.name == 'activated': |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
339 activation_d.callback(None) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
340 else: |
1756
061011fad5b1
plugin XEP-0260: better proxy error handling:
Goffi <goffi@goffi.org>
parents:
1755
diff
changeset
|
341 activation_d.errback(ProxyError()) |
1560 | 342 |
343 @defer.inlineCallbacks | |
344 def jingleHandler(self, action, session, content_name, transport_elt, profile): | |
345 client = self.host.getClient(profile) | |
346 content_data = session['contents'][content_name] | |
347 transport_data = content_data['transport_data'] | |
348 | |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
349 if action in (self._j.A_ACCEPTED_ACK, self._j.A_PREPARE_RESPONDER): |
1560 | 350 pass |
351 | |
352 elif action == self._j.A_SESSION_ACCEPT: | |
353 # initiator side, we select a candidate in the ones sent by responder | |
354 assert 'peer_candidates' not in transport_data | |
355 transport_data['peer_candidates'] = self._parseCandidates(transport_elt) | |
356 | |
357 elif action == self._j.A_START: | |
358 session_hash = transport_data['session_hash'] | |
359 peer_candidates = transport_data['peer_candidates'] | |
360 file_obj = content_data['file_obj'] | |
1757
abd6d6f89006
plugins XEP-0065, XEP-0260: fixed session creation order: session is created earlied, and file object associated in a second time if needed
Goffi <goffi@goffi.org>
parents:
1756
diff
changeset
|
361 self._s5b.associateFileObj(session_hash, file_obj, profile) |
abd6d6f89006
plugins XEP-0065, XEP-0260: fixed session creation order: session is created earlied, and file object associated in a second time if needed
Goffi <goffi@goffi.org>
parents:
1756
diff
changeset
|
362 stream_d = transport_data.pop('stream_d') |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
363 stream_d.chainDeferred(content_data['finished_d']) |
1758
a66d34353f34
plugin XEP-0260, XEP-0065: fixed session hash handling:
Goffi <goffi@goffi.org>
parents:
1757
diff
changeset
|
364 peer_session_hash = transport_data['peer_session_hash'] |
a66d34353f34
plugin XEP-0260, XEP-0065: fixed session hash handling:
Goffi <goffi@goffi.org>
parents:
1757
diff
changeset
|
365 d = self._s5b.getBestCandidate(peer_candidates, session_hash, peer_session_hash, profile) |
1560 | 366 d.addCallback(self._foundPeerCandidate, session, transport_data, content_name, client) |
367 | |
368 elif action == self._j.A_SESSION_INITIATE: | |
369 # responder side, we select a candidate in the ones sent by initiator | |
370 # and we give our candidates | |
371 assert 'peer_candidates' not in transport_data | |
372 sid = transport_data['sid'] = transport_elt['sid'] | |
1758
a66d34353f34
plugin XEP-0260, XEP-0065: fixed session hash handling:
Goffi <goffi@goffi.org>
parents:
1757
diff
changeset
|
373 session_hash = transport_data['session_hash'] = self._s5b.getSessionHash(client.jid, session['peer_jid'], sid) |
a66d34353f34
plugin XEP-0260, XEP-0065: fixed session hash handling:
Goffi <goffi@goffi.org>
parents:
1757
diff
changeset
|
374 peer_session_hash = transport_data['peer_session_hash'] = self._s5b.getSessionHash(session['peer_jid'], client.jid, sid) # requester and target are inversed for peer candidates |
1560 | 375 peer_candidates = transport_data['peer_candidates'] = self._parseCandidates(transport_elt) |
376 file_obj = content_data['file_obj'] | |
377 stream_d = self._s5b.registerHash(session_hash, file_obj, profile) | |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1570
diff
changeset
|
378 stream_d.chainDeferred(content_data['finished_d']) |
1758
a66d34353f34
plugin XEP-0260, XEP-0065: fixed session hash handling:
Goffi <goffi@goffi.org>
parents:
1757
diff
changeset
|
379 d = self._s5b.getBestCandidate(peer_candidates, session_hash, peer_session_hash, profile) |
1560 | 380 d.addCallback(self._foundPeerCandidate, session, transport_data, content_name, client) |
381 candidates = yield self._s5b.getCandidates(profile) | |
382 # we remove duplicate candidates | |
383 candidates = [candidate for candidate in candidates if candidate not in peer_candidates] | |
384 | |
385 transport_data['candidates'] = candidates | |
386 # we can now build a new <transport> element with our candidates | |
387 transport_elt = self._buildCandidates(session, candidates, sid, session_hash, client) | |
388 | |
389 elif action == self._j.A_TRANSPORT_INFO: | |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
390 # transport-info can be about candidate or proxy activation |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
391 candidate_elt = None |
1560 | 392 |
1570
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
393 for method, names in ((self._candidateInfo, ('candidate-used', 'candidate-error')), |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
394 (self._proxyActivationInfo, ('activated', 'proxy-error'))): |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
395 for name in names: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
396 try: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
397 candidate_elt = transport_elt.elements(NS_JINGLE_S5B, name).next() |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
398 except StopIteration: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
399 continue |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
400 else: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
401 method(candidate_elt, session, content_name, transport_data, client) |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
402 break |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
403 |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
404 if candidate_elt is None: |
37d4be4a9fed
plugins XEP-0260, XEP-0065: proxy handling:
Goffi <goffi@goffi.org>
parents:
1567
diff
changeset
|
405 log.warning(u"Unexpected transport element: {}".format(transport_elt.toXml())) |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
406 elif action == self._j.A_DESTROY: |
1758
a66d34353f34
plugin XEP-0260, XEP-0065: fixed session hash handling:
Goffi <goffi@goffi.org>
parents:
1757
diff
changeset
|
407 # the transport is replaced (fallback ?), We need mainly to kill XEP-0065 session. |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
408 # note that sid argument is not necessary for sessions created by this plugin |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
409 self._s5b.killSession(None, transport_data['session_hash'], None, client) |
1560 | 410 else: |
411 log.warning(u"FIXME: unmanaged action {}".format(action)) | |
412 | |
413 defer.returnValue(transport_elt) | |
414 | |
1755
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
415 def jingleTerminate(self, action, session, content_name, reason_elt, profile): |
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
416 if reason_elt.decline: |
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
417 log.debug(u"Session declined, deleting S5B session") |
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
418 # we just need to clean the S5B session if it is declined |
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
419 client = self.host.getClient(profile) |
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
420 content_data = session['contents'][content_name] |
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
421 transport_data = content_data['transport_data'] |
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
422 self._s5b.killSession(None, transport_data['session_hash'], None, client) |
d2e023da2983
plugin XEP-0260: kill s5b session if session is declined
Goffi <goffi@goffi.org>
parents:
1631
diff
changeset
|
423 |
1631
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
424 def _doFallback(self, feature_checked, session, content_name, client): |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
425 """Do the fallback, method called once feature is checked |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
426 |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
427 @param feature_checked(bool): True if other peer can do IBB |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
428 """ |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
429 if not feature_checked: |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
430 log.warning(u"Other peer can't manage jingle IBB, be have to terminate the session") |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
431 self._j.terminate(self._j.REASON_CONNECTIVITY_ERROR, session, client.profile) |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
432 else: |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
433 self._j.transportReplace(self._jingle_ibb.NAMESPACE, session, content_name, client.profile) |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
434 |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
435 def doFallback(self, session, content_name, client): |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
436 """Fallback to IBB transport, used in last resort |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
437 |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
438 @param session(dict): session data |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
439 @param content_name(unicode): name of the current content |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
440 @param client(unicode): %(doc_client)s |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
441 """ |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
442 if session['role'] != self._j.ROLE_INITIATOR: |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
443 # only initiator must do the fallback, see XEP-0260 §3 |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
444 return |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
445 if self._jingle_ibb is None: |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
446 log.warning(u"Jingle IBB (XEP-0261) plugin is not available, we have to close the session") |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
447 self._j.terminate(self._j.REASON_CONNECTIVITY_ERROR, session, client.profile) |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
448 else: |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
449 d = self.host.hasFeature(self._jingle_ibb.NAMESPACE, session['peer_jid'], client.profile) |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
450 d.addCallback(self._doFallback, session, content_name, client) |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
451 return d |
25906c0dbc63
plugin XEP-0260, XEP-0261: fallback from S5B to IBB is implemented
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
452 |
1560 | 453 |
454 class XEP_0260_handler(XMPPHandler): | |
455 implements(iwokkel.IDisco) | |
456 | |
457 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): | |
458 return [disco.DiscoFeature(NS_JINGLE_S5B)] | |
459 | |
460 def getDiscoItems(self, requestor, target, nodeIdentifier=''): | |
461 return [] |