From ae33330ac619a357edd50ec26e6b7922731a0b92 Mon Sep 17 00:00:00 2001 From: Dimitur Kirov Date: Mon, 20 Mar 2006 21:24:10 +0000 Subject: [PATCH] send fake activate stanza to assert that proxy works correctly --- src/common/connection_handlers.py | 2 ++ src/common/helpers.py | 9 +++++++++ src/common/proxy65_manager.py | 27 ++++++++++++++++++++++----- src/filetransfers_window.py | 11 +---------- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 276afb922..5881ec1ae 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -285,7 +285,9 @@ class ConnectionBytestream: def _bytestreamErrorCB(self, con, iq_obj): gajim.log.debug('_bytestreamErrorCB') id = unicode(iq_obj.getAttr('id')) + frm = helpers.get_full_jid_from_iq(iq_obj) query = iq_obj.getTag('query') + gajim.proxy65_manager.error_cb(frm, query) jid = helpers.get_jid_from_iq(iq_obj) id = id[3:] if not self.files_props.has_key(id): diff --git a/src/common/helpers.py b/src/common/helpers.py index 0bfd2ff4a..696f13a6b 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -626,6 +626,15 @@ distro_info = { 'Redhat Linux': '/etc/redhat-release' } +def get_random_string_16(): + ''' create random string of length 16''' + rng = range(65, 90) + rng.extend(range(48, 57)) + char_sequence = map(lambda e:chr(e), rng) + from random import sample + return reduce(lambda e1, e2: e1 + e2, + sample(char_sequence, 16)) + def get_os_info(): if os.name == 'nt': ver = os.sys.getwindowsversion() diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index 7d130bbe5..17cd2577d 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -18,12 +18,14 @@ import struct import common.xmpp from common import gajim +from common import helpers from socks5 import Socks5 from common.xmpp.idlequeue import IdleObject S_INITIAL = 0 S_STARTED = 1 S_RESOLVED = 2 +S_ACTIVATED = 3 S_FINISHED = 4 CONNECT_TIMEOUT = 20 @@ -68,6 +70,15 @@ class Proxy65Manager: self.proxies[proxy].resolve_result(host, port, jid) # we can have only one streamhost raise common.xmpp.NodeProcessed + + def error_cb(self, proxy, query): + if not self.proxies.has_key(proxy): + return + resolver = self.proxies[proxy] + sid = query.getAttr('sid') + if resolver.sid == sid: + resolver.keep_conf() + def get_proxy(self, proxy): if self.proxies.has_key(proxy): resolver = self.proxies[proxy] @@ -87,11 +98,16 @@ class ProxyResolver: self.host_tester.connect() def _on_connect_success(self): - conf = gajim.config - conf.add_per('ft_proxies65_cache', self.proxy) - conf.set_per('ft_proxies65_cache', self.proxy, 'host', self.host) - conf.set_per('ft_proxies65_cache', self.proxy, 'port', self.port) - conf.set_per('ft_proxies65_cache', self.proxy, 'jid', self.jid) + iq = common.xmpp.Protocol(name = 'iq', to = self.jid, typ = 'set') + query = iq.setTag('query') + query.setNamespace(common.xmpp.NS_BYTESTREAM) + query.setAttr('sid', self.sid) + activate = query.setTag('activate') + # activate.setData(self.jid + "/" + self.sid) + self.active_connection.send(iq) + self.state = S_ACTIVATED + + def keep_conf(self): self.state = S_FINISHED def _on_connect_failure(self): @@ -139,6 +155,7 @@ class ProxyResolver: self.jid = None self.host = None self.port = None + self.sid = helpers.get_random_string_16() class HostTester(Socks5, IdleObject): ''' fake proxy tester. ''' diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index 5adba9b45..71704761c 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -525,15 +525,6 @@ _('Connection with peer cannot be established.')) return iter iter = self.model.iter_next(iter) - def get_sid(self): - ''' create random string of length 16''' - rng = range(65, 90) - rng.extend(range(48, 57)) - char_sequence = map(lambda e:chr(e), rng) - from random import sample - return reduce(lambda e1, e2: e1 + e2, - sample(char_sequence, 16)) - def get_send_file_props(self, account, contact, file_path, file_name): ''' create new file_props dict and set initial file transfer properties in it''' @@ -551,7 +542,7 @@ _('Connection with peer cannot be established.')) return None file_props['elapsed-time'] = 0 file_props['size'] = unicode(stat[6]) - file_props['sid'] = self.get_sid() + file_props['sid'] = helpers.get_random_string_16() file_props['completed'] = False file_props['started'] = False file_props['sender'] = account