Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0065.py @ 424:72c13313b6d6
bridge: added check that synchronous method does not return a deferred
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 07 Nov 2011 22:27:07 +0100 |
parents | c513328ade9d |
children | cf005701624b |
rev | line source |
---|---|
0 | 1 #!/usr/bin/python |
2 #-*- coding: utf-8 -*- | |
3 """ | |
4 SAT plugin for managing xep-0065 | |
5 | |
6 Copyright (C) | |
251
dbe1803eca7c
minor copyright update, date format harmonisation
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
7 2002, 2003, 2004 Dave Smith (dizzyd@jabber.org) |
dbe1803eca7c
minor copyright update, date format harmonisation
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
8 2007, 2008 Fabio Forno (xmpp:ff@jabber.bluendo.com) |
dbe1803eca7c
minor copyright update, date format harmonisation
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
9 2009, 2010, 2011 Jérôme Poisson (goffi@goffi.org) |
0 | 10 |
11 This program is free software: you can redistribute it and/or modify | |
12 it under the terms of the GNU General Public License as published by | |
13 the Free Software Foundation, either version 3 of the License, or | |
14 (at your option) any later version. | |
15 | |
16 This program is distributed in the hope that it will be useful, | |
17 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 GNU General Public License for more details. | |
20 | |
21 You should have received a copy of the GNU General Public License | |
22 along with this program. If not, see <http://www.gnu.org/licenses/>. | |
23 | |
24 -- | |
25 | |
26 This program is based on proxy65 (http://code.google.com/p/proxy65), | |
27 originaly written by David Smith and modified by Fabio Forno. | |
28 It is sublicensed under GPL v3 (or any later version) as allowed by the original | |
29 license. | |
30 | |
31 -- | |
32 | |
33 Here is a copy of the original license: | |
34 | |
35 Copyright (C) | |
36 2002-2004 Dave Smith (dizzyd@jabber.org) | |
37 2007-2008 Fabio Forno (xmpp:ff@jabber.bluendo.com) | |
38 | |
39 Permission is hereby granted, free of charge, to any person obtaining a copy | |
40 of this software and associated documentation files (the "Software"), to deal | |
41 in the Software without restriction, including without limitation the rights | |
42 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
43 copies of the Software, and to permit persons to whom the Software is | |
44 furnished to do so, subject to the following conditions: | |
45 | |
46 The above copyright notice and this permission notice shall be included in | |
47 all copies or substantial portions of the Software. | |
48 | |
49 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
50 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
51 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
52 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
53 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
54 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
55 THE SOFTWARE. | |
56 """ | |
57 | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
58 from logging import debug, info, warning, error |
0 | 59 from twisted.internet import protocol, reactor |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
60 from twisted.internet import error as jab_error |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
61 from twisted.words.protocols.jabber import client, jid |
0 | 62 from twisted.protocols.basic import FileSender |
63 from twisted.words.xish import domish | |
20
fc8c202cda87
refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
64 from twisted.web.client import getPage |
0 | 65 import struct |
20
fc8c202cda87
refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
66 import urllib |
0 | 67 import hashlib, pdb |
68 | |
15
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
69 from zope.interface import implements |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
70 |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
71 try: |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
72 from twisted.words.protocols.xmlstream import XMPPHandler |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
73 except ImportError: |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
74 from wokkel.subprotocols import XMPPHandler |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
75 |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
76 from wokkel import disco, iwokkel |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
77 |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
78 IQ_SET = '/iq[@type="set"]' |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
79 NS_BS = 'http://jabber.org/protocol/bytestreams' |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
80 BS_REQUEST = IQ_SET + '/query[@xmlns="' + NS_BS + '"]' |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
81 TIMEOUT = 60 #timeout for workflow |
15
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
82 |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
83 |
0 | 84 |
85 PLUGIN_INFO = { | |
86 "name": "XEP 0065 Plugin", | |
291 | 87 "import_name": "XEP-0065", |
0 | 88 "type": "XEP", |
48 | 89 "protocols": ["XEP-0065"], |
0 | 90 "main": "XEP_0065", |
64 | 91 "handler": "yes", |
69 | 92 "description": _("""Implementation of SOCKS5 Bytestreams""") |
0 | 93 } |
94 | |
95 STATE_INITIAL = 0 | |
96 STATE_AUTH = 1 | |
97 STATE_REQUEST = 2 | |
98 STATE_READY = 3 | |
99 STATE_AUTH_USERPASS = 4 | |
100 STATE_TARGET_INITIAL = 5 | |
101 STATE_TARGET_AUTH = 6 | |
102 STATE_TARGET_REQUEST = 7 | |
103 STATE_TARGET_READY = 8 | |
104 STATE_LAST = 9 | |
105 | |
106 STATE_CONNECT_PENDING = STATE_LAST + 1 | |
107 | |
108 SOCKS5_VER = 0x05 | |
109 | |
110 ADDR_IPV4 = 0x01 | |
111 ADDR_DOMAINNAME = 0x03 | |
112 ADDR_IPV6 = 0x04 | |
113 | |
114 CMD_CONNECT = 0x01 | |
115 CMD_BIND = 0x02 | |
116 CMD_UDPASSOC = 0x03 | |
117 | |
118 AUTHMECH_ANON = 0x00 | |
119 AUTHMECH_USERPASS = 0x02 | |
120 AUTHMECH_INVALID = 0xFF | |
121 | |
122 REPLY_SUCCESS = 0x00 | |
123 REPLY_GENERAL_FAILUR = 0x01 | |
124 REPLY_CONN_NOT_ALLOWED = 0x02 | |
125 REPLY_NETWORK_UNREACHABLE = 0x03 | |
126 REPLY_HOST_UNREACHABLE = 0x04 | |
127 REPLY_CONN_REFUSED = 0x05 | |
128 REPLY_TTL_EXPIRED = 0x06 | |
129 REPLY_CMD_NOT_SUPPORTED = 0x07 | |
130 REPLY_ADDR_NOT_SUPPORTED = 0x08 | |
131 | |
132 | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
133 def calculateHash(from_jid, to_jid, sid): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
134 """Calculate SHA1 Hash according to XEP-0065 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
135 @param from_jid: jid of the requester |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
136 @param to_jid: jid of the target |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
137 @param sid: session id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
138 @return: hash (string)""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
139 return hashlib.sha1((sid + from_jid.full() + to_jid.full()).encode('utf-8')).hexdigest() |
0 | 140 |
141 | |
142 | |
143 class SOCKSv5(protocol.Protocol, FileSender): | |
144 def __init__(self): | |
69 | 145 debug(_("Protocol init")) |
0 | 146 self.state = STATE_INITIAL |
147 self.buf = "" | |
148 self.supportedAuthMechs = [ AUTHMECH_ANON ] | |
149 self.supportedAddrs = [ ADDR_DOMAINNAME ] | |
150 self.enabledCommands = [ CMD_CONNECT ] | |
151 self.peersock = None | |
152 self.addressType = 0 | |
153 self.requestType = 0 | |
154 | |
155 def _startNegotiation(self): | |
156 debug("_startNegotiation") | |
157 self.state = STATE_TARGET_AUTH | |
158 self.transport.write(struct.pack('!3B', SOCKS5_VER, 1, AUTHMECH_ANON)) | |
159 | |
160 def _parseNegotiation(self): | |
161 debug("_parseNegotiation") | |
162 try: | |
163 # Parse out data | |
164 ver, nmethod = struct.unpack('!BB', self.buf[:2]) | |
165 methods = struct.unpack('%dB' % nmethod, self.buf[2:nmethod+2]) | |
166 | |
167 # Ensure version is correct | |
168 if ver != 5: | |
169 self.transport.write(struct.pack('!BB', SOCKS5_VER, AUTHMECH_INVALID)) | |
170 self.transport.loseConnection() | |
171 return | |
172 | |
173 # Trim off front of the buffer | |
174 self.buf = self.buf[nmethod+2:] | |
175 | |
176 # Check for supported auth mechs | |
177 for m in self.supportedAuthMechs: | |
178 if m in methods: | |
179 # Update internal state, according to selected method | |
180 if m == AUTHMECH_ANON: | |
181 self.state = STATE_REQUEST | |
182 elif m == AUTHMECH_USERPASS: | |
183 self.state = STATE_AUTH_USERPASS | |
184 # Complete negotiation w/ this method | |
185 self.transport.write(struct.pack('!BB', SOCKS5_VER, m)) | |
186 return | |
187 | |
188 # No supported mechs found, notify client and close the connection | |
189 self.transport.write(struct.pack('!BB', SOCKS5_VER, AUTHMECH_INVALID)) | |
190 self.transport.loseConnection() | |
191 except struct.error: | |
192 pass | |
193 | |
194 def _parseUserPass(self): | |
195 debug("_parseUserPass") | |
196 try: | |
197 # Parse out data | |
198 ver, ulen = struct.unpack('BB', self.buf[:2]) | |
199 uname, = struct.unpack('%ds' % ulen, self.buf[2:ulen + 2]) | |
200 plen, = struct.unpack('B', self.buf[ulen + 2]) | |
201 password, = struct.unpack('%ds' % plen, self.buf[ulen + 3:ulen + 3 + plen]) | |
202 # Trim off fron of the buffer | |
203 self.buf = self.buf[3 + ulen + plen:] | |
204 # Fire event to authenticate user | |
205 if self.authenticateUserPass(uname, password): | |
206 # Signal success | |
207 self.state = STATE_REQUEST | |
208 self.transport.write(struct.pack('!BB', SOCKS5_VER, 0x00)) | |
209 else: | |
210 # Signal failure | |
211 self.transport.write(struct.pack('!BB', SOCKS5_VER, 0x01)) | |
212 self.transport.loseConnection() | |
213 except struct.error: | |
214 pass | |
215 | |
216 def sendErrorReply(self, errorcode): | |
217 debug("sendErrorReply") | |
218 # Any other address types are not supported | |
219 result = struct.pack('!BBBBIH', SOCKS5_VER, errorcode, 0, 1, 0, 0) | |
220 self.transport.write(result) | |
221 self.transport.loseConnection() | |
222 | |
223 def _parseRequest(self): | |
224 debug("_parseRequest") | |
225 try: | |
226 # Parse out data and trim buffer accordingly | |
227 ver, cmd, rsvd, self.addressType = struct.unpack('!BBBB', self.buf[:4]) | |
228 | |
229 # Ensure we actually support the requested address type | |
230 if self.addressType not in self.supportedAddrs: | |
231 self.sendErrorReply(REPLY_ADDR_NOT_SUPPORTED) | |
232 return | |
233 | |
234 # Deal with addresses | |
235 if self.addressType == ADDR_IPV4: | |
236 addr, port = struct.unpack('!IH', self.buf[4:10]) | |
237 self.buf = self.buf[10:] | |
238 elif self.addressType == ADDR_DOMAINNAME: | |
239 nlen = ord(self.buf[4]) | |
240 addr, port = struct.unpack('!%dsH' % nlen, self.buf[5:]) | |
241 self.buf = self.buf[7 + len(addr):] | |
242 else: | |
243 # Any other address types are not supported | |
244 self.sendErrorReply(REPLY_ADDR_NOT_SUPPORTED) | |
245 return | |
246 | |
247 # Ensure command is supported | |
248 if cmd not in self.enabledCommands: | |
249 # Send a not supported error | |
250 self.sendErrorReply(REPLY_CMD_NOT_SUPPORTED) | |
251 return | |
252 | |
253 # Process the command | |
254 if cmd == CMD_CONNECT: | |
255 self.connectRequested(addr, port) | |
256 elif cmd == CMD_BIND: | |
257 self.bindRequested(addr, port) | |
258 else: | |
259 # Any other command is not supported | |
260 self.sendErrorReply(REPLY_CMD_NOT_SUPPORTED) | |
261 | |
262 except struct.error, why: | |
263 return None | |
264 | |
265 def _makeRequest(self): | |
266 debug("_makeRequest") | |
267 self.state = STATE_TARGET_REQUEST | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
268 sha1 = calculateHash(self.data["from"], self.data["to"], self.sid) |
0 | 269 request = struct.pack('!5B%dsH' % len(sha1), SOCKS5_VER, CMD_CONNECT, 0, ADDR_DOMAINNAME, len(sha1), sha1, 0) |
270 self.transport.write(request) | |
271 | |
272 def _parseRequestReply(self): | |
273 debug("_parseRequestReply") | |
274 try: | |
275 ver, rep, rsvd, self.addressType = struct.unpack('!BBBB', self.buf[:4]) | |
276 # Ensure we actually support the requested address type | |
277 if self.addressType not in self.supportedAddrs: | |
278 self.sendErrorReply(REPLY_ADDR_NOT_SUPPORTED) | |
279 return | |
280 | |
281 # Deal with addresses | |
282 if self.addressType == ADDR_IPV4: | |
283 addr, port = struct.unpack('!IH', self.buf[4:10]) | |
284 self.buf = self.buf[10:] | |
285 elif self.addressType == ADDR_DOMAINNAME: | |
286 nlen = ord(self.buf[4]) | |
287 addr, port = struct.unpack('!%dsH' % nlen, self.buf[5:]) | |
288 self.buf = self.buf[7 + len(addr):] | |
289 else: | |
290 # Any other address types are not supported | |
291 self.sendErrorReply(REPLY_ADDR_NOT_SUPPORTED) | |
292 return | |
293 | |
294 # Ensure reply is OK | |
295 if rep != REPLY_SUCCESS: | |
296 self.loseConnection() | |
297 return | |
298 | |
398 | 299 if self.factory.proxy: |
300 self.state = STATE_READY | |
301 self.factory.activateCb(self.sid, self.factory.iq_id, self.startTransfer) | |
302 else: | |
303 self.state = STATE_TARGET_READY | |
304 self.factory.activateCb(self.sid, self.factory.iq_id) | |
0 | 305 |
306 except struct.error, why: | |
307 return None | |
308 | |
309 def connectionMade(self): | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
310 debug("connectionMade (mode = %s)" % "requester" if isinstance(self.factory, Socks5ServerFactory) else "target") |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
311 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
312 if isinstance(self.factory, Socks5ClientFactory): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
313 self.sid = self.factory.sid |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
314 self.data = self.factory.data |
0 | 315 self.state = STATE_TARGET_INITIAL |
316 self._startNegotiation() | |
317 | |
318 def connectRequested(self, addr, port): | |
69 | 319 debug("connectRequested") |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
320 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
321 # Check that this session if expected |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
322 if not self.factory.hash_sid_map.has_key(addr): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
323 #no: we refuse it |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
324 self.sendErrorReply(socks5.REPLY_CONN_REFUSED) |
0 | 325 return |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
326 self.sid = self.factory.hash_sid_map[addr] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
327 self.factory.current_stream[self.sid]["start_transfer_cb"] = self.startTransfer |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
328 self.connectCompleted(addr, 0) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
329 self.transport.stopReading() |
0 | 330 |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
331 def startTransfer(self, file_obj): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
332 """Callback called when the result iq is received""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
333 d = self.beginFileTransfer(file_obj, self.transport) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
334 d.addCallback(self.fileTransfered) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
335 |
0 | 336 def fileTransfered(self, d): |
69 | 337 info(_("File transfer completed, closing connection")) |
0 | 338 self.transport.loseConnection() |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
339 self.factory.finishedCb(self.sid, True) |
0 | 340 |
341 def connectCompleted(self, remotehost, remoteport): | |
342 debug("connectCompleted") | |
343 if self.addressType == ADDR_IPV4: | |
344 result = struct.pack('!BBBBIH', SOCKS5_VER, REPLY_SUCCESS, 0, 1, remotehost, remoteport) | |
345 elif self.addressType == ADDR_DOMAINNAME: | |
346 result = struct.pack('!BBBBB%dsH' % len(remotehost), SOCKS5_VER, REPLY_SUCCESS, 0, | |
347 ADDR_DOMAINNAME, len(remotehost), remotehost, remoteport) | |
348 self.transport.write(result) | |
349 self.state = STATE_READY | |
350 | |
351 def bindRequested(self, addr, port): | |
352 pass | |
353 | |
354 def authenticateUserPass(self, user, passwd): | |
355 debug("User/pass: %s/%s", user, passwd) | |
356 return True | |
357 | |
358 def dataReceived(self, buf): | |
359 if self.state == STATE_TARGET_READY: | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
360 self.data["file_obj"].write(buf) |
0 | 361 return |
362 | |
363 self.buf = self.buf + buf | |
364 if self.state == STATE_INITIAL: | |
365 self._parseNegotiation() | |
366 if self.state == STATE_AUTH_USERPASS: | |
367 self._parseUserPass() | |
368 if self.state == STATE_REQUEST: | |
369 self._parseRequest() | |
370 if self.state == STATE_TARGET_AUTH: | |
371 ver, method = struct.unpack('!BB', buf) | |
372 self.buf = self.buf[2:] | |
373 if ver!=SOCKS5_VER or method!=AUTHMECH_ANON: | |
374 self.transport.loseConnection() | |
375 else: | |
376 self._makeRequest() | |
377 if self.state == STATE_TARGET_REQUEST: | |
378 self._parseRequestReply() | |
379 | |
380 | |
381 def clientConnectionLost(self, reason): | |
382 debug("clientConnectionLost") | |
383 self.transport.loseConnection() | |
384 | |
385 def connectionLost(self, reason): | |
386 debug("connectionLost") | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
387 if self.state != STATE_CONNECT_PENDING: |
0 | 388 self.transport.unregisterProducer() |
389 if self.peersock != None: | |
390 self.peersock.peersock = None | |
391 self.peersock.transport.unregisterProducer() | |
392 self.peersock = None | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
393 |
0 | 394 |
395 class Socks5ServerFactory(protocol.ServerFactory): | |
396 protocol = SOCKSv5 | |
397 | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
398 def __init__(self, current_stream, hash_sid_map, finishedCb): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
399 self.current_stream = current_stream |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
400 self.hash_sid_map = hash_sid_map |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
401 self.finishedCb = finishedCb |
0 | 402 |
403 def startedConnecting(self, connector): | |
69 | 404 debug (_("Socks 5 server connection started")) |
0 | 405 |
406 def clientConnectionLost(self, connector, reason): | |
69 | 407 debug (_("Socks 5 server connection lost (reason: %s)"), reason) |
0 | 408 |
409 class Socks5ClientFactory(protocol.ClientFactory): | |
410 protocol = SOCKSv5 | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
411 |
398 | 412 def __init__(self, current_stream, sid, iq_id, activateCb, finishedCb, proxy=False): |
413 """Init the Client Factory | |
414 @param current_stream: current streams data | |
415 @param sid: Session ID | |
416 @param iq_id: iq id used to initiate the stream | |
417 @param activateCb: method to call to activate the stream | |
418 @param finishedCb: method to call when the stream session is finished | |
419 @param proxy: True if we are connecting throught a proxy (and we are a requester)""" | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
420 self.data = current_stream[sid] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
421 self.sid = sid |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
422 self.iq_id = iq_id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
423 self.activateCb = activateCb |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
424 self.finishedCb = finishedCb |
398 | 425 self.proxy = proxy |
0 | 426 |
427 def startedConnecting(self, connector): | |
69 | 428 debug (_("Socks 5 client connection started")) |
0 | 429 |
430 def clientConnectionLost(self, connector, reason): | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
431 debug (_("Socks 5 client connection lost")) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
432 self.finishedCb(self.sid, reason.type == jab_error.ConnectionDone) #TODO: really check if the state is actually successful |
0 | 433 |
434 | |
64 | 435 class XEP_0065(): |
15
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
436 |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
437 NAMESPACE = NS_BS |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
438 |
19
f2a745ca0fbc
refactoring: using xml params part III (parameters import)
Goffi <goffi@goffi.org>
parents:
15
diff
changeset
|
439 params = """ |
f2a745ca0fbc
refactoring: using xml params part III (parameters import)
Goffi <goffi@goffi.org>
parents:
15
diff
changeset
|
440 <params> |
60
9764e027ecc0
SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
441 <general> |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
442 <category name="File Transfer"> |
20
fc8c202cda87
refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
443 <param name="IP" value='0.0.0.0' default_cb='yes' type="string" /> |
19
f2a745ca0fbc
refactoring: using xml params part III (parameters import)
Goffi <goffi@goffi.org>
parents:
15
diff
changeset
|
444 <param name="Port" value="28915" type="string" /> |
f2a745ca0fbc
refactoring: using xml params part III (parameters import)
Goffi <goffi@goffi.org>
parents:
15
diff
changeset
|
445 </category> |
60
9764e027ecc0
SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
446 </general> |
398 | 447 <individual> |
448 <category name="File Transfer"> | |
449 <param name="Proxy" value="" type="string" /> | |
450 <param name="Proxy host" value="" type="string" /> | |
451 <param name="Proxy port" value="" type="string" /> | |
452 </category> | |
453 </individual> | |
19
f2a745ca0fbc
refactoring: using xml params part III (parameters import)
Goffi <goffi@goffi.org>
parents:
15
diff
changeset
|
454 </params> |
f2a745ca0fbc
refactoring: using xml params part III (parameters import)
Goffi <goffi@goffi.org>
parents:
15
diff
changeset
|
455 """ |
20
fc8c202cda87
refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
456 |
0 | 457 def __init__(self, host): |
69 | 458 info(_("Plugin XEP_0065 initialization")) |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
459 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
460 #session data |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
461 self.current_stream = {} #key: stream_id, value: data(dict) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
462 self.hash_sid_map = {} #key: hash of the transfer session, value: session id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
463 |
0 | 464 self.host = host |
69 | 465 debug(_("registering")) |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
466 self.server_factory = Socks5ServerFactory(self.current_stream, self.hash_sid_map, self._killId) |
21
633c5ed65701
parameters: new button type (not finished)
Goffi <goffi@goffi.org>
parents:
20
diff
changeset
|
467 |
633c5ed65701
parameters: new button type (not finished)
Goffi <goffi@goffi.org>
parents:
20
diff
changeset
|
468 #parameters |
38 | 469 host.memory.importParams(XEP_0065.params) |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
470 host.memory.setDefault("IP", "File Transfer", self.getExternalIP) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
471 port = int(self.host.memory.getParamA("Port", "File Transfer")) |
21
633c5ed65701
parameters: new button type (not finished)
Goffi <goffi@goffi.org>
parents:
20
diff
changeset
|
472 |
69 | 473 info(_("Launching Socks5 Stream server on port %d"), port) |
0 | 474 reactor.listenTCP(port, self.server_factory) |
15
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
475 |
72 | 476 def getHandler(self, profile): |
64 | 477 return XEP_0065_handler(self) |
478 | |
20
fc8c202cda87
refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
479 def getExternalIP(self): |
fc8c202cda87
refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
480 """Return IP visible from outside, by asking to a website""" |
fc8c202cda87
refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
481 return getPage("http://www.goffi.org/sat_tools/get_ip.php") |
0 | 482 |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
483 def getProgress(self, sid, data): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
484 """Fill data with position of current transfer""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
485 try: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
486 file_obj = self.current_stream[sid]["file_obj"] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
487 data["position"] = str(file_obj.tell()) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
488 data["size"] = str(self.current_stream[sid]["size"]) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
489 except: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
490 pass |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
491 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
492 def _timeOut(self, sid): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
493 """Delecte current_stream id, called after timeout |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
494 @param id: id of self.current_stream""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
495 info(_("Socks5 Bytestream: TimeOut reached for id %s") % sid); |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
496 self._killId(sid, False, "TIMEOUT") |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
497 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
498 def _killId(self, sid, success=False, failure_reason="UNKNOWN"): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
499 """Delete an current_stream id, clean up associated observers |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
500 @param sid: id of self.current_stream""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
501 if not self.current_stream.has_key(sid): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
502 warning(_("kill id called on a non existant id")) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
503 return |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
504 if self.current_stream[sid].has_key("observer_cb"): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
505 xmlstream = self.current_stream[sid]["xmlstream"] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
506 xmlstream.removeObserver(self.current_stream[sid]["event_data"], self.current_stream[sid]["observer_cb"]) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
507 if self.current_stream[sid]['timer'].active(): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
508 self.current_stream[sid]['timer'].cancel() |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
509 if self.current_stream[sid].has_key("size"): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
510 self.host.removeProgressCB(sid) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
511 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
512 file_obj = self.current_stream[sid]['file_obj'] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
513 success_cb = self.current_stream[sid]['success_cb'] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
514 failure_cb = self.current_stream[sid]['failure_cb'] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
515 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
516 del self.current_stream[sid] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
517 if self.hash_sid_map.has_key(sid): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
518 del self.hash_sid_map[sid] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
519 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
520 if success: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
521 success_cb(sid, file_obj, NS_BS) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
522 else: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
523 failure_cb(sid, file_obj, NS_BS, failure_reason) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
524 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
525 def startStream(self, file_obj, to_jid, sid, length, successCb, failureCb, size = None, profile='@NONE@'): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
526 """Launch the stream workflow |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
527 @param file_obj: file_obj to send |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
528 @param to_jid: JID of the recipient |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
529 @param sid: Stream session id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
530 @param length: number of byte to send, or None to send until the end |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
531 @param successCb: method to call when stream successfuly finished |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
532 @param failureCb: method to call when something goes wrong |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
533 @param profile: %(doc_profile)s""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
534 if length != None: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
535 error(_('stream length not managed yet')) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
536 return; |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
537 profile_jid, xmlstream = self.host.getJidNStream(profile) |
398 | 538 if not profile_jid or not xmlstream: |
539 error(_("Unknown profile, this should not happen")) | |
540 return; | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
541 data = self.current_stream[sid] = {} |
398 | 542 data["profile"] = profile |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
543 data["timer"] = reactor.callLater(TIMEOUT, self._timeOut, sid) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
544 data["file_obj"] = file_obj |
398 | 545 data["from"] = profile_jid |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
546 data["to"] = to_jid |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
547 data["success_cb"] = successCb |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
548 data["failure_cb"] = failureCb |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
549 data["xmlstream"] = xmlstream |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
550 data["hash"] = calculateHash(profile_jid, to_jid, sid) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
551 self.hash_sid_map[data["hash"]] = sid |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
552 if size: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
553 data["size"] = size |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
554 self.host.registerProgressCB(sid, self.getProgress) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
555 iq_elt = client.IQ(xmlstream,'set') |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
556 iq_elt["from"] = profile_jid.full() |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
557 iq_elt["to"] = to_jid.full() |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
558 query_elt = iq_elt.addElement('query', NS_BS) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
559 query_elt['mode'] = 'tcp' |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
560 query_elt['sid'] = sid |
398 | 561 #first streamhost: direct connection |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
562 streamhost = query_elt.addElement('streamhost') |
398 | 563 streamhost['host'] = self.host.memory.getParamA("IP", "File Transfer") |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
564 streamhost['port'] = self.host.memory.getParamA("Port", "File Transfer") |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
565 streamhost['jid'] = profile_jid.full() |
398 | 566 |
567 #second streamhost: mediated connection, using proxy | |
568 streamhost = query_elt.addElement('streamhost') | |
569 streamhost['host'] = self.host.memory.getParamA("Proxy host", "File Transfer", profile_key=profile) | |
570 streamhost['port'] = self.host.memory.getParamA("Proxy port", "File Transfer", profile_key=profile) | |
571 streamhost['jid'] = self.host.memory.getParamA("Proxy", "File Transfer", profile_key=profile) | |
572 | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
573 iq_elt.addCallback(self.iqResult, sid) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
574 iq_elt.send() |
0 | 575 |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
576 def iqResult(self, sid, iq_elt): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
577 """Called when the result of open iq is received""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
578 if iq_elt["type"] == "error": |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
579 warning(_("Transfer failed")) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
580 return |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
581 |
398 | 582 try: |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
583 data = self.current_stream[sid] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
584 file_obj = data["file_obj"] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
585 timer = data["timer"] |
398 | 586 profile = data["profile"] |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
587 except KeyError: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
588 error(_("Internal error, can't do transfer")) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
589 return |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
590 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
591 if timer.active(): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
592 timer.cancel() |
398 | 593 |
594 profile_jid, xmlstream = self.host.getJidNStream(profile) | |
595 query_elt = iq_elt.firstChildElement() | |
596 streamhost_elts = filter(lambda elt: elt.name == 'streamhost-used', query_elt.elements()) | |
597 if not streamhost_elts: | |
598 warning(_("No streamhost found in stream query")) | |
599 return | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
600 |
398 | 601 streamhost_jid = streamhost_elts[0]['jid'] |
602 if streamhost_jid != profile_jid.full(): | |
603 debug(_("A proxy server is used")) | |
604 proxy_host = self.host.memory.getParamA("Proxy host", "File Transfer", profile_key=profile) | |
605 proxy_port = self.host.memory.getParamA("Proxy port", "File Transfer", profile_key=profile) | |
606 proxy_jid = self.host.memory.getParamA("Proxy", "File Transfer", profile_key=profile) | |
607 if proxy_jid != streamhost_jid: | |
608 warning(_("Proxy jid is not the same as in parameters, this should not happen")) | |
609 return | |
610 factory = Socks5ClientFactory(self.current_stream, sid, None, self.activateProxyStream, self._killId, True) | |
611 reactor.connectTCP(proxy_host, int(proxy_port), factory) | |
612 else: | |
613 data["start_transfer_cb"](file_obj) #We now activate the stream | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
614 |
398 | 615 def activateProxyStream(self, sid, iq_id, start_transfer_cb): |
616 debug(_("activating stream")) | |
617 data = self.current_stream[sid] | |
618 profile = data['profile'] | |
619 profile_jid, xmlstream = self.host.getJidNStream(profile) | |
620 | |
621 iq_elt = client.IQ(xmlstream,'set') | |
622 iq_elt["from"] = profile_jid.full() | |
623 iq_elt["to"] = self.host.memory.getParamA("Proxy", "File Transfer", profile_key=profile) | |
624 query_elt = iq_elt.addElement('query', NS_BS) | |
625 query_elt['sid'] = sid | |
626 query_elt.addElement('activate', content=data['to'].full()) | |
627 iq_elt.addCallback(self.proxyResult, sid, start_transfer_cb, data['file_obj']) | |
628 iq_elt.send() | |
629 | |
630 def proxyResult(self, sid, start_transfer_cb, file_obj, iq_elt): | |
631 if iq_elt['type'] == 'error': | |
632 warning(_("Can't activate the proxy stream")) | |
633 return | |
634 else: | |
635 start_transfer_cb(file_obj) | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
636 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
637 def prepareToReceive(self, from_jid, sid, file_obj, size, success_cb, failure_cb): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
638 """Called when a bytestream is imminent |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
639 @param from_jid: jid of the sender |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
640 @param sid: Stream id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
641 @param file_obj: File object where data will be written |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
642 @param size: full size of the data, or None if unknown |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
643 @param success_cb: method to call when successfuly finished |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
644 @param failure_cb: method to call when something goes wrong""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
645 data = self.current_stream[sid] = {} |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
646 data["from"] = from_jid |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
647 data["file_obj"] = file_obj |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
648 data["seq"] = -1 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
649 if size: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
650 data["size"] = size |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
651 self.host.registerProgressCB(sid, self.getProgress) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
652 data["timer"] = reactor.callLater(TIMEOUT, self._timeOut, sid) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
653 data["success_cb"] = success_cb |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
654 data["failure_cb"] = failure_cb |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
655 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
656 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
657 def streamQuery(self, iq_elt, profile): |
0 | 658 """Get file using byte stream""" |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
659 debug(_("BS stream query")) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
660 profile_jid, xmlstream = self.host.getJidNStream(profile) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
661 iq_elt.handled = True |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
662 query_elt = iq_elt.firstChildElement() |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
663 sid = query_elt.getAttribute("sid") |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
664 streamhost_elts = filter(lambda elt: elt.name == 'streamhost', query_elt.elements()) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
665 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
666 if not sid in self.current_stream: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
667 warning(_("Ignoring unexpected BS transfer: %s" % sid)) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
668 self.sendNotAcceptableError(iq_elt['id'], iq_elt['from'], xmlstream) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
669 return |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
670 |
403
c513328ade9d
plugins XEP-0047 and XEP-0065: timout bug fix
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
671 self.current_stream[sid]['timer'].cancel() |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
672 self.current_stream[sid]["to"] = jid.JID(iq_elt["to"]) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
673 self.current_stream[sid]["xmlstream"] = xmlstream |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
674 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
675 if not streamhost_elts: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
676 warning(_("No streamhost found in stream query %s" % sid)) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
677 self.sendBadRequestError(iq_elt['id'], iq_elt['from'], xmlstream) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
678 return |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
679 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
680 streamhost_elt = streamhost_elts[0] #TODO: manage several streamhost elements case |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
681 sh_host = streamhost_elt.getAttribute("host") |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
682 sh_port = streamhost_elt.getAttribute("port") |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
683 sh_jid = streamhost_elt.getAttribute("jid") |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
684 if not sh_host or not sh_port or not sh_jid: |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
685 warning(_("incomplete streamhost element")) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
686 self.sendBadRequestError(iq_elt['id'], iq_elt['from'], xmlstream) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
687 return |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
688 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
689 self.current_stream[sid]["streamhost"] = (sh_host, sh_port, sh_jid) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
690 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
691 info (_("Stream proposed: host=[%(host)s] port=[%(port)s]") % {'host':sh_host, 'port':sh_port}) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
692 factory = Socks5ClientFactory(self.current_stream, sid, iq_elt["id"], self.activateStream, self._killId) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
693 reactor.connectTCP(sh_host, int(sh_port), factory) |
0 | 694 |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
695 def activateStream(self, sid, iq_id): |
69 | 696 debug(_("activating stream")) |
0 | 697 result = domish.Element(('', 'iq')) |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
698 data = self.current_stream[sid] |
0 | 699 result['type'] = 'result' |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
700 result['id'] = iq_id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
701 result['from'] = data["to"].full() |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
702 result['to'] = data["from"].full() |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
703 query = result.addElement('query', NS_BS) |
0 | 704 query['sid'] = sid |
705 streamhost = query.addElement('streamhost-used') | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
706 streamhost['jid'] = data["streamhost"][2] |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
707 data["xmlstream"].send(result) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
708 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
709 def sendNotAcceptableError(self, iq_id, to_jid, xmlstream): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
710 """Not acceptable error used when the stream is not expected or something is going wrong |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
711 @param iq_id: IQ id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
712 @param to_jid: addressee |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
713 @param xmlstream: XML stream to use to send the error""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
714 result = domish.Element(('', 'iq')) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
715 result['type'] = 'result' |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
716 result['id'] = iq_id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
717 result['to'] = to_jid |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
718 error_el = result.addElement('error') |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
719 error_el['type'] = 'modify' |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
720 error_el.addElement(('urn:ietf:params:xml:ns:xmpp-stanzas','not-acceptable')) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
721 xmlstream.send(result) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
722 |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
723 def sendBadRequestError(self, iq_id, to_jid, xmlstream): |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
724 """Not acceptable error used when the stream is not expected or something is going wrong |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
725 @param iq_id: IQ id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
726 @param to_jid: addressee |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
727 @param xmlstream: XML stream to use to send the error""" |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
728 result = domish.Element(('', 'iq')) |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
729 result['type'] = 'result' |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
730 result['id'] = iq_id |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
731 result['to'] = to_jid |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
732 error_el = result.addElement('error') |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
733 error_el['type'] = 'cancel' |
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
734 error_el.addElement(('urn:ietf:params:xml:ns:xmpp-stanzas','bad-request')) |
64 | 735 xmlstream.send(result) |
0 | 736 |
64 | 737 class XEP_0065_handler(XMPPHandler): |
738 implements(iwokkel.IDisco) | |
739 | |
740 def __init__(self, plugin_parent): | |
741 self.plugin_parent = plugin_parent | |
742 self.host = plugin_parent.host | |
398 | 743 |
744 def _proxyDataResult(self, iq_elt): | |
745 """Called with the informations about proxy according to XEP-0065 #4 | |
746 Params should be filled with these infos""" | |
747 if iq_elt["type"] == "error": | |
748 warning(_("Can't determine proxy informations")) | |
749 return | |
750 query_elt = iq_elt.firstChildElement() | |
751 if query_elt.name != "query": | |
752 warning(_("Bad answer received from proxy")) | |
753 return | |
754 streamhost_elts = filter(lambda elt: elt.name == 'streamhost', query_elt.elements()) | |
755 if not streamhost_elts: | |
756 warning(_("No streamhost found in stream query")) | |
757 return | |
758 if len(streamhost_elts) != 1: | |
759 warning(_("Multiple streamhost elements in proxy not managed, keeping only the first one")) | |
760 streamhost_elt = streamhost_elts[0] | |
761 proxy = self.host.memory.setParam("Proxy", streamhost_elt.getAttribute("jid",""), "File Transfer", self.parent.profile) | |
762 proxy = self.host.memory.setParam("Proxy host", streamhost_elt.getAttribute("host",""), "File Transfer", self.parent.profile) | |
763 proxy = self.host.memory.setParam("Proxy port", streamhost_elt.getAttribute("port",""), "File Transfer", self.parent.profile) | |
764 | |
64 | 765 |
766 def connectionInitialized(self): | |
398 | 767 def after_init(ignore): |
768 proxy_ent = self.host.memory.getServerServiceEntity("proxy", "bytestreams", self.parent.profile) | |
769 if not proxy_ent: | |
770 debug(_("No proxy found on this server")) | |
771 return | |
772 iq_elt = client.IQ(self.parent.xmlstream,'get') | |
773 iq_elt["to"] = proxy_ent.full() | |
774 query_elt = iq_elt.addElement('query', NS_BS) | |
775 iq_elt.addCallback(self._proxyDataResult) | |
776 iq_elt.send() | |
777 | |
778 | |
394
8f3551ceee17
plugin XEP-0065: refactored and misc stuff fixed. Still not finished
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
779 self.xmlstream.addObserver(BS_REQUEST, self.plugin_parent.streamQuery, profile = self.parent.profile) |
398 | 780 proxy = self.host.memory.getParamA("Proxy", "File Transfer", profile_key = self.parent.profile) |
781 if not proxy: | |
782 self.parent.client_initialized.addCallback(after_init) | |
783 | |
64 | 784 |
785 | |
786 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): | |
787 return [disco.DiscoFeature(NS_BS)] | |
788 | |
789 def getDiscoItems(self, requestor, target, nodeIdentifier=''): | |
790 return [] |