Changeset 10326

Show
Ignore:
Timestamp:
08/27/08 15:11:46 (3 months ago)
Author:
asterix
Message:

fix FT proxy testing. We needed a receiver to connect to proxy to really test it

Location:
trunk/src/common
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/common/connection_handlers.py

    r10319 r10326  
    835835                                                break 
    836836                        if features.__contains__(common.xmpp.NS_BYTESTREAM): 
    837                                 gajim.proxy65_manager.resolve(jid, self.connection, self.name) 
     837                                our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name) +\ 
     838                                        '/' + self.server_resource) 
     839                                gajim.proxy65_manager.resolve(jid, self.connection, our_jid, 
     840                                        self.name) 
    838841                        if features.__contains__(common.xmpp.NS_MUC) and is_muc: 
    839842                                type_ = transport_type or 'jabber' 
     
    22432246                cfg_proxies = gajim.config.get_per('accounts', self.name, 
    22442247                        'file_transfer_proxies') 
     2248                our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name) + '/' +\ 
     2249                        self.server_resource) 
    22452250                if cfg_proxies: 
    22462251                        proxies = map(lambda e:e.strip(), cfg_proxies.split(',')) 
    22472252                        for proxy in proxies: 
    2248                                 gajim.proxy65_manager.resolve(proxy, self.connection) 
     2253                                gajim.proxy65_manager.resolve(proxy, self.connection, our_jid) 
    22492254         
    22502255        def _on_roster_set(self, roster): 
  • trunk/src/common/proxy65_manager.py

    r10250 r10326  
    5050                # dict {account: proxy} default proxy for account 
    5151                self.default_proxies = {} 
    52          
    53         def resolve(self, proxy, connection, default = None): 
     52 
     53        def resolve(self, proxy, connection, sender_jid, default=None): 
    5454                ''' start ''' 
    5555                if self.proxies.has_key(proxy): 
     
    5757                else: 
    5858                        # proxy is being ressolved for the first time 
    59                         resolver = ProxyResolver(proxy) 
     59                        resolver = ProxyResolver(proxy, sender_jid) 
    6060                        self.proxies[proxy] = resolver 
    6161                        resolver.add_connection(connection) 
     
    6363                        # add this proxy as default for account 
    6464                        self.default_proxies[default] = proxy 
    65          
     65 
    6666        def disconnect(self, connection): 
    6767                for resolver in self.proxies.values(): 
    6868                        resolver.disconnect(connection) 
    69          
     69 
    7070        def resolve_result(self, proxy, query): 
    7171                if not self.proxies.has_key(proxy): 
     
    8080                                # we can have only one streamhost 
    8181                                raise common.xmpp.NodeProcessed 
    82          
     82 
    8383        def error_cb(self, proxy, query): 
    8484                sid = query.getAttr('sid') 
     
    8787                                resolver.keep_conf() 
    8888                                break 
    89          
     89 
    9090        def get_default_for_name(self, account): 
    9191                if self.default_proxies.has_key(account): 
    9292                        return self.default_proxies[account] 
    93          
     93 
    9494        def get_proxy(self, proxy, account): 
    9595                if self.proxies.has_key(proxy): 
     
    102102        def resolve_result(self, host, port, jid): 
    103103                ''' test if host has a real proxy65 listening on port ''' 
    104                 self.host = unicode(host) 
     104                self.host = str(host) 
    105105                self.port = int(port) 
    106106                self.jid = unicode(jid) 
    107107                self.state = S_RESOLVED 
     108                self.receiver_tester = ReceiverTester(self.host, self.port, self.jid, 
     109                        self.sid, self.sender_jid, self._on_receiver_success, 
     110                        self._on_connect_failure) 
     111                self.receiver_tester.connect() 
     112         
     113        def _on_receiver_success(self): 
    108114                self.host_tester = HostTester(self.host, self.port, self.jid,  
    109                                 self._on_connect_success, self._on_connect_failure) 
     115                        self.sid, self.sender_jid, self._on_connect_success, 
     116                        self._on_connect_failure) 
    110117                self.host_tester.connect() 
    111          
     118 
    112119        def _on_connect_success(self): 
    113                 iq = common.xmpp.Protocol(name = 'iq', to = self.jid, typ = 'set') 
     120                iq = common.xmpp.Protocol(name='iq', to=self.jid, typ='set') 
    114121                query = iq.setTag('query') 
    115122                query.setNamespace(common.xmpp.NS_BYTESTREAM) 
    116123                query.setAttr('sid',  self.sid) 
    117                  
     124 
    118125                activate = query.setTag('activate') 
    119                 activate.setData(self.jid + "/" + self.sid) 
     126                activate.setData('test@gajim.org/test2') 
    120127 
    121128                if self.active_connection: 
    122                         self.active_connection.send(iq) 
     129                        self.active_connection.SendAndCallForResponse(iq, self.keep_conf) 
    123130                        self.state = S_ACTIVATED 
    124131                else: 
    125132                        self.state = S_INITIAL 
    126                  
    127         def keep_conf(self): 
     133 
     134        def keep_conf(self, data=None): 
     135                self.disconnect(self.active_connection) 
    128136                self.state = S_FINISHED 
    129          
     137 
    130138        def _on_connect_failure(self): 
    131139                self.state = S_FINISHED 
     
    133141                self.port = 0 
    134142                self.jid = None 
    135          
     143 
    136144        def disconnect(self, connection): 
    137145                if self.host_tester: 
    138146                        self.host_tester.disconnect() 
    139147                        self.host_tester = None 
     148                if self.receiver_tester: 
     149                        self.receiver_tester.disconnect() 
     150                        self.receiver_tester = None 
    140151                try: 
    141152                        self.connections.remove(connection) 
     
    147158                                self.state = S_INITIAL 
    148159                                self.try_next_connection() 
    149          
     160 
    150161        def try_next_connection(self): 
    151162                ''' try to resolve proxy with the next possible connection ''' 
     
    153164                        connection = self.connections.pop(0) 
    154165                        self.start_resolve(connection) 
    155          
     166 
    156167        def add_connection(self, connection): 
    157168                ''' add a new connection in case the first fails ''' 
     
    159170                if self.state == S_INITIAL: 
    160171                        self.start_resolve(connection) 
    161          
     172 
    162173        def start_resolve(self, connection): 
    163174                ''' request network address from proxy ''' 
    164175                self.state = S_STARTED 
    165176                self.active_connection = connection 
    166                 iq = common.xmpp.Protocol(name = 'iq', to = self.proxy, typ = 'get') 
     177                iq = common.xmpp.Protocol(name='iq', to=self.proxy, typ='get') 
    167178                query = iq.setTag('query') 
    168179                query.setNamespace(common.xmpp.NS_BYTESTREAM) 
    169180                connection.send(iq) 
    170          
    171         def __init__(self, proxy): 
     181 
     182        def __init__(self, proxy, sender_jid): 
    172183                self.proxy = proxy 
    173184                self.state = S_INITIAL 
     
    175186                self.connections = [] 
    176187                self.host_tester = None 
     188                self.receiver_tester = None 
    177189                self.jid = None 
    178190                self.host = None 
    179191                self.port = None 
    180192                self.sid = helpers.get_random_string_16() 
    181                  
     193                self.sender_jid = sender_jid 
     194 
    182195class HostTester(Socks5, IdleObject): 
    183196        ''' fake proxy tester. ''' 
    184         def __init__(self, host, port, jid, on_success, on_failure): 
     197        def __init__(self, host, port, jid, sid, sender_jid, on_success, on_failure): 
    185198                ''' try to establish and auth to proxy at (host, port) 
    186199                call on_success, or on_failure according to the result''' 
     
    191204                self.on_failure = on_failure 
    192205                self._sock = None 
    193                 self.file_props = {} 
     206                self.file_props = {'is_a_proxy': True, 
     207                        'proxy_sender': sender_jid, 
     208                        'proxy_receiver': 'test@gajim.org/test2'} 
    194209                Socks5.__init__(self, gajim.idlequeue, host, port, None, None, None) 
    195          
     210                self.sid = sid 
     211 
    196212        def connect(self): 
    197213                ''' create the socket and plug it to the idlequeue ''' 
     
    207223                self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 
    208224                return None 
    209                  
     225 
    210226        def read_timeout(self): 
    211227                self.idlequeue.remove_timeout(self.fd) 
    212228                self.pollend() 
    213                  
     229 
    214230        def pollend(self): 
    215231                self.disconnect() 
    216232                self.on_failure() 
    217          
     233 
    218234        def pollout(self): 
    219235                self.idlequeue.remove_timeout(self.fd) 
     
    230246                gajim.idlequeue.plug_idle(self, False, True) 
    231247                gajim.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 
    232          
     248 
    233249        def pollin(self): 
    234250                self.idlequeue.remove_timeout(self.fd) 
     
    247263                        if version != 0x05 or method == 0xff: 
    248264                                self.pollend() 
    249                         self.disconnect() 
     265                                return 
     266                        data = self._get_request_buff(self._get_sha1_auth()) 
     267                        self.send_raw(data) 
     268                        self.state += 1 
     269                elif self.state == 3: 
    250270                        self.on_success() 
    251                 else: 
    252                         self.disconnect() 
    253          
     271                        self.state += 1 
     272 
    254273        def do_connect(self): 
    255274                try: 
    256275                        self._sock.connect((self.host, self.port)) 
    257276                        self._sock.setblocking(False) 
    258                         self._send=self._sock.send 
    259                         self._recv=self._sock.recv 
     277                        self._send = self._sock.send 
     278                        self._recv = self._sock.recv 
    260279                except Exception, ee: 
    261280                        (errnum, errstr) = ee 
     
    271290                        # socket is already connected 
    272291                        self._sock.setblocking(False) 
    273                         self._send=self._sock.send 
    274                         self._recv=self._sock.recv 
     292                        self._send = self._sock.send 
     293                        self._recv = self._sock.recv 
    275294                self.buff = '' 
    276295                self.state = 1 # connected 
    277296                self.idlequeue.plug_idle(self, True, False) 
    278297                return  
    279                  
     298 
     299class ReceiverTester(Socks5, IdleObject): 
     300        ''' fake proxy tester. ''' 
     301        def __init__(self, host, port, jid, sid, sender_jid, on_success, on_failure): 
     302                ''' try to establish and auth to proxy at (host, port) 
     303                call on_success, or on_failure according to the result''' 
     304                self.host = host 
     305                self.port = port 
     306                self.jid = jid 
     307                self.on_success = on_success 
     308                self.on_failure = on_failure 
     309                self._sock = None 
     310                self.file_props = {'is_a_proxy': True, 
     311                        'proxy_sender': sender_jid, 
     312                        'proxy_receiver': 'test@gajim.org/test2'} 
     313                Socks5.__init__(self, gajim.idlequeue, host, port, None, None, None) 
     314                self.sid = sid 
     315 
     316        def connect(self): 
     317                ''' create the socket and plug it to the idlequeue ''' 
     318                if self.host is None: 
     319                        self.on_failure() 
     320                        return None 
     321                self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     322                self._sock.setblocking(False) 
     323                self.fd = self._sock.fileno() 
     324                self.state = 0 # about to be connected 
     325                gajim.idlequeue.plug_idle(self, True, False) 
     326                self.do_connect() 
     327                self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 
     328                return None 
     329 
     330        def read_timeout(self): 
     331                self.idlequeue.remove_timeout(self.fd) 
     332                self.pollend() 
     333 
     334        def pollend(self): 
     335                self.disconnect() 
     336                self.on_failure() 
     337 
     338        def pollout(self): 
     339                self.idlequeue.remove_timeout(self.fd) 
     340                if self.state == 0: 
     341                        self.do_connect() 
     342                        return 
     343                elif self.state == 1: # send initially: version and auth types 
     344                        data = self._get_auth_buff() 
     345                        self.send_raw(data) 
     346                else: 
     347                        return 
     348                self.state += 1 
     349                # unplug and plug for reading 
     350                gajim.idlequeue.plug_idle(self, False, True) 
     351                gajim.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 
     352 
     353        def pollin(self): 
     354                self.idlequeue.remove_timeout(self.fd) 
     355                if self.state in (2, 3): 
     356                        self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) 
     357                        # begin negotiation. on success 'address' != 0  
     358                        buff = self.receive() 
     359                        if buff == '': 
     360                                # end connection 
     361                                self.pollend() 
     362                                return 
     363                if self.state == 2: 
     364                        # read auth response 
     365                        if buff is None or len(buff) != 2: 
     366                                return None 
     367                        version, method = struct.unpack('!BB', buff[:2]) 
     368                        if version != 0x05 or method == 0xff: 
     369                                self.pollend() 
     370                                return 
     371                        data = self._get_request_buff(self._get_sha1_auth()) 
     372                        self.send_raw(data) 
     373                        self.state += 1 
     374                elif self.state == 3: 
     375                        # read connect response 
     376                        if buff is None or len(buff) < 2: 
     377                                return None 
     378                        version, reply = struct.unpack('!BB', buff[:2]) 
     379                        if version != 0x05 or reply != 0x00: 
     380                                self.pollend() 
     381                                return 
     382                        self.on_success() 
     383                        self.state += 1 
     384 
     385        def do_connect(self): 
     386                try: 
     387                        self._sock.connect((self.host, self.port)) 
     388                        self._sock.setblocking(False) 
     389                        self._send = self._sock.send 
     390                        self._recv = self._sock.recv 
     391                except Exception, ee: 
     392                        (errnum, errstr) = ee 
     393                        # 56 is for freebsd 
     394                        if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): 
     395                                # still trying to connect 
     396                                return 
     397                        # win32 needs this 
     398                        if errnum not in (0, 10056, errno.EISCONN): 
     399                                # connection failed 
     400                                self.on_failure() 
     401                                return 
     402                        # socket is already connected 
     403                        self._sock.setblocking(False) 
     404                        self._send = self._sock.send 
     405                        self._recv = self._sock.recv 
     406                self.buff = '' 
     407                self.state = 1 # connected 
     408                self.idlequeue.plug_idle(self, True, False) 
     409                return  
    280410 
    281411# vim: se ts=3: